FaceNet源码解读2:史上最全的FaceNet源码使用方法和讲解(二)

article/2025/8/27 21:41:59

史上最全的FaceNet源码使用方法和讲解(二)

这是对:史上最全的FaceNet源码使用方法和讲解(一)(附预训练模型下载)的一个补充。

一、对模型进行测试:

用到的函数:validate_on_lfw.py
在pycharm中配置的参数如下:

数据集所在路径 模型所在路径 

示例:

20170512-110547 1.png 2.png

这将执行以下四个操作:
a)加载模型。
b)加载和解析文本文件与图像对。
c)计算所有图像(以及它们的水平翻转版本)在测试集中的向量。
d)计算精度,验证率(@ FAR = -10e-3),曲线下面积(AUC)和等误差率(EER)等性能指标。

典型的输出如下:

Model directory: /home/david/models/20180402-114759/
Metagraph file: model-20180402-114759.meta
Checkpoint file: model-20180402-114759.ckpt-275
Runnning forward pass on LFW images
........................
Accuracy: 0.99650+-0.00252
Validation rate: 0.98367+-0.00948 @ FAR=0.00100
Area Under Curve (AUC): 1.000
Equal Error Rate (EER): 0.004

二、对预训练模型重新进行训练

有时候,我们需要用自己的数据集对预训练好的模型进行重新训练,或者之前训练了一个模型之后,觉得训练轮数不够,又不想从头开始训练,这样,在训练之前就要把之前训练的模型重新加载进去,方式如下:
######第一步:添加预训练模型的参数:
在中train_tripletloss.py找到这样一个语句:
这里写图片描述
改成这样:

 parser.add_argument('--pretrained_model', type=str,help='Load a pretrained model before training starts.',default='模型所在路径')
第二步:解决程序中的一个小bug

如果只是完成了第一步,运行程序会报错。经过调试,是因为程序有一个小的bug需要修复:
找到这一行程序:
这里写图片描述
可以看出,这一处函数的作用是:如果预训练模型这个参数非空,那么用tensorflow的saver.restore()函数重新加载模型参数,但是此处会报错,

那么我们模仿compare.py函数中的加载模型方法,将这个函数改为:

facenet.load_model(args.pretrained_model)

然后运行程序,发现程序已经可以正常执行了。

如果不放心,可以取一个已经训练好的模型,加载之后训练一轮,会发现初始的损失函数非常小,同时,训练一轮之后模型的准确率已经和加载的预训练模型准确率差不多了,说明模型加载成功。

三、用自己的数据集结合SVM训练一个人脸识别系统

可能希望自动对您的私人照片集进行分类。或者您有一个安全摄像头,您想要自动识别您的家庭成员。那么您可能希望在自己的数据集上训练分类器。在这种情况下,classifier.py程序也可以用于此。

1)构建自己的数据集。 在该示例中,每个类的5个第一图像用于训练,接下来的5个图像用于测试。
比如说,你有9个需要分类的人(这里暂时用F1-F9表示),其中你有每个人各20张照片

使用的类是:

F1
F2
F3
F4
F5
F6
F7
F8
F9

训练集的目录组织方式:

my_dataset/test
├── F1
│ ├── F1_0.png
│ ├── F1_1.png
│ ├── F1_2.png
│ ├── F1_3.png
│ ├── F1_3.png
…… ……
│ └── F1_19.png
├── F2
│ ├── F2_0.png
│ ├── F2_1.png
│ ├── F2_2.png
│ ├── F2_3.png
│ ├── F2_3.png
│ …… ……
│ └── F2_19.png
├── F3
│ ├── F3_0.png
│ ├── F3_1.png
…… …… ……


测试集的目录组织方式类似。

