项目地址:https://github.com/davidsandberg/facenet

  • facenet基于MTCNN的人脸检测和Inception-Resnet-v1的人脸识别网络
  • softmax,center loss 训练结果比triplet loss训练结果好太多,自己训练达到99.0%+-0.006。利用msceleb训练集。

一、MTCNN人脸检测

待补充

二、Inception-resnet-v1人脸识别模块

2.1如何自己重新训练facenet模型

2.1.1triplet loss原理

triplet loss代码如下:

def triplet_loss(anchor, positive, negative, alpha):"""Calculate the triplet loss according to the FaceNet paperArgs:anchor: the embeddings for the anchor images.positive: the embeddings for the positive images.negative: the embeddings for the negative images.Returns:the triplet loss according to the FaceNet paper as a float tensor."""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
  • 可以看出,triplet loss 利用一组三元数据,分别设为(A,P,N)。其中A代表基准图片,P是与A同一个人的人脸,N是与A不同人的人脸。输入的是从网络输出的embeddings,即最后的特征值。
  • facenet中embeddings的shape由batchsize和embeddings的shape决定,在此例中,我将batchsize设置为30,embeddings_shape为128.则每次输入的anchor为(10,128)的数据。P,N也一样。
  • 计算loss时,由于A和P的距离小于A和N的距离,所以当alpha=0.2时,
    basic_loss=dist(a,p)+0.2dist(a,n) b a s i c _ l o s s = d i s t ( a , p ) + 0.2 − d i s t ( a , n )

    此表达式的目的是为了loss减小的同时,可以修改符合dist(a,p)+0.2 > dist(a,n)这组数据,因为此时,pos_dist+0.2 > neg_dist(a,n),要让pos距离尽可能小,neg距离尽可能大。而在降低loss的同时,就是在做这件事。

解释了triplet loss,开始训练。

2.1.2 利用triplet loss 训练

如何利用triplet loss训练

  • 首先人脸检测,裁剪图片,下载Msceleb或者casia图片库,利用MTCNN进行face align,可以crop到160或者182,只需要分别修改margin和imagesize,margin=32对应160,margin=44对应182.如果裁剪到182,训练时要加–random_crop参数,最后输入网络的依然是160.如果像MsCeleb这种数据集,大约1000,0000的数据量,即使清洗数据依然有500,0000的人脸数据量。需要利用多GPU裁剪,参考上述链接。5百万数据,TITAN XP做了14个小时。
  • 接下来训练识别模型,triplet loss的队列输入每次输入三个图片算一组。batchsize也必须调整为3的倍数,970,4G我用的30。整个数据训练流程如下:
    • 这里要提到images_per_person和images_per_person。首先计算一个epoch要提取的数值,假设images_per_person=45,images_per_person=40,那么nrof_examples=45*40=1800,在这1800容器中,按挑选45个人提取图片,输入进网络计算出embeddings,具体提取过程参考select_triplets()和sample_people(),batchsize=30时,约20000组三元数据。
    • 队列读入数据 ,进行enqueue的op,计算loss,合并正则的loss,此处tf.GraphKeys.REGULARIZATION_LOSSES是在inception-resnet-v1的model中,inference()中slim.arg_scope中定义自动添加到这里,就是所有的权值正则化项,而weight_decay手动定义,这里取1e-4,打印正则化项shape,长度133.
    • 计算loss后不断迭代。

本人triplet loss训练结果一直不如人意,最终lfw的acc只能停留在86%左右。而换成center loss,一下就99.0%了。玄学triplet loss。

2.1.1 center loss原理

利用softmax训练


  • 此公式中 cyi c y i
    代表第i类的中心,只训练符合此类的 xi x i
    ,使得类内距离尽可能的小。达到了提高精度的效果。在人脸识别更适用,因为同一个人的人脸相差不大,特征的类内距离更为接近。人脸的中心性更强一些,也就是说一个人的所有脸取平均值之后的人脸我们还是可以辨识是不是这个人。

  • 总的loss是由softmax loss和center loss相加,由 λ λ
    控制比例。

