程序地带

Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现


  下面随笔将给出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实现过程
  BOXER-8410AI-A2-1010 通过外接 UVC/MJPEG USB 摄像头利用 V4L2 视频接口读取一帧 MJPEG 数据,将 MJPEG 数据送入至 VDEC 解码,经过 VPSS 分两路图形,VpssChn[1]送给 NNIE 做神经网络处理,VpssChn[0]一路正常输出,再通过 VGS 加框,最后 VO-HDMI 输出。整个流程如下:
  (1)初始化 V4L2 接口,开启内存映射;
  (2)初始化 SYS(SAMPLE_COMM_SYS_Init),必须先于 VDEC,VPSS 等模块;
  (3)初始化 VB or USER VB for VDEC(SAMPLE_COMM_VDEC_InitVBPool);
  (4)开启 VDEC(SAMPLE_COMM_VDEC_Start);
  (5)开启 VPSS(SAMPLE_COMM_VPSS_Start);
  (6)开启 VO(SAMPLE_COMM_VO_StartVO);
  (7)绑定 VDEC 与 VPSS(SAMPLE_COMM_VDEC_Bind_VPSS);
  (8)开启 VDEC Stream 线程(SAMPLE_COMM_VDEC_StartSendStream),时刻从 V4L2 接口取数据;
  (9)Load .wk 模型文件(SAMPLE_COMM_SVP_NNIE_LoadModel);
  (10)初始化模型参数(SAMPLE_SVP_NNIE_Rfcn_ParamInit);
  (11)开启 NNIE RFCN 处理线程,从 VPSS 取帧数据,经 NNIE 处理,再用 VGS加框;
  (12)打开 VDEC Stream 线程控制指令;
  (13)VDEC Stream 线程回收 pthread_join();
  (14)NNIE RFCN 线程回收 pthread_join();
  (15)反初始化,结束 V4L2 采集任务等等;
  下面给出具体的移植实现步骤,首先先抛开 V4L2 接口(因为这个之前写已经封装好了,移植相对简单),即先把 V4L2 配置先放一边,其代码主要结合了VDEC、RFCN 及自己编写的 V4L2。所有的代码均在 RFCN 的基础上进行了修改,这个很大程度节约了时间,且提高了程序正确运行的概率,避免出现莫名其妙的 bug。首先,系统需要完成的是就是 MJPEG->VDEC->VPSS->NNIE->VGS->VO 的各个模块的初始化,step1为 SAMPLE_COMM_IVE_StartViVpssVencVo(SAMPLE_VI_CONFIG_S*pstViConfig,SAMPLE_IVE_SWITCH_S*pstSwitch,PIC_SIZE_E*penExtPicSize),此函数实现(2)-(8), step2 在 RFCN_SVP_NNIE_Rfcn()函数下实现.wk 模型导入及 NNIE 初始化,step3 完成 NNIE RFCN 线程的初始化,step4 完成 VDEC_Stream 线程控制和回收及 NNIE 线程的回收。
  关于 V4L2 的移植及实现可以参考我之前的随笔,功能验证都是正确的。
  最后需要在头文件加上 V4L2 接口的相应定义及初始化,在sample_nnie_main.h 函数下添加头文件:

  #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加框的效果)。




 


 


 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/iFrank/p/14491826.html

随机推荐

Charles

Charles的安装双击安装包下一步,下一步,傻瓜式安装Charles的证书下载点击help,选中sslProxying,点击InstallCharlesRo...

weixin_53623248 阅读(330)

linux:进程管理和作业安排

进程管理和作业安排(一)进程管理1.列出系统中正在运行的所有进程的详细信息`ps-aux`2.终止某个进程`killPID`(...

叮叮.一叮点 阅读(932)

Spring 整合JdbcTemplate

Spring 整合JdbcTemplate

目录如何使用jdbcTemplate操作数据库第一步:添加jar包依赖第二步:添加dataSource.properties配置文件第三步:配置dateSou...

村口老师傅 阅读(412)

SVD奇异值分解

SVD奇异值分解

SVD奇异值分解可以用于图像压缩。下面解释SVD中三个矩阵的计算方法。下面是Matlab奇异值分解压缩图片的程序:注意图像的存储,不仅和像素值的多少有关,还和...

wxtRelax 阅读(411)

SpringBoot(1)

SpringBoot(1)1.使用SpringBoot执行异步任务//业务层@ServicepublicclassMyService{@Async//该注解加在方法上此方法会异步执行,...

一位不透露姓名的先生 阅读(455)

c++模板函数的使用

#include<iostream>usingnamespacestd;template<typenameT>voidmySwap(T&a,T&b){Tc;c=a;a&...

dxm809 阅读(152)

Linux环境下安装tomcat并配置开机自启

Linux环境下安装tomcat并配置开机自启1.将tomcat压缩包复制到Linux中,(这里复制到usr/local/tomcat目录下)。2.使用tarzxvfapa...

像个西瓜 阅读(352)

教师资格证面试试讲规律!

教师资格证面试试讲规律!

对于教师资格证考试,大家辛辛苦苦备考,成功通过笔试,面试更不能掉以轻心。很多细节都能决定面试是否能成功通过,试讲时间的分配更是重中之重。今天小编...

xisaiwang 阅读(596)

深入浅出Docker之应用容器化

目录应用的容器化简介单体应用容器化获取应用代码分析`Dockerfile`容器化当前应用/构建具体的镜像推送镜像到仓库运行应用程序生产环境中的多阶段构建实践利用构建缓存合并镜像使用`no-instal...

great-wind 阅读(557)