檢測(cè)核心技術(shù)解析:從CSPDarknet53到工程化優(yōu)化策略)
1. 項(xiàng)目概述從YOLOv3到Y(jié)OLOv4的進(jìn)化之路如果你在2020年前后關(guān)注過(guò)計(jì)算機(jī)視覺(jué)領(lǐng)域尤其是目標(biāo)檢測(cè)這個(gè)細(xì)分方向那么“YOLOv4”這個(gè)名字一定如雷貫耳。它不像一個(gè)橫空出世的革命性架構(gòu)更像是一位經(jīng)驗(yàn)豐富的工程師將當(dāng)時(shí)學(xué)術(shù)界和工業(yè)界最有效的“零件”精心挑選、打磨然后巧妙地組裝成了一臺(tái)性能怪獸。我至今還記得論文剛出來(lái)時(shí)大家看到在COCO數(shù)據(jù)集上達(dá)到43.5% AP65.7% AP50且速度高達(dá)65 FPSTesla V100時(shí)的那種震撼。這不僅僅是數(shù)字的提升更是一種工程哲學(xué)的成功證明了通過(guò)系統(tǒng)性的、工程化的優(yōu)化組合可以在不顯著增加計(jì)算成本的前提下大幅提升模型的精度與速度。對(duì)于當(dāng)時(shí)苦于在精度和速度之間做艱難取舍的從業(yè)者來(lái)說(shuō)YOLOv4提供了一份近乎“保姆級(jí)”的優(yōu)化清單。今天我們就來(lái)徹底拆解這份清單看看YOLOv4究竟做了哪些“加法”和“減法”這些設(shè)計(jì)背后的邏輯是什么以及在實(shí)際應(yīng)用中我們?cè)撊绾谓梃b其思想。YOLOv4的核心貢獻(xiàn)可以概括為在YOLOv3的堅(jiān)實(shí)骨架之上引入了一系列經(jīng)過(guò)驗(yàn)證的“Bag of Freebies”免費(fèi)午餐和“Bag of Specials”特色菜技巧。所謂“免費(fèi)午餐”指的是那些只增加訓(xùn)練成本而不增加推理成本的技術(shù)比如數(shù)據(jù)增強(qiáng)、損失函數(shù)設(shè)計(jì)等而“特色菜”則是那些會(huì)略微增加推理復(fù)雜度但能帶來(lái)顯著精度提升的模塊如注意力機(jī)制、特殊的后處理等。YOLOv4的作者Alexey Bochkovskiy等人像一位頂級(jí)廚師他們的工作不是發(fā)明全新的食材而是從龐大的“食材庫(kù)”計(jì)算機(jī)視覺(jué)技術(shù)棧中挑選出最互補(bǔ)、最有效的那些并以一種高效的方式烹飪成一道佳肴。這篇解讀就是帶你走進(jìn)后廚看懂每一味調(diào)料的作用與火候。2. 核心架構(gòu)與組件深度解析YOLOv4的整體架構(gòu)可以清晰地分為四個(gè)部分輸入端Input、骨干網(wǎng)絡(luò)Backbone、頸部Neck和頭部Head。這個(gè)劃分如今已成為目標(biāo)檢測(cè)模型的通用范式而YOLOv4是其中非常經(jīng)典和明確的實(shí)踐。2.1 骨干網(wǎng)絡(luò)BackboneCSPDarknet53的威力YOLOv4沒(méi)有選擇更復(fù)雜的ResNeXt或EfficientNet而是基于YOLOv3的Darknet53進(jìn)行了關(guān)鍵改進(jìn)提出了CSPDarknet53。這里的CSP代表“Cross Stage Partial connections”即跨階段部分連接。這是整個(gè)骨干網(wǎng)絡(luò)性能提升的關(guān)鍵。為什么是CSP傳統(tǒng)的Darknet53是標(biāo)準(zhǔn)的殘差網(wǎng)絡(luò)ResNet變體。在深層網(wǎng)絡(luò)中梯度信息在反向傳播時(shí)容易減弱或消失梯度消散同時(shí)不同層學(xué)到的特征圖可能存在大量冗余。CSP結(jié)構(gòu)通過(guò)將一個(gè)階段Stage的基卷積層特征圖分成兩部分一部分直接連接到階段末尾另一部分經(jīng)過(guò)多個(gè)殘差塊Dense Block處理后再與第一部分合并。這樣做帶來(lái)了兩大好處增強(qiáng)梯度流那條“捷徑連接”確保了梯度能夠更直接地反向傳播到淺層極大地緩解了梯度消散問(wèn)題使得網(wǎng)絡(luò)可以更容易地訓(xùn)練得更深、更強(qiáng)大。減少計(jì)算冗余通過(guò)分割和合并的機(jī)制CSP結(jié)構(gòu)顯式地鼓勵(lì)特征重用并減少了重復(fù)學(xué)習(xí)相同特征的計(jì)算量。論文中指出CSPResNet在ImageNet分類(lèi)任務(wù)上在達(dá)到相同精度的情況下計(jì)算量FLOPs降低了20%。在YOLOv4中CSPDarknet53使用了Mish激活函數(shù)。Mish是一個(gè)平滑、非單調(diào)的激活函數(shù)公式x * tanh(softplus(x))實(shí)驗(yàn)證明它在深度網(wǎng)絡(luò)中通常比ReLU或Leaky ReLU能帶來(lái)更好的精度盡管計(jì)算稍復(fù)雜。由于骨干網(wǎng)絡(luò)通??梢灶A(yù)訓(xùn)練且推理時(shí)其計(jì)算量占比相對(duì)固定因此使用Mish是典型的用訓(xùn)練成本換取精度提升的“免費(fèi)午餐”策略。實(shí)操心得在自己設(shè)計(jì)或改進(jìn)骨干網(wǎng)絡(luò)時(shí)如果遇到梯度不穩(wěn)定或模型收斂慢的問(wèn)題引入CSP結(jié)構(gòu)是一個(gè)值得嘗試的、性?xún)r(jià)比極高的策略。你可以將其視為一個(gè)即插即用的模塊用于替換原有網(wǎng)絡(luò)中的連續(xù)卷積塊。2.2 頸部NeckSPP與PANet的強(qiáng)強(qiáng)聯(lián)合頸部的作用是融合骨干網(wǎng)絡(luò)提取的多尺度特征并增強(qiáng)特征的表征能力。YOLOv3使用了簡(jiǎn)單的FPN特征金字塔網(wǎng)絡(luò)而YOLOv4則采用了更強(qiáng)大的組合SPP模塊 PANet。SPPSpatial Pyramid Pooling模塊被添加在骨干網(wǎng)絡(luò)輸出之后。它并行使用多個(gè)不同尺寸的最大池化核如1x1, 5x5, 9x9, 13x13將任意尺寸的特征圖池化成固定長(zhǎng)度的特征向量然后拼接起來(lái)。這個(gè)設(shè)計(jì)的妙處在于極大地增加了感受野13x13的池化核能讓網(wǎng)絡(luò)“看到”特征圖上更大范圍的上下文信息這對(duì)于檢測(cè)大物體和理解場(chǎng)景關(guān)系至關(guān)重要。對(duì)輸入尺寸不敏感由于池化操作SPP模塊可以處理不同尺寸的輸入增強(qiáng)了模型的魯棒性。多尺度特征融合不同尺度的池化相當(dāng)于從不同粒度提取特征融合后特征更加豐富。PANetPath Aggregation Network可以看作是FPN的增強(qiáng)版。FPN只有一條自上而下的路徑將高層的語(yǔ)義信息傳遞到低層。而PANet增加了一條自下而上的路徑將底層的精細(xì)位置信息再傳遞回高層。這樣就形成了一個(gè)“雙向”的特征金字塔同時(shí)兼顧了高層語(yǔ)義和底層細(xì)節(jié)對(duì)于提升小目標(biāo)檢測(cè)精度特別有效。YOLOv4將SPP模塊插入到CSPDarknet53輸出后然后再接上PANet結(jié)構(gòu)。這個(gè)組合拳使得頸部網(wǎng)絡(luò)的特征融合和增強(qiáng)能力達(dá)到了新的高度。2.3 頭部Head與YOLOv3一脈相承YOLOv4的檢測(cè)頭Head部分與YOLOv3保持一致仍然是三個(gè)尺度的輸出分別對(duì)應(yīng)大、中、小目標(biāo)每個(gè)尺度的每個(gè)網(wǎng)格預(yù)測(cè)3個(gè)邊界框每個(gè)邊界框預(yù)測(cè)4個(gè)坐標(biāo)值、1個(gè)物體置信度和N個(gè)類(lèi)別概率。這種設(shè)計(jì)的簡(jiǎn)潔性和有效性已經(jīng)得到了時(shí)間的驗(yàn)證。YOLOv4的改進(jìn)重點(diǎn)不在Head結(jié)構(gòu)本身而在于為Head提供更優(yōu)質(zhì)的輸入特征通過(guò)Backbone和Neck以及使用更好的損失函數(shù)來(lái)訓(xùn)練它。3. 訓(xùn)練策略的“免費(fèi)午餐”Bag of Freebies這是YOLOv4論文中最具啟發(fā)性、也最容易被復(fù)現(xiàn)的部分。作者系統(tǒng)地整理并應(yīng)用了多種只影響訓(xùn)練、不影響推理的策略。3.1 數(shù)據(jù)增強(qiáng)的“組合拳”YOLOv4采用了極其豐富的數(shù)據(jù)增強(qiáng)策略遠(yuǎn)超YOLOv3的簡(jiǎn)單縮放和翻轉(zhuǎn)。Mosaic數(shù)據(jù)增強(qiáng)這是YOLOv4的標(biāo)志性增強(qiáng)技術(shù)。它將四張訓(xùn)練圖片隨機(jī)縮放、裁剪、排布后拼接成一張大圖。這樣做有幾個(gè)巨大優(yōu)勢(shì)模擬了多尺度的目標(biāo)一張圖里同時(shí)存在被縮放到不同尺寸的物體讓模型在一個(gè)批次內(nèi)就能學(xué)習(xí)到多尺度特征降低了訓(xùn)練對(duì)大批次內(nèi)存的依賴(lài)YOLOv4甚至可以用單張GPU訓(xùn)練。豐富了背景上下文物體的背景不再是單一的提升了模型在復(fù)雜背景下的泛化能力。提升了小目標(biāo)檢測(cè)能力通過(guò)拼接原本可能被縮放過(guò)小的物體得以保留合適的尺寸。Self-Adversarial Training (SAT)一種“自我對(duì)抗”訓(xùn)練。在第一階段網(wǎng)絡(luò)反向傳播時(shí)不是更新權(quán)重而是更新輸入圖片本身朝著讓網(wǎng)絡(luò)檢測(cè)性能變差的方向“攻擊”圖片即添加對(duì)抗性噪聲。在第二階段再用這張被“攻擊”過(guò)的圖片作為輸入正常訓(xùn)練網(wǎng)絡(luò)去檢測(cè)其中的目標(biāo)。這個(gè)過(guò)程讓模型學(xué)會(huì)了在更困難、更具干擾性的樣本上保持魯棒性。CmBN (Cross mini-Batch Normalization)這是對(duì)傳統(tǒng)BN的改進(jìn)。在分布式訓(xùn)練中同步BNSyncBN需要跨所有GPU同步統(tǒng)計(jì)信息通信開(kāi)銷(xiāo)大。CmBN則在一個(gè)批次Batch內(nèi)進(jìn)行更頻繁的統(tǒng)計(jì)信息累積和參數(shù)更新可以看作是在單個(gè)GPU上對(duì)更大批次數(shù)據(jù)的一種近似既改善了BN在批次較小時(shí)的效果又避免了過(guò)多的通信開(kāi)銷(xiāo)。DropBlock正則化比傳統(tǒng)的Dropout更適合卷積網(wǎng)絡(luò)。Dropout隨機(jī)丟棄單個(gè)神經(jīng)元而DropBlock丟棄的是特征圖中連續(xù)的區(qū)域塊。這更能模擬物體被部分遮擋的情況迫使網(wǎng)絡(luò)不只依賴(lài)局部特征而要學(xué)習(xí)更全局的上下文信息來(lái)進(jìn)行分類(lèi)和定位。3.2 損失函數(shù)的精進(jìn)損失函數(shù)是指導(dǎo)模型學(xué)習(xí)的“指揮棒”。YOLOv4對(duì)損失函數(shù)進(jìn)行了重要改進(jìn)。CIoU LossYOLOv3使用的是MSE均方誤差損失來(lái)優(yōu)化邊界框坐標(biāo)這存在與IoU交并比不對(duì)齊的問(wèn)題。YOLOv4采用了更先進(jìn)的CIoUComplete-IoULoss。CIoU不僅考慮了重疊面積IoU本身還考慮了中心點(diǎn)距離和寬高比的差異。公式核心L_CIoU 1 - IoU (ρ2(b, b^gt) / c2) αvρ2是預(yù)測(cè)框與真實(shí)框中心點(diǎn)的歐氏距離。c是能同時(shí)覆蓋預(yù)測(cè)框和真實(shí)框的最小閉包區(qū)域的對(duì)角線距離。v是衡量寬高比一致性的參數(shù)。α是權(quán)重系數(shù)。優(yōu)勢(shì)CIoU Loss使得邊界框回歸過(guò)程更加平滑、穩(wěn)定收斂更快最終定位精度更高。它直接優(yōu)化與評(píng)估指標(biāo)IoU更相關(guān)的目標(biāo)。分類(lèi)損失YOLOv4使用了標(biāo)簽平滑Label Smoothing和Focal Loss的變體來(lái)優(yōu)化分類(lèi)損失。標(biāo)簽平滑將硬標(biāo)簽如[0, 0, 1, 0]轉(zhuǎn)換為軟標(biāo)簽如[0.01, 0.01, 0.97, 0.01]防止模型對(duì)正確類(lèi)別過(guò)于自信而降低泛化能力。同時(shí)針對(duì)類(lèi)別不平衡問(wèn)題借鑒Focal Loss的思想對(duì)難以分類(lèi)的樣本給予更大的權(quán)重使模型更關(guān)注困難樣本。注意事項(xiàng)在實(shí)際訓(xùn)練中Mosaic和SAT等強(qiáng)增強(qiáng)技術(shù)可能會(huì)導(dǎo)致訓(xùn)練初期損失震蕩較大。一個(gè)實(shí)用的技巧是采用增強(qiáng)策略預(yù)熱在訓(xùn)練的前N個(gè)epoch例如前10%的輪數(shù)使用較弱的增強(qiáng)如隨機(jī)翻轉(zhuǎn)、縮放之后再逐步引入Mosaic和SAT讓模型先學(xué)習(xí)到相對(duì)穩(wěn)定的特征再接受“地獄難度”的挑戰(zhàn)這樣訓(xùn)練曲線會(huì)更平滑。4. 推理優(yōu)化的“特色菜”Bag of Specials這部分模塊會(huì)在推理時(shí)增加少量計(jì)算但能換來(lái)精度提升。Mish激活函數(shù)如前所述主要用于Backbone帶來(lái)精度增益。SPP模塊推理時(shí)增加了一些并行池化操作計(jì)算開(kāi)銷(xiāo)很小但感受野增益顯著。SAMSpatial Attention Module空間注意力模塊這是一個(gè)輕量級(jí)的注意力模塊被修改后融入PANet中。它讓網(wǎng)絡(luò)學(xué)會(huì)在空間維度上“關(guān)注”哪里更重要。例如對(duì)于一張有行人的圖片SAM模塊會(huì)讓特征圖在行人區(qū)域有更高的激活權(quán)重。這個(gè)模塊增加的計(jì)算量微乎其微但能有效提升特征質(zhì)量。DIoU-NMS這是對(duì)標(biāo)準(zhǔn)NMS非極大值抑制的改進(jìn)。標(biāo)準(zhǔn)NMS只根據(jù)置信度分?jǐn)?shù)和IoU來(lái)抑制冗余框可能會(huì)抑制掉那些定位更準(zhǔn)確但可能置信度略低的框。DIoU-NMS在抑制時(shí)不僅考慮IoU還考慮邊界框中心點(diǎn)的距離。兩個(gè)框即使IoU較高但如果中心點(diǎn)離得遠(yuǎn)也可能被保留。這有助于在物體密集、遮擋嚴(yán)重的場(chǎng)景下保留更多的正確檢測(cè)框。5. 實(shí)驗(yàn)設(shè)計(jì)與超參調(diào)優(yōu)的啟示YOLOv4論文不僅給出了最終方案還詳細(xì)記錄了大量的消融實(shí)驗(yàn)Ablation Study這為我們調(diào)參提供了寶貴的經(jīng)驗(yàn)。超參數(shù)選擇優(yōu)化器使用了帶動(dòng)量的SGD而不是Adam。在目標(biāo)檢測(cè)任務(wù)上SGD通常能收斂到更優(yōu)的泛化點(diǎn)盡管可能需要更精細(xì)的學(xué)習(xí)率調(diào)整。學(xué)習(xí)率調(diào)度采用了余弦退火Cosine Annealing策略。這種策略讓學(xué)習(xí)率像余弦曲線一樣從初始值緩慢下降到0有助于模型在訓(xùn)練末期更穩(wěn)定地收斂到局部最優(yōu)解附近。初始錨框AnchorYOLOv4沒(méi)有沿用YOLOv3的預(yù)設(shè)錨框而是在訓(xùn)練數(shù)據(jù)上重新進(jìn)行了K-means聚類(lèi)得到了9組更適合COCO數(shù)據(jù)集的先驗(yàn)框尺寸。這是一個(gè)非常重要的實(shí)踐錨框尺寸必須與你的目標(biāo)數(shù)據(jù)集匹配。如果你在自己的數(shù)據(jù)集上訓(xùn)練YOLO重新聚類(lèi)錨框是必不可少的第一步它能直接提升模型收斂速度和最終精度。消融實(shí)驗(yàn)的智慧論文通過(guò)大量實(shí)驗(yàn)逐一驗(yàn)證了每個(gè)“免費(fèi)午餐”和“特色菜”組件的有效性。例如他們發(fā)現(xiàn)Mosaic數(shù)據(jù)增強(qiáng)單獨(dú)就能帶來(lái)顯著的AP提升CIoU Loss比IoU Loss和GIoU Loss效果更好CmBN在單卡小批次訓(xùn)練時(shí)也能有不錯(cuò)的效果。這種嚴(yán)謹(jǐn)?shù)摹⒖闪炕脑u(píng)估方法值得我們學(xué)習(xí)。在改進(jìn)自己的模型時(shí)也應(yīng)該設(shè)計(jì)這樣的對(duì)照實(shí)驗(yàn)清楚地知道每一個(gè)改動(dòng)帶來(lái)的收益和代價(jià)。6. 實(shí)戰(zhàn)復(fù)現(xiàn)與代碼解讀關(guān)鍵點(diǎn)雖然現(xiàn)在有大量現(xiàn)成的YOLOv4實(shí)現(xiàn)如Darknet官方版、PyTorch復(fù)現(xiàn)版但理解其代碼結(jié)構(gòu)對(duì)于調(diào)試和定制化至關(guān)重要。核心代碼結(jié)構(gòu)通常包括models/目錄定義了CSPDarknet53、SPP、PANet等核心模塊的類(lèi)。閱讀這里可以深入理解網(wǎng)絡(luò)的前向傳播過(guò)程。loss.py包含了CIoU Loss的計(jì)算。這是復(fù)現(xiàn)的重點(diǎn)和難點(diǎn)需要仔細(xì)核對(duì)公式實(shí)現(xiàn)確保與論文一致。datasets.py實(shí)現(xiàn)了Mosaic數(shù)據(jù)增強(qiáng)、SAT等數(shù)據(jù)加載和增強(qiáng)管道。這是訓(xùn)練效果的關(guān)鍵需要理解其拼接、混合的邏輯。train.py包含了CmBN的實(shí)現(xiàn)、優(yōu)化器配置、余弦退火學(xué)習(xí)率調(diào)度等訓(xùn)練循環(huán)邏輯。utils/目錄包含NMS、指標(biāo)計(jì)算、錨框聚類(lèi)等工具函數(shù)。復(fù)現(xiàn)時(shí)的常見(jiàn)陷阱梯度爆炸/消失如果使用了Mish激活函數(shù)和非常深的CSP結(jié)構(gòu)在訓(xùn)練初期可能會(huì)遇到梯度問(wèn)題。確保正確初始化權(quán)重如使用Kaiming初始化并可以考慮使用梯度裁剪Gradient Clipping。內(nèi)存溢出OOMMosaic數(shù)據(jù)增強(qiáng)會(huì)將四張圖拼成一張如果原圖尺寸很大拼接后的圖會(huì)更大。務(wù)必在數(shù)據(jù)加載時(shí)控制好輸入圖像的最終尺寸如608x608或512x512。CIoU Loss不收斂檢查CIoU Loss實(shí)現(xiàn)中對(duì)中心點(diǎn)距離、寬高比懲罰項(xiàng)的計(jì)算是否正確特別是分母項(xiàng)c2覆蓋區(qū)域?qū)蔷€平方是否加了防止除零的小 epsilon。錯(cuò)誤的實(shí)現(xiàn)會(huì)導(dǎo)致?lián)p失出現(xiàn)NaN。預(yù)訓(xùn)練權(quán)重不匹配如果你想在自定義數(shù)據(jù)集上微調(diào)Fine-tune一個(gè)在ImageNet上預(yù)訓(xùn)練的CSPDarknet53要確保你的模型結(jié)構(gòu)與預(yù)訓(xùn)練權(quán)重的結(jié)構(gòu)完全一致包括每個(gè)卷積層的通道數(shù)、CSP塊的分割比例等。7. YOLOv4的遺產(chǎn)與后續(xù)影響YOLOv4雖然已經(jīng)被YOLOv5、v6、v7、v8等后續(xù)版本超越但其設(shè)計(jì)思想影響深遠(yuǎn)。工程化集成的典范它證明了在現(xiàn)有技術(shù)框架內(nèi)通過(guò)系統(tǒng)性的、細(xì)致的工程優(yōu)化可以挖掘出巨大的性能潛力。這鼓勵(lì)研究者不僅要追求算法創(chuàng)新也要重視技術(shù)的整合與應(yīng)用?!癇ag of Freebies/Specials”分類(lèi)法這個(gè)分類(lèi)方式非常清晰為后續(xù)研究者提供了一個(gè)評(píng)估和改進(jìn)模型的框架。任何新的技巧都可以被歸類(lèi)并思考其代價(jià)與收益。推動(dòng)了訓(xùn)練技巧的普及Mosaic、CIoU Loss、余弦退火等因?yàn)閅OLOv4的成功而得到了廣泛應(yīng)用成為了目標(biāo)檢測(cè)乃至其他視覺(jué)任務(wù)的標(biāo)準(zhǔn)配置或重要備選方案。為工業(yè)部署樹(shù)立了標(biāo)桿YOLOv4在精度和速度之間取得的平衡使其在一段時(shí)間內(nèi)成為工業(yè)界實(shí)時(shí)檢測(cè)的首選方案之一。其模型和優(yōu)化思路為實(shí)際產(chǎn)品落地提供了直接參考。時(shí)至今日當(dāng)我們使用更現(xiàn)代的YOLO版本時(shí)依然能看到Y(jié)OLOv4的影子。例如YOLOv5同樣大量使用了Mosaic等數(shù)據(jù)增強(qiáng)并優(yōu)化了訓(xùn)練管道。理解YOLOv4就像是學(xué)習(xí)目標(biāo)檢測(cè)優(yōu)化的一本經(jīng)典教科書(shū)其中的思想、技巧和實(shí)驗(yàn)方法對(duì)于從事任何模型研發(fā)和優(yōu)化工作的人來(lái)說(shuō)都具有長(zhǎng)期的價(jià)值。它告訴我們頂尖的性能往往來(lái)自于對(duì)細(xì)節(jié)的極致打磨和對(duì)現(xiàn)有工具的精妙運(yùn)用。