中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

手把手教你用Python構(gòu)建你的第一個多標(biāo)簽圖像分類模型(附案例)

2019-05-15    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

你正在處理圖像數(shù)據(jù)嗎?我們可以使用計算機視覺算法來做很多事情:

對象檢測
圖像分割
圖像翻譯
對象跟蹤(實時),還有更多……

這讓我思考——如果一個圖像中有多個對象類別,我們該怎么辦?制作一個圖像分類模型是一個很好的開始,但我想擴展我的視野以承擔(dān)一個更具挑戰(zhàn)性的任務(wù)—構(gòu)建一個多標(biāo)簽圖像分類模型!

制作一個圖像分類模型

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

我不想使用簡單玩具數(shù)據(jù)集來構(gòu)建我的模型—這太普通了。然后,它打動了我—包含各種各樣的人的電影/電視劇海報。我可以僅通過看海報就能來構(gòu)建我自己的多標(biāo)簽圖像分類模型來預(yù)測不同的流派嗎?

 

 

答案很簡單——是的!在本文中,我解釋了多標(biāo)簽圖像分類背后的思想。我們將使用電影海報構(gòu)建我們自己的模型。你將會對我們的模型產(chǎn)生的令人印象深刻的結(jié)果感到驚訝。如果你是《復(fù)仇者聯(lián)盟》或《權(quán)力的游戲》的粉絲,那么在實現(xiàn)部分會有一個很棒的驚喜(無劇透的)給你。

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

目錄

1. 什么是多標(biāo)簽圖像分類?

2. 多標(biāo)簽圖像分類與多類圖像分類有何不同?

3. 了解多標(biāo)簽圖像分類模型體系結(jié)構(gòu);

4. 構(gòu)建多標(biāo)簽圖像分類模型的步驟;

5. 案例研究:用Python解決多標(biāo)簽圖像分類問題;

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

7.尾記。

1. 什么是多標(biāo)簽圖像分類?

讓我們通過一個直觀的例子來理解多標(biāo)簽圖像分類的概念。 看看下面的圖片:

 

 

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

當(dāng)我們只有兩類圖像可以分類時,這就稱為二值圖像分類問題。

讓我們再看一個圖片:

 

 

在這個圖片中,你識別出了多少個物體?有太多了——房子、帶噴泉的池塘、樹木、巖石等等。所以,當(dāng)我們可以將一個圖像分類為多個類(如上圖所示)時,就稱為多標(biāo)簽圖像分類問題。

現(xiàn)在,這里有一個問題——我們大多數(shù)人對多標(biāo)簽和多類圖像分類感到困惑。當(dāng)我第一次遇到這些術(shù)語時,我也被迷惑了。現(xiàn)在我對這兩個主題有了更好的理解,讓我來為你們澄清一下區(qū)別。

2. 多標(biāo)簽圖像分類與多類圖像分類有何不同?

假設(shè)給我們一些動物的圖片,讓我們把它們分成相應(yīng)的類別。為了便于理解,我們假設(shè)一個給定的圖像可以分為4類(貓、狗、兔子和鸚鵡),F(xiàn)在,可能有兩種情況:

每個圖像只包含一個對象(上述4個類別中的任何一個),因此,它只能被歸入4個類別中的一個。

圖像可能包含多個對象(來自上述4個類別),因此該圖像將屬于多個類別。

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

 

 

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

這里的每張圖片只能被分類為貓、狗、鸚鵡或兔子。沒有任何一個圖像屬于多個類別的情況。

當(dāng)圖像可分類的類別超過兩種時

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

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

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

 

 

第一張圖片(左上角)包含一只狗和一只貓

第二幅圖(右上角)包括一只狗、一只貓和一只鸚鵡

第三幅圖(左下角)包含一只兔子和一只鸚鵡,以及

最后一張圖片(右下角)包含一只狗和一只鸚鵡

這些都是給定的圖像的標(biāo)簽。這里的每個圖像都屬于一個以上的類,因此它是一個多標(biāo)簽圖像分類問題。

這兩種情況應(yīng)該有助于你理解多類和多標(biāo)簽圖像分類之間的區(qū)別。如果你需要進一步的說明,請在本文下面的評論部分與我聯(lián)系。

在進入下一節(jié)之前,我建議你通讀這篇文章——在10分鐘內(nèi)構(gòu)建你的第一個圖像分類模型!它將幫助你了解如何解決一個多類圖像分類問題。

在10分鐘內(nèi)構(gòu)建你的第一個圖像分類模型:

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

3. 構(gòu)建多標(biāo)簽圖像分類模型的步驟

現(xiàn)在我們已經(jīng)對多標(biāo)簽圖像分類有了一個直觀的認(rèn)識,讓我們深入討論解決這個問題應(yīng)該遵循的步驟。

第一步是以結(jié)構(gòu)化格式獲取數(shù)據(jù)。這既適用于圖像二分類,也適用于多類圖像分類。

