Bounding Box預(yù)測(Bounding box predictions)
在上一篇筆記中汞舱,你們學(xué)到了滑動窗口法的卷積實現(xiàn)蚁阳,這個算法效率更高稠茂,但仍然存在問題谈宛,不能輸出最精準(zhǔn)的邊界框芥映。在這個筆記中吐根,我們看看如何得到更精準(zhǔn)的邊界框逮矛。
在滑動窗口法中鲫售,你取這些離散的位置集合,然后在它們上運(yùn)行分類器径筏,在這種情況下,這些邊界框沒有一個能完美匹配汽車位置障陶,也許這個框(編號1)是最匹配的了滋恬。還有看起來這個真實值,最完美的邊界框甚至不是方形抱究,稍微有點長方形(紅色方框所示)恢氯,長寬比有點向水平方向延伸,有沒有辦法讓這個算法輸出更精準(zhǔn)的邊界框呢鼓寺?
其中一個能得到更精準(zhǔn)邊界框的算法是YOLO算法勋拟,YOLO(You only look once)意思是你只看一次,這是由Joseph Redmon妈候,Santosh Divvala敢靡,Ross Girshick和Ali Farhadi提出的算法。
這個算法是這么做的:
比如你的輸入圖像是100×100的苦银,然后在圖像上放一個網(wǎng)格啸胧。為了介紹起來簡單一些,我用3×3網(wǎng)格幔虏,實際實現(xiàn)時會用更精細(xì)的網(wǎng)格纺念,可能是19×19∠肜ǎ基本思路是使用圖像分類和定位算法(前幾個筆記中介紹過的)陷谱,然后將算法應(yīng)用到9個格子上。(基本思路是瑟蜈,采用圖像分類和定位算法烟逊,本周第一個筆記介紹過的,逐一應(yīng)用在圖像的9個格子中踪栋。)
更具體一點焙格,你需要這樣定義訓(xùn)練標(biāo)簽,所以對于9個格子中的每一個指定一個標(biāo)簽y夷都,y是8維的眷唉,和你之前看到的一樣予颤,
p_c等于0或1取決于這個綠色格子中是否有圖像。
然后b_x冬阳、b_y蛤虐、b_h和b_w作用就是,如果那個格子里有對象肝陪,那么就給出邊界框坐標(biāo)驳庭。
然后c_1、c_2和c_3就是你想要識別的三個類別氯窍,背景類別不算饲常,所以你嘗試在背景類別中識別行人、汽車和摩托車狼讨,那么c_1贝淤、c_2和c_3可以是行人、汽車和摩托車類別政供。這張圖里有9個格子播聪,所以對于每個格子都有這么一個向量。
我們看看左上方格子布隔,這里這個(編號1)离陶,里面什么也沒有,所以左上格子的標(biāo)簽向量y是
然后這個格子(編號2)的輸出標(biāo)簽y也是一樣衅檀,這個格子(編號3)招刨,還有其他什么也沒有的格子都一樣。
現(xiàn)在這個格子呢哀军?
講的更具體一點计济,這張圖有兩個對象,YOLO算法做的就是排苍,取兩個對象的中點沦寂,然后將這個對象分配給包含對象中點的格子。
所以左邊的汽車就分配到這個格子上(編號4)淘衙,然后這輛Condor(車型:神鷹)中點在這里传藏,分配給這個格子(編號6)。所以即使中心格子(編號5)同時有兩輛車的一部分彤守,我們就假裝中心格子沒有任何我們感興趣的對象毯侦,所以對于中心格子,分類標(biāo)簽y和這個向量類似具垫,和這個沒有對象的向量類似侈离,即
而對于這個格子,這個用綠色框起來的格子(編號4)筝蚕,目標(biāo)標(biāo)簽就是這樣的卦碾,這里有一個對象铺坞,p_c=1,然后你寫出b_x洲胖、b_y济榨、b_h和b_w來指定邊界框位置,然后還有
類別1是行人绿映,那么c_1=0擒滑,
類別2是汽車,所以c_2=1叉弦,
類別3是摩托車丐一,則數(shù)值c_3=0,即
右邊這個格子(編號6)也是類似的淹冰,因為這里確實有一個對象钝诚,它的向量應(yīng)該是這個樣子的,
作為目標(biāo)向量對應(yīng)右邊的格子榄棵。
所以對于這里9個格子中任何一個,你都會得到一個8維輸出向量潘拱,因為這里是3×3的網(wǎng)格疹鳄,所以有9個格子,總的輸出尺寸是3×3×8芦岂,所以目標(biāo)輸出是3×3×8瘪弓。因為這里有3×3格子,然后對于每個格子禽最,你都有一個8維向量y腺怯,所以目標(biāo)輸出尺寸是3×3×8。
對于這個例子中川无,左上格子是1×1×8呛占,對應(yīng)的是9個格子中左上格子的輸出向量。所以對于這3×3中每一個位置而言懦趋,對于這9個格子晾虑,每個都對應(yīng)一個8維輸出目標(biāo)向量y,其中一些值可以是dont care-s(即仅叫?)帜篇,如果這里沒有對象的話。所以總的目標(biāo)輸出诫咱,這個圖片的輸出標(biāo)簽尺寸就是3×3×8笙隙。
如果你現(xiàn)在要訓(xùn)練一個輸入為100×100×3的神經(jīng)網(wǎng)絡(luò),現(xiàn)在這是輸入圖像坎缭,然后你有一個普通的卷積網(wǎng)絡(luò)竟痰,卷積層签钩,最大池化層等等,最后你會有這個凯亮,選擇卷積層和最大池化層边臼,這樣最后就映射到一個3×3×8輸出尺寸。
所以你要做的是假消,有一個輸入x柠并,就是這樣的輸入圖像,然后你有這些3×3×8的目標(biāo)標(biāo)簽y富拗。當(dāng)你用反向傳播訓(xùn)練神經(jīng)網(wǎng)絡(luò)時臼予,將任意輸入x映射到這類輸出向量y。
所以這個算法的優(yōu)點在于神經(jīng)網(wǎng)絡(luò)可以輸出精確的邊界框啃沪,所以測試的時候粘拾,你做的是喂入輸入圖像x,然后跑正向傳播创千,直到你得到這個輸出y缰雇。然后對于這里3×3位置對應(yīng)的9個輸出,我們在輸出中展示過的追驴,你就可以讀出1或0(編號1位置)械哟,你就知道9個位置之一有個對象。如果那里有個對象殿雪,那個對象是什么(編號3位置)暇咆,還有格子中這個對象的邊界框是什么(編號2位置)。只要每個格子中對象數(shù)目沒有超過1個丙曙,這個算法應(yīng)該是沒問題的爸业。一個格子中存在多個對象的問題,我們稍后再討論亏镰。但實踐中扯旷,我們這里用的是比較小的3×3網(wǎng)格,實踐中你可能會使用更精細(xì)的19×19網(wǎng)格索抓,所以輸出就是19×19×8薄霜。這樣的網(wǎng)格精細(xì)得多,那么多個對象分配到同一個格子得概率就小得多纸兔。
重申一下惰瓜,把對象分配到一個格子的過程是,你觀察對象的中點汉矿,然后將這個對象分配到其中點所在的格子崎坊,所以即使對象可以橫跨多個格子,也只會被分配到9個格子其中之一洲拇,就是3×3網(wǎng)絡(luò)的其中一個格子奈揍,或者19×19網(wǎng)絡(luò)的其中一個格子曲尸。在19×19網(wǎng)格中,兩個對象的中點(圖中藍(lán)色點所示)處于同一個格子的概率就會更低男翰。
所以要注意另患,首先這和圖像分類和定位算法非常像,我們在本周第一節(jié)課講過的蛾绎,就是它顯式地輸出邊界框坐標(biāo)昆箕,所以這能讓神經(jīng)網(wǎng)絡(luò)輸出邊界框,可以具有任意寬高比租冠,并且能輸出更精確的坐標(biāo)鹏倘,不會受到滑動窗口分類器的步長大小限制。其次顽爹,這是一個卷積實現(xiàn)纤泵,你并沒有在3×3網(wǎng)格上跑9次算法,或者镜粤,如果你用的是19×19的網(wǎng)格捏题,19平方是361次,所以你不需要讓同一個算法跑361次肉渴。相反公荧,這是單次卷積實現(xiàn),但你使用了一個卷積網(wǎng)絡(luò)黄虱,有很多共享計算步驟,在處理這3×3計算中很多計算步驟是共享的庸诱,或者你的19×19的網(wǎng)格捻浦,所以這個算法效率很高。
事實上YOLO算法有一個好處桥爽,也是它受歡迎的原因朱灿,因為這是一個卷積實現(xiàn),實際上它的運(yùn)行速度非衬扑模快盗扒,可以達(dá)到實時識別。在結(jié)束之前我還想給你們分享一個小細(xì)節(jié)缀去,如何編碼這些邊界框b_x侣灶、b_y、b_h和b_w缕碎,我們在下一張圖上討論褥影。
這里有兩輛車,我們有個3×3網(wǎng)格咏雌,我們以右邊的車為例(編號1)凡怎,紅色格子里有個對象校焦,所以目標(biāo)標(biāo)簽y就是,p_c=1统倒,然后b_x寨典、b_y、b_h和b_w房匆,然后c_1=0耸成,c_2=1,c_3=0坛缕,即
你怎么指定這個邊界框呢墓猎?
Specify the bounding boxes:
在YOLO算法中,對于這個方框(編號1所示)赚楚,我們約定左上這個點是(0,0)毙沾,然后右下這個點是(1,1),要指定橙色中點的位置,b_x大概是0.4宠页,因為它的位置大概是水平長度的0.4左胞,然后b_y大概是0.3,然后邊界框的高度用格子總體寬度的比例表示举户,所以這個紅框的寬度可能是藍(lán)線(編號2所示的藍(lán)線)的90%烤宙,所以b_h是0.9,它的高度也許是格子總體高度的一半俭嘁,這樣的話b_w就是0.5躺枕。換句話說,b_x供填、b_y拐云、b_h和b_w單位是相對于格子尺寸的比例,所以b_x和b_y必須在0和1之間近她,因為從定義上看叉瘩,橙色點位于對象分配到格子的范圍內(nèi),如果它不在0和1之間粘捎,如果它在方塊外薇缅,那么這個對象就應(yīng)該分配到另一個格子上。這個值(b_h和b_w)可能會大于1攒磨,特別是如果有一輛汽車的邊界框是這樣的(編號3所示)泳桦,那么邊界框的寬度和高度有可能大于1。
指定邊界框的方式有很多娩缰,但這種約定是比較合理的蓬痒,如果你去讀YOLO的研究論文,YOLO的研究工作有其他參數(shù)化的方式,可能效果會更好梧奢,我這里就只給出了一個合理的約定狱掂,用起來應(yīng)該沒問題。不過還有其他更復(fù)雜的參數(shù)化方式亲轨,涉及到sigmoid函數(shù)趋惨,確保這個值(b_x和b_y)介于0和1之間,然后使用指數(shù)參數(shù)化來確保這些(b_h和b_w)都是非負(fù)數(shù)惦蚊,因為0.9和0.5器虾,這個必須大于等于0。還有其他更高級的參數(shù)化方式蹦锋,可能效果要更好一點兆沙,但我這里講的辦法應(yīng)該是管用的。
這就是YOLO算法莉掂,你只看一次算法葛圃,在接下來的幾個筆記中,我會告訴你一些其他的思路可以讓這個算法做的更好憎妙。在此期間库正,如果你感興趣,也可以看看YOLO的論文厘唾,在前幾張幻燈片底部引用的YOLO論文(Redmon, Joseph, et al. "You Only Look Once: Unified, Real-Time Object Detection." (2015):779-788.)