Как обучить сиамскую нейронную сеть для сопоставления изображений? - PullRequest
1 голос
/ 05 апреля 2019

Мне нужно определить, совпадают ли два отпечатка пальца (с удостоверения личности и датчика).Ниже приведены несколько примеров из моей базы данных (3000 пар изображений):

  1. Пример соответствия изображений

enter image description here

Пример несоответствующих изображений

enter image description here

Я пытаюсь обучить сиамскую сеть, которая получает пару изображений и выводит ихравно [1, 0], если они не совпадают, и [0, 1], если они совпадают, тогда я создал свою модель с помощью Keras:

image_left = Input(shape=(200, 200, 1))
image_right = Input(shape=(200, 200, 1))

vector_left = conv_base(image_left)
vector_right = conv_base(image_right)

merged_features = concatenate([vector_left, vector_right], axis=-1)

fc1 = Dense(64, activation='relu')(merged_features)
fc1 = Dropout(0.2)(fc1)

# # fc2 = Dense(128, activation='relu')(fc1)

pred = Dense(2, activation='softmax')(fc1)

model = Model(inputs=[image_left, image_right], outputs=pred)

, где conv_base - сверточная архитектура.На самом деле, я пробовал с ResNet, leNet, MobileNetV2 и NASNet с keras.applications, но они не работают.

conv_base = NASNetMobile(weights = None,
                        include_top=True,
                       classes=256)

Моя сводка модели похожа, как показано ниже(в зависимости от используемой соответствующей сети):

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_2 (InputLayer)            (None, 200, 200, 1)  0                                            
__________________________________________________________________________________________________
input_3 (InputLayer)            (None, 200, 200, 1)  0                                            
__________________________________________________________________________________________________
NASNet (Model)                  (None, 256)          4539732     input_2[0][0]                    
                                                                 input_3[0][0]                    
__________________________________________________________________________________________________
concatenate_5 (Concatenate)     (None, 512)          0           NASNet[1][0]                     
                                                                 NASNet[2][0]                     
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 64)           32832       concatenate_5[0][0]              
__________________________________________________________________________________________________
dropout_1 (Dropout)             (None, 64)           0           dense_1[0][0]                    
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 2)            130         dropout_1[0][0]                  
==================================================================================================
Total params: 4,572,694
Trainable params: 4,535,956
Non-trainable params: 36,738

В дополнение к сверточным изменениям архитектуры, я пробовал использовать предварительно обученные веса, настраивая все слои как обучаемые, устанавливая последние сверточные слои как обучаемые, увеличение данных,используя функции categorical_crossentropy и contrastive_loss, меняя скорость обучения, но все они ведут себя одинаково.Точность обучения и валидации всегда равна 0,5.

Кто-нибудь имеет представление о том, что я пропускаю / делаю неправильно?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...