Red neuronal convolucional de clasificación múltiple de imágenes

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)

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_28409193/article/details/103583344
Recomendado
Clasificación