树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection

使用英特尔神经计算棒主要有两个原因,一、单独在树莓派4B上测试yolo会出现“段错误”,修改过后又会出现“总线错误”,这个问题没有得到解决,只好添加神经计算棒(有出现并解决此类问题的小伙伴可以讨论一下)二、使用神经计算棒可以明显提高模型在树莓派这种计算量较小的设备上的速度。

避免踩坑,总的步骤如下:

一、在树莓派上安装NCS环境

二、在windows上安装NCS环境(格式转换用到)

三、格式转换

四、在树莓派上部署

具体步骤:

一、在树莓派上安装NCS环境

1、下载OpenVINO toolkit for Raspbian

这是OpenVINO工具包的最新版本,点击下面链接进行下载
l_openvino_toolkit_runtime_raspbian_p_2019.3.334.tgz
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第1张图片

2、树莓派上安装OpenVINO工具包

下载好工具包既可以安装了,可以参考官网教程:Install OpenVINO™ toolkit for Raspbian* OS
我这里命令和官网有些许不同,但是效果是一样的。
下载完后工具包位于/home/pi/Downloads目录下,如果不是,可以创建一个Downloads目录并把工具包放在此目录下
切换至Downloads目录下:

cd  ~/Downloads

解压包:

tar -xf l_openvino_toolkit_runtime_raspbian_p_2019.3.334.tgz

安装cmake(后面会用到):

apt install cmake

配置路径与环境:
执行以下命令,会自动对setupvars.sh文件做修改

sed -i "s||$(pwd)/l_openvino_toolkit_runtime_raspbian_p_2019.3.334|" l_openvino_toolkit_runtime_raspbian_p_2019.3.334/bin/setupvars.sh

配置环境(两种做法):
一种临时的,只对该次窗口有效

suorce l_openvino_toolkit_runtime_raspbian_p_2019.3.334/bin/setupvars.sh

另一种永久的

leafpad /home/pi/.bashrc

打开.bashrc文件,在最后一行添加

source /home/pi/Downloads/l_openvino_toolkit_runtime_raspbian_p_2019.3.334/bin/setupvars.sh

树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第2张图片
保存,再打开一个终端,如果出现:

[setupvars.sh] OpenVINO environment initialized

就表示成功了
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第3张图片
添加USB规则:
将当前Linux用户添加到users组:

sudo usermod -a -G users "$(whoami)"

注:1、"$(whoami)"是用户名,2、这里要说的是我们现在是root用户,如果打开新窗口的话起始用户是pi,所以出现[ setupvars.sh] OpenVINO environment initialized,是对于pi用户来说的。如果在新窗口中用root执行程序,其实并没有成功加载[ setupvars.sh] OpenVINO environment initialized,需要自己再执行一遍
source/home/pi/Downloads/l_openvino_toolkit_runtime_raspbian_p_2019.3.334/bin/setupvars.sh,才能给root用户配置好OpenVINO environment initialized。
接下来配置USB规则,执行:

sh l_openvino_toolkit_runtime_raspbian_p_2019.3.334/install_dependencies/install_NCS_udev_rules.sh

树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第4张图片
到这里就成功安装好计算棒所需要的所有东西了。

demo测试验证安装是否成功
运行人脸检测的实例

cd l_openvino_toolkit_runtime_raspbian_p_2019.3.334/deployment_tools/inference_engine/samples
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=armv7-a"
make -j2 object_detection_sample_ssd

编译完成后,下载网络和权重文件:

wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.bin
wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.xml

然后自己在网上找一张人脸的图片,执行

./armv7l/Release/object_detection_sample_ssd -m face-detection-adas-0001.xml -d MYRIAD -i 图片的绝对路径

如果运行成功,会在build文件夹下输出一种观念out_0.bmp图片,即表示计算棒运行成功。
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第5张图片
Opencv+python api 调用方法
新建一个文件夹,先建立一个face_detection.py文件,写入:

import cv2 as cv
# Load the model 
net = cv.dnn.readNet('face-detection-adas-0001.xml', 'face-detection-adas-0001.bin') 
# Specify target device 
net.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)
# Read an image 
frame = cv.imread('/path/to/image')
# Prepare input blob and perform an inference 
blob = cv.dnn.blobFromImage(frame, size=(672, 384), ddepth=cv.CV_8U) net.setInput(blob) 
out = net.forward()
# Draw detected faces on the frame 
for detection in out.reshape(-1, 7): 
    confidence = float(detection[2]) 
    xmin = int(detection[3] * frame.shape[1]) 
    ymin = int(detection[4] * frame.shape[0]) 
    xmax = int(detection[5] * frame.shape[1]) 
    ymax = int(detection[6] * frame.shape[0])
    if confidence > 0.5:
        cv.rectangle(frame, (xmin, ymin), (xmax, ymax), color=(0, 255, 0))
# Save the frame to an image file 
cv.imwrite('out.png', frame)

