使用樹莓派和神經計算棒實踐OpenVINO人流量統計項目
樹莓派自從2012年問世以來,一直受到廣大開發者的喜愛。今天我們使用樹莓派和英特爾神經計算棒搭建OpenVINO開發環境,實踐人流量統計項目。
本文引用地址:http://www.ex-cimer.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,這都是正?,F象,因為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
評論