天天看點

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

你正在處理圖像資料嗎?我們可以使用計算機視覺算法來做很多事情:

對象檢測

圖像分割

圖像翻譯

對象跟蹤(實時),還有更多……

這讓我思考——如果一個圖像中有多個對象類别,我們該怎麼辦?制作一個圖像分類模型是一個很好的開始,但我想擴充我的視野以承擔一個更具挑戰性的任務—建構一個多标簽圖像分類模型!

制作一個圖像分類模型

https://www.analyticsvidhya.com/blog/2019/01/build-image-classification-model-10-minutes/?utm_source=blog&utm_medium=multi-label-image-classification

我不想使用簡單玩具資料集來建構我的模型—這太普通了。然後,它打動了我—包含各種各樣的人的電影/電視劇海報。我可以僅通過看海報就能來建構我自己的多标簽圖像分類模型來預測不同的流派嗎?

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

答案很簡單——是的!在本文中,我解釋了多标簽圖像分類背後的思想。我們将使用電影海報建構我們自己的模型。你将會對我們的模型産生的令人印象深刻的結果感到驚訝。如果你是《複仇者聯盟》或《權力的遊戲》的粉絲,那麼在實作部分會有一個很棒的驚喜(無劇透的)給你。

激動嗎?很好,我們開始吧!

目錄

1. 什麼是多标簽圖像分類?

2. 多标簽圖像分類與多類圖像分類有何不同?

3. 了解多标簽圖像分類模型體系結構;

4. 建構多标簽圖像分類模型的步驟;

5. 案例研究:用Python解決多标簽圖像分類問題;

6.接下來的步驟和你的實驗;

7.尾記。

1. 什麼是多标簽圖像分類?

讓我們通過一個直覺的例子來了解多标簽圖像分類的概念。 看看下面的圖檔:

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

圖1中的對象是一輛汽車。這是顯而易見的。然而,在圖2中沒有汽車,隻有一組建築物。你能看出我們要怎麼做嗎?我們将圖像分為兩類,即,有車還是沒車。

當我們隻有兩類圖像可以分類時,這就稱為二值圖像分類問題。

讓我們再看一個圖檔:

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

在這個圖檔中,你識别出了多少個物體?有太多了——房子、帶噴泉的池塘、樹木、岩石等等。是以,當我們可以将一個圖像分類為多個類(如上圖所示)時,就稱為多标簽圖像分類問題。

現在,這裡有一個問題——我們大多數人對多标簽和多類圖像分類感到困惑。當我第一次遇到這些術語時,我也被迷惑了。現在我對這兩個主題有了更好的了解,讓我來為你們澄清一下差別。

2. 多标簽圖像分類與多類圖像分類有何不同?

假設給我們一些動物的圖檔,讓我們把它們分成相應的類别。為了便于了解,我們假設一個給定的圖像可以分為4類(貓、狗、兔子和鹦鹉)。現在,可能有兩種情況:

每個圖像隻包含一個對象(上述4個類别中的任何一個),是以,它隻能被歸入4個類别中的一個。

圖像可能包含多個對象(來自上述4個類别),是以該圖像将屬于多個類别。

讓我們通過例子來了解每種情況,從第一個場景開始:

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

這裡,我們的每個圖像都隻包含一個對象。敏銳的你會注意到在這個集合中有4種不同類型的對象(動物)。

這裡的每張圖檔隻能被分類為貓、狗、鹦鹉或兔子。沒有任何一個圖像屬于多個類别的情況。

當圖像可分類的類别超過兩種時

一個圖像不屬于一個以上的類别

如果滿足上述兩個條件,則稱為多類圖像分類問題。

現在,讓我們思考第二種情況 —— 看看下面的圖像:

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

第一張圖檔(左上角)包含一隻狗和一隻貓

第二幅圖(右上角)包括一隻狗、一隻貓和一隻鹦鹉

第三幅圖(左下角)包含一隻兔子和一隻鹦鹉,以及

最後一張圖檔(右下角)包含一隻狗和一隻鹦鹉

這些都是給定的圖像的标簽。這裡的每個圖像都屬于一個以上的類,是以它是一個多标簽圖像分類問題。

這兩種情況應該有助于你了解多類和多标簽圖像分類之間的差別。如果你需要進一步的說明,請在本文下面的評論部分與我聯系。

在進入下一節之前,我建議你通讀這篇文章——在10分鐘内建構你的第一個圖像分類模型!它将幫助你了解如何解決一個多類圖像分類問題。

在10分鐘内建構你的第一個圖像分類模型:

https://www.analyticsvidhya.com/blog/2019/01/build-image-classification-model-10-minutes/?utm_source=blog&utm_medium=multi-label-image-classification

3. 建構多标簽圖像分類模型的步驟

現在我們已經對多标簽圖像分類有了一個直覺的認識,讓我們深入讨論解決這個問題應該遵循的步驟。

第一步是以結構化格式擷取資料。這既适用于圖像二分類,也适用于多類圖像分類。

你應該有一個檔案夾,其中包含您想要訓練模型的所有圖像。現在,為了訓練這個模型,我們還需要圖像的真實标簽。是以,你還應該有一個.csv檔案,其中包含所有訓練圖像的名稱及其對應的真實标簽。

我們将在本文後面學習如何建立這個.csv檔案。現在,隻要記住資料應該是一種特定的格式。資料準備好後,我們可以将進一步的步驟劃分如下:

加載和預處理資料

首先,加載所有圖像,然後根據項目的需求對它們進行預處理。為了檢查我們的模型将如何對不可見的資料(測試資料)執行,我們建立了一個驗證集。我們在訓練集上訓練我們的模型并使用驗證集對其進行驗證(标準的機器學習方法)。

定義模型的結構

下一步是定義模型的結構。這包括決定隐藏層的數量、每層神經元的數量、激活函數等等。

訓練模型

是時候在訓練集上訓練我們的模型了!我們輸入訓練圖像及其對應的真标簽對模型進行訓練。我們還在這裡傳入驗證圖像,以幫助我們驗證模型在不可見資料上的性能。

作出預測

最後,我們使用訓練過的模型對新圖像進行預測。

4. 了解多标簽圖像分類模型結構

現在,多标簽圖像分類任務的預處理步驟将類似于多類問題的預處理步驟。關鍵的差別在于我們定義模型結構的步驟。

對于多類圖像分類模型,我們在輸出層使用softmax激活函數。對于每個圖像,我們想要最大化單個類的機率。當一個類的機率增大時,另一個類的機率就減小。是以,我們可以說每個類的機率都依賴于其他類。

但是在多标簽圖像分類的情況下,單個圖像可以有多個标簽。我們希望機率彼此獨立。使用softmax激活函數并不合适。相反,我們可以使用sigmoid激活函數。這将獨立地預測每個類的機率。它将在内部建立n個模型(這裡的n是總類數),每個類一個模型,并預測每個類的機率。

利用sigmoid激活函數将多标簽問題轉化為n-二分類問題。是以對于每幅圖像,我們将得到機率來确定圖像是否屬于第一類,以此類推。由于我們已經将其轉換為一個n-二分類問題,我們将使用binary_cross-sentropy損失。我們的目标是盡量減少這種損失,以提高模型的性能。

這是我們在定義用于解決多标簽圖像分類問題的模型結構時必須做的主要更改。訓練部分将類似于一個多類問題。我們将傳入訓練圖像及其對應的真實标簽,以及驗證集來驗證模型的性能。

最後,我們将擷取一張新的圖像,并使用訓練過的模型來預測該圖像的标簽。還跟得上嗎?

5. 案例研究:用Python解決多标簽圖像分類問題

祝賀你來到這一步!你的獎勵——用Python解決一個可怕的多标簽圖像分類問題。是時候啟動你最喜歡的Python IDE了!

讓我們明确問題陳述。我們的目标是通過電影的海報圖像來預測電影的類型。你能猜到為什麼這是一個多标簽圖像分類問題嗎?在你往下看之前想一下。

一部電影可以屬于多種類型,對吧?它不僅僅屬于一個類别,如動作片或喜劇片。電影可以是兩種或多種類型的結合。是以,它是多标簽圖像分類。

我們将使用的資料集包含多個多類型電影的海報圖像。我對資料集做了一些更改,并将其轉換為結構化格式,即一個包含圖像的檔案夾和一個存儲真正标簽的.csv檔案。你可以從這裡下載下傳結構化資料集。下面是一些來自我們資料集的海報:

這裡:https://drive.google.com/file/d/1dNa_lBUh4CNoBnKdf9ddoruWJgABY1br/view

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

如果你願意,可以在這裡下載下傳原始資料集和基準真值。

這裡:https://www.cs.ccu.edu.tw/~wtchu/projects/MoviePoster/index.html

讓我們開始程式設計!

首先,導入所有需要的Python庫:

1. import keras

2. from keras.models import Sequential

3. from keras.layers import Dense, Dropout, Flatten

4. from keras.layers import Conv2D, MaxPooling2D

5. from keras.utils import to_categorical

6. from keras.preprocessing import image

7. import numpy as np