在文件夹中放入刚刚我们下载的那两个文件:face-detection-adas-0001.bin和face-detection-adas-0001.xml还有用于检测用的脸的图片,执行:

python3 face_detection.py

程序运行成功,文件夹看见输出结果,检测成功。测试摄像头就就不写了,有需要的可以和我讨论。
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第6张图片

二、在windows上安装NCS环境(格式转换用到)

1、安装英特尔®分布式OpenVINO™工具包核心组件

可以进入OpenVINO官网参考官方安装步骤,也可以参考我的安装步骤。

英特尔®分布式OpenVINO™工具包核心组件安装步骤:

  1. 如果您尚未下载英特尔®分布式OpenVINO™工具包,请下载最新版本。默认情况下,该文件将保存到Downloads目录w_openvino_toolkit_p_2019.3.379.exe。

  2. 转到该Downloads文件夹。

  3. 双击w_openvino_toolkit_p_2019.3.379.exe。将打开一个窗口,您可以选择安装目录和组件。默认安装目录是C:\Program Files (x86)\IntelSWTools\openvino_2019.3.379 .为了简便,还会创建 C:\Program Files (x86)\IntelSWTools\openvino安装目录快捷方式。如果选择其他安装目录,安装程序将为您创建目录:
    树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第7张图片

  4. 单击下一步。

  5. 系统会询问您是否同意收集信息。选择您选择的选项。单击下一步。

  6. 如果您缺少外部依赖项,则会看到警告屏幕。记下您缺少的依赖项。**此时您不需要采取任何行动。**安装英特尔®分布式OpenVINO™工具包核心组件后,将向您提供安装缺少的依赖项说明。下面的屏幕表示您缺少两个依赖项:
    树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第8张图片

  7. 单击下一步。

  8. 安装的第一部分完成后,最终屏幕会通知您已安装核心组件并仍需执行自他步骤:
    树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第9张图片

  9. 单击完成以关闭安装向导。一个新的浏览器窗口将打开到安装指南的下一部分,以设置环境变量。您在同一文档中。如果您在未先打开本安装指南的情况下运行安装,则会打开新窗口。

  10. 如果安装指示您必须安装依赖项,请先安装它们。如果没有缺少的依赖项,则可以继续设置环境变量。

2、安装带有C++和MSBuild的Microsoft Visual Studio

这里只介绍免费版Microsoft Visual Studio 2019的安装步骤,2017或2015版本也是可以的,有问题可以看看其他博主或是一起讨论。

  1. 转到Visual Studio下载页面
  2. 点击免费下载的Visual Studio的Community版本:vs_community__152320450.1557491708.exe类似的文件保存在Downloads文件夹中
  3. 双击可执行文件vs_community__152320450.1557491708.exe以启动Visual Studio 安装程序。
  4. 在打开的窗口中,单击“继续”。
  5. 从“工作负载”的选项卡中,使用复选框选择通用Windows平台开发使用C++进行桌面开发
  6. 在“单个组件”的选项卡中,选择MSBuild
  7. 不做任何更改。单击安装。安装开始,大概需要30分钟才能完成。
  8. 如果在安装完成后看到重新启动计算机的提示,请将其关闭。

3、安装CMake

注意:如果使用Microsoft Visual Studio 2019,则需要安装CMake 3.14。

  1. 转到CMake下载站点

  2. 在获取软件标题下,单击第一段中最新稳定的链接。您的屏幕显示最新版本信息。

  3. 向下滚动到Windows win64-x64 Installer行。

  4. 单击关联的文件名以下载安装程序。文件名将具有扩展名.msi。该文件将保存到您的Downloads文件夹中。

  5. 转到该Downloads文件夹。

  6. 双击该文件以启动安装程序。

注意:如果安装了以前版本的CMake,系统会提示您将其卸载。在安装新版本之前,必须先卸载以前的版本。按照屏幕上的说明操作,然后再次启动安装程序以安装新版本。

  1. 在安装程序中,为所有用户选择“ 将CMake添加到系统PATH ”选项:

  2. 单击下一步。

  3. 安装完成后单击“ 完成 ”。

官网没有找到CMake3.14的,可以点击CMake3.14 进行下载。

4、安装python3.6.5

运行模型优化器需要带有pip的python 3.6.5。使用以下步骤安装正确版本的python软件。

1.转到Python 3.6.5下载页面,然后单击Windows x86-64可执行安装程序以下载可执行文件。该文件保存python-3.6.5-amd64.exe在您的Downloads文件夹中。

2.双击该文件以启动安装。

3.确保屏幕顶部显示python 3.6.5(64位)。

4.重要信息:在安装屏幕的底部,选择“ 将Python 3.6添加到PATH”。

5.单击安装屏幕顶部附近的立即安装,然后完成安装。

6.安装完成后,单击“ 关闭”。

5、设置环境变量

