【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之二】 darknet的weights模型转为计算棒所需的IR模型

  树莓派3B+安装系统(Raspbian 9)以及环境配置

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之一】 安装与部署神经计算棒NCS2

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之三】 将darknet转的bin和xml文件在树莓派上测试yolo v3和yolo v3 tiny

本系列文章主要目的是在树莓派3b+和神经计算棒上运行yolov3,这个yolov3的模型由darknet训练而来;关于树莓派系统安装,计算棒开发包安装以及例子使用参考上面两篇文章;

接下来文章讲解怎么将darknet训练的.weights模型转为 OpenVINO支持的IR文件

假设你同我一样安装了开发包 的这个版本(具体为什么选择这个版本在文章中已经提过了~):

l_openvino_toolkit_raspbi_p_2019.1.094.tgz

Step 1. 下载 darknet版官网训练模型;

如果没有现成的,可以从pjreddie网站下载

 Yolo V3 COCO weights(237MB),Tiny Yolo V3 COCO weights(34MB) 标签文件 coco.names


Step 2. 将weights转为pb文件;

OpenVINO不支持直接使用Yolo V3的.weights文件,目前仅支持ONNX、TensorFlow、Caffe和MXNet。需要先把.weights文件转换成TensorFlow的.pb文件。

官方推荐转换工具为: https://github.com/mystic123/tensorflow-yolo-v3

我这边推荐这个仓库:https://github.com/PINTO0309/OpenVINO-YoloV3

这个PINTO0309 哥们做了一大堆树莓派+神经计算棒的对比试验~~

 

下载了仓库解压,我的目录是C:\Users\chenshaoqi\Desktop\raspberry\OpenVINO-YoloV3-master

运行如下指令:

python convert_weights_pb.py --weights_file yolov3-tiny.weights --tiny True --size 416 --output_graph frozen_darknet_yolov3_tiny_model.pb --data_format NHWC

上面指令是将yolov3-tiny.weights转为pb文件,传的参数:--tiny必须指定True, --data_format 必须是NHWC,否则后面你拿转成功的pb,然后再去转xml和bin,然后做目标检测会遇到此类错误:

[ ERROR ]  Cannot infer shapes or values for node "detector/yolo-v3/meshgrid_1/mul_1/YoloRegion".
[ ERROR ]  index 2 is out of bounds for axis 0 with size 2
[ ERROR ]
[ ERROR ]  It can happen due to bug in custom shape infer function .
[ ERROR ]  Or because the node inputs have incorrect values/shapes.
[ ERROR ]  Or because input shapes are incorrect (embedded to the model or passed via --input_shape).
[ ERROR ]  Run Model Optimizer with --log_level=DEBUG for more information.
[ ERROR ]  Stopped shape/value propagation at "detector/yolo-v3/meshgrid_1/mul_1/YoloRegion" node.
 For more information please refer to Model Optimizer FAQ (/deployment_tools/documentation/docs/MO_FAQ.html), 

错误解析就是数据维度格式不对!参考: https://software.intel.com/en-us/node/802233

所以必须指定数据格式为NHWC (这种格式支持神经计算棒和CPU设备~)

转换yolov3.weights的指令如下

python convert_weights_pb.py --weights_file yolov3.weights --size 416 --data_format NHWC

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之二】 darknet的weights模型转为计算棒所需的IR模型_第1张图片

 会在OpenVINO-YoloV3-master目录下生成frozen_darknet_yolov3_tiny_model.pb frozen_darknet_yolov3_model.pb

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之二】 darknet的weights模型转为计算棒所需的IR模型_第2张图片

 


 Step 3. 将pb模型文件转为IR文件;

树莓派中安装的openVINO是阉割版功能不全。所以为了实现tensorflow格式转换成movidius的格式,还得在windows上安装一遍openVINO。安装方法参考:https://blog.csdn.net/qq_36556893/article/details/81385008

接下来就是将pb转 bin和xml了!!

需要我们取Intel官网下载计算机视觉软件开发包,下载地址:https://software.intel.com/en-us/openvino-toolkit/choose-download/free-download-windows  ;需要你注册下,然后下载个,下载个Full Package版的(Full Package);

你会得到这么个文件:w_openvino_toolkit_p_2019.1.133.exe

