Coder Social home page Coder Social logo

lesliezhoa / tensorflow-facenet Goto Github PK

View Code? Open in Web Editor NEW
148.0 7.0 52.0 17.34 MB

人脸识别算法,结合facenet网络结构和center loss作为损失,基于tensorflow框架,含训练和测试代码,支持从头训练和摄像头测试

Python 100.00%
face-recognition center-loss facenet tensorflow chinese

tensorflow-facenet's Introduction

tensorflow-facenet

人脸识别算法,结合facenet网络结构和center loss作为损失,基于tensorflow框架,含训练和测试代码,支持从头训练和摄像头测试

模型介绍

本代码在训练开始前通过MTCNN网络对数据集的图片进行筛选,筛选出能识别的人脸图像,并通过人脸框将图片裁剪resize成一定尺度用于模型的输入,对于人脸检测MTCNN算法的讲解,我的另一篇项目中做了详尽的介绍和代码注释,本代码的实现也是在此基础上简单修改。

本代码参考FaceNet: A Unified Embedding for Face Recognition and Clustering的主体结构,即使用inception_resnet_v1作为模型主体架构,输出一定维度的图片embeddings。facenet的损失函数采用triplet_loss,即对于某张训练图片img,再选取一张同一类别一张图作为pos,选取不同类别的一张图作为neg。img的embeddings与pos的embeddings的平方和作为pos_dist,im的embeddings和neg的embeddings的平方和作为neg_dist,使pos_dist与neg_dist的差总保持一定阈值。实际训练中在每一batch中对于某一张图,选取同一类别图像作为pos,选取embeddings平方和大于pos的不同类别图像作为neg,依次构成三元组来训练模型。triplet_loss的公式如下所示:

但是这样训练三元组并不能确保每次训练的数据的pos和neg图片都是最难识别的,而且模型收敛极慢。A Discriminative Feature Learning Approach for Deep Face Recognition提出center_loss,可以对模型很快收敛。本代码的损失函数就参考center_loss论文中损失函数。损失公式如下所示:

代码中的损失函数采用softmax交叉熵和center_loss相结合。softmax交叉熵为了使类间距离变大,center_loss是计算某一图片与该类别图片embeddings的均值的损失,为了使类间距离变小。论文中采取minst实验来说明损失函数的功能,如下图所示:

在实际训练中并不是遍历整个数据集来求取某类别center的embeddings,而是只针对每一个batch中出现的类别的center通过batch内相同类别的图像embeddings来进行一定学习率的更新,未出现该批次的类别的center不进行更新。

训练过程中是有类别标记的,那在实际视频测试的时候的验证身份是没有在训练集中出现的类别该怎么办?对于实际测试的时候,有身份图片,和待验证图片,主要就是计算两者embeddings之间的平方和均值与阈值进行比较,当待验证图片与身份图片的embeddings的平方和均值小于一定阈值就判定待验证图片的身份。

我的代码只训练了15个epoch,如果你有兴趣可以在我的基础上重载继续训练或者重新训练,我在筛选图像的时候花费了好长时间,所以要做好心理准备。

代码介绍

本代码参考了davidsandberg的facenet

环境说明

ubuntu16.04
python3.6.5
tensorflow1.8.0
opencv3.4.3
pip install tqdm为了显示进度条
pip install h5py测试时候存储身份图片的embeddings

代码介绍

align下放置的是MTCNN的相关代码,align_mtcnn.py是筛选图像的主程序,其他代码具体都取自我的MTCNN的项目

data下放置的是训练数据以及筛选后的数据

pictures下放置的是你需要对比的身份图像,特别强调文件名称要是全英文路径,opencv识别中文路径和添加中文比较费劲我就没加这一功能。

test下放置的embeddings.py是为了生成身份图像的embeddings省得每次测试都要重新生成,test.py是通过摄像头来识别人的身份

train里放置的config.py是一些参数设定,inception_resnet_v1.py是模型主体结构,train.py是训练代码

补充说明

其他face loss可参考此链接,包含arcface,cosface,center loss

下载数据

如果你想自己训练,下载CASIA-WebFace数据,提取密码是y3wj,多谢Yang Fang的提供。将CASIA-WebFace解压到data目录下。

如果你想继续我的模型训练或者想纯粹跑一下代码,那么你可以下载我的训练模型解压里面的模型文件到model目录下。

运行

训练:

将目录cd到align下,
python align_mtcnn.py生成筛选的人脸图像

将目录cd到train下,
python train.py进行训练

测试:

将你的身份图片放置到pictures目录下

将目录cd到test下
python embeddings.py生成身份图像的embeddings并存储
python test.py测试摄像头读取图像的身份,可以自行改变阈值的选取

如果有什么问题还请留言多多指教!

注意

