Referencia de ejemplo: https://www.jiqizhixin.com/articles/2019-05-15-2
Conjunto de datos: https://www.cs.ccu.edu.tw/~wtchu/projects/MoviePoster/index.html
Se obtendrá el conjunto de datos original. Entre ellos, hay tres archivos. El conjunto de datos de carteles de películas son las imágenes de algunos carteles de películas de 1980 a 2015, y los metadatos de carteles de películas son los detalles de datos de algunas películas de 1980 a 2015. Ejemplo :
El archivo Léame es una explicación de los campos del archivo de metadatos del póster de película. En el proceso de formación solo se utilizan IMPID y Género (tipos de película).
paso:
- procesamiento de datos
Obtenga el tipo de película para implementar la codificación one-hot para el tipo de película, si pertenece a qué tipo, use 1 para indicar, y los otros a 0, obtenga los siguientes archivos,
Teniendo en cuenta la relevancia de las características, elimine la columna de género con menos películas (elimine la columna de género con menos de 50) y finalmente deje 22 géneros de películas, de la siguiente manera:
Utilice el tipo de película como valor de resultado final y luego cargue la imagen:
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)
- Construcción del modelo
El modelo se compone de 4 capas de convolución y 3 capas de capas completamente conectadas. Los parámetros específicos son los siguientes:
Los resultados del entrenamiento son:
- Predicción del modelo
Agregue un nuevo póster de los Vengadores para predecir los datos (aquí se puede reemplazar con los datos del póster) y cargue los datos:
img = image.load_img('F:/aayu/图像/data/GOT.jpg',target_size=(400,400,3))
img = image.img_to_array(img)
img = img/255
resultado del pronóstico:
Código completo:
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
#加入新数据,进行测试
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)
Resumen: En comparación con el conjunto de datos minist, la clasificación de este conjunto de datos tiene una imagen con múltiples clases, y una imagen en el conjunto de datos minist representa un número, es decir, una clasificación, por lo que la clasificación de imágenes y la clasificación de imágenes están en Lo esencial La diferencia radica en el conjunto de datos y la implementación del algoritmo es básicamente la misma.
(El conjunto de datos se está procesando, la URL de github es: https://github.com/YUXUEPENG/ImageMulti-Classification.git)