單階段目標檢測界的扛把子 --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 論文:https://arxiv.org/abs/2104.10419並檢視 PP-YOLOv2 和 PP-YOLO Tiny 的程式碼實現:https://github.com/paddlepaddle/paddledetection(記得 Star 收藏一下,支援開源也防止走丟~)關注百度飛槳的小夥伴可能還記得,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 NetYOLO 系列的一大通病,是對不同尺幅的目標檢測效果欠佳,因此,PP-YOLOv2 第一個最佳化的嘗試是設計一個可以為各種尺度影像構建高層語義特徵圖的檢測頸(detection neck)。不同於 PP-YOLO 採用 FPN 來從下至上的構建特徵金字塔,PP-YOLOv2 採用了 FPN 的變形之一—PAN(Path Aggregation Network)來從上至下的聚合特徵資訊。而採用 PAN 構建的 detection neck 可以由圖 2 看到。圖 2 PP-YOLOv2 Detection Neck 的結構Mish 啟用函式被很多實用的檢測器採用,並擁有出色的表現,例如 YOLOv4 和 YOLOv5 都在骨架網路(backbone)的構建中應用 mish 啟用函式。而對於 PP-YOLOv2,我們傾向於仍然採用原有的骨架網路,因為它的預訓練引數使得網路在 ImageNet 上 top-1 準確率高達 82.4%。所以我們把 mish 啟用函式應用在了 detection neck 而不是骨架網路上。增加輸入尺寸直接帶來了目標面積的擴大。這樣,網路可以更容易捕捉到小尺幅目標的資訊,得到更高的效能。然而,更大的輸入會帶來更多的記憶體佔用。所以在使用這個策略的同時,我們需要同時減少 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] 獲取。在 YOLOv3 中,將分類機率和 objectness 相乘作為最終的檢測置信度,但卻沒有考慮定位置信度。為了解決這一問題,我們將 objectness 與定位置信度 IoU 綜合起來, 使用下面的公式來計算出一個新的 objectness:其中 p 為檢測框與 ground truth 之間的 IoU 的預測值,為平衡引數,在 PP-YOLOv2 中設定為 0.5。我們使用 BCE(binary cross entropy) loss 來學習 p,公式如下所示其中 t 為檢測框與 ground truth 之間的 IoU,σ(.)代表 sigmoid 啟用函式。需要注意的是,只有正性樣本的 IoU aware loss 被計算。而以上這一系列最佳化策略對網路的改進效果分別是怎樣的呢?透過消融實驗得到的圖表我們可以清晰的看到,以上 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 種針對移動端的最佳化策略:骨幹網路可以說是一個模型的核心組成部分,對網路的效能、體積影響巨大。PPYOLO Tiny 採用了移動端高價效比骨幹網路 MobileNetV3。除了骨幹網路,PP-YOLO Tiny 的檢測頭(head)部分採用了更適用於移動端的深度可分離卷積(Depthwise Separable Convolution),相比常規的卷積操作,有更少的引數量和運算成本, 更適用於移動端的記憶體空間和算力。在 PPYOLO 中,採用了近 10 種最佳化策略,但並不是每一種都適用於移動端輕量化網路,比如 iou aware 和 matrix nms 等。這類 Trick 在伺服器端容易計算,但在移動端會引入很多額外的時延,對移動端來說價效比不高,因此去掉反而更適當。為了在移動端有更好的效能,PP-YOLO Tiny 採用 320 和 416 這兩種更小的輸入影像尺寸。並在 PaddleDetection2.0 中提供 tools/anchor_cluster.py 指令碼,使使用者可以一鍵式的獲得與目標資料集匹配的 Anchor。例如,在 COCO 資料集上,我們使用 320*320 尺度重新聚類了 anchor,並對應的在訓練過程中把每 batch 圖⽚的縮放範圍調整到 192-512 來適配⼩尺⼨輸⼊圖片的訓練,得到更高效能。在使⽤⼩尺寸輸入圖片時,對應的目標尺寸也會被縮⼩,漏檢的機率會變大,對應的我們採用瞭如下兩種方法來提升目標的召回率:a.原真實框的註冊方法是註冊到網格⾥最匹配的 anchor 上,最佳化後還會同時註冊到所有與該真實框的 IoU 不小於 0.25 的 anchor 上,提⾼了真實框註冊的正例。
b.原來所有與真實框 IoU 小於 0.7 的 anchor 會被當錯負例,最佳化後將該閾值減小到 0.5,降低了負例比例。
透過以上增加正例、減少負例的方法,彌補了在小尺寸上的正負例傾斜問題,提高了召回率。往往更大的 Batch Size 可以使訓練更加穩定,獲取更優的結果。在 PP-YOLO Tiny 的訓練中,單卡 batch size 由 24 提升到了 32,8 卡總 batch size=8*32=256,最終得到在 COCO 資料集上體積 4.3M,精度與預測速度都較為理想的模型。最後,結合 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日直播課”。由資深研發工程師傾囊相授多年“煉丹”經驗,配套真實工業落地場景案例,最先進的調優方式、訓練技巧、最佳化技巧和工業部署方案,帶您一網打盡,千萬不要錯過!感興趣的同學歡迎微信掃碼加入PaddleDetection技術交流群,更多課程及產品動態,將在群裡即使公告。PaddleDetection QQ交流群:1136406895如果您覺得PP YOLO對您帶來了一些啟發或者確實實用的話,也歡迎您可以給PaddleDetection專案點亮Star,連結如下:GitHub: https://github.com/PaddlePaddle/PaddleDetectionGitee: https://gitee.com/paddlepaddle/PaddleDetection