Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗

本文是Kaggle的一項(xiàng)挑戰(zhàn)賽——Plant Seedings Classification的解決方案,作者Kumar Shridhar最終排名第五。其中的方法非常通用,可以用在其他圖像識(shí)別任務(wù)上。

任務(wù)概覽

你能分清楚雜草和莊稼苗嗎?

如果能高效識(shí)別雜草,就能有效地提高糧食產(chǎn)量,更好地管理環(huán)境。Aarhus University Signal Processing和University of Southern Denmark共同合作,發(fā)布了一份含有12種植物的數(shù)據(jù)集,其中共有將近960棵植株,分別處于不同的生長(zhǎng)階段。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖1

其中一個(gè)樣本植物

該數(shù)據(jù)集目前已經(jīng)公開(kāi),其中的RGB圖像都經(jīng)過(guò)了標(biāo)注,其中物理分辨率大約為每毫米10像素。下面是數(shù)據(jù)集中12種植物的樣本示例:

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖2

要將每張圖片分到各自的類別中,這一任務(wù)可以分成5步:

第一步

首先,機(jī)器學(xué)習(xí)中最重要的任務(wù)是分析數(shù)據(jù)集,在開(kāi)始著手設(shè)計(jì)算法前,理解數(shù)據(jù)集的復(fù)雜程度是非常重要的。

數(shù)據(jù)集中各類圖片的分布如下所示:

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖3

如之前所提到的,這里總共有12種植物的類型,總共有4750張照片。然而,從上圖我們可以看出各種植物的分類并不平均,有些種類里有654張圖片,而有的只有221張。這充分說(shuō)明了數(shù)據(jù)是不平衡的,在第三步時(shí)我們會(huì)解決這一問(wèn)題。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖4

圖片種類分布

現(xiàn)在將圖片進(jìn)行可視化能更好地理解數(shù)據(jù)。下面的圖片將每類植物都挑選了12張,互相對(duì)比看看它們之間都有什么差別。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖5

圖中的各種植物看起來(lái)都長(zhǎng)得很像,只看圖片也沒(méi)什么特別之處。所以我決定用可視化技術(shù)t-SNE對(duì)圖像分類進(jìn)行處理。

t-SNE是適用于高維數(shù)據(jù)集的降維技術(shù),它可以通過(guò)Barnes-Hut技術(shù)應(yīng)用到大型真實(shí)數(shù)據(jù)集上。論智君也曾報(bào)道過(guò)相關(guān)資訊:

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖6

數(shù)據(jù)集的t-SNE可視化

通過(guò)近距離觀察,我們很難看出各類之間的差異。所以重要的是弄清楚數(shù)據(jù)只是對(duì)人來(lái)說(shuō)難以分辨還是對(duì)機(jī)器學(xué)習(xí)模型也很難分辨。所以我們需要為此制定一個(gè)基礎(chǔ)標(biāo)準(zhǔn)。

訓(xùn)練和驗(yàn)證集

在開(kāi)始對(duì)模型設(shè)定基礎(chǔ)標(biāo)準(zhǔn)之前,我們需要把數(shù)據(jù)分成訓(xùn)練集和驗(yàn)證集兩部分。一般來(lái)說(shuō),模型首先在訓(xùn)練集上訓(xùn)練,之后在驗(yàn)證集上測(cè)試,并隨著時(shí)間在驗(yàn)證集上不斷提高性能。當(dāng)我們得到滿意的驗(yàn)證集的結(jié)果后,就可以將模型應(yīng)用到真實(shí)的測(cè)試集上,看模型是否過(guò)度擬合或欠擬合,從而進(jìn)行調(diào)整。

我們將數(shù)據(jù)集中的4750張圖片中的80%用作訓(xùn)練集,20%用作驗(yàn)證集。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖7

第二步

