как построить модель cnn для обнаружения дефектов с тремя классами и протестировать на ней одно изображение

#python #tensorflow #keras #deep-learning #conv-neural-network

Вопрос:

Я построил модель CNN для обнаружения двух видов дефектов на изображении. Эти классы «большие» и «маленькие», и точность действительно хорошая. Архитектура моей модели представлена ниже:

 inputs = tf.keras.Input(shape=(120, 120, 3))
x = tf.keras.layers.Conv2D(filters=16, kernel_size=(3, 3), activation='relu')(inputs)
x = tf.keras.layers.MaxPool2D(pool_size=(2, 2))(x)
x = tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu')(x)
x = tf.keras.layers.MaxPool2D(pool_size=(2, 2))(x)
x = tf.keras.layers.GlobalAveragePooling2D()(x)
outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x)

model = tf.keras.Model(inputs=inputs, outputs=outputs)

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

print(model.summary())

history = model.fit(
    train_data,
    validation_data=val_data,
    epochs=100,
    callbacks=[
        tf.keras.callbacks.EarlyStopping(
            monitor='val_loss',
            patience=3,
            restore_best_weights=True
        )
    ]
)
 

Теперь я хочу использовать эту модель CNN для нескольких классов, и классы будут «большими», «маленькими», «другими». У меня есть набор данных, но я не знаю, как изменить модель для трех классов. Кроме того, в конце я хочу протестировать одно изображение в своей модели CNN и получить метку, если вставленное изображение большое, маленькое или другое, но я не знаю, как это сделать.

Ответ №1:

Попробуйте это:

 model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(input_shape = (120, 120, 3), filters=16, kernel_size=(3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2, 2)))
model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2, 2)))
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(3, activation='softmax'))

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

для прогнозирования вы можете использовать этот код:

 from PIL import Image
import numpy as np
from skimage import transform

def load(filename):
    np_image = Image.open(filename)
    np_image = np.array(np_image).astype('float32')/255
    np_image = transform.resize(np_image, (120, 120, 3))
    np_image = np.expand_dims(np_image, axis=0)
    return np_image


folder_path = 'Dataset/test/4.jpg'
image = load(folder_path)
pred = model.predict_classes(image)
pred.tolist()[0]
 

Комментарии:

1. Большое вам спасибо, но для тестовых изображений, как я могу получить этикетку для вывода? я имею в виду, что этот код возвращает массив из 0 и 1. Я написал функцию, которая получает метку, но я не знаю, как ее использовать:

2. def generate_df(image_dir, метка): пути к файлам = pd.Серия(список(image_dir.glob(r’*.png’)), имя=’Путь к файлу’). тип(str) метки = pd.Серия(метка, имя=’Метка’, индекс=пути к файлам.индекс) df = pd.конкат([пути к файлам, метки], ось=1) возвращает df

3. big_df = generate_df(big_dir, метка=»БОЛЬШОЙ»)

4. Я изменил свой ответ. Чтобы получить прогнозируемые классы, вы должны использовать последовательные.

5. Большое вам спасибо!