align/utils.py line95 image=tf.cast(image,tf.float32)-127.5/128.0应改为image=(tf.cast(image,tf.float32)-127.5)/128.0
相应test/test.py line152 scaled=cv2.cvtColor(scaled,cv2.COLOR_BGR2RGB)-127.5/128.0应改为scaled=(cv2.cvtColor(scaled,cv2.COLOR_BGR2RGB)-127.5)/128.0
test/embeddings.py的line115的scaled =cv2.resize(cropped,(160, 160),interpolation=cv2.INTER_LINEAR)-127.5/128.0改为scaled =(cv2.resize(cropped,(160, 160),interpolation=cv2.INTER_LINEAR)-127.5)/128.0

由于本人失误我的模型应该就是基于此训练的,所以如果要改正需要重新训练模型,不过我想效果应该会更好!
多谢@ltpjob的issues7
希望大家继续批评指正!!!

结果展示

结果是我通过摄像头的身份验证,其中身份图像来源于百度图片,手机上的图片来源于新浪微博。

tensorflow-facenet's People

Contributors

lesliezhoa avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

tensorflow-facenet's Issues

您好,我使用CASIA-WebFace数据集从零开始训练,拟合后发现效果很差

您好,我使用CASIA-WebFace数据集从零开始训练,拟合后发现效果很差。
在训练过程中达到95-97%的识别率,但是使用自己的图片作为识别时几乎所有照片阈值都在0.002-0.003左右,无法区分开来。
请问能否提供下您使用的数据集和相关训练参数,我想重新训练一下。
谢谢您。

使用train.py从零开始训练出现UnboundLocalError: local variable 'summary_val' referenced before assignment

在使用 train.py 从头开始训练时,出现
Step: 1/9, accuracy: 0.155556, center loss: 0.998996, cross loss: 2.833399, Total Loss: 9.798814 ,lr:0.010000
Traceback (most recent call last):
File "train.py", line 283, in
main()
File "train.py", line 201, in main
val_writer.add_summary(summary_val, global_step=epoch)
UnboundLocalError: local variable 'summary_val' referenced before assignment

尝试加入 global summary_val 依然报错

关于epoch_size的疑问

您好。关于训练时的epoch_size,您的epoch_size是使得一个epoch完整跑一遍数据集。但是davidsandberg那份代码里的epoch_size就只是手动指定的,他这么做的目的您懂吗?这两种方法会产生什么区别?

emmmmmm,包都装不上

Uploading image.png…
from MtcnnDetector import MtcnnDetector
from detector import Detector
from fcn_detector import FcnDetector
from model import P_Net,R_Net,O_Net
这几个导入失败

运行embedding.py出错

在运行embedding.py时报错

tim 20190219205942
tim 20190219210049
这是解压后的模型文件,刚开始学习tensorflow,想请问下作者哪里出了问题,谢谢啦

识别准确率非常低

你好,非常感谢你将mtcnn和facenet做了整合,并附上了详细的注释。在使用的过程中发现,MTCNN经常检测出多个人脸(实际只有一个),我调整了min_face_size有所好转,但偶尔还是有这种情况出现;还有就是GPU模式下,mtcnn的detect face耗时很严重,能到1s以上偶尔,平均也要在700-800ms;最后就是判别的时候,正确率非常低,个人还是感觉这种单靠embeding的比较不太靠谱,请问你有什么好的办法么?

训练过程中,程序卡住不动

您好,按您最后说的那几个预处理部分存在的问题修改了程序,然后从头开始训练,但是每次训练一段时间后,程序会卡住不动,不退出也不报错。我是在Win10下运行,TensorFlow版本为1.13,Python版本为3.7。
有时候会卡在训练过程中,但更多的是卡在验证环节,print('.')的时候。后调式发现是卡在
loss_val,center_loss_val,cross_entropy_mean_val,accuracy_val,summary_val=sess.run ([total_loss,prelogits_center_loss,cross_entropy_mean, accuracy,summary_op], feed_dict=feed_dict)
这一句中。
想请教一下,这个是什么原因?

关于center_loss代替triple_loss的问题

人脸毕竟是个开放性问题,如果用center_loss代替triple_loss,对人脸的特征提取问题就变成了对训练集中的人脸种类的分类问题,会不会造成泛化能力不强 ?或者很容易造成过拟合问题 ?

输入读入问题

OutOfRangeError (see above for traceback): FIFOQueue '_1_batch_join/fifo_queue' is closed and has insufficient elements (requested 90, current size 0)
[[Node: batch_join = QueueDequeueUpToV2[component_types=[DT_FLOAT, DT_INT32], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/device:CPU:0"](batch_join/fifo_queue, _arg_batch_size_0_0)]]
我在训练的时候直接报这个错误,试了很多方法都不行,请问,你知道这是怎么回事吗?

关于train.py

你好,我按照你源代码进行预处理之后,想进行训练,可是运行代码之后一直卡在第一步,过了很久都没变化,accurate loss center loss 一直都没有改变。想知道要怎么处理

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.