专栏首页贾志刚-OpenCV学堂干货 | 英特尔神经网络计算棒实现对象检测加速推理

干货 | 英特尔神经网络计算棒实现对象检测加速推理

投稿作者:小黄弟 研究方向:图像分类、检测、多目标跟踪、视频行为分析、重识别等领域 来自:中国电科智慧城市建模仿真与智能技术重点实验室 文字编辑: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模型,需要的是

  • ssd_inception_v2.pb
  • ssd_inception_v2.pbtxt

好了,模型有了,撸代码吧

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上的,效果如下图。

总结与后记

我总结了一下不同硬件及后端测试对应的时间,如下图,任君选择

那么,所有问题都解决了吗?不是的,至少还有两个问题困扰着我,

  1. 怎么把一个模型跑在多个加速棒上,别忘了,我可是有6个加速棒的人。
  2. 怎么把不同模型跑在不同的加速棒上?

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL),作者:小黄弟

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Tensorflow Object Detection API实现对象检测

    Tensorflow Object Detection API自从发布以来,其提供预训练模型也是不断更新发布,功能越来越强大,对常见的物体几乎都可以做到实时准确...

    OpenCV学堂
  • OpenCV实现0到9数字识别OCR

    使用OpenCV对0到9数字进行识别,实现简单OCR功能,基于CA(轮廓)分析实现特征提取,基于L1距离计算匹配实现数字识别。在排除干扰的基础上,识别精度可以达...

    OpenCV学堂
  • tensorflow Object Detection API使用预训练模型mask r-cnn实现对象检测

    Mask R-CNN是何凯明大神在2017年整出来的新网络模型,在原有的R-CNN基础上实现了区域ROI的像素级别分割。关于Mask R-CNN模型本身的介绍与...

    OpenCV学堂
  • Promise与Callback函数

    1,callback函数处理异步:代码逻辑复杂,可读性差----回调地狱;不可return; 2,promise处理异步: 对比callback,易读,可以...

    程序员不务正业
  • 介绍一个MonoTouch开发的伦敦官方城市指南应用

    让大多数伦敦无与伦比的文化、娱乐、著名景点,今年夏天,如没有其它,使用免费的伦敦官方城市指南应用。 你是否正在寻找免费活动,必须看到事件或当地的旅游景点,你可以...

    张善友
  • Angular应用里具有back功能的按钮实现

    下面是具体实现: (1) 在hero detail Component里导入Location,借助该module实现操纵浏览器的跳转行为。

    Jerry Wang
  • leetcode树之从上到下打印二叉树

    这是二叉树层次遍历的一个变种,区别在于每次poll的之前需要先记录下当前queue的size,即当前层的节点个数,然后按这个size去pull。

    codecraft
  • Python内置数据结构之集合

    今天给大家介绍内置数据结构集合的用法。 看一下集合的思维导图: ? 集合的特点 元素是唯一的 元素是无序的,不是线性结构 集合元素是可hash的 聚合的含义和数...

    1846122963
  • Python3.6.5标准库文档(完整中文版)---内置函数(一)

    本文主要介绍Python3.6.5标准库文档(完整中文版)---内置函数:abs(),all(),any(),ascii()

    python鱼霸霸
  • 码农眼中的数学之~数学基础

    1维直线、2维平面(长宽)、3维空间(长宽高 | xyz轴)、4维时空(xyz轴+时间轴)

    逸鹏

扫码关注云+社区

领取腾讯云代金券