有了訓(xùn)練集和驗(yàn)證集,我們就開(kāi)始設(shè)立數(shù)據(jù)集的基準(zhǔn)。在這一任務(wù)中,我們將用到卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)。如果你是個(gè)初學(xué)者,建議先閱讀有關(guān)深度學(xué)習(xí)基礎(chǔ)知識(shí)的文章:深度學(xué)習(xí)入門筆記。

創(chuàng)建CNN模型的方法有很多,我們選擇了Keras深度學(xué)習(xí)庫(kù)。從頭開(kāi)始訓(xùn)練一個(gè)CNN效率非常低,所以我們選擇了一個(gè)在ImageNet上進(jìn)行預(yù)訓(xùn)練的模型權(quán)重,將其進(jìn)行微調(diào)后加以訓(xùn)練。其中頂層是用來(lái)學(xué)習(xí)簡(jiǎn)單基礎(chǔ)特征的,所以無(wú)需訓(xùn)練可以直接應(yīng)用。需要注意的是,我們要檢查一下我們的數(shù)據(jù)集和ImageNet之間的相似性,以及我們的數(shù)據(jù)集有多大。這兩個(gè)特征將決定著我們應(yīng)該如何進(jìn)行調(diào)整??梢蚤喿xAndrej Karpathy的文章了解更多細(xì)節(jié):cs231n.github.io/transfer-learning/

在本次任務(wù)中,我們的數(shù)據(jù)集較小,但是和ImageNet很相似。所以我們首先可以直接用ImageNet的權(quán)重,然后在最后加入一個(gè)帶有12種植物種類的輸出層,得出第一個(gè)基準(zhǔn)。之后我們?cè)俳怄i下面的幾層并進(jìn)行訓(xùn)練。

我們用Keras建立最初的基準(zhǔn),因?yàn)镵eras能提供一些預(yù)訓(xùn)練模型,我們選擇其中的ResNet50和InceptionResNetV2。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖8

同樣,我們可以根據(jù)在ImageNet數(shù)據(jù)集上檢測(cè)這些模型的性能和各模型參數(shù)的數(shù)量來(lái)選擇基準(zhǔn)模型。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖9

對(duì)于第一個(gè)基準(zhǔn),我刪除了最后的輸出層,加上了一個(gè)有12個(gè)種類的輸出層。具體如下所示:

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖10

模型經(jīng)歷了10次迭代,在第6次后結(jié)果達(dá)到飽和。訓(xùn)練精確度達(dá)到了88%,驗(yàn)證精確度達(dá)到了87%。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖11

為了進(jìn)一步提高性能,有一些底部的層沒(méi)有被鎖定,其中的學(xué)習(xí)速率呈指數(shù)衰減。最終將性能提高了兩個(gè)百分點(diǎn)。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖12

以下是這一過(guò)程中使用的超參數(shù):

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖13

第三步

有了基礎(chǔ)標(biāo)準(zhǔn)之后,我們就要基于此改善模型。我們可以從增強(qiáng)更多數(shù)據(jù)開(kāi)始,從而增加數(shù)據(jù)集中圖像的數(shù)量。畢竟數(shù)據(jù)是機(jī)器學(xué)習(xí)之本。

但是之前我們提到,數(shù)據(jù)是不平衡的,我們需要對(duì)其進(jìn)行處理。

真實(shí)的數(shù)據(jù)集從來(lái)都是不平衡的,而模型在小型種類上的表現(xiàn)并不會(huì)很好。所以將少數(shù)種類中的數(shù)據(jù)錯(cuò)分為正常樣本所付出的代價(jià)比正常分類錯(cuò)誤要更高。

所以為了讓數(shù)據(jù)平衡,通常有以下兩種方法:

1.ADASYN算法。ADASYN可以對(duì)擁有較少樣本的種類合成數(shù)據(jù),其核心思想是對(duì)不同的擁有少數(shù)樣本的種類根據(jù)學(xué)習(xí)難易程度進(jìn)行加權(quán)分布,其中學(xué)習(xí)難度更高的種類合成的數(shù)據(jù)越多,容易學(xué)習(xí)的種類數(shù)據(jù)越少。因此,ADASYN方法用兩種改變數(shù)據(jù)分布的方式提升了學(xué)習(xí)性能:(1)減少分類不平衡引起的偏差,(2)自適應(yīng)地將分類決策邊界移向困難的樣本。

