理论
人证比对,其实就是人脸识别的一部分。
通常来说;我们采用神经网络提取特征,如vgg,resnet,我们需要去掉最后的全连接层,只保留前面网络所提取到的特征,而后直接用特征当做向量表示,计算欧几里得距离,借此得到人脸之间的相似度。
但是对于卷积神经网络来说,softmax损失虽然能有效分类,但是不满足相似度所要求的两个条件:1.类内差距小。2.类间差距大。
总而言之:相似度有两个充要条件:1.特征提取算法上的优异性。2.损失函数的优异性。
目前来说,用于人证比对的损失函数有两种:1.三元组损失。2.中心化损失。
算法
1.MTCNN进行人脸裁剪和对齐。
2.然后就是普通的训练啦,resnet,vgg,densenet啥的都行。
3.损失必须要用三元组损失或者中心损失。
最后:输入两张图片就可以计算距离。
代码
下面展示一三元组损失
。
def triplet_loss(anchor, positive, negative, alpha): with tf.variable_scope('triplet_loss'): pos_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, positive)), 1) neg_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, negative)), 1) basic_loss = tf.add(tf.subtract(pos_dist,neg_dist), alpha) loss = tf.reduce_mean(tf.maximum(basic_loss, 0.0), 0) return loss
下面展示一些 中心损失
。
def center_loss(features, label, alfa, nrof_classes): nrof_features = features.get_shape()[1] centers = tf.get_variable('centers', [nrof_classes, nrof_features], dtype=tf.float32, initializer=tf.constant_initializer(0), trainable=False) label = tf.reshape(label, [-1]) centers_batch = tf.gather(centers, label) diff = (1 - alfa) * (centers_batch - features) centers = tf.scatter_sub(centers, label, diff) loss = tf.reduce_mean(tf.square(features - centers_batch)) return loss, centers