你應(yīng)該有一個文件夾,其中包含您想要訓(xùn)練模型的所有圖像,F(xiàn)在,為了訓(xùn)練這個模型,我們還需要圖像的真實標(biāo)簽。因此,你還應(yīng)該有一個.csv文件,其中包含所有訓(xùn)練圖像的名稱及其對應(yīng)的真實標(biāo)簽。

我們將在本文后面學(xué)習(xí)如何創(chuàng)建這個.csv文件。現(xiàn)在,只要記住數(shù)據(jù)應(yīng)該是一種特定的格式。數(shù)據(jù)準(zhǔn)備好后,我們可以將進一步的步驟劃分如下:

加載和預(yù)處理數(shù)據(jù)

首先,加載所有圖像,然后根據(jù)項目的需求對它們進行預(yù)處理。為了檢查我們的模型將如何對不可見的數(shù)據(jù)(測試數(shù)據(jù))執(zhí)行,我們創(chuàng)建了一個驗證集。我們在訓(xùn)練集上訓(xùn)練我們的模型并使用驗證集對其進行驗證(標(biāo)準(zhǔn)的機器學(xué)習(xí)方法)。

定義模型的結(jié)構(gòu)

下一步是定義模型的結(jié)構(gòu)。這包括決定隱藏層的數(shù)量、每層神經(jīng)元的數(shù)量、激活函數(shù)等等。

訓(xùn)練模型

是時候在訓(xùn)練集上訓(xùn)練我們的模型了!我們輸入訓(xùn)練圖像及其對應(yīng)的真標(biāo)簽對模型進行訓(xùn)練。我們還在這里傳入驗證圖像,以幫助我們驗證模型在不可見數(shù)據(jù)上的性能。

作出預(yù)測

最后,我們使用訓(xùn)練過的模型對新圖像進行預(yù)測。

4. 了解多標(biāo)簽圖像分類模型結(jié)構(gòu)

現(xiàn)在,多標(biāo)簽圖像分類任務(wù)的預(yù)處理步驟將類似于多類問題的預(yù)處理步驟。關(guān)鍵的區(qū)別在于我們定義模型結(jié)構(gòu)的步驟。

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

但是在多標(biāo)簽圖像分類的情況下,單個圖像可以有多個標(biāo)簽。我們希望概率彼此獨立。使用softmax激活函數(shù)并不合適。相反,我們可以使用sigmoid激活函數(shù)。這將獨立地預(yù)測每個類的概率。它將在內(nèi)部創(chuàng)建n個模型(這里的n是總類數(shù)),每個類一個模型,并預(yù)測每個類的概率。

利用sigmoid激活函數(shù)將多標(biāo)簽問題轉(zhuǎn)化為n-二分類問題。因此對于每幅圖像,我們將得到概率來確定圖像是否屬于第一類,以此類推。由于我們已經(jīng)將其轉(zhuǎn)換為一個n-二分類問題,我們將使用binary_cross-sentropy損失。我們的目標(biāo)是盡量減少這種損失,以提高模型的性能。

這是我們在定義用于解決多標(biāo)簽圖像分類問題的模型結(jié)構(gòu)時必須做的主要更改。訓(xùn)練部分將類似于一個多類問題。我們將傳入訓(xùn)練圖像及其對應(yīng)的真實標(biāo)簽,以及驗證集來驗證模型的性能。

最后,我們將獲取一張新的圖像,并使用訓(xùn)練過的模型來預(yù)測該圖像的標(biāo)簽。還跟得上嗎?

5. 案例研究:用Python解決多標(biāo)簽圖像分類問題

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

讓我們明確問題陳述。我們的目標(biāo)是通過電影的海報圖像來預(yù)測電影的類型。你能猜到為什么這是一個多標(biāo)簽圖像分類問題嗎?在你往下看之前想一下。

一部電影可以屬于多種類型,對吧?它不僅僅屬于一個類別,如動作片或喜劇片。電影可以是兩種或多種類型的結(jié)合。因此,它是多標(biāo)簽圖像分類。

我們將使用的數(shù)據(jù)集包含多個多類型電影的海報圖像。我對數(shù)據(jù)集做了一些更改,并將其轉(zhuǎn)換為結(jié)構(gòu)化格式,即一個包含圖像的文件夾和一個存儲真正標(biāo)簽的.csv文件。你可以從這里下載結(jié)構(gòu)化數(shù)據(jù)集。下面是一些來自我們數(shù)據(jù)集的海報:

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

 

 

如果你愿意,可以在這里下載原始數(shù)據(jù)集和基準(zhǔn)真值。

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

讓我們開始編程!

首先,導(dǎo)入所有需要的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

現(xiàn)在,讀取.csv文件并查看前五行的內(nèi)容:

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

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

 

 

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

1. train.columns

 

 

Genre列包含每個圖像的列表,其中明確了每個圖像對應(yīng)的電影的類型。因此,從.csv文件的頭部開始,第一個圖像的類型是喜劇和戲劇。

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

