图像多分类——卷积神经网络
例子參考:https://www.jiqizhixin.com/articles/2019-05-15-2
數(shù)據(jù)集:https://www.cs.ccu.edu.tw/~wtchu/projects/MoviePoster/index.html
將獲取到原始數(shù)據(jù)集,其中,有三個文件,? ?Movie Poster Dataset是1980-2015年部分影片海報圖片,?Movie Poster Metadata是1980-2015年部分影片的數(shù)據(jù)詳情,example:
? ? ? ? ? ? ? ? ? ? ? ? ??
Readme則是對?Movie Poster Metadata文件里邊的字段解釋,在訓練過程中只用到IMPId和 Genre(影片類型)。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
步驟:
- 數(shù)據(jù)處理
獲取到影片的類型對影片類型實現(xiàn)one-hot編碼,如果是屬于哪個類型,用1表示,其他為0,得到如下文件,
? ? ? ? ? ? ? ? ? ? ? ? ?
考慮到特征的相關性,刪除影片比較少的類型列(將數(shù)量小于50的類型列進行刪除),最終留下22個電影類型,如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ?
將電影類型作為最終的結果值,然后加載圖片:
for i in tqdm(range(train.shape[0])): img = image.load_img('D:/aayu/實例/圖像多分類/data/Images/'+train['ID'][i]+'.jpg',target_size=(400,400,3)) img = image.img_to_array(img) img = img/255 train_image.append(img) X = np.array(train_image)- 模型構建
模型是由4層卷積和3層全連接層構成,具體參數(shù)如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
訓練結果為:
- 模型預測
新增一個復仇者聯(lián)盟的海報對數(shù)據(jù)進行預測(此處可更換為任意海報數(shù)據(jù)),加載數(shù)據(jù):
img = image.load_img('F:/aayu/圖像/data/GOT.jpg',target_size=(400,400,3)) img = image.img_to_array(img) img = img/255預測結果:
?
完整代碼:
import keras from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras.utils import to_categorical from keras.preprocessing import image import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from tqdm import tqdm #%matplotlib inline train = pd.read_csv('F:/aayu/圖像/data/multi-data.csv')print(train.head())train_image = [] for i in tqdm(range(train.shape[0])): img = image.load_img('F:/aayu/圖像/data/Images/'+train['ID'][i]+'.jpg',target_size=(400,400,3)) img = image.img_to_array(img) img = img/255 train_image.append(img) X = np.array(train_image) y = np.array(train.drop(['ID', 'Genre','News','Reality-TV','Italian','Polish','Adult','Talk-Show','Spanish','Russian','Cantonese','R','PG','German','English','Japanese','Filipino','French','G','Game-Show','Hungarian'],axis=1)) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.1) #model model = Sequential() model.add(Conv2D(filters=16, kernel_size=(5, 5), activation="relu", input_shape=(400,400,3))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(filters=32, kernel_size=(5, 5), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(filters=64, kernel_size=(5, 5), activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(filters=64, kernel_size=(5, 5), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(22, activation='sigmoid')) model.summary() model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test), batch_size=64) #precise #加入新數(shù)據(jù),進行測試 img = image.load_img('F:/aayu/圖像/data/GOT.jpg',target_size=(400,400,3)) img = image.img_to_array(img) img = img/255 classes = np.array(train.columns[:22]) proba = model.predict(img.reshape(1,400,400,3)) top_3 = np.argsort(proba[0])[:-4:-1] for i in range(3): print("{}".format(classes[top_3[i]])+" ({:.3})".format(proba[0][top_3[i]])) plt.imshow(img)總結:與minist數(shù)據(jù)集相比,該數(shù)據(jù)集的分類中存在一張圖片多個類的情況,而minist數(shù)據(jù)集當中一張圖片代表一個數(shù)字,也就是一個分類,所以圖像分類和圖像多分類在本質上的區(qū)別在于數(shù)據(jù)集,算法實現(xiàn)基本都是一樣的。
(數(shù)據(jù)集正在處理中,github網(wǎng)址為:https://github.com/YUXUEPENG/ImageMulti-Classification.git)
?
?
?
?
總結
以上是生活随笔為你收集整理的图像多分类——卷积神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab求两点的距离,matlab求
- 下一篇: MongoDB基本应用操作整理