單階段目標檢測界的扛把子–YOLO,以其“又快又好的效果”在學術及產業界全面風靡。自20年下半年YOLOv4、YOLOv5、PP-YOLO、YOLO-Fastest和YOLOv4 Tiny等等輪番轟炸、掀起“YOLO狂潮”后,時隔半年,超越YOLOv5的PP-YOLOv2和1.3M超超超輕量級的PP-YOLO tiny一起來了!!!

圖 1 PP-YOLOv2和其他目標檢測器性能對比
如圖1可見,PP-YOLOv2在同等速度下,精度超越YOLOv5!相較20年發布的PP-YOLO,v2版本在COCO 2017 test-dev上的精度提升了3.6%,由45.9%提升到了49.5%;在640*640的輸入尺寸下,FPS達到68.9FPS,而采用TensorRT加速的話,FPS更是達到了106.5!這樣的性能,超越了當前所有同等計算量下的檢測器,包括YOLOv4-CSP和YOLOv5l!
而如果將骨架網絡從ResNet50更換為ResNet101,PP-YOLOv2的優勢則更為顯著:mAP達到50.3%,速度比同計算量的YOLOv5x高出了15.9%。
不僅如此,與PP-YOLOv2一同面世的,還有體積只有1.3M的PP-YOLO Tiny,比YOLO-Fastest更輕、更快!這樣超超超輕量的算法面世,更是很好的滿足了產業里大量邊緣、輕量化、低成本芯片上使用目標檢測算法的種種訴求!

