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