投稿作者:小黄弟 研究方向:图像分类、检测、多目标跟踪、视频行为分析、重识别等领域 来自:中国电科智慧城市建模仿真与智能技术重点实验室 文字编辑:gloomyfish 如果你觉得文章对你有帮助,欢迎转发支持
本文小黄弟要向大家介绍的是用英特尔NCS2加速棒实现对tensorflow物体检测模型的加速,涉及到的内容有tensorflow物体检测模型,OpencvDNN模块的使用,OpenVINO的使用。对这3个模块了解的同志看起来会比较愉快,不了解的看了也能有助于睡眠。
tensorflow物体检测模型
Google开源的目标检测 API包含了许多优秀的检测模型,可任君选用,地址为:
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
如下图,每个模型的运行时间、mAP与模型的大小几乎成正比例关系,本文选用的模型是 ssd_mobilenet_v2
下载模型,解压后会得到如下图文件:
我们需要用到的就是ssd_mobilenet_v2.config及ssd_mobilenet_v2.pb文件。有了这两个文件后,可以用tensorflow调用,可以用OpencvDNN调用,也可以用OpenVINO调用,本文研究用OpencvDNN,及OpenVINO调用。
OpencvDNN调用
OpencvDNN模块调用tensorflow物体检测模型,需要通过.config及.pb文件生成一个.pbtxt文件,进入opencv下的dnn目录下,本人目录为
D:\opencv\sources\samples\dnn
需要把
- ssd_mobilenet_v2.config
- ssd_mobilenet_v2.pb
上述两个文件复制到该目录下,运行命令:
python tf_text_graph_ssd.py --input ssd_inception_v2.pb \
--config ssd_inception_v2.config \
--output ssd_inception_v2.pbtxt \
就会生成一个
ssd_inception_v2.pbtxt 文件
OpencvDNN调用ssd_inception_v2模型,需要的是
好了,模型有了,撸代码吧
Net face_detection_net = readNetFromTensorflow("ssd_mobilenet_v2.pb", "ssd_mobilenet_v2.pbtxt");
face_detection_net.setPreferableBackend(DNN_BACKEND_OPENCV);
face_detection_net.setPreferableTarget(DNN_TARGET_CPU);
后端是基于OpenCV,硬件是CPU,检测效果(视频截图)如下,时间约为80ms每帧,是不是有点沮丧,太慢了,别着急,惊喜还会有的。
只需要改一个参数就可以实现加速,把后端由opencv改为基于OpenVINO的INFERENCE_ENGINE即可,硬件还是CPU,代码如下,效果图如下,瞬间飙到了40ms每帧左右,一个参数,速度快了一倍,爽歪歪。
Net face_detection_net = readNetFromTensorflow("ssd_mobilenet_v2.pb", "ssd_mobilenet_v2.pbtxt");
face_detection_net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
face_detection_net.setPreferableTarget(DNN_TARGET_CPU);
OpenVINO + NCS2 调用
NCS2
2018年11月14日在北京举行的人工智能大会上,英特尔发布了英特尔神经计算棒二代(简称英特尔NCS 2),利用该计算棒可以在网络边缘构建更智能的AI算法和计算机视觉原型设备,NCS 2是基于英特尔Movidius Myriad X视觉处理单元(VPU),并得到英特尔 OpenVINO工具包的支持。
OpenVINO计算框架
OpenVINO是英特尔基于自身现有的硬件平台开发的一种可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件。
其实上面我们已经实现了用OpenVINO来加速,不过是跑在CPU上的,下面我们要跑在NCS2上。理论上,只需要将硬件从CPU改为NCS2即可,从:
DNN_TARGET_CPU
改为
DNN_TARGET_MYRIAD
代码如下:
Net face_detection_net = readNetFromTensorflow("ssd_mobilenet_v2.pb", "ssd_mobilenet_v2.pbtxt");
face_detection_net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
face_detection_net.setPreferableTarget(DNN_TARGET_MYRIAD);
结果如下图,但是,但是这出来的结果,检测框跟目标明显有偏移,怎么回事???难道NCS2是个坑,我可是有6个加速棒的人啊,白花花的银子要浪费了???
突然有个想法attack了我,难道ssd_mobilenet_v2.pb文件要转换为Open VINO的xml及bin文件?好吧,那就转吧。进入OpenVINO的model_optmizer目录下,同时建立文件夹为ssd,把ssd_mobilenet_v2.config及ssd_mobilenet_v2.pb复制到ssd文件夹下,在model_optmizer目录下执行一下命令:
python mo_tf.py
--input_modelssd/ssd_mobilenet_v2.pb
--output=detection_boxes,detection_scores,num_detections
--tensorflow_use_custom_operations_config extensions/front/tf/ssd_v2_support.json
--tensorflow_object_detection_api_pipeline_configssd/ssd_mobilenet_v2.config
执行后会生成
- ssd_mobilenet_v2.xml
- ssd_mobilenet_v2.bin
两个文件。
好了,看看经过转换后的模型,会出现什么?加载模型代码如下:
Net face_detection_net = readNetFromModelOptimizer("ssd_mobilenet_v2.xml", "ssd_mobilenet_v2.bin");
face_detection_net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
face_detection_net.setPreferableTarget(DNN_TARGET_MYRIAD);
效果如图所示,瞬间变好了,原来真的需要转换模型格式,执行时间约为110ms每帧,没有CPU的快,不过想想NCS2与CPU的价格差距就知道了。
其实只要用tensorflow物体检测框架训练,然后通过上述步骤,就可以将模型迁移到自己的数据集上,如下图,是我用ssd_mobilenet_v2迁移到人头检测数据集的效果,跑在NCS2上的,效果如下图。
总结与后记
我总结了一下不同硬件及后端测试对应的时间,如下图,任君选择
那么,所有问题都解决了吗?不是的,至少还有两个问题困扰着我,