YOLOv3和YOLOv4长篇核心综述(下)
YOLOv3和YOLOv4長篇核心綜述(下)
4.3.3 Neck創(chuàng)新
在目標(biāo)檢測領(lǐng)域,為了更好的提取融合特征,通常在Backbone和輸出層,會插入一些層,這個部分稱為Neck。相當(dāng)于目標(biāo)檢測網(wǎng)絡(luò)的頸部,也是非常關(guān)鍵的。
Yolov4的Neck結(jié)構(gòu)主要采用了SPP模塊、FPN+PAN的方式。
(1)SPP模塊
SPP模塊,其實在Yolov3中已經(jīng)存在了,在Yolov4的C++代碼文件夾中有一個Yolov3_spp版本,但有的同學(xué)估計從來沒有使用過,在Yolov4中,SPP模塊仍然是在Backbone主干網(wǎng)絡(luò)之后:
作者在SPP模塊中,使用k={11,55,99,1313}的最大池化的方式,再將不同尺度的特征圖進行Concat操作。
在2019提出的《DC-SPP-Yolo》文章:https://arxiv.org/ftp/arxiv/papers/1903/1903.08589.pdf
也對Yolo目標(biāo)檢測的SPP模塊進行了對比測試。
和Yolov4作者的研究相同,采用SPP模塊的方式,比單純的使用k*k最大池化的方式,更有效的增加主干特征的接收范圍,顯著的分離了最重要的上下文特征。
Yolov4的作者在使用608*608大小的圖像進行測試時發(fā)現(xiàn),在COCO目標(biāo)檢測任務(wù)中,以0.5%的額外計算代價將AP50增加了2.7%,因此Yolov4中也采用了SPP模塊。
(2)FPN+PAN
PAN結(jié)構(gòu)比較有意思,看了網(wǎng)上Yolov4關(guān)于這個部分的講解,大多都是講的比較籠統(tǒng)的,而PAN是借鑒圖像分割領(lǐng)域PANet的創(chuàng)新點,有些同學(xué)可能不是很清楚。
下面大白將這個部分拆解開來,看下Yolov4中是如何設(shè)計的。
Yolov3結(jié)構(gòu):
先來看下Yolov3中Neck的FPN結(jié)構(gòu)
可以看到經(jīng)過幾次下采樣,三個紫色箭頭指向的地方,輸出分別是7676、3838、19*19。
以及最后的Prediction中用于預(yù)測的三個特征圖①1919255、②3838255、③7676255。[注:255表示80類別(1+4+80)×3=255]
將Neck部分用立體圖畫出來,更直觀的看下兩部分之間是如何通過FPN結(jié)構(gòu)融合的。
如圖所示,FPN是自頂向下的,將高層的特征信息通過上采樣的方式進行傳遞融合,得到進行預(yù)測的特征圖。
Yolov4結(jié)構(gòu):
而Yolov4中Neck這部分除了使用FPN外,還在此基礎(chǔ)上使用了PAN結(jié)構(gòu):
前面CSPDarknet53中講到,每個CSP模塊前面的卷積核都是3*3大小,相當(dāng)于下采樣操作。
因此可以看到三個紫色箭頭處的特征圖是7676、3838、19*19。
以及最后Prediction中用于預(yù)測的三個特征圖:①7676255,②3838255,③1919255。
也看下Neck部分的立體圖像,看下兩部分是如何通過FPN+PAN結(jié)構(gòu)進行融合的。
和Yolov3的FPN層不同,Yolov4在FPN層的后面還添加了一個自底向上的特征金字塔。
其中包含兩個PAN結(jié)構(gòu)。
這樣結(jié)合操作,FPN層自頂向下傳達強語義特征,而特征金字塔則自底向上傳達強定位特征,兩兩聯(lián)手,從不同的主干層對不同的檢測層進行參數(shù)聚合,這樣的操作確實很皮。
FPN+PAN借鑒的是18年CVPR的PANet,當(dāng)時主要應(yīng)用于圖像分割領(lǐng)域,但Alexey將其拆分應(yīng)用到Y(jié)olov4中,進一步提高特征提取的能力。
不過這里需要注意幾點:
注意一:
Yolov3的FPN層輸出的三個大小不一的特征圖①②③直接進行預(yù)測
但Yolov4的FPN層,只使用最后的一個76*76特征圖①,而經(jīng)過兩次PAN結(jié)構(gòu),輸出預(yù)測的特征圖②和③。
這里的不同也體現(xiàn)在cfg文件中,這一點有很多同學(xué)之前不太明白,
比如Yolov3.cfg最后的三個Yolo層,
第一個Yolo層是最小的特征圖19*19,mask=6,7,8,對應(yīng)最大的anchor
box。
第二個Yolo層是中等的特征圖38*38,mask=3,4,5,對應(yīng)中等的anchor
box。
第三個Yolo層是最大的特征圖76*76,mask=0,1,2,對應(yīng)最小的anchor box。
而Yolov4.cfg則恰恰相反
第一個Yolo層是最大的特征圖76*76,mask=0,1,2,對應(yīng)最小的anchor box。
第二個Yolo層是中等的特征圖38*38,mask=3,4,5,對應(yīng)中等的anchor
box。
第三個Yolo層是最小的特征圖19*19,mask=6,7,8,對應(yīng)最大的anchor
box。
注意點二:
原本的PANet網(wǎng)絡(luò)的PAN結(jié)構(gòu)中,兩個特征圖結(jié)合是采用shortcut操作,而Yolov4中則采用**concat(route)**操作,特征圖融合后的尺寸發(fā)生了變化。
這里也可以對應(yīng)Yolov4的netron網(wǎng)絡(luò)圖查看,很有意思。
4.3.4
Prediction創(chuàng)新
(1)CIOU_loss
目標(biāo)檢測任務(wù)的損失函數(shù)一般由**Classificition Loss(分類損失函數(shù))和Bounding Box Regeression Loss(回歸損失函數(shù))**兩部分構(gòu)成。
Bounding Box Regeression的Loss近些年的發(fā)展過程是:Smooth L1 Loss->
IoU Loss(2016)-> GIoU
Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)
從最常用的IOU_Loss開始,進行對比拆解分析,看下Yolov4為啥要選擇CIOU_Loss。
a.IOU_Loss
可以看到IOU的loss其實很簡單,主要是交集/并集,但其實也存在兩個問題。
問題1: 即狀態(tài)1的情況,當(dāng)預(yù)測框和目標(biāo)框不相交時,IOU=0,無法反應(yīng)兩個框距離的遠近,此時損失函數(shù)不可導(dǎo),IOU_Loss無法優(yōu)化兩個框不相交的情況。
問題2: 即狀態(tài)2和狀態(tài)3的情況,當(dāng)兩個預(yù)測框大小相同,兩個IOU也相同,IOU_Loss無法區(qū)分兩者相交情況的不同。
因此2019年出現(xiàn)了GIOU_Loss來進行改進。
b.GIOU_Loss
可以看到右圖GIOU_Loss中,增加了相交尺度的衡量方式,緩解了單純IOU_Loss時的尷尬。
但為什么僅僅說緩解呢?
因為還存在一種不足:
問題:狀態(tài)1、2、3都是預(yù)測框在目標(biāo)框內(nèi)部且預(yù)測框大小一致的情況,這時預(yù)測框和目標(biāo)框的差集都是相同的,因此這三種狀態(tài)的GIOU值也都是相同的,這時GIOU退化成了IOU,無法區(qū)分相對位置關(guān)系。
基于這個問題,2020年的AAAI又提出了DIOU_Loss。
c.DIOU_Loss
好的目標(biāo)框回歸函數(shù)應(yīng)該考慮三個重要幾何因素:重疊面積、中心點距離,長寬比。
針對IOU和GIOU存在的問題,作者從兩個方面進行考慮
一:如何最小化預(yù)測框和目標(biāo)框之間的歸一化距離?
二:如何在預(yù)測框和目標(biāo)框重疊時,回歸的更準(zhǔn)確?
針對第一個問題,提出了DIOU_Loss (Distance_IOU_Loss)
DIOU_Loss考慮了重疊面積和中心點距離,當(dāng)目標(biāo)框包裹預(yù)測框的時候,直接度量2個框的距離,因此DIOU_Loss收斂的更快。
但就像前面好的目標(biāo)框回歸函數(shù)所說的,沒有考慮到長寬比。
比如上面三種情況,目標(biāo)框包裹預(yù)測框,本來DIOU_Loss可以起作用。
但預(yù)測框的中心點的位置都是一樣的,因此按照DIOU_Loss的計算公式,三者的值都是相同的。
針對這個問題,又提出了CIOU_Loss,不對不說,科學(xué)總是在解決問題中,不斷進步!!
d.CIOU_Loss
CIOU_Loss和DIOU_Loss前面的公式都是一樣的,不過在此基礎(chǔ)上還增加了一個影響因子,將預(yù)測框和目標(biāo)框的長寬比都考慮了進去。
其中v是衡量長寬比一致性的參數(shù),也可以定義為:
這樣CIOU_Loss就將目標(biāo)框回歸函數(shù)應(yīng)該考慮三個重要幾何因素:重疊面積、中心點距離,長寬比全都考慮進去了。
再來綜合的看下各個Loss函數(shù)的不同點:
IOU_Loss: 主要考慮檢測框和目標(biāo)框重疊面積。
GIOU_Loss: 在IOU的基礎(chǔ)上,解決邊界框不重合時的問題。
DIOU_Loss: 在IOU和GIOU的基礎(chǔ)上,考慮邊界框中心點距離的信息。
CIOU_Loss: 在DIOU的基礎(chǔ)上,考慮邊界框?qū)捀弑鹊某叨刃畔ⅰ?/p>
Yolov4中采用了CIOU_Loss的回歸方式,使得預(yù)測框回歸的速度和精度更高一些。
(2)DIOU_nms
Nms主要用于預(yù)測框的篩選,常用的目標(biāo)檢測算法中,一般采用普通的nms的方式,Yolov4則借鑒上面D/CIOU
loss的論文:https://arxiv.org/pdf/1911.08287.pdf
將其中計算IOU的部分替換成DIOU的方式:
再來看下實際的案例
在上圖重疊的摩托車檢測中,中間的摩托車因為考慮邊界框中心點的位置信息,也可以回歸出來。
因此在重疊目標(biāo)的檢測中,DIOU_nms的效果優(yōu)于傳統(tǒng)的nms。
注意:有讀者會有疑問,這里為什么不用CIOU_nms,而用DIOU_nms?
答: 因為前面講到的CIOU_loss,是在DIOU_loss的基礎(chǔ)上,添加的影響因子,包含groundtruth標(biāo)注框的信息,在訓(xùn)練時用于回歸。
但在測試過程中,并沒有g(shù)roundtruth的信息,不用考慮影響因子,因此直接用DIOU_nms即可。
總體來說, YOLOv4的論文稱的上良心之作,將近幾年關(guān)于深度學(xué)習(xí)領(lǐng)域最新研究的tricks移植到Y(jié)olov4中做驗證測試,將Yolov3的精度提高了不少。
雖然沒有全新的創(chuàng)新,但很多改進之處都值得借鑒,借用Yolov4作者的總結(jié)。
Yolov4 主要帶來了 3 點新貢獻:
(1)提出了一種高效而強大的目標(biāo)檢測模型,使用 1080Ti 或 2080Ti 就能訓(xùn)練出超快、準(zhǔn)確的目標(biāo)檢測器。
(2)在檢測器訓(xùn)練過程中,驗證了最先進的一些研究成果對目標(biāo)檢測器的影響。
(3)改進了 SOTA 方法,使其更有效、更適合單 GPU 訓(xùn)練。
5.YoloV4相關(guān)代碼
5.1 python代碼
代碼地址:https://github.com/Tianxiaomo/pytorch-Yolov4
作者的訓(xùn)練和測試推理代碼都已經(jīng)完成
5.2 C++代碼
Yolov4作者Alexey的代碼,俄羅斯的大神,應(yīng)該是個獨立研究員,更新算法的頻繁程度令人佩服。
在Yolov3作者Joseph Redmon宣布停止更新Yolo算法之后,Alexey憑借對于Yolov3算法的不斷探索研究,贏得了Yolov3作者的認可,發(fā)布了Yolov4。
代碼地址:https://github.com/AlexeyAB/darknet
5.3 python版本的Tensorrt代碼
目前測試有效的有tensorflow版本:weights->pb->trt
代碼地址:https://github.com/hunglc007/tensorflow-Yolov4-tflite
5.4 C++版本的Tensorrtrt代碼
代碼地址:https://github.com/wang-xinyu/tensorrtx/tree/master/Yolov4
作者自定義了mish激活函數(shù)的plugin層,Tensorrt加速后速度還是挺快的。
6.相關(guān)數(shù)據(jù)集下載
項目中,目標(biāo)檢測算法應(yīng)該的非常多非常多,比如人臉識別,比如疫情期間的口罩人臉識別,比如車流統(tǒng)計,人流統(tǒng)計等等。
因此大白也會將不錯的值得一試的目標(biāo)檢測數(shù)據(jù)集匯總到此處,方便需要的同學(xué)進行下載。
6.1 口罩遮擋人臉數(shù)據(jù)集
數(shù)據(jù)集詳情: 由武漢大學(xué)多媒體研究中心發(fā)起,目前是全球最大的口罩遮擋人臉數(shù)據(jù)集。
分為真實口罩人臉和模擬口罩人臉兩部分,真實口罩人臉包含525人的5000張口罩人臉和9萬張正常人臉。模擬口罩人臉包含1萬個人共50萬張模擬人臉數(shù)據(jù)集。
應(yīng)用項目: 人臉檢測、人臉識別
數(shù)據(jù)集地址:https://github.com/X-zhangyang/Real-World-Masked-Face-Dataset
6.2 Wider Face人臉數(shù)據(jù)集
數(shù)據(jù)集詳情:香港中文大學(xué)發(fā)起的,包含3萬張圖片共40萬張人臉。
應(yīng)用項目:人臉檢測
數(shù)據(jù)集地址:http://shuoyang1213.me/WIDERFACE/WiderFace_Results.html
6.3 Wider Person擁擠場景行人數(shù)據(jù)集
數(shù)據(jù)集詳情:多種場景比較擁擠場景的行人檢測數(shù)據(jù)集,包含13382張圖片,共計40萬個不同遮擋程度的人體。
應(yīng)用項目:人體檢測
數(shù)據(jù)集地址:http://www.cbsr.ia.ac.cn/users/sfzhang/WiderPerson/
因為工作原因,會搜集大量的各類公開應(yīng)用場景數(shù)據(jù)集,如果有同學(xué)需要其他場景或者其他項目的,也可以留言,或者發(fā)送郵件到j(luò)iangdabai@126.com,也會將對應(yīng)的數(shù)據(jù)集更新到此處。
7.不斷更新ing
在深度學(xué)習(xí)的圖像領(lǐng)域,肯定會涉及目標(biāo)檢測,而在目標(biāo)檢測中,Yolov3是非常經(jīng)典,必須要學(xué)習(xí)的算法,有些同學(xué),特別新接觸的同學(xué),剛學(xué)習(xí)時會覺得yolo算法很繁瑣。
但發(fā)現(xiàn),網(wǎng)上很多的教程其實講的還是比較籠統(tǒng),并不適合學(xué)習(xí)。
所以也在耗盡洪荒之力,在準(zhǔn)備Yolov3和Yolov4及相關(guān)的基礎(chǔ)入門視頻,讓大家看完就能明白整體的流程和各種算法細節(jié),大家可以先收藏,后期制作好后會更新到此處。
總結(jié)
以上是生活随笔為你收集整理的YOLOv3和YOLOv4长篇核心综述(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多目标姿态估计
- 下一篇: YOLO3升级优化版!Poly-YOLO