接上一章,分别在树莓派和Windows上安装了NCS环境,接下来进行格式转换,在windows训练Caffe或TensorFlow模型,编译成NCS可以执行的graph;测试端则面向ncs python mvnc api编程,可以运行在树莓派上raspbian stretch版本,也可以运行在训练端这种机器上。
三、格式转换
1、下载darknet版官网训练模型
如果没有现成的,可以从pjreddie网站下载
Yolo V3 COCO weights(237MB),Tiny Yolo V3 COCO weights(34MB), 标签文件 coco.names
2、将weights文件转换为pb文件
OpenVINO不支持直接使用Yolo V3的.weights文件,目前仅支持ONNX、TensorFlow、Caffe和MXNet。需要先把.weights文件转换成TensorFlow的.pb文件。
自己在桌面新建一个文件夹例如raspberry,将下载的仓库放进新建的文件夹进行解压,并将前面下载的两个权重放进解压的仓库中。
转换yolov3.weights的指令如下:
1 | 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,然后做目标检测会遇到此类错误:
1 | [ ERROR ] Cannot infer shapes or values for node "detector/yolo-v3/meshgrid_1/mul_1/YoloRegion". |
错误解析就是数据维度格式不对!参考: https://software.intel.com/en-us/node/802233
所以必须指定数据格式为NHWC (这种格式支持神经计算棒和CPU设备)
转换yolov3.weights的指令如下:
1 | python convert_weights_pb.py --weights_file yolov3.weights --size 416 --data_format NHWC |
会在OpenVINO-YoloV3-master目录下生成frozen_darknet_yolov3_tiny_model.pb 和 frozen_darknet_yolov3_model.pb ;
3、将pb模型文件转为IR文件
将之前安装好的openvino文件夹里的deployment_tools文件夹拷贝出来。
将拷贝的文件夹粘贴进raspberry文件夹。
切到deploment_tools目录下的model_optimizer并运行以下命令:
转yolov3.pb的指令是:
1 | E:\桌面\raspberry\deployment_tools\model_optimizer>python mo_tf.py --input_model E:\桌面\raspberry\OpenVINO-YoloV3-master\frozen_darknet_yolov3_model.pb --tensorflow_use_custom_operations_config E:\桌面\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的指令如下:
1 | E:\桌面\raspberry\deployment_tools\model_optimizer>python mo_tf.py --input_model E:\桌面\raspberry\OpenVINO-YoloV3-master\frozen_darknet_yolov3_tiny_model.pb --tensorflow_use_custom_operations_config E:\桌面\raspberry\deployment_tools\model_optimizer\extensions\front\tf\yolo_v3_tiny.json --input_shape [1,416,416,3] --data_type=FP16 |
执行完上述指令会生成以下六个文件:
转换过程中,需要你安装了如下依赖项:
1 | 1. tensorflow>=1.2.0 |
用pip安装就行
四、在树莓派上部署
1、环境激活
打开树莓派,终端激活OpenVINO工具包环境变量,后续操作都在这个终端窗口下执行
1 | source /home/pi/Downloads/l_openvino_toolkit_runtime_raspbian_p_2019.3.334/bin/setupvars.sh |
当完成如上操作后,会在终端显示如下:
1 | [setupvars.sh] OpenVINO environment initialized |
2、编译和运行yoloV3
将上文转换的六个模型文件拷贝到树莓派上的/home/pi/Downloads/yolo_model目录下(可更改成你自己的目录);并将coco.names复制两份,分别重命名为:frozen_darknet_yolov3_model.labels 和frozen_darknet_yolov3_tiny_model.labels ,所以/home/pi/Downloads/yolo_model目录下共有以下8个文件
接着
1 | mkdir build && cd build |
编译
1 | cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=armv7-a" /home/pi/Downloads/l_openvino_toolkit_runtime_raspbian_p_2019.3.334/deployment_tools/inference_engine/samples |
编译目标检测例子
1 | make -j2 object_detection_demo_yolov3_async |
编译完成后,会在/build/armv 7l/Release下生成可执行文件:object_detection_demo_yolov3_async;接下来就是给执行文件传入模型文件就可以跑深度学习了!
(测摄像头)运行如下指令:
1 | ./armv7l/Release/object_detection_demo_yolov3_async -m /home/pi/Downloads/yolo_model/frozen_darknet_yolov3_model.xml -d MYRIAD -i cam |
此处-i cam表示读取的是camera;
(测视频文件)运行如下指令:
1 | ./armv7l/Release/object_detection_demo_yolov3_async -m /home/pi/Downloads/yolo_model/frozen_darknet_yolov3_model.xml -d MYRIAD -i /path_to_video |
测试视频需要给-i指定视频路径;
3、编译与运行yoloV3 tiny
同样的编译和执行流程,在编译前需要你更改下源cpp文件,先找到yolo v3的源文件,在:/home/pi/Downloads/l_openvino_toolkit_runtime_raspbian_p_2019.3.334/deployment_tools/inference_engine/samples/object_detection_demo_yolov3_async/这个目录下;你可以发现这个目录下有
main.cpp
CMakelists.txt
object_detection_demo_yolov3_async.hpp
README.md
我们需要更改main.cpp,更改前先备份一份main.cpp
更改: 第126行左右,注释掉原先yolov3的锚点框尺寸,更改成yolo v3 tiny的(共12个数:10, 14, 23, 27, 37, 58, 81, 82, 135, 169, 344, 319)
更改完保存并退出。
然后重新编译:
1 | make -j2 object_detection_demo_yolov3_async |
再编译
1 | ./armv7l/Release/object_detection_demo_yolov3_async -m /home/pi/Downloads/yolo_model/frozen_darknet_yolov3_tiny_model.xml -d MYRIAD -i cam |