然后点击默认安装即可~~最后你会在 C:\Program Files (x86)\IntelSWTools\openvino_2019.1.133 目录下看到如下文件内容:

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之二】 darknet的weights模型转为计算棒所需的IR模型_第3张图片

 你需要用到的是deployment_tools这个文件夹及其内容,将其拷贝出来即可,如下图,我将其拷贝到自己新建的一个文件夹raspberry中了~

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之二】 darknet的weights模型转为计算棒所需的IR模型_第4张图片

运行以下命令(切到deployment_tools所在目录):

转yolov3.pb的指令是:

(base) C:\Users\chenshaoqi\Desktop\raspberry\deployment_tools\model_optimizer>python mo_tf.py --input_model C:\Users\chenshaoqi\Desktop\raspberry\OpenVINO-YoloV3-master\frozen_darknet_yolov3_model.pb --tensorflow_use_custom_operations_config C:\Users\chenshaoqi\Desktop\raspberry\deployment_tools\model_optimizer\extensions\front\tf\yolo_v3.json --input_shape [1,416,416,3] --data_type=FP16

 相应文件的路径切换成自己的~需要说明的是树莓派据说支持数据类型是半浮点型的FP16, 官网很多是FP32的是针对PC的;

转yolov3-tiny.pb的指令如下:

(base) C:\Users\chenshaoqi\Desktop\raspberry\deployment_tools\model_optimizer>python mo_tf.py --input_model C:\Users\chenshaoqi\Desktop\raspberry\OpenVINO-YoloV3-master\frozen_darknet_yolov3_tiny_model.pb --tensorflow_use_custom_operations_config C:\Users\chenshaoqi\Desktop\raspberry\deployment_tools\model_optimizer\extensions\front\tf\yolo_v3_tiny.json --input_shape [1,416,416,3] --data_type=FP16

 其中yolo_v3_tiny.json内容如下:

[
  {
    "id": "TFYOLOV3",
    "match_kind": "general",
    "custom_attributes": {
      "classes": 80,
      "anchors": [10, 14, 23, 27, 37, 58, 81, 82, 135, 169, 344, 319],
      "coords": 4,
      "num": 6,
      "mask": [0, 1, 2],
      "entry_points": ["detector/yolo-v3-tiny/Reshape", "detector/yolo-v3-tiny/Reshape_4"]
    }
  }
]

 coco类别总数80,框坐标是4个,锚点是12个数(2个特征层,每层3个锚点尺寸,每个尺寸两个参数:宽和高),所以num是2x3=6;输出节点名是"detector/yolo-v3-tiny/Reshape", "detector/yolo-v3-tiny/Reshape_4"

其中yolo_v3.json内容如下:

[
  {
    "id": "TFYOLOV3",
    "match_kind": "general",
    "custom_attributes": {
      "classes": 80,
      "coords": 4,
      "num": 9,
      "mask": [0, 1, 2],
      "entry_points": ["detector/yolo-v3/Reshape", "detector/yolo-v3/Reshape_4", "detector/yolo-v3/Reshape_8"]
    }
  }
]

num=3x3;  输出节点名是:"detector/yolo-v3/Reshape", "detector/yolo-v3/Reshape_4", "detector/yolo-v3/Reshape_8"

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之二】 darknet的weights模型转为计算棒所需的IR模型_第5张图片

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之二】 darknet的weights模型转为计算棒所需的IR模型_第6张图片

执行完上面两个转换指令后会生成如下6个文件:

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之二】 darknet的weights模型转为计算棒所需的IR模型_第7张图片

转换过程中,需要你安装了如下依赖项:

tensorflow>=1.2.0
networkx>=1.11
numpy>=1.12.0
test-generator==0.1.1
defusedxml>=0.5.0

用pip安装就行~(可参考:https://blog.csdn.net/c20081052/article/details/89945575)

至此,完成了darknet转神经计算棒所需的模型文件了~

 

接下来就是这么使用转换后的模型了。请参考下面系列文章。

【树莓派3b+和 intel movidius 神经元计算棒2代 系列 之三】 将darknet转的bin和xml文件在树莓派上测试yolo v3和yolo v3 tiny

 

参考:https://blog.csdn.net/LuckyXiaoSu/article/details/87814471

https://blog.csdn.net/weixin_41665225/article/details/86519032

http://itindex.net/detail/59185-%E5%B0%8F%E5%B0%8F-%E7%94%9C%E8%8F%9C-openvino

 

你可能感兴趣的:(深度学习/机器学习,NCS,树莓派,移动端(边缘设备)深度学习)