Raspberry Pi學習筆記(二十七):在Pi上執行YOLOv3
#20200202更新:
該文使用的是Raspberry Pi 4B和 Movidius NCS2(第一代不支援)
該文章發現,使用Pi Camera(FPS:4.28)進行YOLOv3偵測時,FPS表現比使用MP4影片檔(FPS:2.66)進行偵測還要好。作者推論是輸入MP4影片時,需要用到CPU去做運算解碼;而使用Webcam/USB Camera/Pi Camera進行偵測時,不太需要用CPU處理,因此表現較好。
然而,該文使用的是Tiny-YOLO的關係,其mAP在COCO資料集的表現(23.7%)遠低於YOLO(51~57%)。
後續如果要提升mAP的話,可以嘗試以下不同的方法:
- Larger, more accurate YOLO models(使用一般的YOLO模型)
- Single Shot Detectors (SSDs)(作者推薦在嵌入式裝置使用)
- Faster R-CNNs
- RetinaNet
#待補:
在Pi上搭配NCS I執行YOLOv3,本文目前所出現的方式是YOLOv1版本,且必須將.weights or .backup檔案轉換成.caffemodel 才能正常執行,正在找尋NCS I能直接執行.weights or .backup檔案的方法
本文將提供三個在Pi上執行YOLOv3的方式
- AlexeyAB
- darknet-nnpack
- Intel NCS I
AlexeyAB版 : 比起官方pjreddie版快上不少,也修正不少錯誤(因此本文就不附上官方pjreddie版的教學了。),但是執行速度還是很慢,YOLOv3-tiny花費約 30秒。可以執行所有YOLO模型。
下載&編譯
git clone https://github.com/AlexeyAB/darknet
cd darknet
make
下載Pre-trained Weights
#YOLOv3
wget https://pjreddie.com/media/files/yolov3.weights#YOLOv2
wget https://pjreddie.com/media/files/yolov2.weights#Tiny YOLOv3
wget https://pjreddie.com/media/files/yolov3-tiny.weights
執行辨識
#YOLOv3
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg#YOLOv2
./darknet detect cfg/yolov2.cfg yolov2.weights data/dog.jpg#Tiny YOLOv3
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
darknet-nnpack : 針對Arm處理器進行優化,使用YOLOv3-tiny模型進行辨識只要 1~1.2秒左右,而且不用任何額外的GPU。不能執行YOLOv3,只能執行tiny版。
安裝
sudo apt install ninja-build
sudo apt install clang
sudo pip3 install --upgrade git+https://github.com/Maratyszcza/PeachPy
sudo pip3 install --upgrade git+https://github.com/Maratyszcza/confu
編譯NNPACK-darknet
git clone https://github.com/thomaspark-pkj/NNPACK-darknet.gitconfu setup
python ./configure.py
ninja
sudo cp -a lib/* /usr/lib/
sudo cp include/nnpack.h /usr/include/
sudo cp deps/pthreadpool/include/pthreadpool.h /usr/include/#在進行ninja這個步驟的時候盡量不要讓Pi執行其他任務,避免當機,如果當機重開後再進行ninja即可
darknet-nnpack
darknet-nnpack是進行辨識的主要程式
git clone https://github.com/thomaspark-pkj/darknet-nnpack.git
cd darknet-nnpack
make
當完成make編譯之後,我們可以透過預先訓練好的weights檔案來進行物件偵測,此版本比起AlexeyAB快上30倍(以YOLOv3-tiny為例)
如果要結合Movidius NCS I該怎麼做呢?
YOLOv1 with Movidius NCS I