2)训练。 用到的代码:calssifier.py。这一步是在你已经训练好了一个FaceNet模型(或者使用网上提供的模型),需要用这个模型计算出的自己照片的特征向量来训练一个SVM分类器的场景,这个程序的基本原理是:通过用图像算出来的向量数据来训练一个SVM分类器,从而对人的身份进行一个判断,同时在.pkl格式的文件中存储每一个分类。这也是作者对于FaceNet程序应用的一个探索。
这个函数有两个模式,一个模式用来训练,另一个模式用来测试。具体功能如下:

  • 模式= TRAIN:

    • 使用训练好的模型计算图片的向量,用来训练SVM分类器
    • 将训练好的分类模型保存为python pickle文件
  • 模式= CLASSIFY:

    • 加载SVM分类器模型
    • 使用来自数据集测试部分的向量来测试分类器

执行本代码需要添加的参数以及各参数的含义:

  • mode: 设定“TRAIN”和“CLASSIFY”两种模式。
  • data_dir: 图片数据所在文件夹
  • model: 训练好的模型
  • classifier_filename:类似于标签,如果mode参数是TRAIN,那么需要指定一个输出的文件位置(以.pkl结尾,例如**/**.pkl),如果mode参数是CLASSIFY,那么就需要指定参数的路径(.pkl文件)。

配置参数示例:

TRAIN 图片数据所在文件夹 模型文件夹 标签文件.pkl 

运行结果:

Number of classes: 9
Number of images: 180
Loading feature extraction model
Model directory: 20180606
Metagraph file: model-20180606-232113.meta
Checkpoint file: model-20180606-232113.ckpt-120120
Calculating features for images
Training classifier
Saved classifier model to file "E:/facenet/pick/classifier.pkl"

测试:

CLASSIFY 图片数据所在文件夹 模型文件夹 标签文件保存地址.pkl 

运行结果:

Number of classes: 9
Number of images: 20
Loading feature extraction model
Model directory: 20180606
Metagraph file: model-20180606-232113.meta
Checkpoint file: model-20180606-232113.ckpt-120120
Calculating features for images
Testing classifier
Loaded classifier model from file "E:/facenet/pick/classifier.pkl"0  F1: 0.4711  F1: 0.6722  F1: 0.6853  F1: 0.7004  F3: 0.6335  F1: 0.5566  F1: 0.5557  F1: 0.6968  F2: 0.8279  F2: 0.775……  ……

如果不需要在每次执行的过程中都配置这几个参数,可以对程序进行微调,找到原程序中的这几行代码:
这里写图片描述
改动如下(即将初始值配置在程序中,避免每次执行程序时都要输入对应的参数。如果参数有改动,只需要更改程序对应部位即可。):

parser.add_argument('--mode', type=str, choices=['TRAIN', 'CLASSIFY'],help='Indicates if a new classifier should be trained or a classification ' + 'model should be used for classification', default='CLASSIFY')#这里更改模式
parser.add_argument('--data_dir', type=str,help='Path to the data directory containing aligned LFW face patches.',default='TF1_classify')#添加自己的数据文件夹
parser.add_argument('--model', type=str,help='Could be either a directory containing the meta_file and ckpt_file or a model protobuf (.pb) file',default='20180606')#预训练模型
parser.add_argument('--classifier_filename',help='Classifier model file name as a pickle (.pkl) file. ' + 'For training this is the output and for classification this is an input.',default='pick/classifier.pkl')#.pkl文件存储的位置

附录:程序中的一些小改进:

一)用GPU训练模型。

原程序默认使用CPU训练,但是这样训练的速度太慢,如果你电脑恰好有一块不错的GPU,或者实验室里有GPU服务器,那么配置好GPU环境之后(包括cuda,TensorFlow-gpu等),可以在程序中添加代码如下:

import OS
os.environ["CUDA_VISIBLE_DEVICES"] = '0'#如果有多块显卡,可以指定第几块显卡,0即为第一块显卡。

这样,程序在执行过程中就优先调用GPU训练模型了。

二)微调损失函数

在《In Defense of the Triplet Loss for Person Re-Identification》这篇论文中提到:损失函数中去掉平方后效果还会更好一些,如下图:
这里写图片描述

如果有需要的话,可以改成开方的形式,在facenet.py下的triplet_loss函数中,找到如下两句代码:
这里写图片描述
改成:

pos_dist = tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(anchor, positive)), 1))  # tf.square:平方。tf.subtract::减法
neg_dist = tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(anchor, negative)), 1))

即加上一个开方运算。(目前正在测试效果,以后补充……)

个人知乎主页地址:知乎个人主页。欢迎关注。

附:

找到一个非常好的人脸识别领域的汇总博客,把链接贴在这里:格灵深瞳:人脸识别最新进展以及工业级大规模人脸识别实践探讨 | 公开课笔记


http://chatgpt.dhexx.cn/article/3G5svIxt.shtml

相关文章

【人脸识别】基于facenet_pytorch实现人脸识别

该代码可以在Pycharm、Jupyter、Python等Python编译器中运行,本文我使用的是Pycharm。 一、安装 (一)安装pytorch(cpu) 首先在Pycharm中新建一个名为facenet_test的项目,并创建一个名为fp.py的Python文件…

人脸识别基础(FaceNet)

文章目录 Face verification VS Face recoginitionEncoderTriplet Loss 主要思路参考: FaceNet论文:FaceNet: A Unified Embedding for Face Recognition and Clustering吴恩达视频Keras 大佬 Face verification VS Face recoginition 对于人脸验证,我…

使用pyTorch搭建自己的facenet

很长时间没有发自己学习过程的博客了,这次发的是初次使用pyTorch搭建自己的facenet。 参考博主博客:https://blog.csdn.net/weixin_44791964/article/details/108220265 源代码地址:https://github.com/bubbliiiing/facenet-pytorch 本次使…

人脸识别系列(十八):MobileFaceNets

原文链接:MobileFaceNets: Efficient CNNs for Accurate Real-time Face Verification on Mobile Devices MobileNet 可分离卷积(Depthwise separable conv): 可分离卷积可以减少参数量与计算量: 例如输入是100*100…

聪明的人脸识别2——Keras 利用Retinaface+Facenet搭建人脸识别平台

聪明的人脸识别2——Keras 利用RetinafaceFacenet搭建人脸识别平台 学习前言什么是Retinface和Facenet1、Retinface2、Facenet 整体实现代码实现流程一、数据库的初始化二、检测图片的处理1、人脸的截取与对齐2、利用Facenet对矫正后的人脸进行编码3、将实时图片中的人脸特征与…

人脸识别之facenet代码实现

上一篇博文介绍了facenet的原理,这篇讲解一下代码的实现,对于facenet的代码目前也有写好的部分。具体见链接facenet代码实现 。大家可以通过git直接下载代码,然后运行里面的validata_on_lfw.py。输入对应的lfw数据的路径就可以检测模型对lfw数…

聪明的人脸识别1——Keras 搭建自己的Facenet人脸识别平台

聪明的人脸识别1——Keras 搭建自己的Facenet人脸识别平台 学习前言什么是Facenet源码下载Facenet的实现思路一、预测部分1、主干网络介绍2、根据初步特征获得长度为128的特征向量3、l2标准化4、构建分类器(用于辅助Triplet Loss的收敛) 二、训练部分1、…

人脸识别系列(六):FaceNet

原文链接:FaceNet:A Unified Embedding for Face Recognition and Clustering 首先可以看一下最终的效果,数字表示两张图片经过Facenet提取的特征之间的欧式距离,可以直接表示两张图片的差异: 从图中可以看出,若取阈值…

人脸识别(Facenet)

人脸识别是目前应用非常广泛的一种生物识别技术,与其他生物识别技术(指纹识别,掌形识别,眼虹膜识别和声音识别)相比,人脸识别具有以下优势: 其他每种生物识别方法都需要一些人的配合动作&#x…

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

目录 一、 简介 二、Swin Transformer作为Backbone 1.Swin Transformer整体结构 2.PatchEmbed Patch Partition Linear Embedding 3.Swin Transformer Block (1)Window Partition (2)Shifted Window based Self-Attenti…

深度学习之facenet人脸识别网络介绍

1.前言 照例先来一段废话,不要跟我说什么物质决定意识,也不要告诉我意识超越物质。在我眼中,这个世界本就是一个战场。软弱的意志自然无法战胜物质,但是足够强大的意识也是能够做到的。在战争没有进行完之前,谁也不知道…

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

睿智的目标检测51——Pytorch 利用RetinafaceFacenet搭建人脸识别平台 学习前言什么是Retinface和Facenet1、Retinface2、Facenet 整体实现代码实现流程一、数据库的初始化二、检测图片的处理1、人脸的截取与对齐2、利用Facenet对矫正后的人脸进行编码3、将实时图片中的人脸特征…

Facenet 原理介绍

引子[编辑 | 编辑源代码] 这篇wiki主要介绍facenet人脸相似比较的基本原理,另外两篇wiki主要介绍基于tensorflow实现facenet的准确率测试及源码解读。经过在网上的一番搜索,找到了facenet实现人脸聚类的论文和论文解读,以及github上根据facen…

【 facenet-retinaface】快速复现 实现 facenet-retinaface-pytorch 人脸识别 windows上 使用cpu实现

目录 0 前言1 搭建环境与项目2 人脸预测与结果展示 0 前言 这一次要复现的是人脸识别中的 facenet-retinaface-pytorch 是在上一次博客的内容上更进一步 快速复现 实现 facenet-pytorch 人脸识别 windows上 使用cpu实现 人脸对比 参考了: Pytorch 利用Facenet和Re…

FaceNet

摘要: 尽管人脸识别领域最近取得了重大进展[10,14,15,17],但大规模有效地实施人脸验证和识别对当前方法提出了严峻挑战。在本文中,我们提出了一个称为 FaceNet 的系统,它直接学习从人脸图像到紧凑欧几里得空间的映射,其…

【facenet】快速复现 实现 facenet-pytorch 人脸识别 windows上 使用cpu实现 人脸对比

目录 0 前言1 搭建环境与项目2 人脸预测与结果展示 0 前言 这一次要复现的是人脸识别中的 facenet-pytorch 参考了: Pytorch 搭建自己的Facenet人脸识别网络(Bubbliiiing 深度学习 教程) https://gitee.com/xiaozhao123666/facenet-pytorch …

利用MTCNN和facenet实现人脸检测和人脸识别

利用MTCNN和facenet实现人脸检测和人脸识别 人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了。本博客将利用mtcnn和faceNet搭建一个实现人脸检测和人脸识别的系统。基本思路也很简单,先利用mtcnn的进行人脸检测,当然也可以使用其他的人脸…

facenet 总结一

Facenet是谷歌研发的人脸识别系统,该系统是基于百万级人脸数据训练的深度卷积神经网络,可以将人脸图像embedding(映射)成128维度的特征向量。以该向量为特征,采用knn或者svm等机器学习方法实现人脸识别。 CASIA-WebFac…

【人脸识别】FaceNet详解

论文题目:《FaceNet: A Unified Embedding for Face Recognition and Clustering》 论文地址:FaceNet 1、概述 FaceNet(A Unified Embedding for Face Recognition and Clustering)直接把输入图像变成欧式空间中的特征向量&#…

人脸识别系统FaceNet原理

1. 概述 近年来,随着深度学习在CV领域的广泛应用,人脸识别领域也得到了巨大的发展。在深度学习中,通过多层网络的连接,能够学习到图像的特征表示,那么两张人脸的图像,是不是可以通过深度学习判别其是否是相…