Как разработать сверточную нейронную сеть для различения изображений со схожими характеристиками?

В настоящее время я разрабатываю сверточную нейронную сеть в рамках keras с использованием бэкэнда tensorflow, который будет использоваться для различения пройденного или неудачного индикатора. Разница между ними (определяющая, успешно это или нет) заключается в небольшом изменении цвета внутри трубки. Однако, когда я тренирую сверточную нейронную сеть на изображениях (примерно 1500 изображений каждого), кажется, что сеть всегда предсказывает проходы независимо от изображения. Я предполагаю, что это связано с огромным сходством между ними, но я не уверен, почему он не может обнаружить это изменение цвета как отличительную черту.

Код, который я сейчас использую для создания классификатора, приведен ниже, чтобы указать, где классификатор может создать такое смещение.

# Imports from Keras Library to build Network
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Activation
from keras.callbacks import ModelCheckpoint
from keras.layers import BatchNormalization
# Initialising the CNN as a sequential network
classifier = Sequential()

# Addition of convultional layer
classifier.add(Conv2D(32, kernel_size=(3, 3), input_shape = (356, 356, 3)))
# Adding a dropout to prevent overstabilization on certain nodes

# Adding a second/third/fourth convolutional/pooling/dropout layer
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))
classifier.add(Conv2D(32, (3, 3)))
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dropout(0.25))

classifier.add(Conv2D(32, (3, 3)))
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dropout(0.25))
classifier.add(Conv2D(64, (3, 3)))
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dropout(0.25))

# Flattening Layer
classifier.add(Flatten())
# Full connection using dense layers
classifier.add(Dense(units = 128))
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))  
classifier.add(Dense(units = 2, activation = 'softmax'))

# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
classifier.summary()

# Fitting the CNN to the images

from keras.preprocessing.image import ImageDataGenerator

# Taining image generator (causes variation in how images may appear when trained upon)
train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.4,
                                   zoom_range = 0.4,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

# Creation of training set
training_set = train_datagen.flow_from_directory('dataset/TrainingSet',
                                                 target_size = (356, 356),
                                                 batch_size = 32,
                                                 class_mode = 'categorical',
                                                 shuffle = True)

# Creation of test set
test_set = test_datagen.flow_from_directory('dataset/TestSet',
                                            target_size = (356, 356),
                                            batch_size = 32,
                                            class_mode = 'categorical',
                                            shuffle = True)

caller = ModelCheckpoint('/Users/anishkhanna/Documents/Work/BI Test/BI Models/part3.weights.{epoch:02d}-{val_loss:.2f}.hdf5', monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
# Training the model based on above set
# Can also be improved with more images
classifier.fit_generator(training_set,
                         steps_per_epoch = 200,
                         epochs = 200,
                         validation_data = test_set,
                         validation_steps = 15,
                         shuffle = True,
                         callbacks = [caller])

# Creates a HDF5 file to save the imformation of the model so it can be used later without retraining
classifier.save('BI_Test_Classifier_model.h5')

# Deletes the existing model
del classifier  

Если есть какие-то улучшения модели, которые я мог бы внести, или предложения по ней, буду очень признателен.


person Anish Khanna    schedule 05.06.2018    source источник


Ответы (1)


Если вашей отличительной чертой в основном является цвет, вы можете выполнить предварительную обработку, чтобы помочь нейронной сети. В этом случае вы можете преобразовать RGB в значение насыщенности оттенка (HSV) и просто использовать, например канал Hue, который будет содержать информацию о цвете пикселей и игнорировать затенение и т. д. Вот опубликовать об этом, и вы можете использовать его как preprocessing_function для ImageDataGenerator< /а>.

person nuric    schedule 05.06.2018