0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用深度學習做圖像分類?教給你教程和代碼

DPVg_AI_era ? 2018-04-06 00:24 ? 次閱讀

深度學習推動計算機視覺、自然語言處理等諸多領(lǐng)域的快速發(fā)展。在AI大熱和人才奇缺的今天,掌握深度學習成為進入AI領(lǐng)域研究和應(yīng)用的必備技能。來自亞馬遜主任科學家李沐將以計算機視覺的經(jīng)典問題——圖像分類為例,手把手地教導(dǎo)大家從0到1搭建深度神經(jīng)網(wǎng)絡(luò)模型。對于初學者面臨的諸多疑問,提供了從環(huán)境設(shè)置,數(shù)據(jù)處理,模型訓練,效果調(diào)優(yōu)的完整介紹和代碼演示,包括使模型快速獲得良好效果的常用方法——遷移學習。讓大家有一個全景和基礎(chǔ)的了解。

深度學習時代,網(wǎng)絡(luò)的加深使得對訓練數(shù)據(jù)集規(guī)模的依賴更勝以往。學術(shù)界較成功的大規(guī)模數(shù)據(jù)集通常圍繞基礎(chǔ)性的一般認知問題,離有日常有體感的應(yīng)用場景較遠。時尚與人們?nèi)粘I钕⑾⑾嚓P(guān),但行業(yè)大量內(nèi)容仍然依賴人工編輯。通過引入人工智能技術(shù)來提升效率,讓機器來認知時尚將是一個有趣且有用的課題。

近期,阿里巴巴圖像和美團隊與香港理工大學紡織及制衣學系聯(lián)合舉辦了2018FashionAI全球挑戰(zhàn)賽,并在比賽中開放的FashionAI數(shù)據(jù)集,是首個圍繞衣食住行中的“衣”的大規(guī)模高質(zhì)量數(shù)據(jù)集。該數(shù)據(jù)集包含八種不同服飾的圖片數(shù)據(jù),選手們的任務(wù)之一就是設(shè)計一個算法對圖片中服飾的屬性做出準確判斷。例如其中的裙子類圖片,就分為不可見,短裙,中裙,七分裙,九分裙和長裙等總共六種屬性。我們可以將其視為經(jīng)典的圖片分類問題,并通過卷積神經(jīng)網(wǎng)絡(luò)來解決。

FashionAI數(shù)據(jù)集中使用的圖像數(shù)據(jù),全部來源于電商真實場景,刻畫了在模型在真實場景應(yīng)用會遇到的挑戰(zhàn)。在FashoinAI數(shù)據(jù)集上訓練的模型,既有學術(shù)研究價值,又能在未來實際應(yīng)用,幫助識別服飾上的專業(yè)設(shè)計元素。對于計算機視覺研究者來說,不失為一個好的選擇。

本文將利用MXNet進行方法講解。MXNet是一個易安裝易上手的開源深度學習工具,它提供了一個python接口gluon,能夠讓大家很快地搭建起神經(jīng)網(wǎng)絡(luò),并進行高效訓練。接下來,我們將以比賽中的裙子任務(wù)為例,向大家展示如何用gluon從零開始,設(shè)計一個簡單而又效果好的卷積神經(jīng)網(wǎng)絡(luò)算法。

亞馬遜主任科學家 李沐

環(huán)境配置

系統(tǒng)配置

對于深度學習訓練而言,用GPU加速訓練是很重要的。這次競賽的數(shù)據(jù)量雖然不算大,但是只用CPU計算可能還是會讓一次模型訓練花上好幾天的時間!因此我們建議大家使用至少一塊GPU來進行訓練。還沒有GPU的同學,可以參考如下兩種選擇:

根據(jù)自己的預(yù)算和需求入手(年輕人的第)一塊GPU。我們寫了一篇GPU購買指南[1],方便大家選購。

為了這次比賽租用亞馬遜云的GPU服務(wù)器。我們寫了一篇AWS的運行教程[2],幫助大家配置自己的云服務(wù)器。

配置好了硬件與系統(tǒng)之后,我們需要安裝Nvidia提供的CUDA與CUDNN,從而把我們的代碼與GPU硬件真正連接起來。這部分的安裝比較容易,可以參考這一部分[3]的指導(dǎo)。

