首页 > 编程知识 正文

集合venn图的视频讲解,face serum使用方法

时间:2023-05-05 15:06:36 阅读:154801 作者:3205

历史上最完整的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 …… ……

如果不需要在每次执行的过程中都配置这几个参数,可以对程序进行微调,找到原程序中的这几行代码:

改动如下(即将初始值配置在程序中,避免每次执行程序时都要输入对应的参数。如果参数有改动,只需要更改程序对应部位即可。):

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 OSos.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))

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

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

附:

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。