當前位置:
首頁 > 最新 > 使用經典模型進行圖像分類

使用經典模型進行圖像分類

導語

PaddlePaddle提供了豐富的運算單元,幫助大家以模塊化的方式構建起千變萬化的深度學習模型來解決不同的應用問題。這裡,我們針對常見的機器學習任務,提供了不同的神經網路模型供大家學習和使用。本周推文目錄如下:

3.19:【圖像分類】

如何轉化模型文件

3.20:【圖像分類】

使用經典模型進行圖像分類

3.21:【目標檢測】

SSD目標檢測

3.22:【場景文字識別】

場景文字識別

圖像相比文字能夠提供更加生動、容易理解及更具藝術感的信息,是人們轉遞與交換信息的重要來源。圖像分類是根據圖像的語義信息對不同類別圖像進行區分,是計算機視覺中重要的基礎問題,也是圖像檢測、圖像分割、物體跟蹤、行為分析等其他高層視覺任務的基礎,在許多領域都有著廣泛的應用。如:安防領域的人臉識別和智能視頻分析等,交通領域的交通場景識別,互聯網領域基於內容的圖像檢索和相冊自動歸類,醫學領域的圖像識別等。

這裡將介紹如何在PaddlePaddle下使用AlexNet、VGG、GoogLeNet、ResNet、Inception-v4、Inception-ResNet-v2和Xception模型進行圖像分類。圖像分類問題的描述和這些模型的介紹可以參考PaddlePaddle book。(https://github.com/PaddlePaddle/book/tree/develop/03.image_classification)

|1. 訓練模型

[1]初始化

在初始化階段需要導入所用的包,並對PaddlePaddle進行初始化。

[2]定義參數和輸入

設置演算法參數(如數據維度、類別數目和batch size等參數),定義數據輸入層image和類別標籤lbl。 所用數據集是flowers(http://www.robots.ox.ac.uk/~vgg/data/flowers/102/)。花的種類是102,因此,CLASS_DIM=102。

[3]獲得所用模型

這裡可以選擇使用AlexNet、VGG、GoogLeNet、ResNet、Inception-v4、Inception-ResNet-v2和Xception模型中的一個模型進行圖像分類。通過調用相應的方法可以獲得網路最後的Softmax層。

使用AlexNet模型

指定輸入層image和類別數目CLASS_DIM後,可以通過下面的代碼得到AlexNet的Softmax層。

out = alexnet.alexnet(image, class_dim=CLASS_DIM)

使用VGG模型

根據層數的不同,VGG分為VGG13、VGG16和VGG19。使用VGG16模型的代碼如下:

out = vgg.vgg16(image, class_dim=CLASS_DIM)

類似地,VGG13和VGG19可以分別通過vgg.vgg13和vgg.vgg19方法獲得。

使用GoogLeNet模型

GoogLeNet在訓練階段使用兩個輔助的分類器強化梯度信息並進行額外的正則化。因此googlenet.googlenet共返回三個Softmax層,如下面的代碼所示:

out, out1, out2 = googlenet.googlenet(image, class_dim=CLASS_DIM)

loss1 = paddle.layer.cross_entropy_cost(

input=out1, label=lbl, coeff=0.3)

paddle.evaluator.classification_error(input=out1, label=lbl)

loss2 = paddle.layer.cross_entropy_cost(

input=out2, label=lbl, coeff=0.3)

paddle.evaluator.classification_error(input=out2, label=lbl)

extra_layers = [loss1, loss2]

對於兩個輔助的輸出,這裡分別對其計算損失函數並評價錯誤率,然後將損失作為後文SGD的extra_layers。

使用ResNet模型

ResNet模型可以通過下面的代碼獲取:

out = resnet.resnet_imagenet(image, class_dim=CLASS_DIM)

使用Inception-v4模型

Inception-v4模型可以通過下面的代碼獲取, 本例中使用的模型輸入大小為3 * 224 * 224 (原文獻中使用的輸入大小為3 * 299 * 299):

out = inception_v4.inception_v4(image, class_dim=CLASS_DIM)

使用Inception-ResNet-v2模型

提供的Inception-ResNet-v2模型支持3 * 331 * 331和3 *299 * 299兩種大小的輸入,同時可以自行設置dropout概率,可以通過如下的代碼使用:

out = inception_resnet_v2.inception_resnet_v2(

image, class_dim=CLASS_DIM, dropout_rate=0.5, size=DATA_DIM)

使用Xception模型

Xception模型可以通過下面的代碼獲取:

out = xception.xception(image, class_dim=CLASS_DIM)

[4]定義損失函數

[5]創建參數和優化方法

通過learning_rate_decay_a(簡寫a) 、learning_rate_decay_b(簡寫b) 和learning_rate_schedule指定學習率調整策略,這裡採用離散指數的方式調節學習率,計算公式如下, n 代表已經處理過的累計總樣本數,lr0 即為參數里設置的learning_rate。

[6]定義數據讀取

首先以花卉數據(http://www.robots.ox.ac.uk/~vgg/data/flowers/102/index.html)為例說明如何定義輸入。下面的代碼定義了花卉數據訓練集和驗證集的輸入:

若需要使用其他數據,則需要先建立圖像列表文件。reader.py定義了這種文件的讀取方式,它從圖像列表文件中解析出圖像路徑和類別標籤。

圖像列表文件是一個文本文件,其中每一行由一個圖像路徑和類別標籤構成,二者以跳格符(Tab)隔開。類別標籤用整數表示,其最小值為0。下面給出一個圖像列表文件的片段示例:

dataset_100/train_images/n03982430_23191.jpeg 1

dataset_100/train_images/n04461696_23653.jpeg 7

dataset_100/train_images/n02441942_3170.jpeg 8

dataset_100/train_images/n03733281_31716.jpeg 2

dataset_100/train_images/n03424325_240.jpeg 0

dataset_100/train_images/n02643566_75.jpeg 8

訓練時需要分別指定訓練集和驗證集的圖像列表文件。這裡假設這兩個文件分別為train.list和val.list,數據讀取方式如下:

[7]定義事件處理程序

# End batch and end pass event handler

defevent_handler(event):

ifisinstance(event, paddle.event.EndIteration):

if event.batch_id %1==:

print"
Pass %d, Batch %d, Cost %f, %s"% (

event.pass_id, event.batch_id, event.cost, event.metrics)

ifisinstance(event, paddle.event.EndPass):

with gzip.open("params_pass_%d.tar.gz"% event.pass_id,"w") as f:

parameters.to_tar(f)

result = trainer.test(reader=test_reader)

print"
Test with Pass %d, %s"% (event.pass_id, result.metrics)

[8]定義訓練方法

對於AlexNet、VGG、ResNet、Inception-v4、Inception-ResNet-v2和Xception,可以按下面的代碼定義訓練方法:

# Create trainer

trainer = paddle.trainer.SGD(

cost=cost,

parameters=parameters,

update_equation=optimizer)

GoogLeNet有兩個額外的輸出層,因此需要指定extra_layers,如下所示:

# Create trainer

trainer = paddle.trainer.SGD(

cost=cost,

parameters=parameters,

update_equation=optimizer,

extra_layers=extra_layers)

[9]開始訓練

trainer.train(

reader=train_reader, num_passes=200, event_handler=event_handler)

|2.應用模型

模型訓練好後,可以使用下面的代碼預測給定圖片的類別。

# load parameters

with gzip.open("params_pass_10.tar.gz","r") as f:

parameters = paddle.parameters.Parameters.from_tar(f)

file_list = [line.strip() for line inopen(image_list_file)]

test_data = [(paddle.image.load_and_transform(image_file,256,224,False)

.flatten().astype("float32"), )

for image_file in file_list]

probs = paddle.infer(

output_layer=out, parameters=parameters,input=test_data)

lab = np.argsort(-probs)

for file_name, result inzip(file_list, lab):

print"Label of %s is: %d"% (file_name, result[])

首先從文件中載入訓練好的模型(代碼里以第10輪迭代的結果為例),然後讀取image_list_file中的圖像。image_list_file是一個文本文件,每一行為一個圖像路徑。代碼使用paddle.infer判斷image_list_file中每個圖像的類別,並進行輸出。

|3. 使用預訓練模型

為方便進行測試和fine-tuning,我們提供了一些對應於示例中模型配置的預訓練模型,目前包括在ImageNet 1000類上訓練的ResNet50、ResNet101和Vgg16,請使用models目錄下的腳本model_download.sh進行模型下載,如下載ResNet50可進入models目錄並執行"sh model_download.sh ResNet50",完成後同目錄下的Paddle_ResNet50.tar.gz即是訓練好的模型,可以在代碼中使用如下兩種方式進行載入模:

parameters = paddle.parameters.Parameters.from_tar(gzip.open("Paddle_ResNet50.tar.gz","r"))

注意事項

模型壓縮包中所含各文件的文件名和模型配置中的參數名一一對應,是載入模型參數的依據。我們提供的預訓練模型均使用了示例代碼中的配置,如需修改網路配置,請多加註意,需要保證網路配置中的參數名和壓縮包中的文件名能夠正確對應。

end

*原創貼,版權所有,未經許可,禁止轉載

*值班小Paddle:wangp

*歡迎在留言區分享您的觀點

*為了方便大家問題的跟進解決,我們採用Github Issue來採集信息和追蹤進度。大家遇到問題請搜索Github Issue,問題未解決請優先在Github Issue上提問,有助於問題的積累和沉澱


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 PaddlePaddle 的精彩文章:

單雙層RNN API對比介紹
模型配置相關問題匯總

TAG:PaddlePaddle |