PP-YOLOv2:產業最實用的目標檢測器
關注百度飛槳的小伙伴可能還記得,PP-YOLO(https://arxiv.org/abs/2007.12099)是在YOLOv3的基礎上,采用了一整套優化策略,在幾乎不增加模型參數和計算量(FLOPs)的前提下,提升檢測器的精度得到的極高性價比(mAP 45.9,72.9FPS)的單階段目標檢測器。
而PP-YOLOv2,是以PP-YOLO為基線模型進行了一系列的延展實驗得到的。下面,就讓我們來一起看看具體是哪些策略給PP-YOLO帶來了進一步的優化提升呢?
1、采用Path Aggregation Network(路徑聚合網絡)設計Detection Net
YOLO系列的一大通病,是對不同尺幅的目標檢測效果欠佳,因此,PP-YOLOv2第一個優化的嘗試是設計一個可以為各種尺度圖像構建高層語義特征圖的檢測頸(detection neck)。不同于PP-YOLO采用FPN來從下至上的構建特征金字塔,PP-YOLOv2采用了FPN的變形之一—PAN(Path Aggregation Network)來從上至下的聚合特征信息。而采用PAN構建的detection neck可以由圖2看到。

圖2PP-YOLOv2 Detection Neck的結構
2、采用Mish激活函數
Mish激活函數被很多實用的檢測器采用,并擁有出色的表現,例如YOLOv4和YOLOv5都在骨架網絡(backbone)的構建中應用mish激活函數。而對于PP-YOLOv2,我們傾向于仍然采用原有的骨架網絡,因為它的預訓練參數使得網絡在ImageNet上top-1準確率高達82.4%。所以我們把mish激活函數應用在了detection neck而不是骨架網絡上。
3、更大的輸入尺寸
增加輸入尺寸直接帶來了目標面積的擴大。這樣,網絡可以更容易捕捉到小尺幅目標的信息,得到更高的性能。然而,更大的輸入會帶來更多的內存占用。所以在使用這個策略的同時,我們需要同時減少Batch Size。在具體實驗中,我們將Batch Size減少了一倍,從每個GPU 24張圖像減少到每個GPU 12張圖像,并將最大輸入從608擴展到768。輸入大小均勻地從[320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768]獲取。
4、IoU Aware Branch
在YOLOv3中,將分類概率和objectness相乘作為最終的檢測置信度,但卻沒有考慮定位置信度。為了解決這一問題,我們將objectness與定位置信度IoU綜合起來,使用下面的公式來計算出一個新的objectness:

而以上這一系列優化策略對網絡的改進效果分別是怎樣的呢?通過消融實驗得到的圖表我們可以清晰的看到,以上PAN、MISH和輸入尺寸的增大都帶來了一些計算量的增加,但mAP卻得到了顯著的提升。

而優化后的PP-YOLOv2的完整性能測試及與YOLOv4、YOLOv5全系列算法的比較如下表,PP-YOLOv2(R50)計算量相當于YOLOv5l,PP-YOLOv2(R101)計算量相當于YOLOv5x。可以看到,PP-YOLOv2的性能超越了當前所有同等計算量下的檢測器!

值得注意的是:不管是PP-YOLO還是PP-YOLOv2,都是在尋找在產業實踐中最高性價比的目標檢測方案,而不是單純的以提升單階段目標檢測的精度去堆網絡和策略。論文中也特別提到,是以實驗報告的角度來為業界開發者展示更多網絡優化的方法,這些策略也可以被應用在其他網絡的優化上,希望在給業界開發者帶來更好的網絡的同時,也帶來更多的算法優化啟發。
PPYOLO Tiny:1.3M超超超輕量目標檢測算法
在當前移動互聯網、物聯網、車聯網等行業迅猛發展的背景下,邊緣設備上直接部署目標檢測的需求越來越旺盛。生產線上往往需要在極低硬件成本的硬件例如樹莓派、FPGA、K210等芯片上部署目標檢測算法。而我們常用的手機App,也很難直接在終端采用超過6M的深度學習算法。
如何在盡量不損失精度的前提下,獲得體積更小、運算速度更快的算法呢?
得益于PaddleSlim飛槳模型壓縮工具的能力,體積僅為1.3M的PPYOLO Tiny誕生了!

那PP-YOLO Tiny具體采用了哪些優化策略呢?
首先,PP-YOLO Tiny沿用了PP-YOLO系列模型的spp,iou loss, drop block, mixup, sync bn等優化方法,并進一步采用了近10種針對移動端的優化策略:
1、更適用于移動端的骨干網絡:
骨干網絡可以說是一個模型的核心組成部分,對網絡的性能、體積影響巨大。PPYOLO Tiny采用了移動端高性價比骨干網絡MobileNetV3。
2、更適用移動端的檢測頭(head):
除了骨干網絡,PP-YOLO Tiny的檢測頭(head)部分采用了更適用于移動端的深度可分離卷積(Depthwise Separable Convolution),相比常規的卷積操作,有更少的參數量和運算成本,更適用于移動端的內存空間和算力。
3、去除對模型體積、速度有顯著影響的優化策略:
在PPYOLO中,采用了近10種優化策略,但并不是每一種都適用于移動端輕量化網絡,比如iou aware和matrix nms等。這類Trick在服務器端容易計算,但在移動端會引入很多額外的時延,對移動端來說性價比不高,因此去掉反而更適當。
4、使用更小的輸入尺寸
為了在移動端有更好的性能,PP-YOLO Tiny采用320和416這兩種更小的輸入圖像尺寸。并在 PaddleDetection2.0中提供tools/anchor_cluster.py腳本,使用戶可以一鍵式的獲得與目標數據集匹配的Anchor。例如,在COCO數據集上,我們使用320*320尺度重新聚類了anchor,并對應的在訓練過程中把每batch圖片的縮放范圍調整到192-512來適配小尺寸輸入圖片的訓練,得到更高性能。
5、召回率優化
在使用小尺寸輸入圖片時,對應的目標尺寸也會被縮小,漏檢的概率會變大,對應的我們采用了如下兩種方法來提升目標的召回率:
a.原真實框的注冊方法是注冊到網格里最匹配的anchor上,優化后還會同時注冊到所有與該真實框的IoU不小于0.25的anchor上,提高了真實框注冊的正例。
b.原來所有與真實框IoU小于0.7的anchor會被當錯負例,優化后將該閾值減小到0.5,降低了負例比例。
通過以上增加正例、減少負例的方法,彌補了在小尺寸上的正負例傾斜問題,提高了召回率。
6、更大的batch size
往往更大的Batch Size可以使訓練更加穩定,獲取更優的結果。在PP-YOLO Tiny的訓練中,單卡batch size由24提升到了32,8卡總batch size=8*32=256,最終得到在COCO數據集上體積4.3M,精度與預測速度都較為理想的模型。
7、量化后壓縮
最后,結合Paddle Inference和Paddle Lite預測庫支持的后量化策略,即在將權重保存成量化后的int8數據。這樣的操作,是模型體積直接壓縮到了1.3M,而預測時使用Paddle Lite加載權重,會將int8數據還原回float32權重,所以對精度和預測速度?乎沒有任何影響。
通過以上一系列優化,我們就得到了1.3M超超超輕量的PP-YOLO tiny模型,而算法可以通過Paddle Lite直接部署在麒麟990等輕量化芯片上,預測效果也非常理想。

以上所有PP-YOLOv2和PPYOLO Tiny的代碼實現,均在PaddleDetection飛槳目標檢測開發套件中開源提供:github.com/paddlepaddle/paddledetection
還在等什么?趕緊來實際上手體驗一下吧!也歡迎感興趣的小伙伴參與共建!
課程預告
百度飛槳為了幫助大家能快速、深入、全面的了解目標檢測技術,將于5月13、14日特地開設“目標檢測2日直播課”。由資深研發工程師傾囊相授多年“煉丹”經驗,配套真實工業落地場景案例,最先進的調優方式、訓練技巧、優化技巧和工業部署方案一網打盡,千萬不要錯過~感興趣的同學歡迎加入QQ交流群:1136406895,了解更多課程及產品動態。