源码链接:https://github.com/davidsandberg/facenet
论文链接:https://arxiv.org/pdf/1503.03832.pdf
B站大神视频解读论文:https://www.bilibili.com/video/av17281188
FaceNet是一个用于人脸识别的网络。关于人脸,往往分为2个任务:
1.人脸检测(在图中找到人脸,找特征,矫正)
2.人脸识别(看看这是谁)
在本系列的随笔里,人脸检测使用MTCNN,人脸识别采用FaceNet。下面就谈谈FaceNet.
FaceNet的3个任务
- 人脸判断(是不是这个人,是?不是)
- 人脸识别(这人是谁?)
- 人脸聚类(和这张脸相似的脸有哪些?)
FaceNet的大致流程
(经提取的,无需矫正)待判断人脸 -> FaceNet网络 -> embedding(脸的特征向量)
--- 任务1 ---> 和已知人脸的特征向量求L2距离 -> 距离小于阈值就是同一张脸。
--- 任务2 ---> KNN最近邻分类,求是谁的脸(最近邻检索,参考其他随笔)。
--- 任务3 ---> K-means聚类,求相似的脸集合。
FaceNet的技术
上面可以看出,最核心的,应该就是FaceNet网络怎么设计了。3个任务,都是在网络输出的 有代表性的 脸特征embedding 的基础上,使用传统的一些技术实现的。
FaceNet的技术之一:
- 三元组 triplets
所谓的 triplets,可见我的随笔“04-人脸识别-triplets loss 的解释(转载)”
http://www.cnblogs.com/alexYuin/p/8855972.html
在使用中,一个训练数据样本由3张图组成:
(anchor-要判定的脸,positive-和anchor一类的脸,negative-和anchor不同类的脸)
这就是一个 triplet 。
FaceNet的技术之二:
- Triplets Loss 损失函数
可见我的随笔“04-人脸识别-triplets loss 的解释(转载)”
http://www.cnblogs.com/alexYuin/p/8855972.html
这里,triplet 中的核心,是anchor。
04-随笔中,L函数=0的意义,就是 anchor 到 positive 的距离+alpha <= anchor 到 negative 的距离。这就我们想要的结果。也就是优化的方向。
FaceNet的网络可以是什么样的
FaceNet的训练过程