RGA模块的讲解

RGA模块在本项目的作用

        由于网页显示的图像是RGB的彩色图像,所以我们需要使用RGA模块把每一帧的NV12的灰度图像转换成RGB的彩色图像。这篇博客主要的内容是RGA模块的初始化和如何获取经过RGA处理,拿到彩色的RGB数据。

        我们要使用到rga模块,我们就要先认识一下rga模块

        RGA_ATTR_S数据结构,初始化出rga模块

 

        这里使用的结构体是RGA_ATTR_S。RGA_ATTR_S结构体里面包含了两个重要的结构体,分别是stImgInstImgOut。stImgIn是视频输入的结构体,stImgOut是处理后的视频结构体。除了这两个重要的结构体外,还有公共参数需要设置 

        stImgIn是视频输入的结构体,是我传入的NV12视频,stImgOut是处理后的视频结构体,是处理好的RGB彩色视频。

        接下来来看一下RGA工作原理,你能理解RGA的参数怎么填了。

        重点:转换过后它还是vi数据, 但是图像已经变成彩色的了

  

stImgIn结构体的设置:

stImgIn.u32Width:视频输入的分辨率宽度,这里使用的是1920

stImgIn.u32Height:视频输入的分辨率高度,这里使用的是1080 

stImgIn.u32HorStride:视频输入的分辨率虚宽,虚宽的数值跟分辨率宽度数值一致都是1920

stImgIn.u32VirStride:视频输入的分辨率虚高,虚高的数值跟分辨率高度数值一致都是1080

stImgIn.imgType:视频输入的格式这里设置的是NV12也就是IMAGE_TYPE_NV12

stImgIn.u32X:设置stImgIn的X坐标 //默认是0

stImgIn.u32Y:设置stImgIn的Y坐标//默认是0

stImgOut结构体的设置:

stImgOut.u32Width:视频输出的分辨率宽度,这里使用的是1920

stImgOut.u32Height:视频输出的分辨率高度,这里使用的是1080 

stImgOut.u32HorStride:视频输出的分辨率虚宽,虚宽的数值跟分辨率宽度数值一致都是1920

stImgOut.u32VirStride:视频输出的分辨率虚高,虚高的数值跟分辨率高度数值一致都是1080

stImgOut.imgType:视频输出的格式这里设置的是RGB格式,IMAGE_TYPE_RGB888。

stImgOut.u32X:设置stImgOut的X坐标 

stImgOut.u32Y:设置stImgOut的Y坐标

RGA公共参数
u16BufPoolCnt:缓冲区计数,默认是3

u16Rotation:旋转角度,这里填0,没有旋转角度

enFlip:镜像控制,这里选择RGA_FLIP_H,水平镜像处理

bEnBufPool:使能缓冲池

    //RGA模块
    //配置RA参数
    RGA_ATTR_S rga;
    rga.stImgIn.u32Height = 1080;
    rga.stImgIn.u32Width = 11920;
    rga.stImgIn.u32X = 0;
    rga.stImgIn.u32Y = 0;
    rga.stImgIn.imgType = IMAGE_TYPE_NA12;
    rga.stImgIn.u32HorStride =1920;
    rga.stImgIn.u32VerStride = 1080;
    
    rga.stImgOut.u32Height 1080;
    rga.stImgOut.u32Width = 1920;
    rga.stImgOut.u32X = 0;
    rga.stImgOut.u32Y = 0;
    rga.stImgOut.imgType = IMAGE_TYPE_RGB888;
    rga.stImgOut.u32HorStride = 1920;
    rga.stImgOut.u32VerStride = 1080;

    rga.u16BufPoolCnt = 3; //缓冲区计数一般默认是3
    rga.u16Rotaion = 0; //旋转角度,这里默认是0
    rga.enFlip = RGA_FLIP_H; //水平镜像处理
    rga.bEnBufPool = RK_TRUE; //使能缓冲池
    //使能RGA模块通道
    ret = RK_MPI_RGA_CreateChn(RGA_ID, &rga);
    if(ret)
    {
        prinf("RK_MPI_RGA_CreateChn 失败\n");
    }
    else{
        printf("RK_MPI_RGA_CreateChn 成功\n");
    }

        设置完上述的参数后,调用RK_MPI_RGA_CreateChn设置RGA模块,第一个参数是RGA的通道号:0,第二个参数是RGA_ATTR_S结构体指针。

        然后就创建线程,去获取rga转换后的每一帧数据。

创建get_vi_rga_thread线程获取RGA码流数据


void* get_vi_rag_thread(void* args)
{
    //MEDIA_BUFFER就是void*类型
    MEDIA_BUFFER mb;
    while(!quit)
    {
        mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA,  RGA_ID, -1);
        if(!mb)
        {   
            printf("RK_MPI_SYS_GetMediaBuffer 获取数据失败 \n");
            break; //不要在这里循环了
        }
        //todo....
        //要把数据考到贡献内存里面去

        // 释放mb数据
        RK_MPI_MB_ReleaseBuffer(mb);
    }
}

需要调用pthread_create创建get_vi_rga_thread线程,我们来看get_vi_rga_thread线程里面的内容。在这个线程里面,需要调用RK_MPI_SYS_GetMediaBuffer获取RGA模块的数据。而RGA数据的来源是上节课我们讲解的get_camera_vi_thread线程发送的每一帧NV12数据(具体的流程如下图),最后把RGA的数据赋值到共享内存里面,(共享内存的内容下一篇分享)。

在上述论文中,并没有提到具体的“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、付费专栏及课程。

余额充值