facenet学习+练习
0. 摘要
摘要都是都是写给我自己看的废话.
在我接触CNN之前,我一直觉得它是一个晦涩难懂的数学应用.所以刚开始都是抱着敬畏的心里去学习.当我花了段时间看了些后,发现与其称之为科学不如称其为数学技术的应用.各种网络的结构譬如rcnn/yolo/ssd等,只要你找对了文章(要找对了,写的人太多了,不免有些滥竽充数)理解起来是很方便的.直白的讲就是要你造一个轮子来实现某个功能,大家自由发挥.看对的文章,你会发现原理很简单.具体应用的时候可能需要结合一些数学公式.
当然我只是感兴趣拿来玩玩,跑跑,仅限于这个层面.
学习一项知识的时候需要有好奇心和自信心.
在我接触过rcnn/ssd/yolo后,我的心态变了,不在觉得他是多么的高深复杂,遥不可及.当我接触facenet的时候,我的惯性思维又先入为主以为它也是个非常难的,毕竟"不同人脸的特征差异"要远比"不同物体的特征差异"小.但是当我看过facenet的论文后,我又释然了.
谨以此文记录一下facenet的原理(以一个普通学习者的角度,我专业不是搞这个的,就是一时兴起).
1. 简介
facenet的原理很简单,比rcnn/yolo/ssd等都要简单.一言以蔽之:
"提取输入人脸图像的特征(所有的CNN网络都会做这个),通过L2 normalization映射到高维球面(特征维数多可不就是高维空间嘛,做了L2归一化(L2范数为1)后可不就是球面嘛,这些都不用关心啦,我又不是搞研究的),每张人脸图像都对应一个高维球面的特征向量(我们称它为特征向量).判断两张人脸是否是同一个人,可以根据两个特征向量之间的欧式距离(欧式距离这个上过大学的都知道吧,或者上过中学的计算三维空间中两点的距离,坐标相减,然后平方,求和,再开根号)进行判断.欧式距离小于给定的阀值(阀值如何确定:可以在评估模型的时候获取,这个原文里面有讲,我们下面还会再说)则断定为是这两张人脸图片是同一个人的,如果不同那么就不是同一个人的"
好了现在可以去看一下原文了,英语不好的话先去看一下翻译,翻译里有讲的不明白的再去看原文,还不明白的可能就是我下面讲的这几点,再不明白我也就不明白了.
论文翻译文:FaceNet
论文原文:FaceNet: A Unified Embedding for Face Recognition and Clustering
源码: davidsandberg / facenet
2. 一些可能花个几分钟才能搞明白的点
看了一遍文章感觉还是有几个点需要再推敲下,就把他们记录在这吧.
(1) 首先,我们先来了解下数据集:
以LFW(Labled Faces in the Wild)人脸数据集为例,它包含了13000多张人脸图片,每张图片上都标注了名字,不同人的图片数量不一样,有1680人有不止一张人脸图片(多的像George_HW_Bush有500张,大部分人只有一张).我们可以通过以下链接来下载改数据集,在左边栏选download(这里有好几个数据集,我就用了第一个,其他的带align的应该是做了人脸对齐,这样检测的时候就不用MTCNN网络了吧,猜测,还没试过,待验证)
Labeled Faces in the Wild Home
(2) Loss函数:
我们的目标是使"同一人的一对人脸图片的特征向量欧式距离"尽量小,"不同人的一对人脸图片的特征向量欧式距离"尽可能大.从而诞生了论文中的triplet loss
三元组分别是输入的人脸anchor,正例人脸positive(与anchor是同一人),负例人脸negative.每个minibatch中负例是远远多余正例的,因此需要选出hard positive正例和hard negative负例.实际上作者使用了一个minibatch中的所有正例,挑选了同正例数量一致的hard negative负例(这样提高网络的识别能力,特别是针对那些非常像但又不是同一人的人脸).
(3) 模型评估:
这部分建议看一下英文原文
介绍下val和far:
这里先介绍下val和far两个概念,validation rate(准确率,也即true positive(或者true accpet),是一个人切判断正确的比率),fail accept rate(也即我们的false positive(或者false accpet),就是错误判断为正例的比率,本来是负例给人家判断成正例了,本来不是一个人的被判断成一个人)
这个看公式和解释都能明白,但是不是一眼就看明白的,我再解释下.
val = (TA的数量) / (同一人脸的图片对的数量) far = (FA的数量) / (不同人脸图片对的数量)
介绍下欧式距离的threshold:
threshold是一个常量,两张人脸的欧式距离大于threshold则断定是不同的人,小于此值则断定是同一人.threshold是我们识别人脸的最重要的判据
文中规定了far为一个极小值(看源码lfw.py的evaluate函数中调用facenet.calculate_val时指定的是1e-3,源码里把它叫做far_target),目的是降低误判率,根据这个值我们就能得到欧式距离的threshold.两张人脸的欧式距离大于此值则是不同的人,小于此值则是同一人.
那么我们的threshold是如何得到的呢:
模型在评估的时候将threshold按照0.01的间距从0取到4,对每个threshold计算一下val,far评估标准数据(根据val,far可以画出roc曲线图,不明白roc是啥去看机器学习基础(1)- ROC曲线理解).总有一个far刚好接近我们设定的far_target,对应的就是我们想要的那个threshold.
为了保证验证的准确性,这里进行了10折交叉验证(就是把样本集均分成10份,9份做训练集,1份做验证集;这样可以训练和验证10次),我们可以得到10组数据.
threshold也可以得到10组数据,这里我取了平均,当然也可以选其他值,譬如想要保证正确性,那就选一个最小的threshold;或者你也可以选择众数...
哦对了,这个threshold源码里默认没有打印出来,需要自己在facenet.py的calculate_val函数中添加打印.
3. 如何进行人脸识别
有了threshold就好办了,我们可以这样设计下.考虑一个场景,譬如你家的智能门禁,需要先把你家三口人ABC的人脸信息录入数据库,包括label(名字)和特征向量;然后有人来的时候计算一下他的人脸特征向量和数据库中的三人的特征向量欧氏距离xyz,找出最小的那个欧式距离,譬如是y,如果y小于threshold,那么这个人就是B;如果y大于threshold那么就是陌生人喽.
开搞,这里仿照compare.py写了个python脚本.
中间有些问题,我用的python3.5,按照requirement.txt安装的包,结果提示我scipy.misc.imread和scipy.misc.imresize不能用,所以我用imageio模块来实现了图像的read和resize.
附我的github链接https://github.com/steveliu121/facenet
facenet学习+练习相关推荐
- 深度学习——Face Verificaton(人脸验证)与Face Recognition(人脸识别)在FaceNet的应用案例
一.综述 人脸识别领域主要有两个范畴:Face Verificaton(人脸验证)与Face Recognition(人脸识别) 1.Face Verificaton(人脸验证):1:1的匹配问题.如 ...
- 04.卷积神经网络 W4.特殊应用:人脸识别和神经风格转换(作业:快乐屋人脸识别+图片风格转换)
文章目录 作业1:快乐房子 - 人脸识别 0. 朴素人脸验证 1. 编码人脸图片 1.1 使用卷积网络编码 1.2 Triplet 损失 2. 加载训练过的模型 3. 使用模型 3.1 人脸验证 3. ...
- OpenFace学习(2):FaceNet+SVM匹配人脸
前言 在前面的博客中(OpenFace学习(1):安装配置及人脸比对),介绍了OpenFace的安装配置,以及一个人脸匹配的demo.其中只是匹配了几张图片中人脸,对每个人脸的特征向量很粗略地采用欧氏 ...
- FaceNet论文翻译学习3
原文链接:FaceNet: A Unified Embedding for Face Recognition and Clustering FaceNet 4. 数据集和评估(Datasets and ...
- 开发工业上位机 用pyqt5_用Pyqt5开发的基于MTCNN、FaceNet人脸考勤系统
import sys import cv2 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from ...
- 利用MTCNN和FaceNet实现人脸检测和人脸识别 | CSDN博文精选
作者 | pan_jinquan 来源 | CSDN博文精选 (*点击阅读原文,查看作者更多文章) 人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了.本博客将利用MTCNN和FaceNet ...
- CVPR 2020 Oral | 旷视研究院提出Circle Loss,革新深度特征学习范式
IEEE 国际计算机视觉与模式识别会议 CVPR 2020 (IEEE Conference on Computer Vision and Pattern Recognition) 将于 6 月 14 ...
- 2020年最具潜力44个顶级开源项目,涵盖11类 AI 学习框架、平台
转自 | AI开发者 工欲善其事必先利其器,这也是大部分开发者在日常工作中最重要开发原则.选择与开发内容相匹配的工具,常常会使我们事半功倍.但面对人工智能的多个领域,如:机器学习.深度学习.计算机视觉 ...
- 用OpenCV和深度学习进行年龄识别
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|机器学习算法那些事 在本教程中,您将学习如何使用OpenC ...
最新文章
- c++基础知识——算数运算符
- 在同一台服务器上启动多个 FreeSWITCH 实例
- boost::allocator_max_size的实例
- 是选择Keras还是PyTorch开始你的深度学习之旅呢?
- 网游服务端开发入门知识
- html2canvas在手机不行,html2canvas - 在iOS设备上崩溃
- 运行Python时中文注释报错的解决办法
- 快速突破面试算法之排序篇
- 记一个tcp udp测试工具ethrc
- 为Windows Live Writer写一个简单的插件
- Android11 亮度自动调节
- js:Cannot use import statement outside a module
- python网格交易法详解_期货交易技巧:等分网格交易法详解
- 每天自我提升的8个好习惯
- 插秧诗 - 退步原来是向前
- 超稳定的接口——淘宝/天猫获得淘宝商品详情
- 用C#编写一个图片浏览器,实现鼠标控制图片的平移缩放与图片的灰度化
- SVG - 在Android中使用矢量图全攻略
- ip地址位置提供商查询 cip.cc/ip
- 性能测试能力提升-基准、负载、压力、容量测试
热门文章
- python监控网页_python实时监控网页
- 如何进行企业文化建设?
- 试用74LS194加必要的门电路实现4位环形计数器(要求能自启动, 电路越简单越好). 要求它的有效循环状态Q0Q1Q2Q3为 1000-0100-0010-0001-1000
- 【BFS】C++羊和狼
- 常见的块级元素、行内元素、行内块元素
- 中小企业如何有效管理进销存?ERP系统有何作用?
- HTML5 DOM元素类名相关操作API classList简介(转载自张鑫旭大神)
- 网吧40台无盘服务器的配置,带80-120台的网咖无盘服务器配置 | 专业网吧维护
- 网页交互设计基本概念
- 三星电子拟在苹果后院安置特洛伊木马