仓库InsightFace: GitHub - deepinsight/insightface: State-of-the-art 2D and 3D Face Analysis Project

作者演讲:【极市】邓健康-CVPR2019 ArcFace构建高效人脸识别系统_哔哩哔哩_bilibili
测试demo:当《唐人街探案3》遇到Insightface~_哔哩哔哩_bilibili

识别算法配置

1. 安装mxnet

pip install mxnet-cu80 #or mxnet-cu90 or mxnet-cu100

2. 下载insightface算法仓库

git clone --recursive https://github.com/deepinsight/insightface.git

3. 下载(MS1MV2-Arcface)数据集

数据集下载地址在:faces_emore.zip_免费高速下载|百度网盘-分享无限制,数据集里包含以下内容

faces_emore/
train.idx
train.rec
property
lfw.bin
cfp_ff.bin
cfp_fp.bin
agedb_30.bin
calfw.bin
cplfw.bin
vgg2_fp.bin

4. 复制配置文件

cp sample_config.py config.py
vim config.py # edit dataset path etc..

如果后面需要Fine Tune模型,需要将config.py的config.ckpt_embedding这一行的值改为False,这样可以保存网络的fc7层的权重,否则不会保存,不保存就会从头开始重新训练。
可选:将config.py文件中的这一行dataset.emore.val_targets = ['lfw', 'cfp_fp', 'agedb_30']修改为:dataset.emore.val_targets = ['lfw', 'cfp_ff', 'cfp_fp', 'agedb_30'],在训练评估时可以同时评估cpf_ff数据集,想看模型在该数据集上的准确率可以加上,该数据集上的准确率与LFW的准确率接近。

5. 配置环境变量

export MXNET_CPU_WORKER_NTHREADS=24
export MXNET_ENGINE_TYPE=ThreadedEnginePerDevice

模型训练

在训练前先确定模型训练的学习率,测试一下学习率为0.1,0.01和0.005等条件下的训练速度,选择准确率增长较快的学习率进行训练!!!

1. 训练命令

训练LResNet100E-IR网络,损失函数为ArcFace。

CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train.py --network r100 --loss arcface --dataset emore

训练LResNet50E-IR网络,损失函数为CosineFace。

CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train.py --network r50 --loss cosface --dataset emore

训练MobileFaceNet网络,损失函数为Softmax。

CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train.py --network y1 --loss softmax --dataset emore

Fine tune MobileFaceNet网络, 损失函数改为Triplet loss。

CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train.py --network mnas05 --loss triplet --lr 0.005 --pretrained ./models/y1-softmax-emore,1

多GPU训练可以使用train_parall.py文件进行多GPU加速。
作者的训练配置如下所示:每张卡上的batch size为128,共使用4张卡进行训练,故batch size为512。

Namespace(batch_size=512, beta=1000.0, beta_freeze=0, beta_min=5.0, bn_mom=0.9, ckpt=1, ctx_num=4, cutoff=0, data_dir='/cache/jiaguo/faces_ms1mi_112x112', easy_margin=0, emb_size=512, end_epoch=100000, fc7_wd_mult=1.0, gamma=0.12, image_channel=3, image_h=112, image_w=112, loss_type=5, lr=0.1, lr_steps='100000,140000,160000', margin=4, margin_a=1.0, margin_b=0.2, margin_m=0.3, margin_s=64.0, max_steps=0, mom=0.9, network='r100', num_classes=85742, num_layers=100, per_batch_size=128, power=1.0, prefix='../models2/model-r100-ii/model', pretrained='', rand_mirror=1, rescale_threshold=0, scale=0.9993, target='lfw,cfp_fp,agedb_30', use_deformable=0, verbose=2000, version_act='prelu', version_input=1, version_output='E', version_se=0, version_unit=3, wd=0.0005)

2. 训练结果

作者在LFW、CFP和AgeDB30数据集上得到的训练结果如下所示:

testing verification..
(12000, 512)
infer time 21.69233
[lfw][168000]XNorm: 22.172497
[lfw][168000]Accuracy-Flip: 0.99783+-0.00269
testing verification..
(14000, 512)
infer time 24.988244
[cfp_fp][168000]XNorm: 21.383092
[cfp_fp][168000]Accuracy-Flip: 0.98271+-0.00569
testing verification..
(12000, 512)
infer time 21.44195
[agedb_30][168000]XNorm: 22.695239
[agedb_30][168000]Accuracy-Flip: 0.98233+-0.00716
[168000]Accuracy-Highest: 0.98283

模型评估

1. MegaFace数据集评估

需要安装的依赖项:

tbb2 opencv2.4

如果高版本cuda不支持opencv2.4,将FindCUDA.cmake替换为最新版的FindCUDA.cmake,如果不支持compute_20,将OpenCVDetectCUDA.cmake替换为最新版的OpenCVDetectCUDA.cmake,
下载MegaFace的评估工具devkit.tar.gz,
从网盘中下载MegaFace测试数据megaface_testpack_v1.0.zip,解压后文件夹中包含的数据有

facescrub_images/
megaface_images/
facescrub_lst
facescrub_lst_all
facescrub_noises.txt
facescrub_noises_empty.txt
megaface_lst
megaface_noises.txt
megaface_noises_empty.txt

在工程的./Evaluation/Megaface/文件夹中,运行./run.sh文件,测试模型在MegaFace数据集上的识别精度。运行./run.sh前,先修改devkit的路径DEVKIT,将DEVKIT="/raid5data/dplearn/megaface/devkit/experiments"改为devkit/experiments实际所在的位置,修改后,可以得到模型在MegaFace数据集上的识别精度,测试模型需要花费较长时间。

Done matching! Score matrix size: 3530 1000000
Saving to ../../mx_results/otherFiles/facescrub_megaface_r100ii_1000000_1.bin
Computing test results with 1000000 images for set 1
Loaded 3530 probes spanning 80 classes
Loading from ../../mx_results/otherFiles/facescrub_facescrub_r100ii.bin
Probe score matrix size: 3530 3530
distractor score matrix size: 3530 1000000
Done loading. Time to compute some stats!
Finding top distractors!
Done sorting distractor scores
Making gallery!
Done Making Gallery!
Allocating ranks (1000080)
Rank 1: 0.983584

2. LFW, CFP, AgeDB数据集评估

进入./recognition/eval/文件夹,输入以下命令,使用verification.py文件进行评估。需要指定模型所在的文件夹和评估数据所在的文件夹。

python verification.py --model ../../models/model-r100-ii/model --data-dir ../../datasets/faces_emore/

得到的结果如下所示:

(12000, 512)
infer time 108.986159
[lfw]XNorm: 22.132480
[lfw]Accuracy: 0.00000+-0.00000
[lfw]Accuracy-Flip: 0.99767+-0.00281
Max of [lfw] is 0.99767
testing verification..
(14000, 512)
infer time 121.617964
[cfp_ff]XNorm: 21.077436
[cfp_ff]Accuracy: 0.00000+-0.00000
[cfp_ff]Accuracy-Flip: 0.99843+-0.00162
Max of [cfp_ff] is 0.99843
testing verification..
(14000, 512)
infer time 122.128096
[cfp_fp]XNorm: 21.340035
[cfp_fp]Accuracy: 0.00000+-0.00000
[cfp_fp]Accuracy-Flip: 0.98271+-0.00559
Max of [cfp_fp] is 0.98271
testing verification..
(12000, 512)
infer time 104.282227
[agedb_30]XNorm: 22.654594
[agedb_30]Accuracy: 0.00000+-0.00000
[agedb_30]Accuracy-Flip: 0.98250+-0.00712
Max of [agedb_30] is 0.98250

人脸识别为一分类网络,insight face训练先在大数据集上使用ArcFace损失函数做分类训练,然后再使用Triplet损失函数进行微调提高识别精度。

评估结果

相关算法

人脸检测: RetinaFace
人脸对齐: Dense U-Net
人脸识别: ArcFace

  根据文献[1],文章首先介绍了三种利用卷积神经网络识别人脸的主要属性。先是训练数据,介绍了主要的人脸识别训练数据集;其次是网络结构,介绍了各种卷积神经网络;第三是损失函数,介绍了基于欧几里得距离的损失函数和基于角度和余弦的损失函数。

  文章介绍了从SoftMax到ArcFace损失函数。介绍了:(1)SoftMax损失函数;(2)权重归一化;(3)Angular Margin倍数损失函数;(4)特征归一化;(5)Cosine Margin损失函数;(6)Angular Margin损失函数;

数据集

LFW: http://vis-www.cs.umass.edu/lfw/
CFP: Celebrities in Frontal-Profile in the Wild
AgeDB i·bug - resources - AgeDB
MegaFace: MegaFace
MS-Celeb-1M: https://www.microsoft.com/en-us/research/project/ms-celeb-1m-challenge-recognizing-one-million-celebrities-real-world/

人脸识别常用数据集介绍(附下载链接)及常用评估指标

训练集、验证集、测试集以及交验验证的理解

参考文献

arcface论文

[1] ArcFace: Additive Angular Margin Loss for Deep Face Recognition, Jiankang Deng, Jia Guo, Niannan Xue,
Stefanos Zafeiriou, https://arxiv.org/abs/1801.07698

ArcFace论文中文翻译:ArcFace(insightface)论文翻译——中英文对照+标注总结_胥洪利的博客-CSDN博客

人脸识别:《Arcface》论文详解:https://blog.csdn.net/shentanyue/article/details/82109580

retinaface论文

[2] RetinaFace: Single-stage Dense Face Localisation in the Wild, Jiankang Deng, Jia Guo, Yuxiang Zhou,
Jinke Yu, Irene Kotsia, Stefanos Zafeiriou, https://arxiv.org/abs/1905.00641

Retinaface论文翻译及理解:Retinaface论文翻译及理解_诗大人的博客-CSDN博客_retinanet论文翻译

U-Nets论文

[3] Stacked Dense U-Nets with Dual Transformers for Robust Face Alignment, Jia Guo, Jiankang Deng,
Niannan Xue, Stefanos Zafeiriou, https://arxiv.org/abs/1812.01936

Stacked Dense U-Nets with Dual Transformers for Robust Face Alignment 原文翻译:Stacked Dense U-Nets with Dual Transformers for Robust Face Alignment 原文翻译_qq_2579440213的博客-CSDN博客

深度学习网络结构

[4] A Survey of the Recent Architectures of Deep Convolutional Neural Networks,https://arxiv.org/ftp/arxiv/papers/1901/1901.06032.pdf

深度学习中的经典基础网络结构(backbone)总结

深度学习网络结构汇总(21种网络结构)

深入理解CNN卷积层、池化层、全连接层

人脸识别损失函数

人脸识别损失函数综述(附开源实现)

人脸识别的几个常用loss

mxnet lst,rec文件

MXNet如何生成.lst文件和.rec文件

MXNet im2rec.py使用教程(加载多标签)

insithtface lst,rec文件

lst文件格式:

bAligned img_path label bbox_x1 bbox_x2 bbox_y1 bbox_y2 lmk_x1 lmk_x2 ... lmk_y1 lmk_y2 ... lmk_y5
bAligned: 0-无裁剪,1-裁剪对齐
img_path: 图片路径
label: 图片标签
bbox_x1 bbox_x2 bbox_y1 bbox_y2:图片边框信息,bAligned=0时需要带上,可全部填0
lmk_x1 lmk_x2 ... lmk_y1 lmk_y2 ... lmk_y5: 图片5点信息,bAligned=0时需要带上最终rec文件是将裁剪好的图片mx.recordio.pack_img打包在一起,参考face2rec2.py

rec文件需要输入lst,其内部操作是通过lst中的文件路径读取图片,根据5个lmk点进行人脸对齐,得到归一化的人脸区域,然后打包到rec文件中,供网络训练,脚本位于src/data/face2rec2.py

property文件格式:

ids image_h image_w
ids: 有多少类别
image_h: 图片大小
image_w: 图片大小

idx文件格式:

recid  pos
recid: 资源id
pos:  资源id所在的rec二进制文件位置

rec文件格式:

