Архитектура и настройка CNN - обнаружение изображений хорошего и плохого качества - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь установить двоичную классификацию изображений хорошего и плохого качества. В основном изображения хорошего качества в этом случае - это те, которые не показывают сильного сжатия артефактов, имеют довольно легко читаемый текст, не показывают размытости и т. Д. c. В этом случае плохое качество - это те, которые полностью скомпрометированы - есть очень заметная разница между двумя классами. Моя проблема, вероятно, по крайней мере несколько похожа на эту тему: Архитектура CNN: классификация «хороших» и «плохих» изображений

У меня есть вводный фон для архитектур CNN, поэтому я знаком с настройка собаки / кошки и других вводных модулей. Я пробовал несколько разных подходов - после некоторых исследований кажется, что для такого рода проблем рекомендуется использовать предварительно обученный VGG16 или Xception, даже если просто сравнить с базовой настройкой свертки c, которую я тоже пробовал. (Мне трудно поверить, что для решения этой проблемы необходима какая-то сверхсложная архитектура - по крайней мере, должна быть достигнута некоторая приличная точность)

Однако я, должно быть, делаю очевидную ошибку, так как могу ' Я даже не смог добиться разумной точности на обучающей выборке - мои результаты почти сразу же склоняются к точности, эквивалентной 0,5 (случайное предположение) и потере 0,69. Я пробовал разные скорости обучения и оптимизаторы, но безрезультатно. У меня 500 человек каждого класса в обучении и 150 человек каждого класса на проверке изображений разного размера.

Здесь есть какая-то вопиющая ошибка? Или может что-то не так с самими изображениями?

Код:

from keras.applications import *
from keras.models import Model

base_model = tf.keras.applications.Xception(
    include_top = False, weights = "imagenet", input_shape = (299,299,3))

x = base_model.output
x = tf.keras.layers.GlobalAveragePooling2D()(x)
predictions = tf.keras.layers.Dense(1, activation = "sigmoid")(x)

model = tf.keras.Model(inputs = base_model.input, outputs = predictions)

print(model.summary())

for layer in base_model.layers:
    layer.trainable = False

model.compile (loss = 'binary_crossentropy', optimizer = tf.keras.optimizers.Nadam(lr = 1e-5), metrics = ['accuracy'])

from tf.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1/255)

train_generator = train_datagen.flow_from_directory(
'TrainingPath' #contains 2 folders, one "Good" one "Bad",
target_size = (299,299),
batch_size = 32,
shuffle = True,
class_mode = 'binary'
)

validation_datagen = ImageDataGenerator(rescale = 1/255)

validation_generator = validation_datagen.flow_from_directory(
'ValidationPath' #contains 2 folders, one "Good" one "Bad",
target_size = (299,299),
batch_size = 32,
shuffle = True,
class_mode = "binary"
)

history = model.fit(train_generator,
steps_per_epoch = 32,
epochs = 8,
verbose = 1,
validation_data = validation_generator,
validation_steps = 8
)
        
...