我們將構(gòu)建一個返回給定電影海報類型的模型。但在此之前,你還記得構(gòu)建圖像分類模型的第一步嗎?

沒錯——就是正確的加載和預(yù)處理數(shù)據(jù)。所以,讓我們看看所有的訓(xùn)練圖片:

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)

快速瀏覽一下數(shù)組的形狀:

1. X.shape

 

 

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

1. plt.imshow(X[2])

 

 

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

1. train['Genre'][2]

 

 

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

讓我們來看看。 我們知道總共有25種可能的類型。對于每個圖像,我們將有25個目標(biāo),即電影是否屬于該類型。 因此,所有這25個目標(biāo)的值都為0或1。

我們將從訓(xùn)練文件中刪除Id和Genre列,并將剩余的列轉(zhuǎn)換為將成為我們圖像目標(biāo)的數(shù)組:

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

 

輸出數(shù)組的形狀是(7254,25),正如我們預(yù)想的那樣。 現(xiàn)在,讓我們創(chuàng)建一個驗證集,它將幫助我們檢查模型在不可見的數(shù)據(jù)上的性能。 我們將隨機分離10%的圖像作為我們的驗證集:

1. X_train, X_test, y_train, y_test =

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

下一步是定義模型結(jié)構(gòu)。輸出層將有25個神經(jīng)元(等于類型的數(shù)量),我們將使用sigmoid作為激活函數(shù)。

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

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'))

讓我們顯示我們的模型總結(jié):

1. model.summary()

 

 

有相當(dāng)多的參數(shù)要學(xué)習(xí)! 現(xiàn)在,編譯模型。 我將使用binary_crossentropy作為損失函數(shù),使用ADAM作為優(yōu)化器(同樣,你也可以使用其他優(yōu)化器):

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

最后,我們最有趣的部分——訓(xùn)練模型。我們將訓(xùn)練模型10個循環(huán),并傳入我們之前創(chuàng)建的驗證數(shù)據(jù),以驗證模型的性能:

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

 

 

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

所有《權(quán)力的游戲(GoT)》和《復(fù)仇者聯(lián)盟(Avengers)》的粉絲——這是給你們的禮物。 讓我獲取GoT和Avengers的海報,并將它們提供給我們的模型。 在繼續(xù)之前下載GOT和Avengers的海報。

GOT

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

Avengers

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

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

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

2. img = image.img_to_array(img)

3. img = img/255

現(xiàn)在,我們將使用我們訓(xùn)練好的模型預(yù)測這些海報的類型。該模型將告訴我們每種類型的概率,我們將從中獲得前3個預(yù)測結(jié)果。

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)

 

 

真棒!我們的模型為《權(quán)力的游戲》預(yù)測了戲劇,驚悚和動作類型。在我看來,這個分類很好。讓我們在《復(fù)仇者聯(lián)盟》海報上試試我們的模型。圖像預(yù)處理:

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

2. img = image.img_to_array(img)

3. img = img/255

然后做預(yù)測:

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)

 

 

我們的模型給出的類型是戲劇、動作和驚悚。同樣,這些都是非常準(zhǔn)確的結(jié)果。這個模型能在好萊塢電影分類上表現(xiàn)的一樣優(yōu)秀嗎?讓我們來看看。我們將使用這張Golmal 3的海報。

 

 

你知道在這個階段該做什么——加載和預(yù)處理的圖像:

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

2. img = image.img_to_array(img)

3. img = img/255

然后為這個海報預(yù)測電影類型:

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)

 

 

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

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

這就是如何解決多標(biāo)簽圖像分類問題。盡管我們只有大約7000張圖片來訓(xùn)練模型,但我們的模型表現(xiàn)得非常好。

你可以嘗試收集更多的訓(xùn)練海報。我的建議是使所有的流派類別有相對平等的分布的數(shù)據(jù)集。為什么?

如果某一類型在大多數(shù)訓(xùn)練圖像中重復(fù)出現(xiàn),那么我們的模型可能會與該類型過度匹配。對于每一張新圖片,該模型都可能預(yù)測出相同的類型。為了克服這個問題,你應(yīng)該嘗試均衡的流派類別分布。

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

7. 尾記

除了流派類型預(yù)測外,多標(biāo)簽圖像分類還有多種應(yīng)用。例如,你可以使用此技術(shù)自動標(biāo)記圖像。假設(shè)你想預(yù)測圖像中服裝的類型和顏色。你可以建立一個多標(biāo)簽圖像分類模型,這將幫助你預(yù)測同時兩者!

希望本文能幫助你理解多標(biāo)簽圖像分類的概念。如果你有任何反饋或建議,請在下面的評論部分與我們分享。實驗快樂!

原文鏈接:

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

原文標(biāo)題:

Build your First Multi-Label Image Classification Model in Python

標(biāo)簽: [db:TAGG]

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:人工智能時代計算機架構(gòu)的趨勢與挑戰(zhàn)

下一篇:數(shù)據(jù)智能的前世今生:技術(shù)融合與模式躍遷