源码:https://github.com/davidsandberg/facenet

本篇主要对facenet计算图构造部分和模型评估部分进行介绍
有关Triplet Loss及Triplet Selection请看FaceNet(一)—Triplet Loss

###inception_resnet_v1.py

以上为三个不同的网络模型,在此我们使用inception_resnet_v1,关于inception_resnet_v1的详细内容可参考https://blog.csdn.net/lovelyaiq/article/details/79026181

###train_tripletloss.py

#####构造计算图,prelogits为最后一层的输出

 # 导入模型,model_def的默认值为'models.inception_resnet_v1'network = importlib.import_module(args.model_def)#其中prelogits是最后一层的输出prelogits, _ = network.inference(image_batch, args.keep_probability, phase_train=phase_train_placeholder, bottleneck_layer_size=args.embedding_size,weight_decay=args.weight_decay)# 对最后的输出进行标准化,得到该图像的embedding# embeddings = tf.nn.l2_normalize(输入向量, L2范化的维数(取0(列L2范化)或1(行L2范化)), 泛化的最小值边界, name='embeddings')embeddings = tf.nn.l2_normalize(prelogits, 1, 1e-10, name='embeddings')# Split embeddings into anchor, positive and negative and calculate triplet loss# 将输出的embeddings分为anchor,正样本, 负样本三个部分anchor, positive, negative = tf.unstack(tf.reshape(embeddings, [-1,3,args.embedding_size]), 3, 1)#根据上面三个部分计算triplet-losstriplet_loss = facenet.triplet_loss(anchor, positive, negative, args.alpha)#定义优化方法,将指数衰减应用到学习率上 #tf.train.exponential_decay(learning_rate, global_, decay_steps, decay_rate, staircase=True/False)##如果staircase=True,那就表明每decay_steps次更新学习速率,如果是False,那就是每一步都更新学习速率。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 total losses# 加入正则化损失regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)# 整体的损失即为triplet-loss+正则损失total_loss = tf.add_n([triplet_loss] + regularization_losses, name='total_loss')# Build a Graph that trains the model with one batch of examples and updates the model parameters# 用上述定义的优化方法和loss进行优化train_op = facenet.train(total_loss, global_step, args.optimizer, learning_rate, args.moving_average_decay, tf.global_variables())

facenet评价指标

def calculate_accuracy(threshold, dist, actual_issame):predict_issame = np.less(dist, threshold)# tp统计predict_issame和actual_issame均为True的个数,即true posotive.A-P中预测对的tp = np.sum(np.logical_and(predict_issame, actual_issame))# false positive,将A-N预测为A-Pfp = np.sum(np.logical_and(predict_issame, np.logical_not(actual_issame)))# true negtive,A-N中预测对的tn = np.sum(np.logical_and(np.logical_not(predict_issame), np.logical_not(actual_issame)))# false negtive,将A-P预测为A-Nfn = np.sum(np.logical_and(np.logical_not(predict_issame), actual_issame))# ROC曲线,横轴为fpr,纵轴为tpr,曲线越接近左上角效果越好# 当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变# true positive rate  tp/p   A-P中预测对的tpr = 0 if (tp + fn == 0) else float(tp) / float(tp + fn)# false positive rate  fp/n  将A-N预测为A-Pfpr = 0 if (fp + tn == 0) else float(fp) / float(fp + tn)#acc = float(tp + tn) / dist.sizereturn tpr, fpr, acc
def calculate_val_far(threshold, dist, actual_issame):predict_issame = np.less(dist, threshold)# A-P对中预测对的tp = np.sum(np.logical_and(predict_issame, actual_issame))# 将A-N预测为A-Pfp = np.sum(np.logical_and(predict_issame, np.logical_not(actual_issame)))# A-P对总数n_same = np.sum(actual_issame)# A-N对总数n_diff = np.sum(np.logical_not(actual_issame))val = float(tp) / float(n_same)far = float(fp) / float(n_diff)return val, far

事实上,tpr=val,fpr=far
val和far存在的意义为:Find the threshold that gives FAR =far_target

def calculate_val(thresholds, embeddings, actual_issame, far_target):dist, nrof_thresholds = calculate_dist(thresholds, embeddings)# Find the threshold that gives FAR = far_targetfar_val = np.zeros(nrof_thresholds)for threshold_idx, threshold in enumerate(thresholds):_, far_val[threshold_idx] = calculate_val_far(threshold, dist, actual_issame)if np.max(far_val) >= far_target:# interp1d一维线性插值,它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值f = interpolate.interp1d(far_val, thresholds, kind='slinear')threshold = f(far_target)else:threshold = 0.0val, far = calculate_val_far(threshold, dist, actual_issame)return val, far , threshold

部分文件作用介绍:

一、基于mtcnn(处理人脸检测和人脸关键点定位问题)与facenet的人脸聚类

文件:facenet/contributed/cluster.py

文件:facenet/contributed/clustering.py实现了相似的功能,只是没有mtcnn进行检测

1.使用mtcnn进行人脸检测并对齐与裁剪

2.对裁剪的人脸使用facenet进行embedding

3.对embedding的特征向量使用欧式距离进行聚类

二、基于mtcnn与facenet的人脸识别(输入单张图片判断这人是谁)

文件:facenet/contributed/predict.py

1.使用mtcnn进行人脸检测并对齐与裁剪

2.对裁剪的人脸使用facenet进行embedding

3.执行predict.py进行人脸识别(需要训练好的svm模型)

