V833/V831目标检测demo方案开发

随着社会的发展人工智能已经逐渐走进并融入我们的生活,且应用在各个行业领域,AI不仅给许多行业带来了巨大的经济效益,同时也为我们的生活带来了许多改变和便利.在AI技术的加持下,传统消费电子产品向智能化转变,本篇就以V833为例,介绍在其上开发物体检测应用的具体步骤。 

方案运行平台:

支持IPC开发的平台有Melis和Tina,过程是类似的,这里以Tina为例介绍。

V833/V831目标检测demo方案开发_第1张图片

方案软件架构:

方案软件设计:

V833/V831目标检测demo方案开发_第2张图片

方案数据通路:

V833/V831目标检测demo方案开发_第3张图片

一路sensor图像经过四路VIPP缩放操作后,送给四个不同应用,分别是H265编码存盘,LCD预览以及以及NPU人形检测,还有一路照片抓拍。

NPU人形检测原理如下:

V833/V831目标检测demo方案开发_第4张图片

V833/V831目标检测demo方案开发_第5张图片

V833/V831目标检测demo方案开发_第6张图片

NPU线程抓取352*198(VIPP支持的输出大小)像素,格式为NV21的YUV原始帧数据,喂给人形检测算法网络,得到类别和坐标数据后,反馈给VIPP1 预览通道画框。

最后,将模型文件和模型数据放到路径/mnt/sdcard/object_det/model/下,因为程序会固定的到这个位置读取网络结构文件和网络数据文件。

模型是基于darknet yolov4-tiny.cfg的基础上优化得到的。

V833/V831目标检测demo方案开发_第7张图片

方案调试以及问题记录:

运行过程中,利用如下命令查看数据通路:

V833/V831目标检测demo方案开发_第8张图片

cat /sys/kernel/debug/mpp/vi
root@(none):/# cat /sys/kernel/debug/mpp/vi
*****************************************************
VIN hardware feature list:
mcsi 1, ncsi 1, parser 2, isp 1, vipp 4, dma 4
CSI_VERSION: CSI230_200, ISP_VERSION: ISP521_100
CSI_CLK: 336000000, ISP_CLK: 300000000
*****************************************************
vi0:
imx386_mipi => mipi0 => csi0 => isp0 => vipp0
input => hoff: 0, voff: 2, w: 1920, h: 1080, fmt: RGGB10
output => width: 1920, height: 1080, fmt: NV21M
interface: MIPI, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 1920, y: 1082, hb: 397, hs: 2183
buf => cnt: 5 size: 3133440 rest: 5, mode: software_update
frame => cnt: 1033, lost_cnt: 1, error_cnt: 1
internal => avg: 16(ms), max: 30(ms), min: 1(ms)
*****************************************************
vi1:
imx386_mipi => mipi0 => csi0 => isp0 => vipp1
input => hoff: 0, voff: 2, w: 1920, h: 1080, fmt: RGGB10
output => width: 1080, height: 720, fmt: NV21M
interface: MIPI, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 1920, y: 1082, hb: 397, hs: 2183
buf => cnt: 5 size: 1179648 rest: 3, mode: software_update
frame => cnt: 4369922, lost_cnt: 2643, error_cnt: 0
internal => avg: 16(ms), max: 24(ms), min: 2(ms)
*****************************************************
vi2:
imx386_mipi => mipi0 => csi0 => isp0 => vipp2
input => hoff: 0, voff: 2, w: 1920, h: 1080, fmt: RGGB10
output => width: 352, height: 198, fmt: NV21M
interface: MIPI, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 1920, y: 1082, hb: 401, hs: 2183
buf => cnt: 5 size: 110592 rest: 2, mode: software_update
frame => cnt: 4369922, lost_cnt: 3963615, error_cnt: 0
internal => avg: 16(ms), max: 24(ms), min: 8(ms)
*****************************************************
vi3:
(null) => csi1 => isp1 => vipp3
input => hoff: 0, voff: 0, w: 0, h: 0, fmt: NULL
output => width: 0, height: 0, fmt: NULL
interface: PARALLEL, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 0, y: 0, hb: 0, hs: 0
buf => cnt: 0 size: 0 rest: 0, mode: software_update
frame => cnt: 0, lost_cnt: 0, error_cnt: 0
internal => avg: 0(ms), max: 0(ms), min: 0(ms)
*****************************************************
root@(none):/# cat /sys/kernel/debug/mpp/vi
cat /sys/kernel/debug/mpp/vi
*****************************************************
VIN hardware feature list:
mcsi 1, ncsi 1, parser 2, isp 1, vipp 4, dma 4
CSI_VERSION: CSI230_200, ISP_VERSION: ISP521_100
CSI_CLK: 336000000, ISP_CLK: 300000000
*****************************************************
vi0:
imx386_mipi => mipi0 => csi0 => isp0 => vipp0
input => hoff: 0, voff: 2, w: 1920, h: 1080, fmt: RGGB10
output => width: 1920, height: 1080, fmt: NV21M
interface: MIPI, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 1920, y: 1082, hb: 397, hs: 2183
buf => cnt: 5 size: 3133440 rest: 5, mode: software_update
frame => cnt: 1033, lost_cnt: 1, error_cnt: 1
internal => avg: 16(ms), max: 30(ms), min: 1(ms)
*****************************************************
vi1:
imx386_mipi => mipi0 => csi0 => isp0 => vipp1
input => hoff: 0, voff: 2, w: 1920, h: 1080, fmt: RGGB10
output => width: 1080, height: 720, fmt: NV21M
interface: MIPI, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 1920, y: 1082, hb: 398, hs: 2183
buf => cnt: 5 size: 1179648 rest: 3, mode: software_update
frame => cnt: 4370069, lost_cnt: 2643, error_cnt: 0
internal => avg: 16(ms), max: 24(ms), min: 2(ms)
*****************************************************
vi2:
imx386_mipi => mipi0 => csi0 => isp0 => vipp2
input => hoff: 0, voff: 2, w: 1920, h: 1080, fmt: RGGB10
output => width: 352, height: 198, fmt: NV21M
interface: MIPI, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 1920, y: 1082, hb: 398, hs: 2182
buf => cnt: 5 size: 110592 rest: 2, mode: software_update
frame => cnt: 4370069, lost_cnt: 3963749, error_cnt: 0
internal => avg: 18(ms), max: 24(ms), min: 8(ms)
*****************************************************
vi3:
(null) => csi1 => isp1 => vipp3
input => hoff: 0, voff: 0, w: 0, h: 0, fmt: NULL
output => width: 0, height: 0, fmt: NULL
interface: PARALLEL, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 0, y: 0, hb: 0, hs: 0
buf => cnt: 0 size: 0 rest: 0, mode: software_update
frame => cnt: 0, lost_cnt: 0, error_cnt: 0
internal => avg: 0(ms), max: 0(ms), min: 0(ms)
*****************************************************
root@(none):/#