如果選擇使用亞馬遜云服務(wù)器,那么我們建議在選擇系統(tǒng)鏡像時選擇Deep Learning AMI,這個鏡像把與GPU訓練相關(guān)的環(huán)境(CUDA,CUDNN)都已經(jīng)配置好了,不需要做其他的配置了。

安裝MXNet

配置好了環(huán)境之后,我們就可以安裝MXNet了。有很多種方式可以安裝MXNet,如果要在Linux系統(tǒng)上為python安裝GPU版本,只需要執(zhí)行:

就可以了。如果系統(tǒng)中安裝的是CUDA8.0,可以將代碼改成對應(yīng)的mxnet-cu80。如果有同學想要使用其他的語言接口或者是操作系統(tǒng),或者是自己從源碼編譯,都可以在官方的安裝說明[4]中找到符合自己情況的安裝步驟。在接下來的教程中,我們使用MXNet的python接口gluon帶領(lǐng)大家上手此次競賽。

數(shù)據(jù)處理

數(shù)據(jù)獲取

首先我們在當前目錄下新建data文件夾,然后從官網(wǎng)上將熱身數(shù)據(jù)集,訓練數(shù)據(jù)集和測試數(shù)據(jù)集下載到data中并解壓。比賽的數(shù)據(jù)可以從比賽官網(wǎng)[5]獲取,不過同學們要登錄天池賬號并注冊參加比賽之后才能下載。主要的數(shù)據(jù)集有三個:

fashionAI_attributes_train_20180222.tar是主要訓練數(shù)據(jù),里面含有八個任務(wù)的帶標記訓練圖片。這份教程中我們只選用其中的裙子任務(wù)做演示。

fashionAI_attributes_test_a_20180222.tar是預(yù)測數(shù)據(jù),里面含有八個任務(wù)的不帶標記訓練圖片,我們的目的就是訓練出模型之后在這份數(shù)據(jù)上給出分類預(yù)測。

warm_up_train_20180201.tar是熱身數(shù)據(jù),里面含有與訓練集不重復(fù)的裙子訓練集圖片,是對訓練數(shù)據(jù)很重要的補充。在進一步運行前,請確認當前的目錄結(jié)構(gòu)是這樣的:

注意事項:下載好的數(shù)據(jù)在解壓前與解壓后會各占用約8G的硬盤空間,在接下來的數(shù)據(jù)整理中我們會將數(shù)據(jù)復(fù)制為更方便的目錄結(jié)構(gòu),因此請預(yù)留足夠的硬盤空間。

因為圖片數(shù)據(jù)集通常很大,因此gluon不會一次性將所有圖片讀入內(nèi)存,而是在訓練過程中不斷讀取硬盤上的圖片文件。請有條件的同學將圖片存在SSD硬盤上,這樣可以避免數(shù)據(jù)讀取成為瓶頸,從而大幅提高訓練速度。

首先,我們在data下新建一個目錄train_valid,作為所有整理后數(shù)據(jù)的目錄。

我們選用裙子數(shù)據(jù)的原因之一,就是熱身數(shù)據(jù)與訓練數(shù)據(jù)中都提供了它的訓練圖片,從而能讓我們能夠有更豐富的訓練資源。下面我們將分別從熱身數(shù)據(jù)欲訓練數(shù)據(jù)的標記文件中:

讀取每張圖片的路徑和標簽

將這張圖片按照它的標簽放入data/train_valid目錄下對應(yīng)的類別目錄中

將前90%的數(shù)據(jù)用做訓練,后10%的數(shù)據(jù)用作驗證

第一步,讀取訓練圖片的路徑和標簽。

我們來檢查一下讀入的數(shù)據(jù)。image_path應(yīng)該由路徑和圖片對應(yīng)標簽組成,其中標簽是若干個n一個y組成的字符串,字母y出現(xiàn)的位置就是圖片對應(yīng)的類型。

可以看出這張圖中的裙子是長裙,對應(yīng)上官方的說明,可以發(fā)現(xiàn)與標記吻合。接下來,我們就準備好訓練集和測試集的目錄,以及6個裙子類別對應(yīng)的子目錄。

運行后的目錄結(jié)構(gòu)如下:

要想處理其他類型的服飾,只需要將task變量指定為對應(yīng)的服飾類型名稱就行了。最后,我們將圖片復(fù)制到各自對應(yīng)的目錄中。需要注意的是,這里我們刻意隨機打亂了圖片的順序,從而防止訓練集與測試集切分不均勻的情況出現(xiàn)。