2.SMOTE算法。SMOTE算法是對(duì)少類進(jìn)行過(guò)采樣或者下采樣來(lái)得到最佳結(jié)果。通過(guò)對(duì)少數(shù)樣本進(jìn)行過(guò)采樣,同時(shí)對(duì)多數(shù)類別進(jìn)行下采樣可以讓分類器得到最佳水平。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖14

在這一情況下,SMOTE比ADASYN表現(xiàn)得更好。數(shù)據(jù)集平衡后,我們可以進(jìn)行數(shù)據(jù)增強(qiáng)處理,所用方法有以下幾種:

  • 尺度變換

  • 裁剪

  • 翻轉(zhuǎn)

  • 旋轉(zhuǎn)

  • 平移

  • 添加噪聲

  • 改變光線條件

  • GAN

第四步

為了進(jìn)一步提高性能,我們要對(duì)學(xué)習(xí)率進(jìn)行改進(jìn)。在這之前,首先需要找到模型的最佳學(xué)習(xí)速率是多少。這就需要在學(xué)習(xí)速率和損失函數(shù)之間繪圖,看看損失從哪開(kāi)始減少。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖15

在我們的案例中,1e-1看上去是完美的學(xué)習(xí)速率,但是當(dāng)我們?cè)絹?lái)越接近全局最小值,我們就想邁出更小一步。其中一個(gè)方法是學(xué)習(xí)速率退火(learning rate annealing),但是我用的是熱重啟(warm restart)。同樣,優(yōu)化器從Adam換成了SGD,并安裝了SGDR。

現(xiàn)在,我們要用以上技術(shù)訓(xùn)練多個(gè)架構(gòu),然后將結(jié)果融合在一起,這被稱為模型集成。雖然這種方法已經(jīng)很普遍了,但是卻十分耗費(fèi)計(jì)算量。所以我決定用快照集成法(snapshot ensembling),即訓(xùn)練單個(gè)神經(jīng)網(wǎng)絡(luò)進(jìn)行集成,并讓它在優(yōu)化過(guò)程中收斂到幾個(gè)局部最小值,節(jié)省模型參數(shù)。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖16

搞定了學(xué)習(xí)速率方法后,我開(kāi)始調(diào)整圖像尺寸。我訓(xùn)練了一個(gè)模型,其中圖像尺寸為64×64(在ImageNet上進(jìn)行微調(diào)),解鎖一些圖層后,應(yīng)用了循環(huán)學(xué)習(xí)速率和快照集成,取模型的權(quán)重,將尺寸改變成299×299,再根據(jù)64×64的權(quán)重進(jìn)行微調(diào),之后進(jìn)行快照集成和熱重啟。

第五步

最后一步是將結(jié)果進(jìn)行可視化從而確定哪一種類有最佳表現(xiàn)(或最差表現(xiàn)),還需要做些其他調(diào)整來(lái)提高結(jié)果。理解結(jié)果的一種好方法是建立一個(gè)混淆矩陣。

Kaggle競(jìng)賽方案分享:如何分辨雜草和植物幼苗的圖17

我們可以看到模型預(yù)測(cè)的標(biāo)簽和真實(shí)標(biāo)簽的不同,我們可以慢慢改善這一狀況。我們還可以做更多數(shù)據(jù)增強(qiáng)的工作,讓模型學(xué)習(xí)更多種類。

方案提交后,我的排名位列第一(但隨著競(jìng)賽展開(kāi),目前位列第五)。

原文地址:medium.com/neuralspace/kaggle-1-winning-approach-for-image-classification-challenge-9c1188157a86

登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP