YOLO 算法(Putting it together: YOLO algorithm)
你們已經(jīng)學(xué)到對(duì)象檢測(cè)算法的大部分組件了,在這個(gè)筆記里艇挨,我們會(huì)把所有組件組裝在一起構(gòu)成YOLO對(duì)象檢測(cè)算法浴韭。
我們先看看如何構(gòu)造你的訓(xùn)練集置济,假設(shè)你要訓(xùn)練一個(gè)算法去檢測(cè)三種對(duì)象壹瘟,行人阅签、汽車和摩托車,你還需要顯式指定完整的背景類別枕面。
這里有3個(gè)類別標(biāo)簽,如果你要用兩個(gè)anchor box缚去,那么輸出 y 就是3×3×2×8潮秘,其中3×3表示3×3個(gè)網(wǎng)格,2是anchor box的數(shù)量易结,8是向量維度枕荞,8實(shí)際上先是5(p_c,b_x,b_y,b_h,b_w)再加上類別的數(shù)量(c_1,c_2,c_3)。你可以將它看成是3×3×2×8搞动,或者3×3×16躏精。要構(gòu)造訓(xùn)練集,你需要遍歷9個(gè)格子鹦肿,然后構(gòu)成對(duì)應(yīng)的目標(biāo)向量y矗烛。
所以先看看第一個(gè)格子(編號(hào)1),里面沒什么有價(jià)值的東西箩溃,行人瞭吃、車子和摩托車,三個(gè)類別都沒有出現(xiàn)在左上格子中涣旨,所以對(duì)應(yīng)那個(gè)格子目標(biāo)y就是這樣的歪架,
第一個(gè)anchor box的 p_c 是0,因?yàn)闆]什么和第一個(gè)anchor box有關(guān)的霹陡,第二個(gè)anchor box的 p_c 也是0和蚪,剩下這些值是don’t care-s止状。
現(xiàn)在網(wǎng)格中大多數(shù)格子都是空的,但那里的格子(編號(hào)2)會(huì)有這個(gè)目標(biāo)向量y攒霹,
所以假設(shè)你的訓(xùn)練集中导俘,對(duì)于車子有這樣一個(gè)邊界框(編號(hào)3),水平方向更長(zhǎng)一點(diǎn)剔蹋。所以如果這是你的anchor box旅薄,這是anchor box 1(編號(hào)4),這是anchor box 2(編號(hào)5)泣崩,然后紅框和anchor box 2的交并比更高少梁,那么車子就和向量的下半部分相關(guān)。要注意矫付,這里和anchor box 1有關(guān)的 p_c 是0凯沪,剩下這些分量都是don’t care-s,然后你的第二個(gè) p_c=1买优,然后你要用這些(b_x,b_y,b_h,b_w)來指定紅邊界框的位置妨马,然后指定它的正確類別是2(c_1=0,c_2=1,c_3=0),對(duì)吧杀赢,這是一輛汽車烘跺。
所以你這樣遍歷9個(gè)格子,遍歷3×3網(wǎng)格的所有位置脂崔,你會(huì)得到這樣一個(gè)向量滤淳,得到一個(gè)16維向量,所以最終輸出尺寸就是3×3×16砌左。
和之前一樣脖咐,簡(jiǎn)單起見,我在這里用的是3×3網(wǎng)格汇歹,實(shí)踐中用的可能是19×19×16屁擅,或者需要用到更多的anchor box,可能是19×19×5×8产弹,即19×19×40派歌,用了5個(gè)anchor box。這就是訓(xùn)練集取视,然后你訓(xùn)練一個(gè)卷積網(wǎng)絡(luò)硝皂,輸入是圖片,可能是100×100×3作谭,然后你的卷積網(wǎng)絡(luò)最后輸出尺寸是稽物,在我們例子中是3×3×16或者3×3×2×8。
接下來我們看看你的算法是怎樣做出預(yù)測(cè)的折欠?
輸入圖像贝或,你的神經(jīng)網(wǎng)絡(luò)的輸出尺寸是這個(gè)3××3×2×8吼过,對(duì)于9個(gè)格子,每個(gè)都有對(duì)應(yīng)的向量咪奖。對(duì)于左上的格子(編號(hào)1)盗忱,那里沒有任何對(duì)象,那么我們希望你的神經(jīng)網(wǎng)絡(luò)在那里(第一個(gè)p_c)輸出的是0羊赵,這里(第二個(gè)p_c)是0趟佃,然后我們輸出一些值,你的神經(jīng)網(wǎng)絡(luò)不能輸出問號(hào)昧捷,不能輸出don’t care-s闲昭,剩下的我輸入一些數(shù)字,但這些數(shù)字基本上會(huì)被忽略靡挥,因?yàn)樯窠?jīng)網(wǎng)絡(luò)告訴你序矩,那里沒有任何東西,所以輸出是不是對(duì)應(yīng)一個(gè)類別的邊界框無關(guān)緊要跋破,所以基本上是一組數(shù)字簸淀,多多少少都是噪音(輸出 y 如編號(hào)3所示)。
和這里的邊界框不大一樣毒返,希望y的值租幕,那個(gè)左下格子(編號(hào)2)的輸出y(編號(hào)4所示),形式是饿悬,對(duì)于邊界框1來說(p_c)是0令蛉,然后就是一組數(shù)字,就是噪音(anchor box 1對(duì)應(yīng)行人狡恬,此格子中無行人,p_c=0,b_x=?,b_y=?,b_h=?,b_w=?,c_1=?c_2=?,c_3=?)蝎宇。
希望你的算法能輸出一些數(shù)字弟劲,可以對(duì)車子指定一個(gè)相當(dāng)準(zhǔn)確的邊界框(anchor box 2對(duì)應(yīng)汽車,此格子中有車姥芥,p_c=1,b_x,b_y,b_h,b_w,c_1=0,c_2=1,c_3=0)兔乞,這就是神經(jīng)網(wǎng)絡(luò)做出預(yù)測(cè)的過程。
最后你要運(yùn)行一下這個(gè)非極大值抑制凉唐,為了讓內(nèi)容更有趣一些庸追,我們看看一張新的測(cè)試圖像,這就是運(yùn)行非極大值抑制的過程台囱。如果你使用兩個(gè)anchor box淡溯,那么對(duì)于9個(gè)格子中任何一個(gè)都會(huì)有兩個(gè)預(yù)測(cè)的邊界框,其中一個(gè)的概率p_c很低簿训。但9個(gè)格子中咱娶,每個(gè)都有兩個(gè)預(yù)測(cè)的邊界框米间,比如說我們得到的邊界框是是這樣的,注意有一些邊界框可以超出所在格子的高度和寬度(編號(hào)1所示)膘侮。
接下來你拋棄概率很低的預(yù)測(cè)屈糊,去掉這些連神經(jīng)網(wǎng)絡(luò)都說,這里很可能什么都沒有琼了,所以你需要拋棄這些(編號(hào)2所示)逻锐。
最后,如果你有三個(gè)對(duì)象檢測(cè)類別雕薪,你希望檢測(cè)行人昧诱,汽車和摩托車,那么你要做的是蹦哼,對(duì)于每個(gè)類別單獨(dú)運(yùn)行非極大值抑制鳄哭,處理預(yù)測(cè)結(jié)果所屬類別的邊界框,用非極大值抑制來處理行人類別纲熏,用非極大值抑制處理車子類別妆丘,然后對(duì)摩托車類別進(jìn)行非極大值抑制,運(yùn)行三次來得到最終的預(yù)測(cè)結(jié)果局劲。所以算法的輸出最好能夠檢測(cè)出圖像里所有的車子勺拣,還有所有的行人(編號(hào)3所示)。
這就是YOLO對(duì)象檢測(cè)算法鱼填,這實(shí)際上是最有效的對(duì)象檢測(cè)算法之一药有,包含了整個(gè)計(jì)算機(jī)視覺對(duì)象檢測(cè)領(lǐng)域文獻(xiàn)中很多最精妙的思路。