人脸识别连体网络

时间:2021-02-27 12:16:00

标签: python machine-learning keras face-recognition

我在使用 Siamese Network 执行两项任务时遇到一些问题:

任务是:

  1. 构建一个 Siamese 网络,从 facenet network 中提取的特征开始,能够为同一主题生成相似的向量,反之亦然。网络代码:
numberNode = [512,400,200,256]

def build_network(input_shape):
    model = Sequential()
    model.add(Dense(numberNode[0],
                    input_shape=input_shape,
                    activation='linear'
                    ))
    model.add(Dense(numberNode[1],
                    activation='linear'
                    ))
    model.add(Dense(numberNode[2]
                    ,activation='relu'
                    ))
    model.add(Dense(numberNode[3]
                    ,activation='relu'
                    ))
    return model;

dimInput = (512,)
imgA = Input(shape=dimInput)
imgB = Input(shape=dimInput)

net = build_network(dimInput)
net.summary()

featVecsA = net(imgA)
featVecsB = net(imgB)
distance = Lambda(chebyshevDistance, output_shape=outputShapeFunction)([featVecsA, featVecsB])
model = Model(inputs=[imgA, imgB], outputs=distance)

为了训练网络,我使用 AT&T 数据集和 Contrastive Loss 函数来减少相似受试者之间的切比雪夫距离并增加不同受试者之间的切比雪夫距离

earlyStopper = EarlyStopping(patience=5, verbose=1)
sgd = Adam(learning_rate=0.00005)
model.compile(loss=contrastive_loss, optimizer=sgd)

def contrastive_loss(y_true, y_pred):
    margin = 1.5
    return K.mean(y_true * 0.5 * K.square(y_pred) + (1-y_true) * 0.5 * K.square(K.maximum(margin - y_pred, 0)))
  1. 第二个任务涉及获取网络倒数第二个级别的输出并将其二值化,以便为同一主题获得相同的二元向量,而对于另一个主题显然不同。

我的解决方案是根据 0.5 的阈值进行二值化,但实际上在我获得的 4000 对的测试集上结果并不出色:

True Acceptance: 600
False Acceptance: 89
False Rejection: 1376
True Rejection: 1887

我不明白我的方法是否正确,因为即使在第一个任务中,网络也会立即过度拟合。我尝试改变网络结构、激活函数和学习率,但没有任何改进。

我解决问题的方法正确吗?

0 个答案:

没有答案