遷移學習

數(shù)據(jù)準備完畢,接下來我們可以開始著手設(shè)計算法了。

服裝的識別可以被視作計算機視覺中的經(jīng)典問題:圖片分類。一個典型的例子是ImageNet數(shù)據(jù)集與ILSVRC競賽,其中選手們要為分別從屬于1000個類別的逾1400萬張圖片設(shè)計算法,將它們準確分類。在服飾屬性判別競賽中,我們可以認為不同屬性的服飾從屬于不同的類別,于是便能參考ImageNet中的優(yōu)勝算法來參賽。

在初賽階段,主辦方給每類服飾各提供了約一萬張圖片用來訓練,這樣的數(shù)據(jù)量還不足以讓我們從零開始訓練一個很棒的深度學習模型。于是我們可以借用遷移學習的想法,從一個在ImageNet數(shù)據(jù)集上被訓練好的模型出發(fā),一點點把它改造成“更懂衣服”的模型。如下圖所示,左邊的是在ImageNet數(shù)據(jù)集上訓練好的網(wǎng)絡(luò),右邊的是我們即將用來參賽的網(wǎng)絡(luò),這兩個網(wǎng)絡(luò)主體結(jié)構(gòu)一致,因此我們可以將主要的網(wǎng)絡(luò)權(quán)重都復(fù)制過來。因為兩個網(wǎng)絡(luò)在輸出層的分類個數(shù)與含義都不一樣,我們需要將輸出層重新定義并隨機初始化。

在ImageNet數(shù)據(jù)集上,大家主要用卷積神經(jīng)網(wǎng)絡(luò),而在過去的幾年中也出現(xiàn)了很多不同的網(wǎng)絡(luò)架構(gòu)。gluon官方提供了許多不同的預(yù)訓練好的卷積神經(jīng)網(wǎng)絡(luò)模型,我們在這個比賽中選擇效果比較好的resnet50_v2模型作為訓練的出發(fā)點。關(guān)于遷移學習更詳細的介紹可以參考gluon中文教程中的Fine-tuning:通過微調(diào)來遷移學習[6]一節(jié)。

首先,我們準備好需要用到的環(huán)境。

下面我們可以一句話導(dǎo)入預(yù)訓練好的resnet50_v2模型。如果是首次導(dǎo)入模型,代碼會需要一點時間下載預(yù)訓練好的模型。

在ImageNet上訓練的模型輸出是1000維的,我們需要定義一個新的resnet50_v2網(wǎng)絡(luò),其中

輸出層之前的權(quán)重是預(yù)訓練好的

輸出是6維的,且輸出層的權(quán)重隨機初始化

之后,我們可以根據(jù)具體的機器環(huán)境選擇將網(wǎng)絡(luò)保存在CPU或者是GPU上。

在上面代碼中的最后一行我們調(diào)用了hybridize,這是gluon的主要特性之一,能將命令式編程構(gòu)建的模型在執(zhí)行時把大部分運算轉(zhuǎn)成符號式來執(zhí)行,這樣一方面提高了開發(fā)效率,同時也保證了運行速度。關(guān)于hybridize更詳細的介紹可以參考gluon中文教程中的Hybridize:更快和更好移植[7]一節(jié)。

接下來我們定義幾個輔助函數(shù),它們分別是

計算AveragePrecision,官方的結(jié)果評價標準。

訓練集與驗證集的圖片增廣函數(shù)。

每輪訓練結(jié)束后在測試集上評估的函數(shù)

關(guān)于圖片增廣更詳細的介紹可以參考中文教程中的圖片增廣[8]一節(jié)。

下面我們定義一些訓練參數(shù)。注意,在遷移學習中,我們一般認為整個網(wǎng)絡(luò)的參數(shù)不需要進行很大地改動,只需要在訓練數(shù)據(jù)上微調(diào),因此我們的學習速率都設(shè)為一個比較小的值,比如0.001。

為了方便演示,我們只循環(huán)兩輪訓練,展示過程。

接下來我們可以讀入數(shù)據(jù)了。經(jīng)過之前的整理,數(shù)據(jù)可以用接口gluon.data.DataLoader讀入

下面我們定義網(wǎng)絡(luò)的優(yōu)化算法和損失函數(shù)。這次比賽中我們選用隨機梯度下降就能得到比較好的效果。分類問題一般用交叉熵作為損失函數(shù),另外,我們除了mAP指標之外也關(guān)心模型的準確率。

