以下文章來源于GiantPandaCV ,作者BBuf本文來自 @BBuf 的社群專欄 GiantPandaCV
最近一些群友有詢問我有沒有哪些YOLO的算法推薦,考慮到現在Pytorch是做實驗發論文最流行的深度學習架構,是以我就針對Pytorch實作的YOLO項目做了一個盤點和彙總,真心希望可以幫助到入門目标檢測的同學。寫作不易,要是覺得這篇文章有用就點個關注吧QAQ。
前言
這篇推文的目的是為了給目标檢測領域的剛入門或者希望進一步提升自己的能力的同學做的一個YOLO項目推薦。推薦的項目都是目前流行,Star較高,用Pytorch架構實作的基于YOLO的檢測項目,建議收藏和學習。
推薦項目
Pytorch-YOLOv3
- 項目位址:https://github.com/eriklindernoren/PyTorch-YOLOv3
- 項目特點:代碼簡潔,适合學習,最原始的YOLOV3實作,沒有什麼特殊Trick。
- 在COCO資料集上的mAP50測試結果如下:
Model | mAP (min. 50 IoU) |
---|---|
YOLOv3 608 (paper) | 57.9 |
YOLOv3 608 (this impl.) | 57.3 |
YOLOv3 416 (paper) | 55.3 |
YOLOv3 416 (this impl.) | 55.5 |
- 推理時間:
Backbone | GPU | FPS |
---|---|---|
ResNet-101 | Titan X | 53 |
ResNet-152 | Titan X | 37 |
Darknet-53 (paper) | Titan X | 76 |
Darknet-53 (this impl.) | 1080ti | 74 |
- 可視化效果:

