使用NTS理解細(xì)粒度圖像分類(lèi)
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
細(xì)粒度圖像分類(lèi)的一些問(wèn)題和挑戰(zhàn)。
自從2012年的ILSVRC競(jìng)賽Alexnet贏得冠軍以來(lái),計(jì)算機(jī)視覺(jué)已經(jīng)非常出色了。這是人們?cè)陂_(kāi)始研究這項(xiàng)快速發(fā)展的技術(shù)時(shí)經(jīng)常會(huì)遇到的說(shuō)法。這個(gè)博客是為了理解細(xì)粒度視覺(jué)分類(lèi)(FGVC)這一具有挑戰(zhàn)性的問(wèn)題,下面的文章將對(duì)此進(jìn)行詳細(xì)描述。
有關(guān)Pytorch代碼實(shí)現(xiàn),請(qǐng)參考以下github庫(kù):https://github.com/yangze0930/NTS-Net
在這個(gè)過(guò)程中,人們可以理解最初可能面臨的挑戰(zhàn),以及如何使用本文有趣的架構(gòu)從剛開(kāi)始時(shí)的42%達(dá)到87%的驗(yàn)證精度(數(shù)字是基于我的經(jīng)驗(yàn))。使用的數(shù)據(jù)集是FGVC Aircraft variant。后面,我還在Stanford-Cars數(shù)據(jù)集上進(jìn)行了訓(xùn)練。
這篇文章分為以下部分:
第一部分簡(jiǎn)要敘述了我是如何開(kāi)始的以及從這個(gè)問(wèn)題開(kāi)始所面臨的挑戰(zhàn)。
第2部分描述了上面提到的研究論文,其中第1節(jié),第2節(jié)和第3節(jié)分別描述了Region Proposal,它在NTS和各種自定義損失中的用法。
第一部分:初始嘗試和誤差
細(xì)粒度視覺(jué)分類(lèi)
我們知道,視覺(jué)分類(lèi)任務(wù)指創(chuàng)建一個(gè)模型來(lái)捕獲從輸入圖像到相應(yīng)輸出類(lèi)的關(guān)系。然而,F(xiàn)GVC的任務(wù)和普通的分類(lèi)不太一樣,因?yàn)轭?lèi)內(nèi)差異比類(lèi)間差異更多。這就是為什么我們的目標(biāo)是在視覺(jué)上類(lèi)似的類(lèi)中捕獲有區(qū)別的特征。尋找這樣的特征具有挑戰(zhàn)性。此外,對(duì)樣本中信息最豐富的區(qū)域進(jìn)行邊界框的標(biāo)注代價(jià)昂貴。
當(dāng)開(kāi)始處理問(wèn)題時(shí),可以使用圖像分類(lèi)的一般方法,即使用標(biāo)準(zhǔn)的預(yù)訓(xùn)練模型,并對(duì)其進(jìn)行微調(diào),以達(dá)到正確的任務(wù)參數(shù)集合。如本文所述,以下鏈接的數(shù)據(jù)集有三個(gè)層次進(jìn)行分類(lèi),即manufacturer、family和variant 層次。細(xì)粒度分類(lèi)是variant級(jí)別的。
開(kāi)始的時(shí)候,我使用標(biāo)準(zhǔn)的pre-trained模型,并嘗試了不同的調(diào)整,在manufacturer上能得到66%的驗(yàn)證準(zhǔn)確性,在variant上可以得到42%的準(zhǔn)確率,嘗試了NTS后,在variant上第一次就可以得到87%。對(duì)于像我這樣的初學(xué)者來(lái)說(shuō),理解一個(gè)復(fù)雜問(wèn)題的工作代碼并獲得正確的見(jiàn)解是非常有幫助的。
第二部分:是什么導(dǎo)致了這個(gè)效果
NTS-NET
如前所述,收集每個(gè)樣本中信息最豐富區(qū)域的邊界框的標(biāo)注樣本是非常昂貴的。這正是本文所提供的幫助。它有效地局部化了這些信息區(qū)域,而不需要邊界框標(biāo)注。
本文中創(chuàng)建的模型稱為NTS-NET,使用三個(gè)協(xié)同工作的“agent”在基準(zhǔn)數(shù)據(jù)集( FGVC aircraft、Stanford Cars、Caltech-UCSD Birds)中實(shí)現(xiàn)最先進(jìn)的性能。
這三個(gè)代理被定義為Navigator、Teacher和Scrutinizer。讓我們討論一下它們的作用。
The Navigator agent 網(wǎng)絡(luò)導(dǎo)航模型,以關(guān)注信息最豐富的區(qū)域。對(duì)于圖像中的每個(gè)區(qū)域,Navigator通過(guò)對(duì)損失排序來(lái)預(yù)測(cè)該區(qū)域的信息量(如下所述),并利用這些預(yù)測(cè)來(lái)提出信息最豐富的區(qū)域。現(xiàn)在的問(wèn)題是:如何在圖像中得到有用的可變長(zhǎng)度的“區(qū)域”?好了,這個(gè)問(wèn)題前面已經(jīng)有了答案,所以請(qǐng)耐心等待我來(lái)理解每個(gè)agent的高級(jí)功能。
Teacher agent 對(duì)Navigator提出的信息量最大的區(qū)域進(jìn)行評(píng)估,并提供反饋:對(duì)于每個(gè)提出的區(qū)域,Teacher評(píng)估其概率為ground-truth class。置信度評(píng)估指導(dǎo)navigator網(wǎng)絡(luò)使用排序一致性損失函數(shù)(在代碼實(shí)現(xiàn)中稱為“ranking loss”),提出信息更豐富的區(qū)域。
當(dāng)teacher提供更精確的監(jiān)督時(shí),navigator會(huì)將更多的信息區(qū)域局部化,從而使teacher受益。
Scrutinizer agent 從Navigator中對(duì)提出的區(qū)域進(jìn)行審查并進(jìn)行細(xì)粒度分類(lèi):將每個(gè)提出的區(qū)域擴(kuò)大到相同大小,agent從中提取特征,將區(qū)域特征與整幅圖像的特征聯(lián)合處理,進(jìn)行細(xì)粒度分類(lèi),是解決這一復(fù)雜問(wèn)題的主要方法。
信息區(qū)域有助于更好地表征物體,因此將信息區(qū)域的特征與全圖像融合將獲得更好的性能。
因此,目標(biāo)是局部化物體中信息最豐富的區(qū)域。