在编译和运行OpenVINO™应用程序之前,必须更新多个环境变量。打开命令提示符并运行以下批处理文件以临时设置环境变量:

C:\Program Files(x86)\IntelSWTools\openvino\bin\setupvars.bat

(可选):关闭“命令提示符”窗口时,将删除OpenVINO工具箱环境变量。作为选项,您可以手动永久设置环境变量。

下列步骤进一步确认使用OpenVINO

1、配置模型优化程序

重要信息:这些步骤是必需的。您必须为至少一个框架配置Model Optimizer。如果您未完成本节中的步骤,模型优化程序将失败。

C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\model_optimizer
2、模型优化器配置步骤

您可以一次为所有受支持的框架配置模型优化程序,也可以一次为一个框架配置模型优化程序。选择最适合您需求的选项。如果看到错误消息,请确保已安装所有依赖项。
选项1:同时为所有支持的框架配置Model Optimizer
打开命令提示符,转到Model Optimizer条件目录,执行下列命令以配置Caffe *,TensorFlow *,MXNet *,Kaldi *和ONNX *的模型优化器。

install_prerequisites.bat

选项2:分别为每个框架配置模型优化器

  • 对于Caffe:
install_prerequisites_caffe.bat
  • 对于TensorFlow:
install_prerequisites_tf.bat
  • 对于MXNet:
install_prerequisites_mxnet.bat
  • 对于ONNX:
install_prerequisites_onnx.bat
  • 对于Kaldi:
install_prerequisites_kaldi.bat
3、使用验证脚本验证您的安装

**注意:**要运行英特尔处理器显卡,英特尔Movidius™神经计算棒,英特尔神经计算棒2,或英特尔®视觉加速器设计与英特尔Movidius的VPU™演示应用程序,请确保您完成了额外的安装步骤第一。
执行下列代码:

cd C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\demo\
4、运行图像分类验证脚本

要运行该脚本,请启动该demo_squeezenet_download_convert_run.bat文件:

demo_squeezenet_download_convert_run.bat

您将获得如图所示:
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第10张图片

5、运行推理管道验证脚本
demo_security_barrier_camera.bat

您将打开两个窗口:

  • 一个控制台窗口,显示有关演示执行的任务的信息
  • 图像查看器窗口,显示结果帧,并将检测结果渲染为边界框,类似于以下内容:
    树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第11张图片

三、格式转换

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文件。
官方推荐转换工具为: https://github.com/mystic123/tensorflow-yolo-v3

我这边推荐这个仓库:https://github.com/PINTO0309/OpenVINO-YoloV3
自己在桌面新建一个文件夹例如raspberry,将下载的仓库放进新建的文件夹进行解压,并将前面下载的两个权重放进解压的仓库中。

转换yolov3.weights的指令如下:

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

树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第12张图片
会在OpenVINO-YoloV3-master目录下生成frozen_darknet_yolov3_tiny_model.pbfrozen_darknet_yolov3_model.pb
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第13张图片

3、将pb模型文件转为IR文件

将之前安装好的openvino文件夹里的deployment_tools文件夹拷贝出来。
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第14张图片
将拷贝的文件夹粘贴进raspberry文件夹。
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第15张图片
切到deploment_tools目录下的model_optimizer并运行以下命令:
转yolov3.pb的指令是:

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的指令如下:

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

树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第16张图片

树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第17张图片
执行完上述指令会生成以下六个文件:
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第18张图片
转换过程中,需要你安装了如下依赖项:

 1. tensorflow>=1.2.0 
 2. networkx>=1.11
 3. numpy>=1.12.0
 4. test-generator==0.1.1
 5. defusedxml>=0.5.0

用pip安装就行

四、在树莓派上部署

1、环境激活

打开树莓派,终端激活OpenVINO工具包环境变量,后续操作都在这个终端窗口下执行

source /home/pi/Downloads/l_openvino_toolkit_runtime_raspbian_p_2019.3.334/bin/setupvars.sh

当完成如上操作后,会在终端显示如下:

[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个文件
树莓派4B+NCS2代测试yolov3和yolov3_tiny实现object_detection_第19张图片
接着

mkdir build && cd build

编译

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

编译目标检测例子

make -j2 object_detection_demo_yolov3_async

编译完成后,会在/build/armv 7l/Release下生成可执行文件:object_detection_demo_yolov3_async;接下来就是给执行文件传入模型文件就可以跑深度学习了!

(测摄像头)运行如下指令:

./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;

(测视频文件)运行如下指令:

./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)
更改完保存并退出。
然后重新编译:

make -j2 object_detection_demo_yolov3_async

再编译

./armv7l/Release/object_detection_demo_yolov3_async -m /home/pi/Downloads/yolo_model/frozen_darknet_yolov3_tiny_model.xml -d MYRIAD -i cam

接下来就是优化了,感兴趣的小伙伴欢迎讨论……

你可能感兴趣的:(深度学习)