FaceNet源码使⽤⽅法及其迁移学习训练⾃⼰数据集的代码修
改
关于修改train_softmax.py⽂件进⾏迁移学习
⽐如:⾃⼰的数据集要识别6个⼈,最后⼀个全连接层的节点个数为6。训练的数据集路径下改成⾃⼰的数据集。
代码修改及解释有如下⼏处:
经过上⾯的修改后即可在⾃⼰的数据集上进⾏迁移学习的训练,保存最终训练的模型,其他地⽅的参数可以⾃⾏调整优化。
FaceNet源码使⽤⽅法主要参照转载⾃:
前提条件:已安装并配置好Tensorflow的运⾏环境。
第⼀步:准备facenet程序:
⼀、下载FaceNet源码。
下载地址:
⼆、精简代码。作者在代码⾥实现了很多功能,但是对于初学者来说,很多代码是没有必要的,反倒不到学习这个程序的⼊⼝。建议先精简⼀下代码,便于读懂代码:新建⼀个⽂件夹,取名:facenet,把源码中的src⽂件夹直接拷贝过来。
注:便于⼤家能够看懂代码,以上两步我已经完成,同时,⾃⼰运⾏程序之后,还对⾥边的代码做了详细的注释,如果想先了解facenet的源码,强烈建议下载这个,下载地址:
第⼆步:下载预训练模型。
facenet提供了两个预训练模型,分别是基于CASIA-WebFace和MS-Celeb-1M⼈脸库训练的,不过需要去⾕歌⽹盘下载,这⾥给其中⼀个模型的百度⽹盘的链接:链接: 预训练模型百度⽹盘地址 密码: 12mh
下载完成后,把预训练模型的⽂件夹拷贝在刚才的⽂件夹⾥。⽤pycharm打开这个⼯程⽂件如图:
第三步:运⾏⼈脸⽐对程序(compare.py)。
facnet可以直接⽐对两个⼈脸经过它的⽹络映射之后的欧⽒距离。
-1、在compare.py所在⽬录下放⼊要⽐对的⽂件1.png和2.png。
-2、运⾏compare.py⽂件,但是会报错如下:
这是因为这个程序需要输⼊参数,在上⽅的⼯具栏⾥选择Run>EditConfigurations ,
在Parameters中配置参数:20170512-110547 1.png 2.png。再次运⾏程序
可以看到,程序会算出这两个图⽚的差值矩阵
第四步:图⽚预处理——运⾏⼈脸对齐程序(align\align_dataset_mtcnn.py)。
我们可以下载LFW数据集⽤来测试这个程序,也为后边的训练函数做好数据准备。
因为程序中神经⽹络使⽤的是⾕歌的“inception resnet v1”⽹络模型,这个模型的输⼊时160*160的图像,⽽我们下载的LFW数据集是250*250限像素的图像,所以需要进⾏图⽚的预处理。
在运⾏时需要输⼊的参数:
input_dir:输⼊图像的⽂件夹(E:\facenet\data\lfw E:\facenet\data\lfw)
output_dir:输出图像的⽂件夹(E:\facenet\data\lfw E:\facenet\data\lfw_160)
指定裁剪后图⽚的⼤⼩:--image_size 160 --margin 32 --random_order(如果不指定,默认的裁剪结果是182*182像素的)
⽐如我的是:E:\facenet\data\lfw E:\facenet\data\lfw_160 --image_size 160 --margin 32 --random_order
如果在pycharm中运⾏,按照同样的⽅法配置以上参数如下:
第五步:运⾏训练程序:(train_tripletloss.py)。
前边已经下载并处理好了LFW的数据集,现在,可以进⾏训练了。
运⾏之前,要在train_tripletloss.py中把加载数据的路径改成⾃⼰的数据集所在路径,如下图:
注:train_tripletloss.py和train_softmax.py的区别:这是作者对论⽂做出的⼀个延伸,除了使⽤facenet⾥提到的train_tripletloss三元组损失函数来训练,还实现了⽤softmax的训练⽅法来训练。当然,在样本量很⼩的情况下,⽤softmax训练会更容易收敛。但是,当训练集中包含⼤量的不同个体(超过10万)时,最后⼀层的softmax输出数量就会变得⾮常⼤,但是使⽤train_tripletloss的训练仍然可以正常⼯作。
最后,附上原来的⽂件中各py⽂件的作⽤(持续更新):
⼀、主要函数
align/ :⽤于⼈脸检测与⼈脸对齐的神经⽹络pycharm安装教程和使用
facenet :⽤于⼈脸映射的神经⽹络
util/plot_learning_curves.m:这是⽤来在训练softmax模型的时候⽤matlab显⽰训练过程的程序
⼆、facenet/contributed/相关函数:
1、基于mtcnn与facenet的⼈脸聚类
代码:facenet/contributed/cluster.py(facenet/contributed/clustering.py实现了相似的功能,只是没有mtcnn进⾏检测这⼀步)
主要功能:
① 使⽤mtcnn进⾏⼈脸检测并对齐与裁剪
② 对裁剪的⼈脸使⽤facenet进⾏em bedding
③ 对embedding的特征向量使⽤欧式距离进⾏聚类
2、基于mtcnn与facenet的⼈脸识别(输⼊单张图⽚判断这⼈是谁)
代码:facenet/contributed/predict.py
主要功能:
① 使⽤mtcnn进⾏⼈脸检测并对齐与裁剪
② 对裁剪的⼈脸使⽤facenet进⾏em bedding
③ 执⾏predict.py进⾏⼈脸识别(需要训练好的svm模型)
3、以numpy数组的形式输出⼈脸聚类和图像标签
代码:facenet/contributed/export_embeddings.py
主要功能:
① 需要对数据进⾏对齐与裁剪做为输⼊数据
② 输出embeddings.npy;labels.npy;label_strings.npy
补充:
⼀、对模型进⾏测试:
⽤到的函数: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: a
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
⼆、对预训练模型重新进⾏训练
有时候,我们需要⽤⾃⼰的数据集对预训练好的模型进⾏重新训练,或者之前训练了⼀个模型之后,觉得训练轮数不够,⼜不想从头开始训练,这样,在训练之前就要把之前训练的模型重新加载进去,⽅式如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论