至此萬事俱備,我們可以開始訓練了!再次提醒,這里為了快速演示,我們只做兩次循環(huán),為了達到更好的訓練效果請記得將epochs調(diào)大。

訓練結(jié)束了,那效果怎么樣呢?我們可以直接拿幾張測試集的圖片出來,用人眼對比一下看看預(yù)測的類型是否準確。

可以看到,雖然只有兩輪訓練,但我們的模型在展示的幾張圖片上都做出了正確的預(yù)測。

總結(jié)

至此,我們展示了從數(shù)據(jù)整理直到作出預(yù)測的樣例代碼。你可以從這里開始,不斷地改進代碼,向著更好的結(jié)果出發(fā)。也建議大家去下載FashoinAI數(shù)據(jù)集,直接用實踐本文中所學習到的技巧。下面我們給出一些可以改進的方向,你可以從他們開始著手:

1.調(diào)整參數(shù),比如學習速率,批量大小,訓練循環(huán)次數(shù)等。

參數(shù)之間是有互相影響的,比如更小的學習速率可能意味著更多的循環(huán)次數(shù)。

建議以驗證集上的結(jié)果來選擇參數(shù)

不同數(shù)據(jù)的最佳參數(shù)可能是不一樣的,建議對每個任務(wù)選取相應(yīng)的最佳參數(shù)

2.選擇模型。除了ResNet模型之外,gluon還提供很多其他流行的卷積神經(jīng)網(wǎng)絡(luò)模型,可以到官方文檔根據(jù)它們在ImageNet上的表現(xiàn)進行選擇。

在計算資源有限的情況下,可以考慮選用占內(nèi)存更小、計算速度更快的模型。

3.更全面的圖片增廣可以考慮在訓練時加上更多的圖片操作。image.CreateAugmenter函數(shù)有很多其他的參數(shù),不妨分別試試效果。

在預(yù)測時將預(yù)測圖片做不同的裁剪/微調(diào)并分別預(yù)測,最后以平均預(yù)測值為最后答案,可以得到更穩(wěn)健的結(jié)果。

特別感謝:作者/亞馬遜主任科學家 李沐

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4789

    瀏覽量

    101530
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    32335

    瀏覽量

    271432
  • 深度學習
    +關(guān)注

    關(guān)注

    73

    文章

    5527

    瀏覽量

    121833

原文標題:MXNet 作者李沐:用深度學習做圖像分類,教程+代碼

文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    討論紋理分析在圖像分類中的重要性及其在深度學習中使用紋理分析

    地執(zhí)行基于紋理特征的分類任務(wù)。為了讓深度學習在基于紋理的數(shù)據(jù)上更好地工作,需要有一種方法,可以從圖像中提取紋理特定的特征,并將其傳遞給全連接層,同時保留全局特征。這樣的架構(gòu)設(shè)置將使全連
    發(fā)表于 10-26 16:57

    什么是深度學習?使用FPGA進行深度學習的好處?

    什么是深度學習為了解釋深度學習,有必要了解神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)是一種模擬人腦的神經(jīng)元和神經(jīng)網(wǎng)絡(luò)的計算模型。作為具體示例,讓我們考慮一個輸入圖像
    發(fā)表于 02-17 16:56

    圖像分類的方法之深度學習與傳統(tǒng)機器學習

    實際情況非常復(fù)雜,傳統(tǒng)的分類方法不堪重負?,F(xiàn)在,我們不再試圖用代碼來描述每一個圖像類別,決定轉(zhuǎn)而使用機器學習的方法處理圖像
    發(fā)表于 09-28 19:43 ?0次下載

    基于數(shù)據(jù)挖掘的醫(yī)學圖像分類方法

    一種深度學習的新方法卷積受限玻爾茲曼機模型,并且采用改進的快速持續(xù)對比散度算法對模型進行訓練。該方法直接從乳腺X光圖像中自主學習特征并利用學習
    發(fā)表于 11-22 16:32 ?8次下載

    一種新的目標分類特征深度學習模型

    受限和高識別率要求,提取圖像的局部方向梯度直方圖( HOG)特征,構(gòu)建稀疏自編碼器棧對HOG特征進行深層次編碼,設(shè)計Softmax多分類器對所抽取的特征進行分類。在深度神經(jīng)網(wǎng)絡(luò)模型
    發(fā)表于 03-20 17:30 ?0次下載
    一種新的目標<b class='flag-5'>分類</b>特征<b class='flag-5'>深度</b><b class='flag-5'>學習</b>模型

    Xilinx FPGA如何通過深度學習圖像分類加速機器學習

    了解Xilinx FPGA如何通過深度學習圖像分類示例來加速重要數(shù)據(jù)中心工作負載機器學習。該演示可通過Alexnet神經(jīng)網(wǎng)絡(luò)模型加速
    的頭像 發(fā)表于 11-28 06:54 ?3894次閱讀

    FPGA深度學習加速的技能總結(jié)

    深度學習加速器已經(jīng)兩年了,從RTL設(shè)計到仿真驗證,以及相應(yīng)的去了解了Linux驅(qū)動,深度學習壓縮方法等等。
    的頭像 發(fā)表于 03-08 16:29 ?8947次閱讀
    FPGA<b class='flag-5'>做</b><b class='flag-5'>深度</b><b class='flag-5'>學習</b>加速的技能總結(jié)

    如何使用深度卷積神經(jīng)網(wǎng)絡(luò)改進服裝圖像分類檢索算法

    針對利用深度學習的服裝圖像檢索算法分類精度較低的問題,提出基于深度卷積神經(jīng)網(wǎng)絡(luò)的改進服裝圖像
    發(fā)表于 08-27 10:09 ?6次下載
    如何使用<b class='flag-5'>深度</b>卷積神經(jīng)網(wǎng)絡(luò)改進服裝<b class='flag-5'>圖像</b><b class='flag-5'>分類</b>檢索算法

    深度學習圖像分割的方法和應(yīng)用

    介紹使圖像分割的方法,包括傳統(tǒng)方法和深度學習方法,以及應(yīng)用場景。 基于人工智能和深度學習方法的現(xiàn)代計算機視覺技術(shù)在過去10年里取得了顯著進展
    的頭像 發(fā)表于 11-27 10:29 ?3287次閱讀

    詳解深度學習圖像分割

    基于人工智能和深度學習方法的現(xiàn)代計算機視覺技術(shù)在過去10年里取得了顯著進展。如今,它被用于圖像分類、人臉識別、圖像中物體的識別、視頻分析和
    的頭像 發(fā)表于 01-06 15:50 ?3775次閱讀

    基于深度學習圖像修復(fù)模型及實驗對比

    深度學習技術(shù)在解決¨大面積缺失圖像修復(fù)”問題時具有重要作用并帶來了深遠影響,文中在簡要介紹傳統(tǒng)圖像修復(fù)方法的基礎(chǔ)上,重點介紹了基于深度
    發(fā)表于 04-08 09:38 ?20次下載
    基于<b class='flag-5'>深度</b><b class='flag-5'>學習</b>的<b class='flag-5'>圖像</b>修復(fù)模型及實驗對比

    OpenCV使用深度學習邊緣檢測的流程

    導(dǎo)讀 分析了Canny的優(yōu)劣,并給出了OpenCV使用深度學習邊緣檢測的流程。 在這篇文章中,我們將學習如何在OpenCV中使用基于深度
    的頭像 發(fā)表于 05-08 11:05 ?2356次閱讀
    OpenCV使用<b class='flag-5'>深度</b><b class='flag-5'>學習</b><b class='flag-5'>做</b>邊緣檢測的流程

    深度學習中的圖像分割

    深度學習可以學習視覺輸入的模式,以預(yù)測組成圖像的對象類。用于圖像處理的主要深度
    的頭像 發(fā)表于 05-05 11:35 ?1343次閱讀

    OpenCV庫在圖像處理和深度學習中的應(yīng)用

    本文深入淺出地探討了OpenCV庫在圖像處理和深度學習中的應(yīng)用。從基本概念和操作,到復(fù)雜的圖像變換和深度
    的頭像 發(fā)表于 08-18 11:33 ?995次閱讀

    深度學習中的時間序列分類方法

    時間序列分類(Time Series Classification, TSC)是機器學習深度學習領(lǐng)域的重要任務(wù)之一,廣泛應(yīng)用于人體活動識別、系統(tǒng)監(jiān)測、金融預(yù)測、醫(yī)療診斷等多個領(lǐng)域。隨
    的頭像 發(fā)表于 07-09 15:54 ?1347次閱讀