距離四月二十三日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公司的障眼法:
- YOLOV4使用正統Darknet與PYTorch版YOLOV5兩者的 framework不同。
- 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皆可。
- 必要安裝
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
- 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
- 下載安裝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。
- 必要的安裝(最新編譯版本4.1.1.26 opencv在樹莓派上有bug)
pip install opencv_contrib_python==4.1.0.25 sudo apt install libopencv-dev
- 安裝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再加上一部份自行標記圖片所訓練出來,可大量且準確的抓出圖片中所有的人體和頭部。
開始測試
下方為我們使用的測試圖片:
在樹莓派使用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個頭部。
在樹莓派使用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個。
在樹莓派使用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個。
在樹莓派使用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個。
經過上方的測試發現,不需要任何加速器,Pytorch版的YOLOV5從小型的S到大型的L版本,在樹莓派3上皆可正常運行。
相同模型輸入尺寸不同
我們另外找了以下三張相片進行測試。
頭 | 身體 | 頭 | 身體 | 頭 | 身體 | |
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加速器的情況,各版本也能夠直接運行,相當值得推薦。