現(xiàn)在讓我們回到上面討論的問(wèn)題,即如何在圖像中得到有用的可變長(zhǎng)度“區(qū)域”?導(dǎo)航到可能的信息區(qū)域可以看作是在R-CNN論文中引入的區(qū)域建議網(wǎng)絡(luò)(RPN)的問(wèn)題,我將在這里討論它的相關(guān)性。
第1節(jié):區(qū)域建議
在討論區(qū)域建議如何在NTS上實(shí)施之前,我應(yīng)該先簡(jiǎn)單介紹一下它的起源。如果你知道,請(qǐng)隨意跳過(guò)這個(gè)部分。
有幾個(gè)進(jìn)行區(qū)域建議的方法:
i) 滑動(dòng)窗口:滑動(dòng)窗口中,你在所有固定大小的滑動(dòng)圖像的窗口上運(yùn)行一個(gè)訓(xùn)練分類(lèi)器,然后運(yùn)行檢測(cè)器來(lái)查看物體是什么。我們可以使用這種算法,但缺點(diǎn)是它可能會(huì)檢查許多這樣的沒(méi)有物體的窗口,因此提出了R-CNN算法。
ii) R-CNN:在這個(gè)方法中進(jìn)行分割算法,獲取可能包含物體的區(qū)域,只在這些區(qū)域上運(yùn)行分類(lèi)器。缺點(diǎn)是速度慢,因?yàn)榻ㄗh的區(qū)域一次只分類(lèi)一個(gè)類(lèi)別。
iii) Fast R-CNN:用分割算法進(jìn)行區(qū)域建議,與R-CNN不同的是,所有建議的區(qū)域都使用卷積式滑動(dòng)窗口實(shí)現(xiàn)同時(shí)分類(lèi)。
iv) Faster R-CNN:使用區(qū)域建議網(wǎng)絡(luò),簡(jiǎn)稱RPN,它需要錨(以不同的大小、尺度和長(zhǎng)寬比分布在圖像各處的邊界框)和ground truth邊界框來(lái)建議信息區(qū)域,而不是傳統(tǒng)的分割算法。
第2節(jié):NTS中的區(qū)域建議是什么樣的?
在本文中,默認(rèn)的錨被放置在整個(gè)圖像中,而NTS-model,通過(guò)代碼實(shí)現(xiàn)中的自定義損失(學(xué)習(xí)是因?yàn)?/em>我們沒(méi)有使用帶標(biāo)注的邊框)從這些錨點(diǎn)中學(xué)習(xí)了最具信息的錨點(diǎn)。這些錨定義了代碼中定義的由Prosposal_Net(或Navigator Network)給出的建議區(qū)域的坐標(biāo),并使用NMS(非最大抑制)去除冗余(重疊區(qū)域)并給出top_n的建議區(qū)域。