8. import pandas as pd

9. import matplotlib.pyplot as plt

10. from sklearn.model_selection import train_test_split

11. from tqdm import tqdm

12. %matplotlib inline

現在,讀取.csv檔案并檢視前五行的内容:

1. train = pd.read_csv('multi_label_train.csv') # reading the csv file

2. train.head() # printing first five rows of the file

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

這個檔案中有27列。 讓我們輸出這些列的名字看看:

1. train.columns

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

Genre列包含每個圖像的清單,其中明确了每個圖像對應的電影的類型。是以,從.csv檔案的頭部開始,第一個圖像的類型是喜劇和戲劇。

剩下的25列是獨熱碼列。是以,如果一部電影屬于動作類型,它的值将為1,否則為0。每個圖像可以屬于25種不同的類型。

我們将建構一個傳回給定電影海報類型的模型。但在此之前,你還記得建構圖像分類模型的第一步嗎?

沒錯——就是正确的加載和預處理資料。是以,讓我們看看所有的訓練圖檔:

1. train_image = []

2. for i in tqdm(range(train.shape[0])):

3. img = image.load_img('Multi_Label_dataset/Images/'+train['Id'][i]+'.jpg',target_size=(400,400,3))

4. img = image.img_to_array(img)

5. img = img/255

6. train_image.append(img)

7. X = np.array(train_image)

快速浏覽一下數組的形狀:

1. X.shape

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

這裡共有7254個海報圖像,所有圖像都已轉換為(400,300,3)的形狀。 讓我們繪制并可視化其中一個圖像:

1. plt.imshow(X[2])

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

這是電影《交易場所》的海報。讓我們輸出這部電影的類型:

1. train['Genre'][2]

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

這部電影僅有一個類型——喜劇。我們的模型所需的下一步是所有圖像的真實标簽。你能猜出這7254個圖像真實标簽的形狀是什麼嗎?

讓我們來看看。 我們知道總共有25種可能的類型。對于每個圖像,我們将有25個目标,即電影是否屬于該類型。 是以,所有這25個目标的值都為0或1。

我們将從訓練檔案中删除Id和Genre列,并将剩餘的列轉換為将成為我們圖像目标的數組:

1. y = np.array(train.drop(['Id', 'Genre'],axis=1))

2. y.shape

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

輸出數組的形狀是(7254,25),正如我們預想的那樣。 現在,讓我們建立一個驗證集,它将幫助我們檢查模型在不可見的資料上的性能。 我們将随機分離10%的圖像作為我們的驗證集:

1. X_train, X_test, y_train, y_test =

2. train_test_split(X, y, random_state=42, test_size=0.1)

下一步是定義模型結構。輸出層将有25個神經元(等于類型的數量),我們将使用sigmoid作為激活函數。

我将使用某一結構(如下所示)來解決這個問題。 你也可以通過更改隐藏層數,激活函數和其他超參數來修改此架構。

1. model = Sequential()

2. model.add(Conv2D(filters=16, kernel_size=(5, 5), activation="relu", input_shape=(400,400,3)))

3. model.add(MaxPooling2D(pool_size=(2, 2)))

4. model.add(Dropout(0.25))

5. model.add(Conv2D(filters=32, kernel_size=(5, 5), activation='relu'))

6. model.add(MaxPooling2D(pool_size=(2, 2)))

7. model.add(Dropout(0.25))

8. model.add(Conv2D(filters=64, kernel_size=(5, 5), activation="relu"))

9. model.add(MaxPooling2D(pool_size=(2, 2)))

10. model.add(Dropout(0.25))

11. model.add(Conv2D(filters=64, kernel_size=(5, 5), activation='relu'))

12. model.add(MaxPooling2D(pool_size=(2, 2)))

13. model.add(Dropout(0.25))

14. model.add(Flatten())

15. model.add(Dense(128, activation='relu'))

16. model.add(Dropout(0.5))

17. model.add(Dense(64, activation='relu'))

18. model.add(Dropout(0.5))

19. model.add(Dense(25, activation='sigmoid'))

讓我們顯示我們的模型總結:

1. model.summary()

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

有相當多的參數要學習! 現在,編譯模型。 我将使用binary_crossentropy作為損失函數,使用ADAM作為優化器(同樣,你也可以使用其他優化器):

1. model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

最後,我們最有趣的部分——訓練模型。我們将訓練模型10個循環,并傳入我們之前建立的驗證資料,以驗證模型的性能:

1. model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test), batch_size=64)

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

我們可以看到訓練損失已降至0.24,驗證損失也降低了。 下一步是什麼? 是時候做預測了!