关于center loss 原理:center loss 原理

train_softmax.py训练

def center_loss(features, label, alfa, nrof_classes):"""Center loss based on the paper "A Discriminative Feature Learning Approach for Deep Face Recognition"(http://ydwen.github.io/papers/WenECCV16.pdf)"""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

2.1.2 利用center loss和softmax训练

其中添加loss的模块如下:

# Add center loss
if args.center_loss_factor>0.0:prelogits_center_loss,_= facenet.center_loss(prelogits, label_batch, args.center_loss_alfa, nrof_classes)tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, prelogits_center_loss * args.center_loss_factor)learning_rate = tf.train.exponential_decay(learning_rate_placeholder, global_step,args.learning_rate_decay_epochs*args.epoch_size, args.learning_rate_decay_factor, staircase=True)
tf.summary.scalar('learning_rate', learning_rate)# Calculate the average cross entropy loss across the batch
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=label_batch, logits=logits, name='cross_entropy_per_example')
cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy')
tf.add_to_collection('losses', cross_entropy_mean)# Calculate the total losses
regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
total_loss = tf.add_n([cross_entropy_mean] + regularization_losses, name='total_loss')
  • 整体流程与triplet loss类似,此方法是基础方法,所有显示的epochsize=1000是对此方法生效的。在triplet loss方法时1000只是一个最低限额,而真正的epochsize次数不是1000.与triplet loss不同的是,每次一张图片的输入而不是三元组的输入。
  • 学习率,开场0.1,150=0.01,180=0.001,210=0.0001到了150时loss和acc有明显的变化,acc从98%上升到99%,其余变化点无明显变化。
  • 收敛迅速,200个epoch达到99%,TITAN XP batchsize=150.

补充:

其余滑动平均、随机crop,prewhiten等代码中都很详细。

三、评价模型准确率

  • 如何验证lfw数据集
  • 评价模型准确率时,利用lfw的pairs做varification。accuracy很好理解,具体参考facenet.calculate_roc(),利用10折交叉验证,找出最佳accuracy的阈值,从0-4步长0.01.一般在1.2左右。
  • 而Validation rate,和far这个判断值搞了半天才搞清楚,这个值是在假定误把不同的人判断为相同的人的概率设定为FAIR=0.001的情况下,判断两个人是同一个人判断正确的概率。这个是为了尽可能降低将不同人判断为同一个人的概率。
def calculate_val_far(threshold, dist, actual_issame):predict_issame = np.less(dist, threshold)true_accept = np.sum(np.logical_and(predict_issame, actual_issame))false_accept = np.sum(np.logical_and(predict_issame, np.logical_not(actual_issame)))n_same = np.sum(actual_issame)n_diff = np.sum(np.logical_not(actual_issame))val = float(true_accept) / float(n_same)far = float(false_accept) / float(n_diff)return val, far