第3節(jié):NTS-NET中各種損失的描述
在論文中使用的自定義損失有很多,后來(lái)累計(jì)在總損失中,即原始損失、concat損失、rank損失和part_cls損失。
注:代碼中使用的損失術(shù)語(yǔ)與論文中的不同,分別是Navigator、Teacher和Scrutinizer的損失,這里我使用代碼中使用的損失。
Total loss= Raw_loss+Rank_loss+Concat_loss+Part_cls_loss
注:我們使用RESNET50模型作為原始圖像和建議區(qū)域的特征提取器。
RAW LOSS:這是針對(duì)RESNET網(wǎng)絡(luò)參數(shù)的圖像分類(lèi)的分類(lèi)交叉熵?fù)p失。我們對(duì)原始圖像的特征進(jìn)行raw loss,然后將其與我們的建議區(qū)域圖像的特征結(jié)合進(jìn)行細(xì)粒度分類(lèi)。這里的輸出是圖像的標(biāo)簽。
CONCAT LOSS:在Scrutinizer網(wǎng)絡(luò)中,我們從原始圖像特征和建議區(qū)域特征CONCAT,輸入到這個(gè)分類(lèi)交叉熵?fù)p失中國(guó),輸出圖像的標(biāo)簽。
PART LOSS(LIST LOSS):它被用作navigator網(wǎng)絡(luò)的反饋,因?yàn)樵谶@里我們找到了每個(gè)建議的圖像和它的ground truth類(lèi)之間的交叉熵?fù)p失。
RANK LOSS:使用top_n rpn分?jǐn)?shù)(建議區(qū)域特征)和相應(yīng)的損失作為每一個(gè)建議區(qū)域收到的反饋損失的一部分,對(duì)于每一個(gè)建議區(qū)域,所有排序在建議區(qū)域之前的loss添加到rank loss中,這樣rank loss可以進(jìn)行優(yōu)化。
PART_CLS LOSS:這是部分特征和標(biāo)簽之間的交叉熵?fù)p失。部分特征使用代碼中定義的part_images從RESNET-50中提取,該代碼使用top_n建議區(qū)域的坐標(biāo)從原始圖像中生成。
現(xiàn)在part loss和part_cls損失是相同的,但是part_cls損失對(duì)total損失有貢獻(xiàn),而其他loss則沒(méi)有,并且part_loss在rank loss中還用作指導(dǎo)/反饋。
好消息!
小白學(xué)視覺(jué)知識(shí)星球
開(kāi)始面向外開(kāi)放啦??????
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車(chē)道線檢測(cè)、車(chē)輛計(jì)數(shù)、添加眼線、車(chē)牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。 下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。 交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

