历史上最完整的FaceNet源代码的使用方法和说明(二)这是对历史上最完整的FaceNet源代码的使用方法和说明(一)的预训练模型下载)的补充。
一.测试模型:使用的函数: validate_on_lfw.py
由pycharm构成的参数如下。
数据集所在的路径模型所在的路径示例:
20170512-110547 1.png 2.png它执行以下四个操作:
a )加载模型。
b )加载并分析文本文件和图像对。
c )计算测试集中所有图像(及其水平翻转版本)的向量。
d )计算精度、验证率(@ FAR=-10e-3 )、曲线下面积(AUC )和等误差率(EER )等性能指标。
典型的输出如下所示
模型目录:/home/David/models/2018 04 02-114759/metagraphfile :模型- 2018 04 02-114759.metacheckpointion . accuracy :99650-0.00252 validation rate :98367-0.00948 @ far=0.00100 areaundercurve (AUC ) :000 equalerrrrre 重新训练预训练模型时,我们需要使用自己的数据集重新训练预训练模型。 或者,以前训练过模型后,感觉训练回合数不够,又不想从头开始训练。 这样,在训练前重新加载以前训练过的模型的方法如下。
######第一步:添加预训练模型参数:
在中train_tripletloss.py中找到以下语句:
这样更改。
parser.add _ argument ('-- pre trained _ model ',type=str,help=' loadapretrainedmodelbeforetrainingstarts.',LP )
找到了这个程序:
此函数的作用是如果预训练模型参数不为空,则在tensorflow的saver.restore ()函数中重新加载模型参数,但会报告错误
模仿compare.py函数加载模型的方式,将此函数修改如下:
face net.load _ model (args.pre trained _ model ) )然后运行程序时,发现程序可以正常运行。
如果不放心的话,可以采取已经训练过的模型。 加载后训练一次,可以发现初始损失函数非常小。 此外,训练一次后模型的精度与加载的预训练模型的精度基本相同,表明模型加载成功。
三.结合自己的数据集和SVM训练人脸识别系统时,可能想自动分类自己的私人照片集。 或者有自动识别家人的安全摄像头。 那么,你可能想用自己的数据集训练分类器。 在这种情况下,也可以使用classifier.py程序。
1)构建自己的数据集。在本例中,每个类的五个第一个图像用于训练,以下五个图像用于测试。
例如,你有9个应该分类的人。 (这里暂时用F1-F9表示。 )其中各有20张照片
使用的类如下所示。
F1
F2
F3
F4
F5
F6
F7
F8
F9
如何组织培训集目录:
my_dataset/test
f 1
() ) 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: 9Number of images: 180Loading feature extraction modelModel directory: 20180606Metagraph file: model-20180606-232113.metaCheckpoint file: model-20180606-232113.ckpt-120120Calculating features for imagesTraining classifierSaved classifier model to file "E:/facenet/pick/classifier.pkl"测试:
CLASSIFY 图片数据所在文件夹 模型文件夹 标签文件保存地址.pkl运行结果:
Number of classes: 9Number of images: 20Loading feature extraction modelModel directory: 20180606Metagraph file: model-20180606-232113.metaCheckpoint file: model-20180606-232113.ckpt-120120Calculating features for imagesTesting classifierLoaded classifier model from file "E:/facenet/pick/classifier.pkl" 0 F1: 0.471 1 F1: 0.672 2 F1: 0.685 3 F1: 0.700 4 F3: 0.633 5 F1: 0.556 6 F1: 0.555 7 F1: 0.696 8 F2: 0.827 9 F2: 0.775 …… ……如果不需要在每次执行的过程中都配置这几个参数,可以对程序进行微调,找到原程序中的这几行代码:
改动如下(即将初始值配置在程序中,避免每次执行程序时都要输入对应的参数。如果参数有改动,只需要更改程序对应部位即可。):
原程序默认使用CPU训练,但是这样训练的速度太慢,如果你电脑恰好有一块不错的GPU,或者实验室里有GPU服务器,那么配置好GPU环境之后(包括cuda,TensorFlow-gpu等),可以在程序中添加代码如下:
import OSos.environ["CUDA_VISIBLE_DEVICES"] = '0'#如果有多块显卡,可以指定第几块显卡,0即为第一块显卡。这样,程序在执行过程中就优先调用GPU训练模型了。
二)微调损失函数在《In Defense of the Triplet Loss for Person Re-Identification》这篇论文中提到:损失函数中去掉平方后效果还会更好一些,如下图:
如果有需要的话,可以改成开方的形式,在facenet.py下的triplet_loss函数中,找到如下两句代码:
改成:
即加上一个开方运算。(目前正在测试效果,以后补充……)
个人知乎主页地址:知乎个人主页。欢迎关注。
附:找到一个非常好的人脸识别领域的汇总博客,把链接贴在这里:格灵深瞳:人脸识别最新进展以及工业级大规模人脸识别实践探讨 | 公开课笔记