转载自我的知乎专栏
当我们谈到推理应用的时候,一个很容易想到的场景就是:输入一个视频或视频流,进行推理,输出标注后的视频流。下面的视频是在Atlas200DK上使用yolov3+deepsort得到的结果。
freecar_out
这个应用大概分为以下几个步骤:
- 读取视频(流),得到H264码流
- 解码H264,得到一帧一帧的图片
- 对图片做一些预处理,比如resize
- 将图片传给NPU推理,得到分类结果和框
- 在输入图片上画框并且标注
- 将标注后的图片重新编码,写入视频文件或者视频流
乍一看使用OpenCV的接口组合起来就可以搭建一个推理应用了。但是在推理应用中直接使用OpenCV有不少问题:
- OpenCV在Atlas200DK上使用的是软件编解码,使用CPU处理1080P视频过于吃力
- OpenCV的画图函数不支持YUV420SP,而一般编解码器输入输出格式都是YUV420SP,使用OpenCV画图需要先将图片转到RGB格式,这也要消耗大量CPU时间
- OpenCV的putText函数似乎不支持中文
因为OpenCV上面的问题,所以我在demo中没有使用OpenCV,而是使用ffmpeg和freetype实现相关的功能。
demo仓库: