YOLOV5在樹莓派上的測試

距離四月二十三日YOLOV4正式發佈不到二個月的六月十日,一個名為Roboflow研發團隊在其網站發佈了一篇「YOLOv5 is Here: State-of-the-Art Object Detection at 140 FPS」文章,宣稱釋出開源最新版本的YOLOV5版(該版本位於Ultralytics LLC公司GitHUB帳戶下),截至今天(6/22)不到11天,該YOLOV5專案已經快速累積了2.3K星好評,但其作法也在AI領域捲起了千堆雪,雖然讚賞且樂於使用的網友很多,但是嘲諷的網友更是不少,指責焦點在於其版本未見公開paper、且未經官方授權允諾,很明顯是為了冒名賺曝光率。

Model size比較(最右的YOLOv5s與最左側的YOLOv4-custom)

Training time (200 epochs on an example dataset.)

mAP on validation dataset(兩者相當接近)

Roboflow並未放上與YOLOV4的比較,而是EfficientDet。

估且不論其血緣正統的有無,光看Roboflow所宣稱的mAP、速度以及模型大小較諸前代V4的大幅增進,僅有1/10的體積卻能達到相近的mAP,就已經教人讚嘆不已,這是怎麼作到的?(下方圖表來自:https://models.roboflow.ai/object-detection/yolov5)

不過,也有網友認為這是Roboflow公司的障眼法:

  1. YOLOV4使用正統Darknet與PYTorch版YOLOV5兩者的 framework不同。
  2. YOLOV5s號稱mAP與YOLOV4接近,但其使用的image size為640,大於YOLOV4的608。因此YOLOV4作者AlexeAB提出下列比較,在相同的Pytorch YOLO framework下,以相同的尺寸,重新比較m AP,發現YOLOV4s(big YOLOV4)較YOLOV5 large尺寸的版本好。

  • weights size: YOLOv4s 245 MB vs YOLOv5l 192 MB vs YOLOv5x 366 MB
  • test-dev accuracy on MSCOCO: YOLOv4s-608 45% AP vs YOLOv5l-736 44.2% AP (YOLOv4 is more accurate)
  • speed with batch=16: YOLOv4s-608 10.3ms vs YOLOv5l-736 13.5ms (YOLOv4 is faster)

但平心而論,這個所謂非官方版的YOLOV5版,雖然在釋出及推廣的賺曝光率方法上惹人疑義,但是這個YOLOV5版所提供的訓練、推論工具,以及模型的多選擇性及運作效率上,皆有YOLO官方值得去學習導入的地方。

在樹莓派使用YOLOV5

由於YOLOV5號稱其體積較YOLOV4小了近十分之一,只有27MB,這點實在讓人很興奮,因為目前官方所釋出的各系列版本中,只有Tiny能夠在樹莓派不透過加速器直接運行,因此,我們馬上來測試看看只有27MB號稱與YOLOV4同級的YOLOV5s版本是否能在樹莓派3 B+上運行。在進行下列的安裝前,請先準備好一台安裝好最新版本Rasbian OS的樹莓派3或4皆可。

  1. 必要安裝
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt install libopenblas-dev libblas-dev m4 cmake cython python3-dev python3-yaml python3-setuptools
sudo apt-get install libavutil-dev libavcodec-dev libavformat-dev libswscale-dev
  1. Pytorch, Torchvision 安裝

有兩種方式,最簡單的方法為下載pre-compiled Python wheel files直接安裝

https://github.com/sungjuGit/Pytorch-and-Vision-for-Raspberry-Pi-4B

如果無法安裝或需要最新版本,只能採用source 安裝 (from: https://sites.google.com/view/steam-for-vision/raspberry-pi/PytorchRP4)

mkdir pytorch_install
cd pytorch_install
git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
git submodule update --remote third_party/protobuf
export NO_CUDA=1
export NO_DISTRIBUTED=1
export NO_MKLDNN=1
export NO_NNPACK=1
export NO_QNNPACK=1
python setup.py build
sudo -E python setup.py install
cd ..
mkdir pytorch_vision_install && cd pytorch_vision_install
git clone --recursive https://github.com/pytorch/vision
cd vision
sudo -E python setup.py install
  1. 下載安裝YOLOV5
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
cat requirements.txt

這些是YOLOV5要求安裝的套件資訊,請完成安裝。

numpy==1.17
opencv-python
torch >= 1.5
matplotlib
pycocotools
tqdm
pillow
tensorboard
pyyaml

在樹莓派使用YOLOV4

同樣的,為了進行比較,我們在同一台樹莓派上也安裝最新版本的Darknet。

  1. 必要的安裝(最新編譯版本4.1.1.26 opencv在樹莓派上有bug)
pip install opencv_contrib_python==4.1.0.25
sudo apt install libopencv-dev
  1. 安裝Darknet
git clone https://github.com/AlexeyAB/darknet.git

cd darknet

修改Makefile前方的參數如下:

GPU=0
CUDNN=0
CUDNN_HALF=0
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1

存檔後執行make 並確認成功編譯。

測試用的模型

我們要在樹莓派上,使用Darknet及Pytorch分別執行V4以及V5的YOLO模型來推論,並比較其所花費的時間。使用的模型是我在上文中所訓練的人體/頭部偵測模型,計有YOLOV3. YOLOV3-Tiny, YOLOV4, YOLOV5,該模型為使用了15,000張的CrowdHuman dataset再加上一部份自行標記圖片所訓練出來,可大量且準確的抓出圖片中所有的人體和頭部。

開始測試

下方為我們使用的測試圖片:

C:\Users\ch.tseng\Downloads\77655600-asian-people-are-across-the-crosswalk.jpg

在樹莓派使用darknet執行YOLOV3 (235MB)

./darknet detector test \
../test_models/yolov3/obj.data \
../test_models/yolov3/yolov3.cfg \
../test_models/yolov3/yolov3_181000.weights \
../test_models/77655600-asian-people-are-across-the-crosswalk.jpg \
-ext_output output_yolov3.jpg \
-thresh 0.15 -dont_show

出現memory error!

看來除非透過諸如NCS的加速器,否則樹莓派無法直接運行235MB的YOLOV3 model。

在樹莓派使用darknet執行YOLOV3-Tiny (34MB)

./darknet detector test \
../test_models/yolov3-tiny/obj.data \
../test_models/yolov3-tiny/yolov3-tiny.cfg \
../test_models/yolov3-tiny/yolov3-tiny_1415693.weights \
../test_models/77655600-asian-people-are-across-the-crosswalk.jpg \
-ext_output output_yolov3_tiny.jpg \
-thresh 0.15 -dont_show

樹莓派成功推論完成,只是花了不少的時間,從load模型到完成推論,總計花了1分18秒,單張影像的推論時間約67秒。

在該圖片中,YOLOV3-Tiny辨識出84個人體以及85個頭部。

C:\Users\ch.tseng\Downloads\predictions.jpg

在樹莓派使用darknet執行YOLOV4 (245MB)

./darknet detector test \
../test_models/yolov4/obj.data \
../test_models/yolov4/yolov4.cfg \
../test_models/yolov4/yolov4_18000.weights \
../test_models/77655600-asian-people-are-across-the-crosswalk.jpg \
-ext_output output_yolov4.jpg \
-thresh 0.15 -dont_show

Model load到一半便發生error了,看來執行YOLOV4所需要的資源比起YOLOV3還要更多。

在樹莓派使用darknet執行YOLOV5s (27MB)

python ~/yolov5/detect.py \
--weights ~/test_models/yolov5s/last_yolov5s_crownHuman.pt \
--img-size 640 --conf-thres 0.25 \
--source ~/test_models/77655600-asian-people-are-across-the-crosswalk.jpg

樹莓派成功推論完成,從load模型到完成推論,總計接近21秒,推論一張圖片時間則僅約8.04秒。

YOLOV5s所抓到的數量,分別是:身體120個,頭部92個。

C:\Users\ch.tseng\Downloads\77655600-asian-people-are-across-the-crosswalk.jpg

在樹莓派使用darknet執行YOLOV5m (84MB)

在上面的測試中,號稱與YOLOV4同級的YOLOV5s可以在樹莓派執行,而且速度比起YOLOV3-Tiny更快,那較大的版本YOLOV5m是否可以呢?

python ~/yolov5/detect.py \
--weights ../test_models/yolov5m/best_yolov5m_640_crownHuman.pt \
--img-size 640 --conf-thres 0.25 \
--source ~/test_models/77655600-asian-people-are-across-the-crosswalk.jpg

結果樹莓派也能夠成功推論完成,從load模型到完成推論,總計接近36秒,而推論一張圖片時間約19.66秒。

YOLOV5m所抓到的數量,分別是:身體108個,頭部90個。

C:\Users\ch.tseng\Downloads\77655600-asian-people-are-across-the-crosswalk.jpg

在樹莓派使用darknet執行YOLOV5l (191MB)

YOLOV5s, YOLOV5m都可以順利在樹莓派執行,接下來,繼續測試參數更多更大的YOLOV5l是否可以。

python ~/yolov5/detect.py \
--weights ../test_models/yolov5l_640/best_yolov5l_640_crownHuman.pt \
--img-size 640 --conf-thres 0.25 \
--source ~/test_models/77655600-asian-people-are-across-the-crosswalk.jpg

連YOLOV5l的版本樹莓派也能夠成功推論完成,從load模型到完成推論,總計接近53秒,而推論一張圖片時間約39.63秒。

YOLOV5l所抓到的數量,分別是:身體119個,頭部91個。

C:\Users\ch.tseng\Downloads\77655600-asian-people-are-across-the-crosswalk.jpg

經過上方的測試發現,不需要任何加速器,Pytorch版的YOLOV5從小型的S到大型的L版本,在樹莓派3上皆可正常運行。

相同模型輸入尺寸不同

我們另外找了以下三張相片進行測試。

C:\Users\ch.tseng\Downloads\p1.jpg C:\Users\ch.tseng\Downloads\p3.jpg C:\Users\ch.tseng\Downloads\p4.jpg
身體 身體 身體
YOLOV3-Tiny 133 104 133 126 163 136
YOLOV5s-640 146 154 109 191 104 196
YOLOV5s-960 152 148 117 183 123 177
YOLOV5m-640 143 157 105 195 106 194
YOLOV5m-960 151 149 115 185 130 170
YOLOV5l-640 142 158 107 193 103 197

YOLOV5版本的input size,若從640加大到960除了提高辨識率,其實並不會增加weights檔的大小,但是會影響到推論的時間。以YOLOV5s模型來說,我們分別訓練了input size為640與960的模型,會發現它們的weights大小皆同樣為27MB,但樹莓派推論時所需時間由640px的10.69秒增加到960px的20.77秒。

如下圖,YOLOV5若使用相同模型但加大input size,可在不增加模型大小情況下顯著的提昇辨識率。

YOLOV5s 640

YOLOV5s 960

YOLOV5的小體積高mAP,對於edge端的開發者來說,是相當好用的選擇,在不使用外部AI加速器的情況,各版本也能夠直接運行,相當值得推薦。