rec二进制文件一个内存资源组成:
[header, value],其中value可选header组成为:flag, label, id, id2图片资源为:
flag = 0
label = [label, bAligned]  # lst文件中的label, bAligned值
id = 1~n                   # rec资源id
id2 = 0                    # 无用到
value = pack_img           # 打包的图片img数据集信息资源为:
flag = 2
label = [_id, _id+len(identities)]  # 图片资源总数量,图片+身份信息资源总数量
id = 0                              # rec资源id = 0
id2 = 0                             # 无用到身份信息资源为:
flag = 2
label = [imgid_start, imgid_id_end]  # 存储每个label的imgid范围,即同一类别的多张图片
id = n+1, 2n                         # rec资源id
id2 = 0                              # 无用到

mxnet fine-tune:

Fine-tune with Pretrained Models — mxnet documentation

How to finetune on my own datasets ? · Issue #245 · deepinsight/insightface · GitHub

insightface源码目录结构

insightfacde 算法学习相关推荐

  1. 拿下斯坦福和剑桥双offer,00后的算法学习之路

    董文馨,00后,精通英语,西班牙语.斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习. 10岁开始在国外上学:12岁学Scratch: 13岁学HTML & CSS: 14岁 ...

  2. 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)

    知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...

  3. 原创 | 初学者友好!最全算法学习资源汇总(附链接)

    在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...

  4. 基本算法学习(一)之希尔排序(JS)

    参考书: 严蔚敏-数据结构 希尔排序(Shell's Sort) 希尔排序又称"缩小增量排序",归属于插入排序一类,简单来说,和我们的插入排序比,它更快. 奇妙的记忆点: 内排序( ...

  5. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  6. Surf算法学习心得(一)——算法原理

    Surf算法学习心得(一)--算法原理 写在前面的话: Surf算法是对Sift算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!由于我也是初学者,刚刚才开始研究这个算法,然而网上 ...

  7. 算法学习:后缀自动机

    [前置知识] AC自动机(没有什么关联,但是看懂了会对后缀自动机有不同的理解) [解决问题] 各种子串的问题 [算法学习] 学习后缀自动机的过程中,看到了许多相关性质和证明,但是奈何才疏学浅(lan) ...

  8. 算法学习:后缀数组 height的求取

    [前置知识] 后缀数组 [定义] [LCP]全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 [z函数] 函数z [ i ] 表 ...

  9. 算法学习:最小圆覆盖

    [参考博客] https://www.cnblogs.com/bztMinamoto/p/10698920.html [定义] [圆]一个圆心和他的半径,就能够确定这个半径 [解决问题] 字面意思 给 ...

最新文章

  1. Building your training into your researcing
  2. 最优化——线性规划总结1(线性规划标准型,规范型,顶点)
  3. 相似图片搜索的原理(转)
  4. ios开发学习-指示器(HUD)效果源码分享
  5. Hosts 文件切换工具
  6. @autowired注解 抽象类_Spring容器注解注入
  7. Ubuntu环境下Android反编译apk教程
  8. linux xp双系统引导修复工具,XP和Linux双系统启动菜单的修复
  9. 【AI视野·今日CV 计算机视觉论文速览 第181期】Tue, 7 Apr 2020
  10. 怎么设置台式计算机密码忘了,台式电脑忘记开机密码怎么办
  11. AWR实战分析之---- PX Deq Credit: send blkd
  12. 可以把JPG图片转成PDF的格式转换器
  13. C++语言中关于switch的用法
  14. 读书笔记:普通心理学之个体心理
  15. 【C++ 科学计算】介绍 C++线性代数和科学计算库 Armadillo
  16. C++文件服务器项目—数据库表设计 与 后端接口设计—6
  17. BBR学习笔记--什么是BBR、可调整的参数
  18. [NOIP1998 普及组] 幂次方
  19. FigDraw 2. SCI 文章绘图必备 R 语言基础
  20. 基于百问网IMX6ULL_PRO开发板的Uboot移植(Uboot-2017.03)

热门文章

  1. HEVC测试序列下载
  2. 远程答题平台的使用方法
  3. ORACLE 12C数据库驱动文件分享
  4. 一次腾讯云centos服务器被入侵的处理
  5. 无人机倾斜摄影测量技术的优势有哪些?
  6. Spring 事务管理@transactional 的实现原理和使用
  7. HEX文件校验和算法
  8. 【锐捷无线】隐藏SSID配置
  9. 年产10000吨乳制品工厂设计
  10. SEO写作的问题有哪些,重点又是什么呢