很多人以为github上的Facenet项目就是Facenet论文的复现,但是他们有区别,本文解读github上的开源Facenet项目https://github.com/davidsandberg/facenet,包括源码以及算法。

网络结构

首先Facenet项目和Facenet论文有区别,Facenet项目源码中,特征提取网络有三个选择,分别是Inception-resnet v1,Inception-resnet v2,以及squeezenet,这三种网络都不是Facenet原论文中测试用的网络结构,但是性能更好。其种Inception-resnet v1提取的是512维人脸特征,而Facenet原文中说的是经过多次比较发现128维的人脸特征最好,用的是128维人脸特征,这点也不相同。

损失函数

而在损失函数方面有两个损失函数可供选择,分别是Facenet原文中提出的Triplet loss(三元损失),以及center loss + softmax loss。项目将center loss+softmax loss称为softmax,个人觉得这种叫法不准确,在github的issues上面也有人提到这个问题,而center loss+softmax loss这种损失函数是在ECCV2016上发表的一篇文章提出的:“A Discriminative Feature Learning Approach for Deep Face Recognition”。也就是说Facenet这个项目复现了两篇文章,只是项目的名字叫做Facenet。Facenet项目中用的三种网络结构都与两篇文章中用的不同,但是没有什么关系,因为这两篇文章的主要贡献都是在于损失函数,只要把损失函数实现了就相当于把论文复现了。

这个项目中,三个不同的网络和两个不同的损失函数一共可以组成6种模型。项目还提供了两个预训练的模型,两个训练好的模型都是用的inception-renet v1网络结构结合center loss+softmax loss损失函数来实现的,可以说预训练的Facenet模型是和Facenet论文没有任何关系的,所以想要尝试Facenet方法的同学得自己去训练模型了。

模型保存和加载

源码中训练时用的tf.train.Saver()来保存整个模型的参数和网络结构,在调用模型时使用tf.train.import_meta_graph()加载。

数据加载

数据加载是一个重要的环节,代码中通过队列来建立输入。data_flow_ops.py是tf中的一个文件,这里直接放在了代码文件夹中。

# 输入队列的参数配置
   input_queue = data_flow_ops.FIFOQueue(capacity=2000000,  ##容量
                                    dtypes=[tf.string, tf.int32, tf.int32],  ##元素类型
                                    shapes=[(1,), (1,), (1,)],  ##元素尺寸
                                    shared_name=None, name=None) 
# 根据输入队列的配置来建立输入
enqueue_op = input_queue.enqueue_many([image_paths_placeholder, labels_placeholder, control_placeholder], name='enqueue_op')
# 通过图像路径经过处理得到输入
image_batch, label_batch = facenet.create_input_pipeline(input_queue, image_size, nrof_preprocess_threads, batch_size_placeholder) #读取图片

代码详解

facenet_train.py代码注释https://blog.csdn.net/LIYUAN123ZHOUHUI/article/details/71427799

未完待续~

目前准确度最高的开源人脸识别算法Insight Face

Facenet推出到现在已经好几年了,现在效果最好的开源人脸识别算法是ArcFace(github开源项目叫InsightFace),
人脸识别之insightface开源代码使用——自定义数据集制作
https://zhuanlan.zhihu.com/p/92738758?from_voters_page=true
也有用Insight FaceAace训练的mobilefacenet,识别速度非常快,可以用于移动端部署,可以参见这篇文章

目前最快的开源人脸检测算法BlazeFace

MTCNN人脸检测算法推出到现在也已经好些年了,也算是有点老了,现在最新的最快的人脸检测算法是BlazeFace
https://zhuanlan.zhihu.com/p/73741766

参考博客

稍微修改后的Facenet项目
https://panjinquan.blog.csdn.net/article/details/84896733
facenet 源码解析
https://zhuanlan.zhihu.com/p/38341541
FaceNet源码使用方法及其迁移学习训练自己数据集的代码修改
https://blog.csdn.net/loveliuzz/article/details/81744985?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
FaceNet源码解读
https://blog.csdn.net/u013044310/article/details/79556099
https://blog.csdn.net/u013044310/article/details/80481642
facenet tensorflow code源码解析
https://blog.csdn.net/lq126126/article/details/80776709?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
Facenet 的 TensorFlow 实现
https://blog.csdn.net/FortiLZ/article/details/81660669?utm_source=blogxgwz9
https://blog.csdn.net/FortiLZ/article/details/81660669?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
人脸检测MTCNN和人脸识别Facenet(附源码)
https://www.bbsmax.com/A/6pdDg6DD5w/
FaceNet原理和TensorFlow实现
https://blog.csdn.net/zshluckydogs/article/details/86099193?depth_1-utm_source=distribute.pc_relevant_right.none-task&utm_source=distribute.pc_relevant_right.none-task
ROC曲线及facenet中的使用
https://blog.csdn.net/LIYUAN123ZHOUHUI/article/details/72673654
运用MTCNN和Facenet模型实现人脸识别和检测
https://blog.csdn.net/weixin_42094589/article/details/86315388?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