所有《權力的遊戲(GoT)》和《複仇者聯盟(Avengers)》的粉絲——這是給你們的禮物。 讓我擷取GoT和Avengers的海報,并将它們提供給我們的模型。 在繼續之前下載下傳GOT和Avengers的海報。

GOT

https://drive.google.com/file/d/1cfIE-42H4_UM-JERoctseLUpKwmd40YE/view

Avengers

https://drive.google.com/file/d/1buNOcfo0Im2HmFH778dUwxven8Zzebtu/view

在進行預測之前,我們需要使用前面看到的相同步驟預處理這些圖像。

1. img = image.load_img('GOT.jpg',target_size=(400,400,3))

2. img = image.img_to_array(img)

3. img = img/255

現在,我們将使用我們訓練好的模型預測這些海報的類型。該模型将告訴我們每種類型的機率,我們将從中獲得前3個預測結果。

1. classes = np.array(train.columns[2:])

2. proba = model.predict(img.reshape(1,400,400,3))

3. top_3 = np.argsort(proba[0])[:-4:-1]

4. for i in range(3):

5. print("{}".format(classes[top_3[i]])+" ({:.3})".format(proba[0][top_3[i]]))

6. plt.imshow(img)

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

真棒!我們的模型為《權力的遊戲》預測了戲劇,驚悚和動作類型。在我看來,這個分類很好。讓我們在《複仇者聯盟》海報上試試我們的模型。圖像預處理:

1. img = image.load_img('avengers.jpeg',target_size=(400,400,3))

2. img = image.img_to_array(img)

3. img = img/255

然後做預測:

1. classes = np.array(train.columns[2:])

2. proba = model.predict(img.reshape(1,400,400,3))

3. top_3 = np.argsort(proba[0])[:-4:-1]

4. for i in range(3):

5. print("{}".format(classes[top_3[i]])+" ({:.3})".format(proba[0][top_3[i]]))

6. plt.imshow(img)

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

我們的模型給出的類型是戲劇、動作和驚悚。同樣,這些都是非常準确的結果。這個模型能在好萊塢電影分類上表現的一樣優秀嗎?讓我們來看看。我們将使用這張Golmal 3的海報。

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

你知道在這個階段該做什麼——加載和預處理的圖像:

1. img = image.load_img('golmal.jpeg',target_size=(400,400,3))

2. img = image.img_to_array(img)

3. img = img/255

然後為這個海報預測電影類型:

1. classes = np.array(train.columns[2:])

2. proba = model.predict(img.reshape(1,400,400,3))

3. top_3 = np.argsort(proba[0])[:-4:-1]

4. for i in range(3):

5. print("{}".format(classes[top_3[i]])+" ({:.3})".format(proba[0][top_3[i]]))

6. plt.imshow(img)

python如何訓練模型生産_手把手教你用Python建構你的第一個多标簽圖像分類模型(附案例)...

《Golmaal 3》是一部喜劇,我們的模型預測它為最受歡迎的類型。其他預測類型是劇情片和浪漫片——相對準确的評估。我們可以看到該模型能夠僅通過海報預測電影類型。

6. 接下來的步驟和你自己的實驗

這就是如何解決多标簽圖像分類問題。盡管我們隻有大約7000張圖檔來訓練模型,但我們的模型表現得非常好。

你可以嘗試收集更多的訓練海報。我的建議是使所有的流派類别有相對平等的分布的資料集。為什麼?

如果某一類型在大多數訓練圖像中重複出現,那麼我們的模型可能會與該類型過度比對。對于每一張新圖檔,該模型都可能預測出相同的類型。為了克服這個問題,你應該嘗試均衡的流派類别分布。

這些是你可以嘗試改進模型性能的一些關鍵點。你還能想到别的嗎?告訴我!

7. 尾記

除了流派類型預測外,多标簽圖像分類還有多種應用。例如,你可以使用此技術自動标記圖像。假設你想預測圖像中服裝的類型和顔色。你可以建立一個多标簽圖像分類模型,這将幫助你預測同時兩者!

希望本文能幫助你了解多标簽圖像分類的概念。如果你有任何回報或建議,請在下面的評論部分與我們分享。實驗快樂!

原文連結:

https://www.analyticsvidhya.com/blog/2019/04/build-first-multi-label-image-classification-model-python/

原文标題:

Build your First Multi-Label Image Classification Model in Python

版權申明:本站文章部分自網絡,如有侵權,請聯系:[email protected]

特别注意:本站所有轉載文章言論不代表本站觀點!

本站所提供的圖檔等素材,版權歸原作者所有,如需使用,請與原作者聯系。