三.Exports the embeddings and labels of a directory of images as numpy arrays

文件:facenet/contributed/export_embeddings.py

1.需要对数据进行对齐与裁剪做为输入数据

2.输出embeddings.npy;labels.npy;label_strings.npy

四.Performs face alignment and calculates distance between the embeddings of images

文件:facenet/src/compare.py

1.使用mtcnn进行人脸检测并对齐与裁剪

2.对裁剪的人脸使用facenet进行embedding

3.计算输入图片的距离

参考:http://blog.csdn.net/qq_36673141/article/details/78958582

【人脸识别】FaceNet(二)相关推荐

  1. 人脸检测MTCNN和人脸识别Facenet(附源码)

    原文链接:人脸检测MTCNN和人脸识别Facenet(附源码) 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第九节.人脸检测之Haa ...

  2. 手把手教人脸识别Facenet实现

    在实现人脸检测mtcnn和人脸识别facenet时,遇到很多坑,记录解决方法,给其他人一点启发. 一.人脸检测mtcnn和人脸识别facenet的具体介绍 参考博客https://www.cnblog ...

  3. 二自由度云台扫描算法_基于HuskyLens人脸识别的二自由度自动跟踪云台

    "看什么看?" "就盯着你看!" --基于HuskyLens人脸识别的二自由度自动跟踪云台 试用群里的老师们先后放出了各色利用二哈人脸识别功能的案例,实验对象从 ...

  4. IOS人脸识别和二维码识别

    人脸识别应用于许多领域.二维码的识别更是疯狂.下面,我们一起去看看简单的人脸识别和二维码识别. 1.测试数据的展示(人脸). 原图: 1.人脸的大小 // 人脸大小 CGRect FaceRect  ...

  5. 人脸识别(二)----如何生成CSV文件

    人脸识别(二)----如何生成CSV文件 当我们写人脸模型训练的时候,我们需要读取人脸的路径path和人脸对应的标签label.人脸的路径就是人脸图片所在你的电脑的位置,标签就是一个人对应一个标签(注 ...

  6. matlab人脸识别样本库建立,facenet 人脸识别(二)——创建人脸库搭建人脸识别系统...

    搭建人脸库 选择的方式是从百度下载明星照片 照片下载,downloadImageByBaidu.py # coding=utf-8 """ 爬取百度图片的高清原图 &qu ...

  7. (转)第三十七节、人脸检测MTCNN和人脸识别Facenet(附源码)

    http://www.cnblogs.com/zyly/p/9703614.html 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第 ...

  8. 应用层下的人脸识别(二):人脸库

    本文作者根据多年人脸识别项目经验,总结了人脸识别技术在安防.商业领域应用及产品设计细节,汇总成应用层下的人脸识别系列文章. 本文为系列文章的第二篇,介绍人脸库的相关内容.人脸库是人脸识别的基础,建立人 ...

  9. OpenCV3实现人脸识别(二)——收集要识别的人脸数据集

    前言 1.前面博文有演示过如何使用OpenCV自带的人脸与眼睛的级联分类器检测到图像中的人脸,这里将演示如何打开连接电脑的摄像头并检测人脸,然后拍照保存下来,用来做人脸识别的训练数据. 2.我的编程环 ...

  10. 人脸识别(二)——训练分类器

    上一篇简单整理了下人脸识别的相关基础知识,这一篇将着重介绍利用pencv(2.4.9)已有的模型进行分类器训练. 一.关于ORL人脸数据库 ORL是一个40个人,每人采取10张人脸头像构成的一个人脸数 ...

最新文章

  1. UI培训分享:导航栏UI设计规范及注意事项有哪些?
  2. 详解vue 路由跳转四种方式 (带参数)
  3. 项目: 写一个开头的界面 【c++ / c】
  4. DPOS共识算法—缺失的白皮书
  5. rabbitmq队列php应用,RabbitMQ工作队列应用
  6. 基于RadeonRays的光线追踪全局光照实现方案
  7. Apache Apollo REST API
  8. linux查看目录下文件个球,球服务翻译……只找到以前版本的。新版的服务名称改了……...
  9. 一步一步分析vue之_data属性
  10. 2019年春计算机应用基础随堂作业,华南理工2019年《计算机应用基础》随堂练习 doc...
  11. 有关UITableviewCell 重用内存 内部解析
  12. [LeetCode]题解(python):038-Count and Say
  13. 2018北航计算机考研复试经验
  14. bzoj 3730 震波 —— 动态点分治+树状数组
  15. 计算机基础--练习题
  16. 【转】U-Boot启动过程--详细版的完全分析
  17. java audioinputstream 读取音频文件_从原始文件中获取最多x个字节的AudioInputStream(剪切音频文件)...
  18. python运维工程师前景及待遇_运维工程师有前途么?
  19. Python100行-贪吃蛇小游戏
  20. 软件测试V、W和H模型的优缺点

热门文章

  1. 能提高十倍工作效率的windows桌面小工具
  2. (4)FPGA开发工具介绍(第1天)
  3. 利用winHex对文件进行修复
  4. 配音小程序源码,内置106个配音角色
  5. 企业邮箱哪个好?资深企业邮箱使用者分析
  6. 使用路由守卫来写登录效果
  7. nfc支持饭卡吗_苹果iPhone手机开启NFC功能方法教程
  8. GEE进行项目的学习应用
  9. 按键精灵实现qq群私发脚本Day1实战讲解
  10. MinIO按前缀批量下载文件到本地