深度学习算法优化系列四 | 如何使用OpenVINO部署以Mobilenet做Backbone的YOLOv3模型?

点击上方“蓝字”关注“AI开发者”

本文来自  @BBuf  的社区专栏  GiantPandaCV ,文末扫码即可订阅专栏。

前言

因为最近在和计算棒打交道,自然存在一个模型转换问题,如果说YOLOv3或者YOLOV3-tiny怎么进一步压缩,我想大多数人都会想到将标准卷积改为深度可分离卷积结构?而当前很多人都是基于DarkNet框架训练目标检测模型,并且github也有开源一个Darknet转到OpenVINO推理框架的工具,地址见附录。而要说明的是,github上的开源工具只是支持了原生的YOLOv3和YOLOV3-tiny模型转到tensorflow的pb模型,然后再由pb模型转换到IR模型执行在神经棒的推理。因此,我写了一个脚本可以将带深度可分离卷积的YOLOv3或YOLOV3-tiny转换到pb模型并转换到IR模型,且测试无误。就奉献一下啦。

项目配置

  • Tensorflow 1.8.0

  • python3

工具搭建

此工具基于github上 模型转 模型的工具 ,具体见附录。我这里以修改一下 里面的有 个通道的标准卷积为深度可分离卷积为例来介绍。下图是YOLOv3-tiny的网络结构,我们考虑如何把 个通道的标准卷积改造成深度可分离卷积的形式即可。其他卷积类似操作即可。

  • 步骤一:修改YOLOv3-tiny的cfg文件, 个输出通道的卷积层输入通道数 ,卷积核尺寸为 ,因此对应到深度可分离卷积的结构就是 的分组卷积核 的点卷积(也是标准的 )卷积。所以我们将 个输出通道的卷积层替换为这两个层即可,这里使用 版本的Darknet进行训练,链接也在附录,注意要使用 分组卷积这个参数,需要用 以上的版本编译DarkNet。然后我们修改cfg文件夹下面的yolov3-tiny.cfg,把其中的 通道的卷积换成深度可分离卷积,如下图所示。注意是 而不是
在这里插入图片描述
  • 步骤二:训练好模型,并使用DarkNet测试一下模型是否表现正常。

  • 步骤三:克隆 工程,链接见附录。
  • 步骤四:用我的工具转换训练出来的 模型到 模型,这一步骤的具体操作为用下面我提供的脚本替换一下 工程中的 即可,注意是全部替换。我的脚本具体代码如下:

可以看到我仍然使用了tensorflow的slim模块搭建整个框架,和原始的 的区别就在:

需要进一步注意的是 深度可分离卷积的参数传递方式,我们来看一下这个函数的参数列表:

  • 步骤四:执行下面的模型转换命令,就可以把带深度可分离卷积的 模型转到 模型了。
  • 步骤五:接下来就是把 模型转为IR模型,在Intel神经棒上进行推理,这一部分之前的推文已经详细说过了,这里就不再赘述了。想详细了解请看之前的推文,地址如下: YOLOv3-tiny在VS2015上使用Openvino部署

测试结果

个输出通道的卷积核替换为深度可分离卷积之后,模型从 压缩到了 ,并且在我的数据集上精度没有显著下降(这个需要自己评判了,因为我的数据自然是没有VOC或者COCO数据集那么复杂的),并且速度也获得了提升。

后记

这个工具可以为大家提供了一个花式将Darknet转换为pb模型的一个 ,DarkNet下面的MobileNet-YOLO自然比Caffe的MobileNet-YOLO更容易获得,因为动手改几个groups参数就可以啦。所以我觉得这件事对于使用DarkNet同时玩一下计算棒的同学是有一点意义的,我把我修改后的工程放在github了,地址见附录。

附录

原始的darknet转pb模型工程:https://github.com/mystic123/tensorflow-yolo-v3

支持深度可分离卷积的darknet转pb模型工程:https://github.com/BBuf/cv_tools

AlexAB版Darknet:https://github.com/AlexeyAB/darknet

扫码订阅专栏

关于专栏

AI 研习社专栏旨在满足有持续创作能力的的知名学者、技术专家、优秀博主、讲师和人工智能人才文字创作和打造专属个人IP的需求。 AI 研习社希望能够帮助大咖见证求知,分享洞见~

欢迎大家来AI研习社订阅/开通专栏: https://www.yanxishe.com/column

  点击 阅读原文 ,查看专栏更多内容

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章