嵌入式音视频开发学习(VI模块、RGA模块)

嵌入式音视频开发

      • YUV原理
        • 1.什么是YUV格式
        • 2.YUV的优势
        • 3.YUV采样格式
        • 4.YUV存储格式
      • VI模块
        • 1.什么是VI模块
        • 2.VI模块重要参数
          • **VI视频节点**
          • **VI_CHN_BUF_TYPE**
        • 3.VI模块初始化API
          • 1.RK_MPI_VI_SetChnAttr
          • 2.RK_MPI_VI_EnableChn
      • 多线程获取VI模块的YUV数据
        • 初始化VI模块
        • 启动VI模块
        • 使用多线程的方式去采集
      • RGA模块
        • 1.RGA结构体的定义
        • 2.RGA常用API
        • 3.多线程获取RGA模块数据

​ 嵌入式音视频指的是通过采集摄像头、麦克风等数据进行智能化、压缩化操作,从而达到商业化的效果。生活中常见的产品有很多:人脸考勤机、车载系统、移动直播设备、无人机等等。

​ 常见的嵌入式音视频的芯片:瑞芯微RV1126/RK3399/RK3586、海思Hi3519AV100/Hi3559AV100、英伟达TX1/TX2芯片等等。三款芯片是目前市场上流行最火的音视频芯片,广泛运用在人工智能识别、音视频编解码、模型训练等高端领域。

​ RV1126是瑞芯微最新一代的智能视觉芯片。RV1126芯片主要支持4K 30fps、H264/H265视频编解码功能,并支持ISP2.0、HDR、麦克风阵列等最新技术。所以目前绝大部分公司都会用RV1126的芯片进行音视频项目的开发,学会了RV1126开发对音视频开发基本就有比较全的了解。

RV1126应用开发手册:

​ 应用手册在开发中发挥着至关重要的作用,很多不懂的知识点可以在手册找到解决方法。着重学习以下内容:VI模块、RGA模块、VENC模块、VDEC模块、VO模块、AI模块、AENC模块、AO模块

YUV原理

1.什么是YUV格式

​ YUV是一种常见的视频像素格式,经常用在视频编解码上面,YUV分别由Y、U和V分量组成。Y分量指的是亮度分量,也就是经常说的灰阶值,相当于一副灰色的图像。而U分量和V分量表示的是色度分量, 它的作用就是用于影像的色彩以及饱和度,常用于指定像素的颜色,U分量是图像蓝色部分去掉亮度Y,V分量是图像红色部分去掉Y。换言之如果一副图像只有Y分量,没有UV分量就相当于看黑白电视一样没有颜色,所以现在彩电都引用了YUV像素格式。

2.YUV的优势

​ YUV和RGB是目前最流行的两套颜色格式,但是在音视频编解码和网络传输的时候基本都会用YUV,而非RGB。这是因为YUV在网络传输时只需要占用很少的带宽进行传输,这能大大节约存储空间、并且提高传输效率。比如YUV420P格式进行采样能够比RGB节约超过1/2存储空间

3.YUV采样格式

​ 现在主流的YUV采样方式一般分三种:YUV444、YUV422、YUV420。

​ YUV444采样,相当于Y、U、V三个分量采用相同的采样比例进行采样。所以用YUV444采样生成的图像,YUV三个分量的信息是完整的,都是8bit,也就是一个字节。这里的YUV444顾名思义就是4个Y分量、4个U分量、4个V分量。Y分量大小:w * h;U分量大小:w * h;V分量大小:w * h。所以,我们用YUV444格式去采样一个1920 * 1080的图像的时候,得到的大小等于:**(1920 * 1080 * 8 + 1920 * 1080 * 8 + 1920 * 1080 * 8)/8/1024/1024 ~= 5.94M****。**从计算公式可以看出,YUV444每一帧图像大小和RGB差不多,所以在真正开发中很少会用到。

​ YUV422采样,相当于U、V分量是以Y分量采样的一半进行采样,Y分量和UV分量按照2:1的比例进行采样(也可以理解为两个Y分量对应一个UV分量)。就比方说,若一个水平方向有8个像素点,那么采样了8个Y分量,那么UV分量只有4个。这里采样用的是4个Y分量、2个U分量、2个V分量进行采样。Y分量大小:w * h;U分量:w * h /2;V分量:w * h /2。所以,用YUV422采样的大小是:(1920 * 1080 * 8 + (1920 * 1080)/2 * 8 + (1920 * 1080)/2 * 8)/8/1024/1024 ~= 3.96M****。

