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

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

Я пытаюсь обучить сиамскую сеть, которая получает пару изображений и выводит ихравно [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.
Кто-нибудь имеет представление о том, что я пропускаю / делаю неправильно?
Спасибо.