使用樹莓派和神經(jīng)計(jì)算棒實(shí)踐OpenVINO人流量統(tǒng)計(jì)項(xiàng)目
樹莓派自從2012年問世以來,一直受到廣大開發(fā)者的喜愛。今天我們使用樹莓派和英特爾神經(jīng)計(jì)算棒搭建OpenVINO開發(fā)環(huán)境,實(shí)踐人流量統(tǒng)計(jì)項(xiàng)目。
本文引用地址:http://cafeforensic.com/article/202111/429363.htm一、樹莓派系統(tǒng)刷寫
當(dāng)我們拿到樹莓派以后,首先需要安裝操作系統(tǒng)。適用于樹莓派的操作系統(tǒng)非常多,官網(wǎng)推薦的系統(tǒng)是Raspberry Pi OS,是目前應(yīng)用最為廣泛的樹莓派操作系統(tǒng),這里我們也將使用Raspberry Pi OS進(jìn)行實(shí)踐。由于樹莓派沒有配置板載閃存,因此我們將Raspberry Pi OS燒寫在一張16GB的存儲(chǔ)卡上,一般要求存儲(chǔ)卡不小于8GB。
下面介紹樹莓派操作系統(tǒng)的燒寫流程。
1、在樹莓派官方網(wǎng)站(https://www.raspberrypi.org/software/operating-systems/)下載Raspberry Pi OS系統(tǒng)鏡像。該頁面下提供了3種Raspberry Pi OS最新版本的鏡像文件,如下圖所示。
Raspberry Pi OS with desktop and recommended software集成了圖形化界面,同時(shí)預(yù)安裝了一些常用軟件,Raspberry Pi OS with desktop集成了圖形化界面,Raspberry Pi OS Lite沒有圖形化桌面。我們選擇Raspberry Pi OS with desktop and recommended software,點(diǎn)擊Downloal或者Download Torrent下載該文件。
2、在Windows系統(tǒng)的電腦中對(duì)存儲(chǔ)卡進(jìn)行格式化。
3、使用燒寫軟件Etcher將系統(tǒng)刻錄在SD卡。Etcher是支持Windows、macOS以及Linux系統(tǒng)的輕量化軟件(https://www.balena.io/etcher/)。打開Etcher后分別選擇鏡像文件目錄以及待燒寫SD卡的盤符,點(diǎn)擊Flash即可。
燒寫大概需要10~15分鐘的時(shí)間,具體時(shí)長(zhǎng)與設(shè)備的讀寫能力有關(guān)。燒寫完成后,我們?cè)赪indows的磁盤管理器中可能看到SD卡的空間只剩下幾十MB,這都是正?,F(xiàn)象,因?yàn)閃indows無法識(shí)別Linux的文件系統(tǒng)。如果系統(tǒng)提示SD卡需要格式化,切記不要選擇“是”,這會(huì)使我們之前的工作變成無用功。等待燒寫完成,將SD卡插入樹莓派背面的SD卡卡槽內(nèi),就可以連接硬件了。
二、在樹莓派上搭建OpenVINO環(huán)境
接下來,我們?yōu)闃漭缮洗罱?a class="contentlabel" href="http://cafeforensic.com/news/listbylabel/label/OpenVINO">OpenVINO開發(fā)環(huán)境。樹莓派的OpenVINO工具套件包括推理引擎和MYRIAD插件,需要搭配英特爾二代神經(jīng)計(jì)算棒進(jìn)行AI推理。由于樹莓派的OpenVINO工具套件不包含模型優(yōu)化器,我們需要在其他機(jī)器上對(duì)模型進(jìn)行轉(zhuǎn)換,然后將優(yōu)化后的模型部署在樹莓派上。
1、下載樹莓派的OpenVINO工具套件安裝包
(https://storage.openvinotoolkit.org/repositories/openvino/packages/),這里我們選擇的是2021.4版本。
2、打開樹莓派終端,新建文件夾openvino_2021,將下載好的安裝包解壓到當(dāng)前文件夾。
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、設(shè)置環(huán)境變量
source /opt/intel/openvino_2021/bin/setupvars.sh
這樣設(shè)置每次重啟終端都需要運(yùn)行上面的代碼。
永久設(shè)置環(huán)境變量
echo "source /opt/intel/openvino_2021/bin/setupvars.sh" >> ~/.bashrc
5、添加USB規(guī)則
添加當(dāng)前用戶至users組,注銷登錄使其生效。
sudo usermod -a -G users "$(whoami)"
安裝usb規(guī)則
sh /opt/intel/openvino_2021/install_dependencies/install_NCS_udev_rules.sh
6、編譯和運(yùn)行目標(biāo)檢測(cè)樣例
完成上面的步驟后,我們運(yùn)行工具套件中的人臉檢測(cè)模型,測(cè)試環(huán)境是否搭建成功。
(1)創(chuàng)建build文件夾用來編譯項(xiàng)目
mkdir build && cd build
(2)編譯人臉檢測(cè)樣例
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中下載人臉檢測(cè)模型
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)連接神經(jīng)計(jì)算棒,運(yùn)行模型
./armv7l/Release/object_detection_sample_ssd -m <path_to_model>/face-detection-adas-0001.xml -d MYRIAD -i <path_to_image>
程序運(yùn)行結(jié)束后,我們可以查看生成的out_0.bmp文件中的人臉檢測(cè)框。
至此,我們已經(jīng)完成了樹莓派OpenVINO環(huán)境的搭建。
三、open_model_zoo的使用
OpenVINO官網(wǎng)為我們提供了豐富的資源,方便我們快速構(gòu)建自己的項(xiàng)目。其中,GitHub中的open_model_zoo(https://github.com/openvinotoolkit/open_model_zoo)倉庫為我們提供了一些公開的和英特爾預(yù)訓(xùn)練好的模型,以及一些場(chǎng)景下使用OpenVINO的demo。
由于我們要在樹莓派上實(shí)踐人流量統(tǒng)計(jì)項(xiàng)目,首先我們需要在open_model_zoo中篩選能夠檢測(cè)行人的目標(biāo)檢測(cè)模型。我們選擇適用于移動(dòng)端的輕量級(jí)深度網(wǎng)絡(luò)模型mobilenet-ssd作為人群檢測(cè)模型。https://github.com/openvinotoolkit/open_model_zoo/tree/master/models/public/mobilenet-ssd
倉庫中mobilenet-ssd的介紹文檔向我們?cè)敿?xì)描述了模型的輸入、輸出、精度、計(jì)算量、參數(shù)量等。mobilenet-ssd模型是一個(gè)單階段的目標(biāo)檢測(cè)模型,使用的是Caffe框架,模型的輸入是300*300的BGR三通道圖片,計(jì)算量2.316GFLOPs,參數(shù)量5.783MParams,在VOC2007數(shù)據(jù)集上的mAP值是67%。輸入輸出部分向我們介紹了原始模型和使用模型優(yōu)化器轉(zhuǎn)換后模型的輸入輸出參數(shù)。我們可以按照自己對(duì)精度、計(jì)算量、參數(shù)量、框架以及部署環(huán)境的要求,選擇自己需要的模型。
1、模型下載器的使用
確定好模型后,我們使用OpenVINO提供的模型下載器(downloader.py)下載模型。Windows平臺(tái)下需要以管理員身份運(yùn)行Window命令提示符。
切換目錄:cd C:Program Files (x86)Intelopenvino_2021.2.185deployment_toolsopen_model_zootoolsdownloader
--help參數(shù)可以查看模型下載器的參數(shù)設(shè)置。
--print_all參數(shù)可以打印所有可以下載的模型:python downloader.py --print_all
下載模型需要在—name參數(shù)后面加上模型名稱 :python downloader.py --name mobilenet-ssd
2、模型優(yōu)化器的使用
模型優(yōu)化器Model Optimizer可以將深度學(xué)習(xí)模型轉(zhuǎn)換為能夠被推理引擎執(zhí)行的IR文件。IR文件包含一個(gè)*.xml文件用來描述網(wǎng)絡(luò)結(jié)構(gòu),還包含一個(gè)*.bin文件用來存儲(chǔ)網(wǎng)絡(luò)的權(quán)重和偏置量。
下載好模型后,使用模型優(yōu)化器優(yōu)化模型,樹莓派的OpenVINO工具套件不包含模型下載器,因此我們需要在別的機(jī)器上對(duì)模型進(jìn)行優(yōu)化。運(yùn)行下面命令,完成對(duì)模型的優(yōu)化。--help參數(shù)可以查看模型優(yōu)化器的參數(shù)設(shè)置。
python mo.py --input_model mobilenet-ssdmobilenet-ssd.caffemodel --scale 127.5 --mean_values [127.5,127.5,127.5]
四、應(yīng)用及代碼展示
1、行人檢測(cè)代碼
這里對(duì)人流量統(tǒng)計(jì)中,使用OpenVINO進(jìn)行人員檢測(cè)的代碼進(jìn)行展示。
# 導(dǎo)入模塊
from openvino.inference_engine import IECore,IENetwork
import cv2
# 定義模型、圖片路徑以及計(jì)算設(shè)備
model_xml = "mobilenet_ssd/mobilenet-ssd.xml"
model_bin = "mobilenet_ssd/mobilenet-ssd.bin"
image_file = "2.jpg"
DEVICE = 'MYRIAD'
# 初始化推理引擎對(duì)象
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
# 加載模型到計(jì)算設(shè)備
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))
# 推理計(jì)算
res = exec_net.infer(inputs={input_blob:image})
# 可視化展示推理結(jié)果
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()
人流量統(tǒng)計(jì)視頻http://v.eepw.com.cn/video/play/id/15333
在距離視頻畫面頂部2/3處畫了一條水平黃線,當(dāng)有人越過這條黃線,使用模型對(duì)其進(jìn)行檢測(cè)和追蹤,Up和Down分別對(duì)應(yīng)人員流入和人員流出,從而實(shí)現(xiàn)對(duì)特定場(chǎng)所進(jìn)入和出去人流量的統(tǒng)計(jì)。
我們?cè)跇漭缮戏謩e對(duì)使用OpenCV的dnn相關(guān)函數(shù)調(diào)用mobilenet-ssd原始模型和OpenVINO運(yùn)行優(yōu)化后的模型進(jìn)行比較。視頻中左側(cè)為OpenCV運(yùn)行,右側(cè)為OpenVINO運(yùn)行,同時(shí)對(duì)推理部分的FPS值進(jìn)行計(jì)算??梢钥闯?,樹莓派上英特爾神經(jīng)計(jì)算棒與OpenVINO搭配的FPS值明顯要優(yōu)于單獨(dú)使用OpenCV運(yùn)行原始mobilenet-ssd模型。
人流量統(tǒng)計(jì)運(yùn)行結(jié)果對(duì)比視頻http://v.eepw.com.cn/video/play/id/15334
參考資料:
樹莓派官網(wǎng):https://www.raspberrypi.org/software/operating-systems/
樹莓派搭建OpenVINO環(huán)境指南:https://docs.openvinotoolkit.org/latest/openvino_docs_install_guides_installing_openvino_raspbian.html
評(píng)論