帧延迟

这样的设计方案包含一个问题,NPU这边获得帧并进行网络推理得到坐标结果并反馈给VIPP1通道是需要时间的,这段时间物体有可能已经发生移动,所以画框的图像帧并非是和原始检测帧同一个场景,所以绘的框可能不太准确,不过如果物体运动速度不太快的话,误差也不会太大,消费类设备是可以接受的。这个原理有点类似于游戏设计中的三帧延迟,以吃鸡游戏为例,当你按下趴键准备做个老阴逼的时候,下趴指令实际上是先发送给CPU做解码,之后在给GPU做帧合成,最后才送给DPU做现实,这中间的误差一般有三帧,原理类似,用VIPP的数据去给VIPP画框,就像揪着自己的头发把自己提起来一样,被你画框的图永远不会是你检测的那张. :)

坐标处理

这里遇到的问题是,在开发画框流程的时候,发现对设置的框坐标无法和LCD显示器上的框坐标对应上,例如,box的坐标有四个参数来描述,定义如下:

V833/V831目标检测demo方案开发_第9张图片

当设置x,y坐标为0,0时,发现绘出来的框缺失这个点,显示在屏幕上就是框不完整,缺失了一部分。经过不断尝试,标定,最终发现了屏幕大小的矩形框对应的box的坐标,x,y,width,height的关系,下面是分析过程:

VIPP1的原图格式设置的是1280 * 720, 但是LCD的显示分辨率是 480 * 640,无论怎么算,aspect ratio都不相同,如下图:

由于显示前,DE如果发现源分辨率和目标分辨率不同,会自动做scale操作,而我们设置的BOX坐标是按照源图给的,所以如果scale过程中发生裁剪,那么最终会出来的矩形框肯定是不对的,经过分析,这恰恰是遇到的情况。

经过反复调试,得到的坐标原点和屏幕宽高给

大概的处理过程如下:V833/V831目标检测demo方案开发_第10张图片

当x,y,width,height分别为140,0,800,720时的框图像:

你可能感兴趣的:(Linux,多媒体,嵌入式系统,V833,V831,AI,人形检测,目标检测,1024程序员节)