使用树莓派和神经计算棒实践OpenVINO人流量统计项目
树莓派自从2012年问世以来,一直受到广大开发者的喜爱。今天我们使用树莓派和英特尔神经计算棒搭建OpenVINO开发环境,实践人流量统计项目。
本文引用地址://www.cghlg.com/article/202111/429363.htm一、树莓派系统刷写
当我们拿到树莓派以后,首先需要安装操作系统。适用于树莓派的操作系统非常多,官网推荐的系统是Raspberry Pi OS,是目前应用最为广泛的树莓派操作系统,这里我们也将使用Raspberry Pi OS进行实践。由于树莓派没有配置板载闪存,因此我们将Raspberry Pi OS烧写在一张16GB的存储卡上,一般要求存储卡不小于8GB。
下面介绍树莓派操作系统的烧写流程。
1、在树莓派官方网站(https://www.raspberrypi.org/software/operating-systems/)下载Raspberry Pi OS系统镜像。该页面下提供了3种Raspberry Pi OS最新版本的镜像文件,如下图所示。
Raspberry Pi OS with desktop and recommended software集成了图形化界面,同时预安装了一些常用软件,Raspberry Pi OS with desktop集成了图形化界面,Raspberry Pi OS Lite没有图形化桌面。我们选择Raspberry Pi OS with desktop and recommended software,点击Downloal或者Download Torrent下载该文件。
2、在Windows系统的电脑中对存储卡进行格式化。
3、使用烧写软件Etcher将系统刻录在SD卡。Etcher是支持Windows、macOS以及Linux系统的轻量化软件(https://www.balena.io/etcher/)。打开Etcher后分别选择镜像文件目录以及待烧写SD卡的盘符,点击Flash即可。
烧写大概需要10~15分钟的时间,具体时长与设备的读写能力有关。烧写完成后,我们在Windows的磁盘管理器中可能看到SD卡的空间只剩下几十MB,这都是正常现象,因为Windows无法识别Linux的文件系统。如果系统提示SD卡需要格式化,切记不要选择“是”,这会使我们之前的工作变成无用功。等待烧写完成,将SD卡插入树莓派背面的SD卡卡槽内,就可以连接硬件了。
二、在树莓派上搭建OpenVINO环境
接下来,我们为树莓派上搭建OpenVINO开发环境。树莓派的OpenVINO工具套件包括推理引擎和MYRIAD插件,需要搭配英特尔二代神经计算棒进行AI推理。由于树莓派的OpenVINO工具套件不包含模型优化器,我们需要在其他机器上对模型进行转换,然后将优化后的模型部署在树莓派上。
1、下载树莓派的OpenVINO工具套件安装包
(https://storage.openvinotoolkit.org/repositories/openvino/packages/),这里我们选择的是2021.4版本。
2、打开树莓派终端,新建文件夹openvino_2021,将下载好的安装包解压到当前文件夹。
sudo mkdir -p /opt/intel/openvino_2021
sudo tar -xf l_openvino_toolkit_runtime_raspbian_p_<version>.tgz --strip 1 -C /opt/intel/openvino_2021
3、安装外部软件依赖cmake
sudo apt install cmake
4、设置环境变量
source /opt/intel/openvino_2021/bin/setupvars.sh
这样设置每次重启终端都需要运行上面的代码。
永久设置环境变量
echo "source /opt/intel/openvino_2021/bin/setupvars.sh" >> ~/.bashrc
5、添加USB规则
添加当前用户至users组,注销登录使其生效。
sudo usermod -a -G users "$(whoami)"
安装usb规则
sh /opt/intel/openvino_2021/install_dependencies/install_NCS_udev_rules.sh
6、编译和运行目标检测样例
完成上面的步骤后,我们运行工具套件中的人脸检测模型,测试环境是否搭建成功。
(1)创建build文件夹用来编译项目
mkdir build && cd build
(2)编译人脸检测样例
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=armv7-a" /opt/intel/openvino_2021/deployment_tools/inference_engine/samples/cpp
make -j2 object_detection_sample_ssd
(3)在open_model_zoo中下载人脸检测模型
git clone --depth 1 https://github.com/openvinotoolkit/open_model_zoo
cd open_model_zoo/tools/downloader
python3 -m pip install -r requirements.in
python3 downloader.py --name face-detection-adas-0001
(4)连接神经计算棒,运行模型
./armv7l/Release/object_detection_sample_ssd -m <path_to_model>/face-detection-adas-0001.xml -d MYRIAD -i <path_to_image>
程序运行结束后,我们可以查看生成的out_0.bmp文件中的人脸检测框。
至此,我们已经完成了树莓派OpenVINO环境的搭建。
三、open_model_zoo的使用
OpenVINO官网为我们提供了丰富的资源,方便我们快速构建自己的项目。其中,GitHub中的open_model_zoo(https://github.com/openvinotoolkit/open_model_zoo)仓库为我们提供了一些公开的和英特尔预训练好的模型,以及一些场景下使用OpenVINO的demo。
由于我们要在树莓派上实践人流量统计项目,首先我们需要在open_model_zoo中筛选能够检测行人的目标检测模型。我们选择适用于移动端的轻量级深度网络模型mobilenet-ssd作为人群检测模型。https://github.com/openvinotoolkit/open_model_zoo/tree/master/models/public/mobilenet-ssd
仓库中mobilenet-ssd的介绍文档向我们详细描述了模型的输入、输出、精度、计算量、参数量等。mobilenet-ssd模型是一个单阶段的目标检测模型,使用的是Caffe框架,模型的输入是300*300的BGR三通道图片,计算量2.316GFLOPs,参数量5.783MParams,在VOC2007数据集上的mAP值是67%。输入输出部分向我们介绍了原始模型和使用模型优化器转换后模型的输入输出参数。我们可以按照自己对精度、计算量、参数量、框架以及部署环境的要求,选择自己需要的模型。
1、模型下载器的使用
确定好模型后,我们使用OpenVINO提供的模型下载器(downloader.py)下载模型。Windows平台下需要以管理员身份运行Window命令提示符。
切换目录:cd C:Program Files (x86)Intelopenvino_2021.2.185deployment_toolsopen_model_zootoolsdownloader
--help参数可以查看模型下载器的参数设置。
--print_all参数可以打印所有可以下载的模型:python downloader.py --print_all
下载模型需要在—name参数后面加上模型名称 :python downloader.py --name mobilenet-ssd
2、模型优化器的使用
模型优化器Model Optimizer可以将深度学习模型转换为能够被推理引擎执行的IR文件。IR文件包含一个*.xml文件用来描述网络结构,还包含一个*.bin文件用来存储网络的权重和偏置量。
下载好模型后,使用模型优化器优化模型,树莓派的OpenVINO工具套件不包含模型下载器,因此我们需要在别的机器上对模型进行优化。运行下面命令,完成对模型的优化。--help参数可以查看模型优化器的参数设置。
python mo.py --input_model mobilenet-ssdmobilenet-ssd.caffemodel --scale 127.5 --mean_values [127.5,127.5,127.5]
四、应用及代码展示
1、行人检测代码
这里对人流量统计中,使用OpenVINO进行人员检测的代码进行展示。
# 导入模块
from openvino.inference_engine import IECore,IENetwork
import cv2
# 定义模型、图片路径以及计算设备
model_xml = "mobilenet_ssd/mobilenet-ssd.xml"
model_bin = "mobilenet_ssd/mobilenet-ssd.bin"
image_file = "2.jpg"
DEVICE = 'MYRIAD'
# 初始化推理引擎对象
ie = IECore()
# 读取模型
net = IENetwork(model=model_xml, weights=model_bin)
# 配置输入输出
input_blob = next(iter(net.inputs))
out_blob = next(iter(net.outputs))
net.batch_size = 1
# 加载模型到计算设备
exec_net = ie.load_network(network=net, num_requests=1, device_name=DEVICE)
n,c,h,w = net.inputs[input_blob].shape
frame = cv2.imread(image_file)
(initial_h, initial_w, channels) = frame.shape
image = cv2.resize(frame, (w,h))
image = image.transpose((2,0,1))
# 推理计算
res = exec_net.infer(inputs={input_blob:image})
# 可视化展示推理结果
res = res[out_blob]
for obj in res[0][0]:
if obj[2] > 0.7:
xmin = int(obj[3]*initial_w)
ymin = int(obj[4]*initial_h)
xmax = int(obj[5]*initial_w)
ymax = int(obj[6]*initial_h)
class_id = int(obj[1])
color = (0,255,0)
cv2.rectangle(frame, (xmin,ymin), (xmax, ymax), color,2)
cv2.imshow("result", frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、人流量统计视频
人流量统计视频http://v.eepw.com.cn/video/play/id/15333
在距离视频画面顶部2/3处画了一条水平黄线,当有人越过这条黄线,使用模型对其进行检测和追踪,Up和Down分别对应人员流入和人员流出,从而实现对特定场所进入和出去人流量的统计。
3、运行结果对比
我们在树莓派上分别对使用OpenCV的dnn相关函数调用mobilenet-ssd原始模型和OpenVINO运行优化后的模型进行比较。视频中左侧为OpenCV运行,右侧为OpenVINO运行,同时对推理部分的FPS值进行计算。可以看出,树莓派上英特尔神经计算棒与OpenVINO搭配的FPS值明显要优于单独使用OpenCV运行原始mobilenet-ssd模型。
人流量统计运行结果对比视频http://v.eepw.com.cn/video/play/id/15334
参考资料:
树莓派官网:https://www.raspberrypi.org/software/operating-systems/
树莓派搭建OpenVINO环境指南:https://docs.openvinotoolkit.org/latest/openvino_docs_install_guides_installing_openvino_raspbian.html
评论