(1920仍稀,被識(shí)別為泰迪熊拳芙?有排面)
背景
2017年底察藐,我已畢業(yè)多年了。用起Excel和PPT舟扎、研究車的質(zhì)量問題儼然老手的樣子分飞。有一晚,照著一個(gè)帖子跑了一下Yolov1的inference睹限,驚為天人譬猫。躡手躡腳的搞環(huán)境、下模型羡疗、跑一下clone的程序染服,就把攝像頭前的物體都用框框標(biāo)記了出來(lái)。在不懂原理的我看來(lái)叨恨,大概驚嘆了一晚上柳刮。
那份驚嘆,也讓我和許多年輕人一起決定加入AI的行列痒钝。我現(xiàn)在常常吹噓秉颗,自己大學(xué)七年對(duì)航空和汽車發(fā)動(dòng)機(jī)多了解,工作五年對(duì)汽車掌握的多透徹送矩,彷佛放棄了十二年優(yōu)異的經(jīng)驗(yàn)蚕甥,其實(shí)都是人設(shè)啊。我根本就學(xué)不好益愈,現(xiàn)在也完全不記得了梢灭。(當(dāng)然,搞AI也只是現(xiàn)在的人設(shè)罷了蒸其,不要當(dāng)真)
時(shí)過境遷敏释,在AI方面我還是小學(xué)生,Yolo已經(jīng)從V1發(fā)展到了V5摸袁,并有各種衍生和優(yōu)化版本钥顽。我們津津樂道它的名字是You only look once的簡(jiǎn)寫,原意“你只看一遍”是為了區(qū)分看“兩遍”的faster-rcnn等二階段模型靠汁,其簡(jiǎn)寫Yolo又寓意著另一句諺語(yǔ)"You only live once"蜂大,生命只有一次。就像食神里說的“不僅好吃蝶怔,還有噱頭奶浦,我也忍不住買了一碗“。
充滿噱頭的除了性能踢星、名字外甚至還有作者本身澳叉,作者年初時(shí)宣布因?yàn)閷?duì)技術(shù)濫用的擔(dān)憂放棄視覺研究了,頗有高人之風(fēng)。而且明明是個(gè)大胡子成洗,個(gè)人網(wǎng)站卻是滿滿粉色獨(dú)角獸的萌妹風(fēng)格五督。寫的論文中,為了突出速度之快瓶殃,甚至故意把圖畫到坐標(biāo)軸外面去了充包。
機(jī)器視覺任務(wù),常見的有分類遥椿、檢測(cè)基矮、分割。而Yolo正是檢測(cè)中的佼佼者冠场,在工業(yè)界愈捅,Yolo兼顧精度和速度,往往是大家的首選慈鸠。
效果
V5的效果也是非常不錯(cuò):
其實(shí)蓝谨,yolov4剛出來(lái)的時(shí)候,大家還對(duì)名字爭(zhēng)議了一番青团。畢竟原作者已經(jīng)棄坑譬巫,新作看上去又是一個(gè)trick集合。馬上yolov5出現(xiàn)之后督笆,似乎對(duì)v4的質(zhì)疑就消失了芦昔,因?yàn)関5這個(gè)名字起的似乎更離譜了。這里就不討論名字爭(zhēng)議了娃肿。
原理
作為一階段end2end的檢測(cè)算法代表作咕缎,我們簡(jiǎn)單回顧一下Yolo從V1到V5的主要改進(jìn)措施,當(dāng)然backbone也一直在進(jìn)化著料扰。
v1: 劃分網(wǎng)格負(fù)責(zé)檢測(cè)凭豪,confidence loss
v2: 加入k-means的anchor,兩階段訓(xùn)練晒杈,全卷積網(wǎng)絡(luò)
v3: FPN多尺度檢測(cè)
v4: spp嫂伞,mish激活函數(shù),數(shù)據(jù)增強(qiáng)mosaic\mixup拯钻,giou損失函數(shù)
v5: 對(duì)模型大小靈活控制帖努,hardswish激活函數(shù),數(shù)據(jù)增強(qiáng)
v1/v2因?yàn)閷?duì)小目標(biāo)檢測(cè)效果不佳粪般,在v3中加入了多尺度檢測(cè)拼余。v3大概可以比作iphone界的iphone6,是前后代廣受好評(píng)的大成者亩歹,至今仍活躍在一線匙监,“等等黨永遠(yuǎn)不虧”寡润。Yolov4把整個(gè)流程中可能進(jìn)行的優(yōu)化都梳理和嘗試了了一遍,并找到了各個(gè)排列組合中的最好效果舅柜。v5可以靈活的控制從10+M到200+M的模型,其小模型非常驚艷躲惰。
v3到v5的整體網(wǎng)絡(luò)圖相差不多致份,可以清晰的看到:模型從三個(gè)不同尺度分別對(duì)大小不同的物體有重點(diǎn)的進(jìn)行檢測(cè)。
細(xì)節(jié)
數(shù)據(jù)增強(qiáng)和預(yù)處理
由于模型需要圖片尺寸相同础拨,因此可以采用resize氮块、padding resize和letterbox的方法。letterbox訓(xùn)練的時(shí)候不用诡宗,只是在推理時(shí)候用滔蝉。數(shù)據(jù)增強(qiáng)(data augmentation)是提升模型泛化能力的重要手段。
flip: 翻轉(zhuǎn)
perspective:仿射變換
hsv augment:顏色變換
mosaic:馬賽克數(shù)據(jù)增強(qiáng)把原來(lái)的四幅圖組在一起
當(dāng)然后面可以試試albumentations包里的方法塔沃。
獲取anchor:k-means
早就在機(jī)器學(xué)習(xí)中學(xué)過最基礎(chǔ)的聚類算法k-means蝠引,沒想到第一次用上是在目標(biāo)檢測(cè)里。果然沒有免費(fèi)的午餐啊蛀柴,在合適的地方用上合適的算法就好螃概。k-means的兩個(gè)關(guān)鍵超參數(shù)是k的選擇和距離的選擇,所以在Yolo中的k等于n_scale(尺度鸽疾,一般為3)* anchor_per_scale (每個(gè)尺度的anchor吊洼,一般也為3)。V5做了一點(diǎn)小小的改進(jìn):訓(xùn)練時(shí)自動(dòng)獲取制肮。
匹配anchor和網(wǎng)格
雖然討論的時(shí)候冒窍,經(jīng)常看見的都是改了哪些fancy的模型豺鼻,真正寫程序時(shí)比較困難的反而是這種數(shù)據(jù)前處理的pipeline综液。yolo的關(guān)鍵思想通過標(biāo)記物體的中心點(diǎn)落在哪個(gè)網(wǎng)格里,就由這個(gè)網(wǎng)格負(fù)責(zé)檢測(cè)儒飒,就是通過設(shè)置目標(biāo)來(lái)實(shí)現(xiàn)的意乓。
1)計(jì)算這張圖片所有g(shù)round truth與每一個(gè)anchor的IOU,從而得到對(duì)每一個(gè)ground truth匹配最好的anchor id约素〗炝迹可以根據(jù)真實(shí)框和錨礦的IOU或者長(zhǎng)寬比來(lái)選擇,v4與v5中做的改進(jìn)是根據(jù)寬高比來(lái)進(jìn)行anchor的匹配圣猎。
2)對(duì)每一個(gè)ground truth循環(huán)士葫。找到這個(gè)anchor對(duì)應(yīng)的尺度,和這個(gè)anchor對(duì)應(yīng)的哪一個(gè)anchor送悔。
3)模型最終輸出的是三個(gè)尺度慢显,每個(gè)尺度下每個(gè)網(wǎng)格帶下的三個(gè)anchor對(duì)應(yīng)的box爪模。所以將標(biāo)記的box也要放置到對(duì)應(yīng)的grid里,對(duì)應(yīng)的是三個(gè)anchor里的哪一個(gè)荚藻。根據(jù)上面找到對(duì)應(yīng)grid屋灌,對(duì)應(yīng)anchor,將標(biāo)記的box尺寸和class 信息設(shè)置到目標(biāo)里应狱,其他設(shè)置為0共郭。
另外兩個(gè)改進(jìn)點(diǎn),一個(gè)改進(jìn)點(diǎn)是正樣本增強(qiáng)疾呻。通過正樣本的增強(qiáng)可以減輕正負(fù)樣本的不均衡除嘹。另一個(gè)改進(jìn)點(diǎn)是標(biāo)注框?qū)nchor的encoding(編碼方式)。從v2中引入anchor以來(lái)岸蜗,一直通過如下編碼方式
為了解決網(wǎng)格的敏感性尉咕,v4的作者發(fā)現(xiàn)簡(jiǎn)單的編碼方式就可以提高結(jié)果。
x = (logistic(in) * 2 - 0.5 + grid_x) / grid_width
y = ...
w = pow( logistic(in)*2, 2) * anchor / network_width
h = ...
模型主體
(來(lái)自dabai同學(xué))
v5的模型通過類似EfficientNet的兩個(gè)系數(shù)來(lái)控制模型的寬度和深度璃岳,在yaml文件的depth_multiple和width_multiple中調(diào)節(jié)年缎。
Focus:是v5相對(duì)v4的改進(jìn)。
CSPNet:跨階段局部融合網(wǎng)絡(luò)
PANet:之前FPN是把傳統(tǒng)視覺任務(wù)的圖像金字塔改進(jìn)到了深度學(xué)習(xí)的特征金字塔铃慷,來(lái)自論文Path Aggregation Network for Instance Segmentation晦款。
損失函數(shù)
Yolo的損失函數(shù)比較驚艷,通過損失函數(shù)的設(shè)定把目標(biāo)檢測(cè)任務(wù)轉(zhuǎn)化為一個(gè)回歸任務(wù)枚冗。
第一部分為box的損失函數(shù)缓溅,可以用過smoth L1損失函數(shù)計(jì)算xywh,也可以通過iou赁温、giou坛怪、ciou等。類似的giou股囊、diou和ciou都是在交并比iou的基礎(chǔ)上發(fā)展而來(lái)的優(yōu)化方法袜匿,解決了iou在兩個(gè)候選框完全沒有交集時(shí),損失為0不可優(yōu)化的狀況稚疹。第二部分為有無(wú)物體的損失:yolo獨(dú)特的設(shè)置了一個(gè)有無(wú)物體的confidence居灯,目標(biāo)中有的自然設(shè)置為1。預(yù)測(cè)的值用sigmoid轉(zhuǎn)化為(0内狗,1)的概率怪嫌,然后計(jì)算binary cross entropy。第三部分為分類損失部分柳沙,雖然是多分類岩灭,也采用binary corss entropy。
同時(shí)赂鲤,為了平衡不同尺度的輸出噪径,v5中對(duì)以上三部分加了人工痕跡比較明顯的系數(shù)柱恤。
后處理
極大值抑制(nms)。分三個(gè)尺度進(jìn)行檢測(cè)找爱,且分配不同的anchor梗顺,那么同一個(gè)物體有可能被多個(gè)尺度、anchor所檢測(cè)到车摄。所以通過極大值抑制來(lái)從中選擇最佳的候選框寺谤。也有soft-nms、matrix-nms等改進(jìn)方式可以試一試练般。
訓(xùn)練
訓(xùn)練過程就比較平平無(wú)奇了,可以添加如下技巧:梯度累積锈候、遺傳算法薄料、EMA滑動(dòng)平均、算子融合泵琳。
展望
檢測(cè)之外摄职,之后還可以繼續(xù)拓展和優(yōu)化的方向:
- tensorrt推理加速
- deepsort物體追蹤,可以穩(wěn)定視頻中檢測(cè)框的抖動(dòng)
- 針對(duì)小目標(biāo)分割patch檢測(cè)获列,例如衛(wèi)星遙感圖像的改進(jìn)you only look twice
- 多尺度scalable yolov4
致謝
代碼如下:
Yolov5-pytorch
Yolov5-tensorflow