論文鏈接:https://arxiv.org/pdf/1506.02640.pdf
tensorflow源碼鏈接:https://github.com/nilboy/tensorflow-yolo/tree/python2.7/yolo
Ross Girshick提出的Faster R-CNN把目標(biāo)檢測的速度提高了一大步集歇,在用Titan X時(shí)檢測速度可以達(dá)到7fps先舷,同時(shí)準(zhǔn)確度達(dá)到73mAP。但在實(shí)際使用時(shí)這樣的速度還是達(dá)不到實(shí)時(shí)的目地的俩功,幾乎在提出Faster R-CNN的同時(shí)绍傲,Joseph Redmon和Ross Girshick又提出了一種叫做YOLO的檢測方法扔傅,速度可以達(dá)到45fps,YOLO的名字取自You only look once烫饼,從名字就能看出它的速度有多快猎塞。雖然45fps已經(jīng)達(dá)到了實(shí)時(shí)的目標(biāo),但YOLO從出生那天起自身就帶有很多的缺陷杠纵,最大的問題就是mAP只有63荠耽,這樣的準(zhǔn)確度就讓實(shí)用價(jià)值打上了折扣,但不管怎么說作為第一個(gè)達(dá)到實(shí)時(shí)檢測目標(biāo)的結(jié)構(gòu)YOLO還是有很多值得參考的地方的淡诗。
一骇塘、整體結(jié)構(gòu)
YOLO之前的結(jié)構(gòu)都會(huì)先對輸入的圖片提取要檢測的區(qū)域(proposal),然后僅對proposal區(qū)域進(jìn)行分類韩容,因?yàn)檎麄€(gè)過程分為提取proposal+檢測兩個(gè)階段款违,速度就打了折扣。YOLO則直接砍掉了提取proposal的過程群凶,一次回歸就完成bbox位置插爹、目標(biāo)置信度、分類的工作请梢。圖1是它的基本結(jié)構(gòu):
輸入的圖片是448x448的尺寸赠尾,經(jīng)過24個(gè)卷積+2個(gè)全連接層變成[1,7,7,30]的輸出,這個(gè)結(jié)構(gòu)的特征提取部分有點(diǎn)像GoogLeNet毅弧,只是用(1x1卷積+relu+3x3卷積+relu)代替了GoogLeNet上的inception結(jié)構(gòu)气嫁。最后的輸出長寬方向都只有7個(gè)點(diǎn),也就是說原始的448x448圖片可以在長寬方向各7等分够坐,49個(gè)小區(qū)域各自提煉成最終輸出上的一個(gè)點(diǎn)寸宵;此外在特征維度上最后的輸出的長度是30崖面,代表了每個(gè)點(diǎn)都有30種要進(jìn)行回歸的輸出。具體是哪30種數(shù)據(jù)呢梯影?包括了2個(gè)bounding box的位置[x,y,w,h]巫员,2個(gè)bounding box的confidence值,20個(gè)類別的分類概率甲棍,加在一起就有BX5+C=30(B=2個(gè)bounding box, C=20個(gè)分類)個(gè)輸出简识。7x7個(gè)區(qū)域每個(gè)都有30個(gè)輸出,所以整個(gè)圖就有SXSX(BX5+C)=1470個(gè)要回歸的數(shù)據(jù)(S=7感猛,是原圖上等分的數(shù)目)七扰。
下面來詳述上面那30個(gè)輸出的含義:
bounding box位置:在Faster R-CNN中每個(gè)anchor都有9個(gè)不同尺寸的形狀來確保能覆蓋到原圖上的目標(biāo)戳寸,到了YOLO就做了簡化,每個(gè)區(qū)域只用了兩種尺寸的形狀來覆蓋目標(biāo)拷泽,如圖3紅色的區(qū)域就用黃色的兩個(gè)bounding box疫鹊。每個(gè)bounding box都用[x,y,w,h]來定位,x司致、y代表中心點(diǎn)在原圖上的坐標(biāo)位置拆吆,w、h代表bounding box的長寬脂矫。事實(shí)上這種簡化成兩個(gè)bounding box的方法會(huì)犧牲性能枣耀,這也是YOLO準(zhǔn)確度低的原因,在后來的YOLO2庭再、SSD方法中重新啟用了Faster R-CNN的多個(gè)anchor的方式來提升mAP捞奕。
confidence值:confidence是指某個(gè)小區(qū)域是否被用作識別目標(biāo)狼电,以及該區(qū)域?qū)?yīng)的bounding box覆蓋目標(biāo)的準(zhǔn)確度至耻,confidence可以用公式1表示秋忙。如果ground truth的中心點(diǎn)落在小區(qū)域(圖3紅框)內(nèi)部棋嘲,第一項(xiàng)Pr(Object)就等于1,否則是0痹换;IOU是bounding box和ground truth間的重疊部分面積占兩者總覆蓋面積的比例醋虏。在Faster R-CNN中IOU只被用來得出Pr(Object)嫂易,并沒有真正用于回歸計(jì)算斧抱,到了YOLO中IOU也參與到回歸常拓,這么做能得到更加精確的目標(biāo)位置。
要注意的是某一個(gè)ground truth只會(huì)對應(yīng)小區(qū)域內(nèi)IOU最大的那個(gè)bounding box辉浦。也就是說ground truth和bounding box是一一對應(yīng)的關(guān)系弄抬。
如果同時(shí)有多個(gè)目標(biāo)落在同一個(gè)區(qū)域內(nèi),該區(qū)域內(nèi)的bounding box只選用IOU最大的目標(biāo)來計(jì)算confidence宪郊。
分類概率:在作者的論文中只選擇了20個(gè)類別來做識別掂恕,根據(jù)ground truth的類別來給每個(gè)小區(qū)域打上label荔茬。
二、loss計(jì)算
再看下loss的計(jì)算竹海,公式2是YOLO的全部loss組成,分為4個(gè)部分
公式的前兩項(xiàng)是全部SxSxB個(gè)bounding box的位置[x,y,w,h]相對于ground truth位置的回歸損失值丐黄,1ijobj就是前面提到的Pr(Object)斋配,如果ground truth的中心點(diǎn)落在小區(qū)域(圖3紅框)內(nèi)部,它就等于1灌闺,否則是0艰争。
在有相同的預(yù)測偏差時(shí),偏差給小尺寸的bbox帶來的影響要比大尺寸的bbox大的多桂对,因?yàn)樾〕叽鏱box只要偏移一點(diǎn)識別就會(huì)完全不準(zhǔn)甩卓,為了緩和這個(gè)問題,作者對w蕉斜、h的回歸損失采用開根號的方法來計(jì)算逾柿。如圖4:small bbox的橫軸值較小,發(fā)生偏移時(shí)宅此,反應(yīng)到y(tǒng)軸上的loss(下圖綠色)比big box(下圖紅色)要大机错。反過來可以理解成調(diào)整相同大小的損失梯度時(shí),小尺寸bbox就偏移的更少父腕,調(diào)整的就更精確弱匪。
公式2的第3項(xiàng)和第4項(xiàng)是置信度的回歸損失璧亮,C就是某個(gè)小區(qū)域的bounding box的IOU值萧诫,第4項(xiàng)的1ijnoobj只有當(dāng)ground truth的中心點(diǎn)不落在該區(qū)域才是1,否則是0枝嘶,和1ijobj正好相反帘饶。這里為什么要有λcoord和λnoobj兩個(gè)權(quán)重,論文中的解釋是躬络,大部分網(wǎng)格是不包含目標(biāo)的尖奔,所以第4部分的Loss會(huì)比較大,以致于壓制其他部分的loss對整體loss的影響穷当,會(huì)導(dǎo)致模型參數(shù)的不穩(wěn)定提茁,容易發(fā)散,所以會(huì)設(shè)置一個(gè)比較小的λnoobj和比較大的λcoord使得包含目標(biāo)的網(wǎng)格的預(yù)測損失能夠有比較大的權(quán)重馁菜。
三茴扁、測試過程
完成訓(xùn)練后再來看下結(jié)構(gòu)怎么用來測試。測試時(shí)需要將每個(gè)bbox的置信度乘上該小區(qū)域各個(gè)類的預(yù)測概率汪疮,得到每個(gè)類的置信度峭火,見公式3毁习。
得到了全部bbox的類別置信度后,再用一個(gè)門限過濾掉得分低的值卖丸,剩下的再用NMS做非極大值抑制纺且,得出的結(jié)果就是最終的識別結(jié)果。
四稍浆、YOLO的優(yōu)點(diǎn)
YOLO最大的優(yōu)點(diǎn)就是不用再提取proposal载碌,直接對全圖進(jìn)行回歸,原先的兩步流程變成了一步到位衅枫,自然速度就快了很多嫁艇。為什么能砍掉提取proposal的過程呢?在講到Faster R-CNN要有proposal的原因時(shí)弦撩,我們最常提到的一點(diǎn)是:如果對整張圖的特征進(jìn)行分類步咪,目標(biāo)周圍的不相關(guān)背景會(huì)帶來干擾,引起分類不準(zhǔn)確益楼。這個(gè)問題產(chǎn)生的根因是在Faster R-CNN的最后一級卷積層猾漫,空間維度上的信息都已被pooling成了一個(gè)點(diǎn),對一個(gè)包含了全部背景感凤、前景信息的點(diǎn)標(biāo)注label静袖,會(huì)造成計(jì)算出的loss中包含過多背景干擾,進(jìn)而訓(xùn)練的不準(zhǔn)確俊扭。
到了YOLO队橙,卷積的輸出不再是一個(gè)點(diǎn),而是7x7個(gè)點(diǎn)萨惑,你可以給每個(gè)點(diǎn)都單獨(dú)標(biāo)注上原圖對應(yīng)區(qū)域的目標(biāo)的label(不再是全圖一個(gè)label)捐康,這樣就能指引每個(gè)點(diǎn)按各自區(qū)域內(nèi)的目標(biāo)去收斂,不再受到周圍背景的干擾庸蔼。
事實(shí)上YOLO的這種結(jié)構(gòu)還是有些缺陷的解总,因?yàn)樵谳敵鲎罱K的7x7之前有兩個(gè)全連接層,這意味著7x7的每個(gè)點(diǎn)都攜帶有全圖信息姐仅,我們并不需要全圖信息花枫,只要一個(gè)小區(qū)域的信息就能滿足要求,有了全圖信息反而會(huì)造成收斂變慢掏膏。YOLO的這個(gè)缺陷在一年后的SSD結(jié)構(gòu)中有了全新的解決辦法劳翰。
五、YOLO的缺陷
YOLO有不少缺陷馒疹,幾個(gè)最明顯的問題是:
1佳簸、如果兩個(gè)要識別的物體中心點(diǎn)落在同一區(qū)域,但屬于不同的類別颖变,就無法都識別出生均。原因很明顯:一個(gè)小區(qū)域雖然能輸出兩個(gè)bounding box听想,但都是同一類別,兩種類別的物體無論如何都不可能識別全马胧。
2汉买、如果兩個(gè)物體的類別是一樣的,是不是就能識別全呢佩脊?當(dāng)兩個(gè)物體尺寸录别、位置([x,y,w,h])比較相近時(shí)答案就是否定的。前面介紹YOLO的輸出結(jié)構(gòu)時(shí)提到訓(xùn)練時(shí)gound truth和bounding box是一一對應(yīng)的邻吞,一個(gè)ground truth在一個(gè)區(qū)域中選擇哪個(gè)bounding box來訓(xùn)練由IOU的最大值來決定,由此可以推斷兩個(gè)尺寸葫男、位置相近的ground truth一定對應(yīng)同一個(gè)bounding box來訓(xùn)練抱冷,到了測試階段兩個(gè)尺寸、位置相近的目標(biāo)也就一定由同一個(gè)bounding box來識別梢褐,因?yàn)闇y試時(shí)一個(gè)bounding box只能對應(yīng)有一個(gè)輸出([x,y,w,h])旺遮,所以就無法區(qū)分開兩種物體。
3盈咳、當(dāng)長寬比和bbox的默認(rèn)長寬比差異比較大時(shí)耿眉,IOU會(huì)很小,會(huì)影響檢測鱼响;
以上這些缺陷都成為了YOLO后來改進(jìn)的方向鸣剪。