​ YUV420采样,相当于每一行扫描的时候只扫描一种色度分量(U分量或者V分量),和Y分量按照2:1的方式进行采样(也可以理解为四个Y分量对应一个UV分量)。就比方说,在第一行扫描的时候,YV分量按照2:1的方式进行采样,那么YU分量也是用2:1的方式采样,所以对于每个色度分量来说,它的水平方向和垂直方向的采样比都是2:1。这里采用的是4个Y分量、2个U分量、0个V分量采集,而下一行的则是用4个Y分量、0个U分量、2个V分量采样。所以,Y分量大小:w * h;U分量:w * h /4; V分量:w * h/4。所以用YUV420采集一个1920 * 1080的图像大小:(1920 * 1080 * 8 + (1920 * 1080)/4 * 8 + (1920 * 1080)/4 * 8)/8/1024/1024 ~=2.97M **。**可以看到用YUV420采样的图像比YUV444和YUV422都节省空间,因此它是目前最主流的采样格式。

4.YUV存储格式

​ YUV存储一般分为两大类,一种是 Planar,另一种是Packed

​ Planar指平面格式:它的特点是先连续存储所有的Y像素点,然后再存储所有的U像素点,最后存储所有的V像素点。即它分三个数组存储三个分量,比如data0[]存储所有Y分量、data1[]存储所有U分量、data2[]存储所有V分量。

​ Packed指的是打包格式:它的特点是所有像素点的YUV分量都是连续存储,并且所有的数据都存储在data0[]里面。

YUV420采样格式,就有这几种打包格式:NV12、NV21、YV12、YU12

NV12(常见):这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后UV交替存储。

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 U0 V0…

NV21:这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后VU交替存储。

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 V0 U0…

YV12:这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后存V分量、 最后存U分量,

Y0 … Y7 V0 … V7 U0…

YU12:这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后存U分量、 最后存V分量,

Y0 … Y7 U0 … U7 V0…

YUV422

在上述论文中,并没有提到具体的“RGA(Recurrent Gate Attention)模块”。该论文主要讨论的是如何利用知识蒸馏生成用于黑盒攻击的替代模型。如果你希望将RGA模块引入到这个框架中,可以考虑以下步骤: ### 1. **理解RGA模块的功能** - **RGA模块**通常用于增强模型的注意力机制,特别是在序列数据或图像中的局部特征提取上。它通过门控机制来动态调整不同部分的重要性。 ### 2. **确定RGA模块的插入位置** - **教师模型**:可以在教师模型中加入RGA模块,以提高其性能和鲁棒性。 - **学生模型**:也可以在学生模型中加入RGA模块,以增强其对复杂任务的学习能力。 ### 3. **具体实现步骤** #### 3.1. 在教师模型中加入RGA模块 假设你在使用的是PyTorch框架,可以在教师模型的定义中加入RGA模块。例如: ```python import torch import torch.nn as nn class TeacherModel(nn.Module): def __init__(self): super(TeacherModel, self).__init__() # 定义基础卷积层 self.conv_layers = nn.Sequential( nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2), # 其他卷积层... ) # 加入RGA模块 self.rga_module = RGA_Module(channels=64) # 全连接层 self.fc_layers = nn.Sequential( nn.Linear(64 * 16 * 16, 128), nn.ReLU(), nn.Linear(128, num_classes) ) def forward(self, x): x = self.conv_layers(x) x = self.rga_module(x) x = x.view(x.size(0), -1) x = self.fc_layers(x) return x ``` #### 3.2. 在学生模型中加入RGA模块 类似地,你可以在学生模型中也加入RGA模块: ```python class StudentModel(nn.Module): def __init__(self): super(StudentModel, self).__init__() # 定义基础卷积层 self.conv_layers = nn.Sequential( nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2), # 其他卷积层... ) # 加入RGA模块 self.rga_module = RGA_Module(channels=32) # 全连接层 self.fc_layers = nn.Sequential( nn.Linear(32 * 16 * 16, 64), nn.ReLU(), nn.Linear(64, num_classes) ) def forward(self, x): x = self.conv_layers(x) x = self.rga_module(x) x = x.view(x.size(0), -1) x = self.fc_layers(x) return x ``` ### 4. **训练过程** - **知识蒸馏**:在训练过程中,使用教师模型的输出作为软标签来指导学生模型的学习。你可以参考论文中的公式和方法来进行知识蒸馏。 ### 5. **评估** - **评估指标**:使用攻击成功率(ASR)等指标来评估加入RGA模块后的模型性能。 ### 6. **注意事项** - **超参数调优**:RGA模块的引入可能会增加模型的复杂度,需要适当调整学习率、批量大小等超参数。 - **计算资源**:RGA模块可能增加计算量,确保有足够的计算资源进行训练和测试。 通过以上步骤,你可以在现有的知识蒸馏框架中加入RGA模块,从而提升模型的性能和鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值