facenet-tensorflow人脸识别相关推荐

  1. 如何在 Keras 中使用 FaceNet 开发人脸识别系统

    https://www.infoq.cn/article/4wT4mNvKlVvEQZR-JXmp Keras 是一个用 Python 编写的高级神经网络 API,能够以 TensorFlow.CNT ...

  2. TensorFlow 人脸识别实验 ImportError: No module named 'sklearn.model_selection'

    今天在运行TensorFlow 人脸识别 python项目时,报 ImportError: No module named 'sklearn.model_selection',当我使用pip inst ...

  3. 聪明的人脸识别4——Pytorch 利用Retinaface+Facenet搭建人脸识别平台

    睿智的目标检测51--Pytorch 利用Retinaface+Facenet搭建人脸识别平台 学习前言 什么是Retinface和Facenet 1.Retinface 2.Facenet 整体实现 ...

  4. facenet 搭建人脸识别库

    转载自:https://www.cnblogs.com/gmhappy/p/9472387.html 选择的方式是从百度下载明星照片 照片下载,downloadImageByBaidu.py # co ...

  5. 机器学习20:基于ResNet50和FaceNet实现人脸识别

    说明: 这是优达学城的一个机器学习作业项目, 我觉得还比较典型综合了几个常见的深度学习技术,值得分享一下:实现包括,数据增广,迁移学习,网络模型构建,训练,评估方法等. 这里只是做了一个迁移学习的实现 ...

  6. facenet训练自己的数据_基于SSD与Facenet的人脸识别

    小方哥-AI人工智能模式识别算法 系统介绍 随着深度学习的日益发展,人脸识别的技术越来越趋于成熟.基于人脸识别的也伴随着众多的应用,比如说基于人脸识别的工厂打卡或者签到系统:基于人脸识别的五官定位以及 ...

  7. 全网首发,Swin Transformer+FaceNet实现人脸识别

    目录 一. 简介 二.Swin Transformer作为Backbone 1.Swin Transformer整体结构 2.PatchEmbed = Patch Partition + Linear ...

  8. 人工智能python3+tensorflow人脸识别_机器学习tensorflow object detection 实现人脸识别...

    object detection是Tensorflow很常用的api,功能强大,很有想象空间,人脸识别,花草识别,物品识别等.下面是我做实验的全过程,使用自己收集的胡歌图片,实现人脸识别,找出胡歌. ...

  9. CNN tensorflow 人脸识别

    数据材料 这是一个小型的人脸数据库,一共有40个人,每个人有10张照片作为样本数据.这些图片都是黑白照片,意味着这些图片都只有灰度0-255,没有rgb三通道.于是我们需要对这张大图片切分成一个个的小 ...

  10. python3 tensorflow 人脸识别_tensorflow人脸识别(自己的数据集)

    可以在云盘下载打包文件包括API,数据 把原有的文件夹下面的object_detection删掉,这里面的(__init____.py)文件百度云盘上传不了,全都没成功,所以在把文件下来之后objec ...

最新文章

  1. linux创建ftp指定目录命令行,Linux-命令行建立FTP
  2. 第十一届山东省大学生程序设计竞赛(热身赛)Mika with Cherry Cake
  3. mysql 5.5 替换字符_Mysql 5.7替换表中某些字段的字符串
  4. Kettle 系列随笔
  5. 【java】dubbo基础学习
  6. 解析MySQL基础架构及一条SQL语句的执行流程和流转
  7. Cookie Theft and Session Hijacking
  8. 简易图解N合1集成安装光盘制作教程二
  9. linux视频教程之vi编辑器
  10. 教你如何更好的用ubuntu
  11. mysql cmd 常用命令
  12. 英语写作——常用的 过度词-连接词
  13. 关于脆弱的图象水印的概述(翻译)
  14. fiddler证书生成ca证书命令及抓包配置
  15. 112A.Petya and Strings
  16. win32 opengl画线
  17. UI设计APP金刚区,卡片式设计
  18. 本周AI热点回顾:AI技术重现的老北京原声影像又火了、百度ERNIE-ViL刷新5项任务记录、Transformer 3发布
  19. 通过system verilog unpacked array转换为packed array解决readmemh无法读取packed array
  20. 9大“抠门”富豪揭密

热门文章

  1. C 语言为什么不会过时?
  2. 【博客625】keepalived开启garp refresh的重要性
  3. 华为鸿蒙系统支持19款机型 有你的手机吗,华为鸿蒙OS再生变数,首批只有19款机型可升级,有你的手机吗?...
  4. 【攻防世界 level2】
  5. 用MATLAB作微粉环节,电力系统分析理论课本习题MATLAB做.doc
  6. 这3个今日头条常见的赚钱方法,掌握后,月入过万都不难
  7. umi+dva dva全局的dispatch方法
  8. 企业微信HTTP协议调用,逆行开发,不受本地配置限制
  9. 了解原型设计工具:墨刀
  10. 手机投屏电视显示服务器连接失败,投屏失败怎么办?两种投屏到电视的方法教学...