下面随笔将给出Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现,最终的效果是:USB摄像头通过板载处理能够把图像通过HDMI接口输出,并结合RFCN模型,通过NNIE实现目标检测,下面给出具体的实现过程。
板载平台:BOXER-8410AI
芯片型号:Hi3559AV100
相机型号:Logitch c270
开发环境:VM15.5+ubuntu16.04+Hilinux
首先给出本篇随笔涉及之前写的随笔,希望大家先提前看一看,因为有些知识你可能不大清楚,看了之后能够清楚V4L2的实现及更好理解移植过程:
Hi3559AV100外接UVC/MJPEG相机实时采图设计(一):Linux USB摄像头驱动分析:
https://www.cnblogs.com/iFrank/p/14399421.html
Hi3559AV100外接UVC/MJPEG相机实时采图设计(二):V4L2接口的实现(以YUV422为例) :
https://www.cnblogs.com/iFrank/p/14403397.html
Hi3559AV100外接UVC/MJPEG相机实时采图设计(三):V4L2接口通过MPP平台输出 :
https://www.cnblogs.com/iFrank/p/14403620.html
Hi3559AV100外接UVC/MJPEG相机实时采图设计(四):VDEC_Send_Stream线程分析:
https://www.cnblogs.com/iFrank/p/14485199.html
1、系统框图及VDEC Chn通道与VPSS Group组的关系
在实现系统功能前先要确定VDEC的通道数、VPSS Group组的关系,我先给出系统的整体实现图解:
为了确定参数,再度分析VPSS上下文关系,用户可通过 MPI 接口对 GROUP 进行管理。每个 GROUP 仅可与一个输入源绑定。GROUP 的物理通道两种工作模式:AUTO 和 USER,两种模式间可动态切换。AUTO 模式下各通道仅可与一个接收者绑定,主要用于预览和回放场景下做播放控制。USER 模式下各通道可与多个接收者绑定。需要特别注意的是,USER 模式主要用于对同一通道图像进行多路编码的场景,此模式下播放控制不生效,因此回放场景下不建议使用 USER 模式。(对于RFCN移植就用到了user模式)
在移植过程中,用到了VPSS两个物理通道,对应Hi3559AV100(#define VPSS_MAX_PHY_CHN_NUM 4),对应图示图下:
VPSS 硬件提供多个物理通道,每个通道具缩放、裁剪等 功能。扩展通道具备缩放功能,它通过绑定物 理通道,将物理通道输出作为自己的输入,把图像缩放成用户设置的目标分辨率输出,对于本项目,VPSS的输入源为VDEC,输出为SVP NNIE,我之前实现的Hi3559AV100外接UVC/MJPEG相机实时采图设计(三):V4L2接口通过MPP平台输出VPSS是接的VO,所有开发过程有不同,实现过程如下图:
VDEC模块读取的视频文件需为H.264/H.265/MJPEG的数据文件,该模块可参考sample_vdec demo编写,一个通道对应一个视频文件。
2、V4L2->VDEC->VPSS->NNIE->VGS->VO实现过程
#include "sample_comm.h"
#include <linux/types.h>
#include <linux/videodev2.h>
文件改动位置:
3、调试遇到问题解决
在完成MJPEG->VDEC->VPSS->NNIE->VGS->VO函数的初始化之后,最初是简单的移植了VDEC线程开启运行的三个函数,但是出现了程序卡住的bug,具体如下所示:
代码对应位置:
因为SAMPLE_COMM_VDEC_CmdCtrl()函数进入了while,卡住了进程,直接将函数位置放到NNIE初始化后面即可,且把函数输入的参数换成全局变量即可。
4、结果测试
系统的硬件连接图如下所示:
结果测试如下所示,因为视频上传不了,所有以图片来进行演示,从图片可以看到,数据通过V4L2->VDEC->VPSS->NNIE->VGS->VO的系统开发后,能够将摄像头的数据通过HDMI在显示屏输出,并且开发的NNIE实现了RFCN目标识别的深度学习模型(红色框为NNIE处理图形后VGS加框的效果)。