ARM+Movidius VPU 目标识别调试笔记(三)

软件架构

前文(参考链接1和2)中针对我们在整个项目中需要用到的一些技术进行了描述,现在我们说回到产品应用部分的流程,并梳理以下整个软件架构。
整个软件功能分三部分:图像预处理、目标识别算法处理和识别结果可视化。
由于我们使用的主芯片是海思的Hi3516D,一款流媒体方案的SoC,所以本文会涉及一些关于海思的SDK的实现逻辑和流程,如果是没有接触过海思方案的读者可能会有些疑惑。

图像预处理

图像预处理功能其实很简单,分为三步操作:

  1. 获取相机前端视频输入,视频输入的分辨率为1920 x 1080。
  2. 由于我们使用的Tiny YOLO V2的网络,输入层张量维度为[416, 416, 3],所以我们需要将图像下采样至416 x 416的分辨率。
  3. 将下采样之后的图像编码成jpg格式。
    下采样和图像编码都不可能用软件在ARM上面运行完成,因为耗时比较大。所以我们通过SoC内部集成的ISS核和VSS核来进行处理。
    下采样部分,我们通过调用SDK来增加一条vpss channel,绑定到系统中的VI通道,该vpss channel的输出分辨率即为我们需要下采样的目标分辨率 416 x 416,这样使用硬件去处理的话可以根据相机的帧率达到实时效果。
    编码部分,我们新增一条VENC编码通道,编码格式为JPEG,直接将下采样使用的vpss channel 和这条VENC通道进行绑定。
    这样,软件层面我们就可以从VENC中循环获取预处理完成的JPG图片,然后将图片中的RGB数据送到算法模块,进行算法处理即可。
    后面为了降低用软件方式将JPG转RGB的耗时。在方案上通过使用海思SDK中的IVE CSC方式来实现,这样就可以直接将VPSS中的YUV420SP格式的图片转码为 IVE_IMAGE_TYPE_U8C3_PACKAGE 类型的BGR图片。通过测试CSC转码的416 x 416分辨率的图片耗时均值为20ms。这样优化了速率,同时可以省略新增的VENC通道。

算法处理

算法处理逻辑和流程前面两篇博文已经提及过,所以这里只需要将算法处理部分移植过来就可以了,处理时需要避免Movidius的device handle 和 计算图graph handle重复创建,避免重复写入相同的计算图数据,以消除一些不必要的耗时。

结果可视化

这款相机原本有两个程序,一个程序用于前端采集数据并将视频流编码为H.264/H.265格式,另一个程序是获取视频流,然后通过live555封装rtsp协议,以便PC端可以通过VLC或者其他支持rtsp协议的软件工具查看适时视频。
同样,我们的软件也会独立于这两个程序,作为一个新的服务组件存在于系统之中,这样降低了各个组件之间的耦合性。
要使算法结果可视化,我们需要在实时视频流上面增加OSD,以便查看。所以我们需要调用海思SDK中的RGN功能,增加overlay和cover_ex两种类型的RGN,一种用于显示目标的类别标签,另一种用于显示目标的box。

以上,就是我们整个软件的架构逻辑,整个流程也不算复杂。

效果分析

下面,我们看看初步调试出来的效果。
由于测试条件有限,目前我只能通过手机打开检测图片,然后将手机放置在镜头前面,让程序去识别手机图片中的目标信息。
实际上,这样的操作方式对算法识别的准确率影响其实是很大的,如果因为手机屏幕摆放角度造成光线反射量不同,导致画面上曝光程度不一致,对效果的影响很大。
如下两张图,分别用来识别人和小汽车。
图一

图二

图一的效果来看,准确率和召回率都还基本满足需求,但是检测的坐标有不太准确,会有一些偏差。图二也是同样的情况,部分结果中坐标偏差较大。这个效果确实有待优化。

算法效率

现在,我把整个处理过程拆分之后分别测试耗时,得出如下表一中的数据:

Function Time(ms)
ncFifoWriteElem 70~90
ncGraphQueueInference 10
ncFifoReadElem 10

从上表中看出FifoWriteElem这个接口耗时峰值达到了90ms,这个接口功能是将输入图片写到VPU中,输入图像的大小是 416 x 416 x 3个float32型数据,估算一下传输速率大概在2.4MB/s的样子,这样看,传输速率还不是很高。
目前为止,调出来的算法处理速率达到6fps。

设备性能

相传VPU的芯片功耗很低,但是在测试过程中,发现USB频繁出现断连的情况,算法运行一段时间之后,USB会就disconnect了,无论VPU连接PC机还是智能相机时都有这个问题。目前还没找到故障原因。

总结

到目前为止,项目整个功能就已经实现了,同时也实现了效果可视化。后面的工作就是对算法mAP的调优以及耗时方面的优化。力求达到一个不错的效果。所以,博文的更新暂告一个段落,效果优化之后再更新后续内容。

参考链接

1、ARM+Movidius VPU 目标识别调试笔记(一)
2、ARM+Movidius VPU 目标识别调试笔记(二)
3、Movidius VPU移植ssd_mobilenet问题记录

你可能感兴趣的:(海思,tensorflow,深度学习)