giraffe.png
dog
- 總結:本項目适合剛學習目标檢測的新手,可以快速上手,了解YOLOV3的原理,為進一步的實驗和工作打下基礎。
ultralytics-yolov3
- 項目位址:https://github.com/ultralytics/yolov3
- 項目特點:實作效果更好,适合工業應用。此項目,不僅僅實作了先進的資料增強方式如嵌入增強,還支援多種SOTA metric learning方式的回歸損失如IOU Loss,GIOU Loss,DIOU Loss, CIOU Loss。另外在分類損失時也支援了Focal Loss來提升檢測的敏感度。最後,此項目還支援了超參數進化機制,可以在你的資料上生成更好的的超參數,相當于有自動調參的功能,吸引力很強。
- 在COCO資料集上的mAP測試結果如下:
- [email protected] run at
, [email protected] run at--iou-thr 0.5
--iou-thr 0.7
- Darknet results: https://arxiv.org/abs/1804.02767
- [email protected] run at
Size | COCO [email protected] | COCO [email protected] | |
---|---|---|---|
YOLOv3-tinyYOLOv3YOLOv3-SPPYOLOv3-SPP-ultralytics | 320 | 14.028.730.536.3 | 29.151.852.355.5 |
YOLOv3-tinyYOLOv3YOLOv3-SPPYOLOv3-SPP-ultralytics | 416 | 16.031.233.939.8 | 33.055.456.959.6 |
YOLOv3-tinyYOLOv3YOLOv3-SPPYOLOv3-SPP-ultralytics | 512 | 16.632.735.641.3 | 34.957.759.561.3 |
YOLOv3-tinyYOLOv3YOLOv3-SPPYOLOv3-SPP-ultralytics | 608 | 16.633.137.041.7 | 35.458.260.761.5 |
- 在Google雲上的速度測試:
https://cloud.google.com/deep-learning-vm/
Machine type: preemptible n1-standard-16 (16 vCPUs, 60 GB memory)
CPU platform: Intel Skylake
GPUs: K80 (0.35/hr), V100 ($0.83/hr) CUDA with Nvidia Apex FP16/32
HDD: 1 TB SSD
Dataset: COCO train 2014 (117,263 images)
Model:
yolov3-spp.cfg
Command:
python3 train.py --img 416 --batch 32 --accum 2
GPU | n | --batch --accum | img/s | epochtime | epochcost |
---|---|---|---|---|---|
K80 | 1 | 32 x 2 | 11 | 175 min | $0.58 |
T4 | 12 | 32 x 264 x 1 | 4161 | 48 min32 min | 0.36 |
V100 | 12 | 32 x 264 x 1 | 122178 | 16 min11 min | $0.23$0.31 |
2080Ti | 12 | 32 x 264 x 1 | 81140 | 24 min14 min | -- |
- 可視化:
yolov3.cfg
yolov3-tiny.cfg
yolov3-spp.cfg
- 總結:本項目不僅适合寫論文做實驗,還适合工業級應用,并且本工程還支援了Pytorch模型和DarkNet模型互轉,以及導出Onnx通過移動端架構部署,作者也提供了通過CoreML在IOS端進行部署的例子。這一項目也是Pytorch YOLO實作中最流行的項目,推薦使用。
- 題外話:本公衆号針對這一架構也做了多期使用和原了解讀的高品質文章,推薦大家閱讀:
- 【從零開始學習YOLOv3】1. YOLOv3的cfg檔案解析與總結
- 【從零開始學習YOLOv3】2. YOLOv3中的代碼配置和資料集建構
- 【從零開始學習YOLOv3】3. YOLOv3的資料加載機制和增強方法
- 【從零開始學習YOLOv3】4. YOLOv3中的參數進化
- 【從零開始學習YOLOv3】5. 網絡模型的建構
- 【從零開始學習YOLOv3】6. 模型建構中的YOLOLayer
- 【從零開始學習YOLOv3】7. 教你在YOLOv3模型中添加Attention機制
YOLOv3-model-pruning
- 項目位址:https://github.com/Lam1360/YOLOv3-model-pruning
- 項目特點:用 YOLOv3 模型在一個開源的人手檢測資料集 oxford hand 上做人手檢測,并在此基礎上做模型剪枝。對于該資料集,對 YOLOv3 進行 channel pruning 之後,模型的參數量、模型大小減少 80% ,FLOPs 降低 70%,前向推斷的速度可以達到原來的 200%,同時可以保持 mAP 基本不變。
- 原理簡介:這個代碼基于論文 ICLR 2017《Pruning Filters for Efficient ConvNets》 進行改進實作的 channel pruning算法,類似的代碼實作還有這個 yolov3-network-slimming(位址:https://github.com/talebolano/yolov3-network-slimming)。原始論文中的算法是針對分類模型的,基于 BN 層的 gamma 系數進行剪枝的。剪枝步驟就是稀疏訓練->剪枝->微調。
- 剪枝結果:
下面是對部分卷積層進行剪枝前後通道數的變化:
部分卷積層的通道數大幅度減少
剪枝前後名額對比:
參數數量 | 模型體積 | Flops | 前向推斷耗時(2070 TI) | mAP | |
---|---|---|---|---|---|
Baseline (416) | 61.5M | 246.4MB | 32.8B | 15.0 ms | 0.7692 |
Prune (416) | 10.9M | 43.6MB | 9.6B | 7.7 ms | 0.7722 |
Finetune (416) | 同上 | 同上 | 同上 | 同上 | 0.7750 |
加入稀疏正則項之後,mAP 反而更高了(在實驗過程中發現,其實 mAP上下波動 0.02 是正常現象),是以可以認為稀疏訓練得到的 mAP 與正常訓練幾乎一緻。将 prune 後得到的模型進行 finetune 并沒有明顯的提升,是以剪枝三步可以直接簡化成兩步。剪枝前後模型的參數量、模型大小降為原來的 1/6 ,FLOPs 降為原來的 1/3,前向推斷的速度可以達到原來的 2 倍,同時可以保持 mAP 基本不變。需要明确的是,上面表格中剪枝的效果是隻是針對該資料集的,不一定能保證在其他資料集上也有同樣的效果。
- 總結:這個剪枝項目是可以在工程中進行應用的,在這之前如果你想學習這個算法的原理,那麼推薦看我寫的這篇:深度學習算法優化系列八 | VGG,ResNet,DenseNe模型剪枝代碼實戰
Slim YOLOV3
- 項目位址:https://github.com/PengyiZhang/SlimYOLOv3
- 項目特點:《SlimYOLOv3: Narrower, Faster and Better for Real-Time UAV Applications》是arXiv, 25 Jul 2019的論文,作者全部來自北理,論文連結:arxiv.org/abs/1907.1109。作者對YOLOv3的卷積層通道剪枝(以通道級稀疏化),大幅削減了模型的計算量(~90.8% decrease of FLOPs)和參數量( ~92.0% decline of parameter size),剪枝後的模型運作速度約為原來的兩倍,并基本保持了原模型的檢測精度。
- 原理介紹:這篇論文基本上就是ICLR 2017《Pruning Filters for Efficient ConvNets》 這篇論文在YOLOV3-SPP上的一個應用。原理可以用下圖解釋:
- 算法結果:
結果1
結果2
- 論文展示效果:
可視化效果圖
- 總結:說白了這篇論文就是剪枝算法在YOLOV3-SPP上的應用,技術含量其實也就那樣。。。但是新手的話還是推薦大家來學習一下。
Anchor聚類 kmeans-anchor-boxes
- 項目位址:https://github.com/lars76/kmeans-anchor-boxes
- 項目特點:針對自己的資料集聚類出最适配的Anchor,可以加快收斂速度并有可能提升模型效果。
- 原理介紹:我之前寫了一篇推文仔細的講解這個,位址如下:目标檢測算法之YOLO系列算法的Anchor聚類代碼實戰
- 在VOC 2007資料集上獲得的算法結果:
論文中的不同聚類算法獲得的平均IOU對比
在結果測試時,YOLOv2采用的5種Anchor可以達到的Avg IOU是61,而Faster-RCNN采用9種Anchor達到的平均IOU是60.9,也即是說本文僅僅選取5種Anchor就可以達到Faster-RCNN中9種Anchor的效果。
ASFF
- 論文位址:https://arxiv.org/abs/1911.09516
- 項目位址:https://github.com/ruinmessi/ASFF
- 項目特點:超強Tricks!
- 貢獻:這篇論文最大的創新點是提出了一種新的特征融合的方式ASFF,通過學習權重參數的方式将不同層的特征融合到一起,作者證明了這樣的方法要優于通過concatenation或者element-wise的方式。不僅如此,作者還在YOLOv3的基礎上吸取了很多優秀的經驗,建構了一個非常強勁的目标檢測baseline,這個baseline的mAP就達到了38(之前的YOLOV3mAP值是33%左右,ORZ),其中包括:
- Guided Anchoring
- Bags of Tricks
- Additional IoU loss
- 算法原理:這裡不多介紹,之後會專門寫一篇文章介紹一下,這裡看一下論文的核心原理圖:
ASPP
- 算法結果:
精度和速度對比
在COCO資料集的精度測試。
System | test-dev mAP | Time (V100) | Time (2080ti) |
---|---|---|---|
YOLOv3 608 | 33.0 | 20ms | 26ms |
YOLOv3 608+ BoFs | 37.0 | 20ms | 26ms |
YOLOv3 608 (our baseline) | 38.8 | 20ms | 26ms |
YOLOv3 608+ ASFF | 40.6 | 22ms | 30ms |
YOLOv3 608+ ASFF* | 42.4 | 22ms | 30ms |
YOLOv3 800+ ASFF* | 43.9 | 34ms | 38ms |
YOLOv3 MobileNetV1 416 + BoFs | 28.6 | - | 22 ms |
YOLOv3 MobileNetV2 416 (our baseline) | 29.0 | - | 22 ms |
YOLOv3 MobileNetV2 416 +ASFF | 30.6 | - | 24 ms |
- 總結:ASPP這篇論文可以算是集百家之長,并且ASPP創新點也是拉滿,讓我第一次知道空間資訊的疊加也是可學習的,結果也非常驚豔,推薦大家學習。
yolov3-channel-and-layer-pruning
- 項目位址:https://github.com/tanluren/yolov3-channel-and-layer-pruning
- 項目特點:本項目以ultralytics/yolov3為基礎實作,根據論文Learning Efficient Convolutional Networks Through Network Slimming (ICCV 2017)原理基于bn層Gmma系數進行通道剪枝,下面引用了幾種不同的通道剪枝政策,并對原政策進行了改進,提高了剪枝率和精度;在這些工作基礎上,又衍生出了層剪枝,本身通道剪枝已經大大減小了模型參數和計算量,降低了模型對資源的占用,而層剪枝可以進一步減小了計算量,并大大提高了模型推理速度;通過層剪枝和通道剪枝結合,可以壓縮模型的深度和寬度,某種意義上實作了針對不同資料集的小模型搜尋。此外,除了剪枝作者進一步在YOLOV3中使用了知識蒸餾政策,進一步壓縮模型,具體請看原項目。這是國内的檢測大佬維護的開源項目,也可以加入到他們的讨論群去讨論。
YOLO-Lite
- 論文原文:https://arxiv.org/pdf/1811.05588.pdf
- 項目位址:https://github.com/reu2018DL/YOLO-LITE
- 項目特點:論文緻力于設計一個網絡(cpu速度大于10FPS,PASCAL VOC精度大于30%),是以基于YOLO-v2,提出了一個cpu端的或者端側的實時檢測架構YOLO-LITE。在PASCAL VOC 上取得了33.81%的map,在COCO上取得了12.26%的map,實時性達到了21FPS。
- 算法原理:作者在論文裡面主要證明了兩點,一是淺層網絡(shallow networks)的對于非GPU快速目标檢測應用的能力;二是,證明BN層對于shallow networks是不必要的。
- 精度和推理時間展示:
DataSet | mAP | FPS |
---|---|---|
PASCAL VOC | 33.57 | 21 |
COCO | 12.26 | 21 |
- 效果展示:
- 總結:精度很低,不過對于網絡修改和模型加速有一定的參考價值。
YOLO Nano
- 論文位址:https://arxiv.org/abs/1910.01271
- 項目位址:https://github.com/liux0614/yolo_nano
- 項目特點:來自滑鐵盧大學與 Darwin AI 的研究者提出了名為 YOLO Nano 的網絡,他們通過人與機器協同設計模型架構大大提升了性能。YOLO Nano 大小隻有 4.0MB 左右,比 Tiny YOLOv2 和 Tiny YOLOv3 分别小了 15.1 倍和 8.3 倍,在計算上需要 4.57B 次推斷運算,比後兩個網絡分别少了 34% 和 17%,在性能表現上,在 VOC2007 資料集取得了 69.1% 的 mAP,準确率比後兩者分别提升了 12 個點和 10.7 個點。值得一提的是4M是int8量化後的大小。
- 精度和推理時間展示:
精度和推理時間展示
- 網絡結構:
網絡結構
- 總結:這個開源工程并不是作者公開的,論文中的資訊也不足以支撐實作代碼的開發以及效果的複現,不過PEP和FCA子產品可以作為我們設計網絡去借鑒的思路。
附錄
- YOLOV3 608:http://pjreddie.com/darknet/yolo/
- Bag of Freebies for Training Object Detection Neural Networks : https://arxiv.org/abs/1902.04103
後記
好了,上面推薦的項目基本就是我入門目标檢測一起調研到的Pytorch 實作的以YOLO為BaseLine的最值得收藏和學習的項目了,希望對大家有幫助。