这篇文章是基于研二时候在公司实习做人脸识别项目的记录,自己也是从零开始学习神经网络, tensorflow到完成一个人脸识别项目。出于隐私保护,代码不能公开,打算分享一下觉得比较有参考价值的论文和一些经验,也许有的论文的技术到现在已经算不上很先进了,但是经典的论文多读读总会有收获的。
参考论文:
人脸检测,关键点定位,追踪:
【1】Deep Convolutional Network Cascade for Facial Point Detection
【2】A Convolutional Neural Network Cascade for Face Detection
【3】Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
【4】Robust facial landmark tracking via cascade regression
【5】Convolutional Experts Network for Facial Landmark Detection
【6】A Functional Regression approach to Facial Landmark Tracking
人脸识别:
1:1 verification
【1】FaceNet:A Unified Embedding for Face Recognition and Clustering
【2】Additive Margin Softmax for Face Verification
【3】ArcFace-Additive Angular Margin Loss for Deep Face Recognition
【4】MobileFaceNets Efficient CNNs for Accurate Real-Time Face Verification on Mobile Devices
1:n identification
【1】A Fast and Accurate System for Face Detection, Identification, and Verification
【2】MegaFace A Million Faces for Recognition at Scale
【3】Unconstrained Face Recognition Identifying a Person of Interest from a Media Collection
【4】Web-Scale Training for Face Identification
活体检测:
【1】Face Flashing: a Secure Liveness Detection Protocol based on Light Reflections
人脸去网纹:
【1】Multi-task ConvNet for Blind Face Inpainting with Application to Face Verification
【2】DeMeshNet: Blind Face Inpainting for Deep MeshFace Verification
防翻拍:
【1】Learning Deep Models for Face Anti-Spoofing Binary or Auxiliary Supervision
【2】CCoLBP: Chromatic Co-Occurrence of Local Binary Pattern for Face Presentation Attack Detection
遮挡检测:
【1】An Occluded Stacked Hourglass Approach to Facial Landmark Localization and Occlusion Estimation
【2】Occlusion Coherence: Detecting and Localizing Occluded Faces
数据集
人脸识别:欧美:vggFace,lfw,WebFace,MSIM 亚洲:msra亚洲人脸数据集
人脸检测对齐:FDDB,widerface,ALFW
开发环境: tesla p40,4gpu,单卡显存22g
python3 + tensorflow_gpu 1.11.0 + cuda9.2 + cudnn7200
python3 + tensorflow_gpu 1.11.0 + cuda9.0 + cudnn7300
loss函数实测:(仅作参考)
softmax_loss:目前证明可以很好地拟合训练集,loss函数可以降到0.0x级别,但是在lfw测试集上面性能和主流loss差距较大
center_loss:强调最小化类内距离,单独不太好训练,和softmax结合着用,实测效果提升不是很明显
triplet_loss:谷歌论文提出的损失函数,强调类间类内距离,实测不太好训练,所以打算在后期尝试用来finetune,也有一种想法是将triplet_loss的欧式距离改成余弦距离测试一下效果
arc_loss:理论上来说应该是精度最高的,基于L_Resnet_E_IR网络进行训练,实测网络训练时占用显存比较多,要复现论文的batch_size和迭代步骤数需要一定的硬件支撑和时间(论文中作者用了4个tesla-p40,实测确实要4个才跑的起512的batch_size,一个batch迭代1.5-2秒)
additive_margin_loss:一种基于angular的损失函数,采用20层或者36层的resnet网络,收敛速度比较快,lfw数据集上准确率明显优于softmax,但是loss相对于softmax不太容易降下去,对于训练集的拟合程度不是很好,目前打算采用GPU并行增大batch_size数量进行迭代,同时调整学习率,观察loss下降趋势进一步优化
网络架构实测:
resnet(20,36):实测收敛速度快,用相同的loss函数进行迭代对比,lfw准确率介于inception和LR之间,后期可以试试更深的层数迭代
inception_resnet_v1:按理说效果应该是要比resnet好,但是实测性能也没有太明显的提升
L_Resnet_E_IR:同样的loss函数下,最终迭代精确度最高的网络,迭代速度较于resnet和inception-resnet要慢一倍,采用了L_Resnet_50网络:bacth_size=32时GPU显存占用8g,tensorflow模型迭代速度约30-40 sample/s,识别一张图片300ms左右
Mobilefacenet:单gpu batch_size=256,GPU显存占用16g,模型迭代速度260sample/s,识别一张图片60ms左右
一些调优经验:
关于神经网络的调优,一般可以考虑以下一些方面:
embedding_size:在mobilefacenet中,128调整为512,更加稳定
adam参数调整,图像分类时部分超参数需要手动设置
梯度爆炸,learning rate调小
结合tensorboard观察loss下降趋势,相应地调节epoch迭代步数
weight_decay罚项减小,增加模型复杂度
图像归一化处理,训练和测试集要统一
batch_size不是越大越好,要和模型相适应
模型对于训练集的拟合度和类别的数量有直接关系,复杂的网络对于类别多的数据集拟合能力更好
相关学习资料
李飞飞计算机视觉cs231n课程
fast.ai课程
补充知识点:
关于CNN对图像特征的位移、尺度、形变不变性的理解
卷积神经网络显存,内存,使用量估计
深度学习优化器解析,模型参数调优,正则化机制
人脸识别算法评价指标——TAR,FAR,FRR,ERR
命令行记录:
1.pip wheel --wheel-dir=下载目录 tensorlayer==x.x.x
2.https://pypi.tuna.tsinghua.edu.cn/simple/
3.awk 'BEGIN{srand();} {printf "%s %s\n", rand(), $0}' t | sort -k1n | awk '{gsub($1FS,""); print $0}' | tee shuffle.txt
4.cat /usr/local/cuda/version.txt
5.cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
更新ing
9.16
1.增加bin文件生成脚本
2.增加tf_record文件生成脚本
3.增加pair.txt生成脚本
4.增加视频提取人脸帧,并且进行方向调整脚本(左旋90,右旋90,倒立均无法检测出人脸)
5.增加模型预加载测试脚本
9.20
增加网纹生成脚本
10.1
记录一些docker常用命令:
sudo docker import docker_name.tar docker_name:1.0
sudo docker images
sudo docker run -idt -v /data:/data dce2d4ae5307 /bin/bash
sudo docker run -it docker_name:1.0 /bin/bash
sudo docker ps
sudo docker attach p_id
docker commit -m="has update" -a="runoob" 47090a533b51 user_name/docker_name:3.0
sudo docker stop
exit
sudo docker rm
sudo docker rmi
ctrl+p, ctrl+q
10.20
1.添加L_Resnet_E_IR多GPU训练脚本,可以进行单GPU或者CPU finetune
2.添加MoblienFacenet多GPU训练脚本,可以进行单GPU或者CPU finetune
来源:CSDN
作者:xiaoxiaoyuererer
链接:https://blog.csdn.net/qq632683582/article/details/104107128