目标检测:Yolov5集百家之长
首發(fā)于:公眾號YueTan
(1920,被識別為泰迪熊?有排面)
背景
2017年底,我已畢業(yè)多年了。用起Excel和PPT、研究車的質(zhì)量問題儼然老手的樣子。有一晚,照著一個帖子跑了一下Yolov1的inference,驚為天人。躡手躡腳的搞環(huán)境、下模型、跑一下clone的程序,就把攝像頭前的物體都用框框標(biāo)記了出來。在不懂原理的我看來,大概驚嘆了一晚上。
那份驚嘆,也讓我和許多年輕人一起決定加入AI的行列。我現(xiàn)在常常吹噓,自己大學(xué)七年對航空和汽車發(fā)動機(jī)多了解,工作五年對汽車掌握的多透徹,彷佛放棄了十二年優(yōu)異的經(jīng)驗,其實(shí)都是人設(shè)啊。我根本就學(xué)不好,現(xiàn)在也完全不記得了。(當(dāng)然,搞AI也只是現(xiàn)在的人設(shè)罷了,不要當(dāng)真)
時過境遷,在AI方面我還是小學(xué)生,Yolo已經(jīng)從V1發(fā)展到了V5,并有各種衍生和優(yōu)化版本。我們津津樂道它的名字是You only look once的簡寫,原意“你只看一遍”是為了區(qū)分看“兩遍”的faster-rcnn等二階段模型,其簡寫Yolo又寓意著另一句諺語"You only live once",生命只有一次。就像食神里說的“不僅好吃,還有噱頭,我也忍不住買了一碗“。
充滿噱頭的除了性能、名字外甚至還有作者本身,作者年初時宣布因為對技術(shù)濫用的擔(dān)憂放棄視覺研究了,頗有高人之風(fēng)。而且明明是個大胡子,個人網(wǎng)站卻是滿滿粉色獨(dú)角獸的萌妹風(fēng)格。寫的論文中,為了突出速度之快,甚至故意把圖畫到坐標(biāo)軸外面去了。
機(jī)器視覺任務(wù),常見的有分類、檢測、分割。而Yolo正是檢測中的佼佼者,在工業(yè)界,Yolo兼顧精度和速度,往往是大家的首選。
效果
V5的效果也是非常不錯:
其實(shí),yolov4剛出來的時候,大家還對名字爭議了一番。畢竟原作者已經(jīng)棄坑,新作看上去又是一個trick集合。馬上yolov5出現(xiàn)之后,似乎對v4的質(zhì)疑就消失了,因為v5這個名字起的似乎更離譜了。這里就不討論名字爭議了。
原理
作為一階段end2end的檢測算法代表作,我們簡單回顧一下Yolo從V1到V5的主要改進(jìn)措施,當(dāng)然backbone也一直在進(jìn)化著。
v1: 劃分網(wǎng)格負(fù)責(zé)檢測,confidence loss
v2: 加入k-means的anchor,兩階段訓(xùn)練,全卷積網(wǎng)絡(luò)
v3: FPN多尺度檢測
v4: spp,mish激活函數(shù),數(shù)據(jù)增強(qiáng)mosaic\mixup,giou損失函數(shù)
v5: 對模型大小靈活控制,hardswish激活函數(shù),數(shù)據(jù)增強(qiáng)
v1/v2因為對小目標(biāo)檢測效果不佳,在v3中加入了多尺度檢測。v3大概可以比作iphone界的iphone6,是前后代廣受好評的大成者,至今仍活躍在一線,“等等黨永遠(yuǎn)不虧”。Yolov4把整個流程中可能進(jìn)行的優(yōu)化都梳理和嘗試了了一遍,并找到了各個排列組合中的最好效果。v5可以靈活的控制從10+M到200+M的模型,其小模型非常驚艷。
v3到v5的整體網(wǎng)絡(luò)圖相差不多,可以清晰的看到:模型從三個不同尺度分別對大小不同的物體有重點(diǎn)的進(jìn)行檢測。
細(xì)節(jié)
數(shù)據(jù)增強(qiáng)和預(yù)處理
由于模型需要圖片尺寸相同,因此可以采用resize、padding resize和letterbox的方法。letterbox訓(xùn)練的時候不用,只是在推理時候用。數(shù)據(jù)增強(qiáng)(data augmentation)是提升模型泛化能力的重要手段。
flip: 翻轉(zhuǎn)
perspective:仿射變換
hsv augment:顏色變換
mosaic:馬賽克數(shù)據(jù)增強(qiáng)把原來的四幅圖組在一起
當(dāng)然后面可以試試albumentations包里的方法。
獲取anchor:k-means
早就在機(jī)器學(xué)習(xí)中學(xué)過最基礎(chǔ)的聚類算法k-means,沒想到第一次用上是在目標(biāo)檢測里。果然沒有免費(fèi)的午餐啊,在合適的地方用上合適的算法就好。k-means的兩個關(guān)鍵超參數(shù)是k的選擇和距離的選擇,所以在Yolo中的k等于n_scale(尺度,一般為3)* anchor_per_scale (每個尺度的anchor,一般也為3)。V5做了一點(diǎn)小小的改進(jìn):訓(xùn)練時自動獲取。
匹配anchor和網(wǎng)格
雖然討論的時候,經(jīng)??匆姷亩际歉牧四男ゝancy的模型,真正寫程序時比較困難的反而是這種數(shù)據(jù)前處理的pipeline。yolo的關(guān)鍵思想通過標(biāo)記物體的中心點(diǎn)落在哪個網(wǎng)格里,就由這個網(wǎng)格負(fù)責(zé)檢測,就是通過設(shè)置目標(biāo)來實(shí)現(xiàn)的。
1)計算這張圖片所有g(shù)round truth與每一個anchor的IOU,從而得到對每一個ground truth匹配最好的anchor id。可以根據(jù)真實(shí)框和錨礦的IOU或者長寬比來選擇,v4與v5中做的改進(jìn)是根據(jù)寬高比來進(jìn)行anchor的匹配。
2)對每一個ground truth循環(huán)。找到這個anchor對應(yīng)的尺度,和這個anchor對應(yīng)的哪一個anchor。
3)模型最終輸出的是三個尺度,每個尺度下每個網(wǎng)格帶下的三個anchor對應(yīng)的box。所以將標(biāo)記的box也要放置到對應(yīng)的grid里,對應(yīng)的是三個anchor里的哪一個。根據(jù)上面找到對應(yīng)grid,對應(yīng)anchor,將標(biāo)記的box尺寸和class 信息設(shè)置到目標(biāo)里,其他設(shè)置為0。
另外兩個改進(jìn)點(diǎn),一個改進(jìn)點(diǎn)是正樣本增強(qiáng)。通過正樣本的增強(qiáng)可以減輕正負(fù)樣本的不均衡。另一個改進(jìn)點(diǎn)是標(biāo)注框?qū)nchor的encoding(編碼方式)。從v2中引入anchor以來,一直通過如下編碼方式
為了解決網(wǎng)格的敏感性,v4的作者發(fā)現(xiàn)簡單的編碼方式就可以提高結(jié)果。
x = (logistic(in) * 2 - 0.5 + grid_x) / grid_width y = ... w = pow( logistic(in)*2, 2) * anchor / network_width h = ...模型主體
(來自dabai同學(xué))
v5的模型通過類似EfficientNet的兩個系數(shù)來控制模型的寬度和深度,在yaml文件的depth_multiple和width_multiple中調(diào)節(jié)。
Focus:是v5相對v4的改進(jìn)。
CSPNet:跨階段局部融合網(wǎng)絡(luò)
PANet:之前FPN是把傳統(tǒng)視覺任務(wù)的圖像金字塔改進(jìn)到了深度學(xué)習(xí)的特征金字塔,來自論文Path Aggregation Network for Instance Segmentation。
損失函數(shù)
Yolo的損失函數(shù)比較驚艷,通過損失函數(shù)的設(shè)定把目標(biāo)檢測任務(wù)轉(zhuǎn)化為一個回歸任務(wù)。
第一部分為box的損失函數(shù),可以用過smoth L1損失函數(shù)計算xywh,也可以通過iou、giou、ciou等。類似的giou、diou和ciou都是在交并比iou的基礎(chǔ)上發(fā)展而來的優(yōu)化方法,解決了iou在兩個候選框完全沒有交集時,損失為0不可優(yōu)化的狀況。第二部分為有無物體的損失:yolo獨(dú)特的設(shè)置了一個有無物體的confidence,目標(biāo)中有的自然設(shè)置為1。預(yù)測的值用sigmoid轉(zhuǎn)化為(0,1)的概率,然后計算binary cross entropy。第三部分為分類損失部分,雖然是多分類,也采用binary corss entropy。
同時,為了平衡不同尺度的輸出,v5中對以上三部分加了人工痕跡比較明顯的系數(shù)。
后處理
極大值抑制(nms)。分三個尺度進(jìn)行檢測,且分配不同的anchor,那么同一個物體有可能被多個尺度、anchor所檢測到。所以通過極大值抑制來從中選擇最佳的候選框。也有soft-nms、matrix-nms等改進(jìn)方式可以試一試。
訓(xùn)練
訓(xùn)練過程就比較平平無奇了,可以添加如下技巧:梯度累積、遺傳算法、EMA滑動平均、算子融合。
展望
檢測之外,之后還可以繼續(xù)拓展和優(yōu)化的方向:
- tensorrt推理加速
- deepsort物體追蹤,可以穩(wěn)定視頻中檢測框的抖動
- 針對小目標(biāo)分割patch檢測,例如衛(wèi)星遙感圖像的改進(jìn)you only look twice
- 多尺度scalable yolov4
代碼
Yolov5-pytorch
Yolov5-tensorflow
聯(lián)系方式
公眾號搜索:YueTan
總結(jié)
以上是生活随笔為你收集整理的目标检测:Yolov5集百家之长的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringMVC 执行流程解析
- 下一篇: Debug Tensorflow: 随着