基于insightface训练mobilefacenet的相关步骤及ncnn转换流程

标签: | 发表时间:2019-03-15 22:52 | 作者:
出处:https://github.com

5月16日更新

经多位网友的共同实验,原方案部分情况下迭代次数稍微不足,导致最终识别率略有小差异,为了相对容易获得论文的最佳结果,对训练方案进行简单更新,实际训练也可根据数据acc训练是否已稳定来判断lr下降的迭代次数:

  • 适当增大softmax迭代次数,4万-->12万;
  • 增大arcface第一级lr0.1的迭代次数,8万-->12万;

ps:无闲置机器,暂不再更新log。该项目训练步骤,已验证mobilefacenet可复现,良心大作,期待作者后续的研究。


5月14日更新

更新两个实验测试:

  1. arcface_loss_test2-4:接lr0.1已经训练12万次的模型,增强lr0.1步骤的训练8万次,自身acc小幅提升,下降lr后,最终部分结果中lfw最佳结果99.517%,agedb有模型已提升至96.033%+
  2. arcface_loss_test2-5:接arcface_loss_test2-4最佳结果的模型进行精调,margin_s=128,延长了lr0.001迭代次数40000,最终部分结果中lfw最佳结果99.500%,agedb有模型已提升至96.150%+,该步骤对lfw未有提升,对agedb提升比较有效,略微超过论文的96.07%;

ps:issues已有人训练出比论文相对更佳的结果,lfw:99.583,agedb:96.083。


5月11日更新

实验二验证补充实验:增加lr0.1,+40000steps,lr 0.01,+20000steps,初步判断单卡延长迭代步数有效,lfw提升至99.5+的次数增加,agedb可达到95.9+;继续实验延长迭代次数,判断整体最终稳定情况;


5月10日更新

更新ncnn转换测试步骤;


5月9日更新

实验二:切换arcface_loss,节选列出lfw最高一组acc结果:

    [2018-05-09 02:28:45]  lr-batch-epoch: 0.01 534 15
[2018-05-09 02:28:45]  testing verification..
[2018-05-09 02:28:58]  (12000, 128)
[2018-05-09 02:28:58]  infer time 12.946839
[2018-05-09 02:29:02]  [lfw][112000]XNorm: 11.147283
[2018-05-09 02:29:02]  [lfw][112000]Accuracy-Flip: 0.99517+-0.00450
[2018-05-09 02:29:02]  testing verification..
[2018-05-09 02:29:18]  (14000, 128)
[2018-05-09 02:29:18]  infer time 15.957752
[2018-05-09 02:29:23]  [cfp_fp][112000]XNorm: 9.074075
[2018-05-09 02:29:23]  [cfp_fp][112000]Accuracy-Flip: 0.88457+-0.01533
[2018-05-09 02:29:23]  testing verification..
[2018-05-09 02:29:35]  (12000, 128)
[2018-05-09 02:29:35]  infer time 12.255588
[2018-05-09 02:29:39]  [agedb_30][112000]XNorm: 11.038146
[2018-05-09 02:29:39]  [agedb_30][112000]Accuracy-Flip: 0.95067+-0.00907

目前离论文要求识别率已非常接近,下组实验增加迭代轮数,判断是否因为单卡原因;


5月7日更新

实验一,目前测试效果不佳,softmax预训练未达到预期在lfw上98+的识别率,待排查及进一步实验。如何在lr0.1下达到一个合理的预训练区间,对后续是否能训练到最优识别率影响较大。

实验二:

论文指出:

    We set the weight decay parameter to be 4e-5, except the weight decay 
parameter of the last layers after the global operator (GDConv or GAPool) being 4e-4.

修复错误:--wd设置0.00004,--fc7-wd-mult设置10,重新进行试验;

实验日志:softmax训练的acc持续提升,lfw上99+,转下一步训练;


前言

本文主要记录下复现mobilefacenet的流程,参考mobilefacenet作者月生给的基本流程,基于insightface的4月27日

    4bc813215a4603474c840c85fa2113f5354c7180

版本代码在P40单显卡训练调试。

训练步骤

1.拉取配置 insightface工程的基础环境;

2.softmax loss初调:lr0.1,softmax的fc7配置wd_mult=10.0和no_bias=True,训练12万步;

切换到src目录下,修改train_softmax.py: 179-182行:

    if args.loss_type==0: #softmax
    _bias = mx.symbol.Variable('fc7_bias', lr_mult=2.0, wd_mult=0.0)
    fc7 = mx.sym.FullyConnected(data=embedding, weight = _weight, bias = _bias, num_hidden=args.num_classes, name='fc7')

修改为:

    if args.loss_type==0: #softmax
    #_bias = mx.symbol.Variable('fc7_bias', lr_mult=2.0, wd_mult=0.0)
    # fc7 = mx.sym.FullyConnected(data=embedding, weight = _weight, bias = _bias, num_hidden=args.num_classes, name='fc7')
    fc7 = mx.sym.FullyConnected(data=embedding, weight = _weight, no_bias=True, num_hidden=args.num_classes, name='fc7')

363行:

    if args.network[0]=='r' or args.network[0]=='y':

修改为:

    if args.network[0]=='r' :

这样保证uniform初始化;

运行:

    CUDA_VISIBLE_DEVICES='0' python -u train_softmax.py --network y1 --ckpt 2 --loss-type 0 --lr-steps 120000,140000 --wd 0.00004 --fc7-wd-mult 10 --per-batch-size 512 --emb-size 128  --data-dir  ../datasets/faces_ms1m_112x112  --prefix ../models/MobileFaceNet/model-y1-softmax

3.arcface loss调试:s=64, m=0.5, 起始lr=0.1,在[120000, 160000, 180000, 200000]步处降低lr,总共训练20万步,也可通过判断acc是否稳定后下降lr。该步骤,LFW acc能到0.9955左右,agedb-30 acc能到0.95以上。

切换到src目录下:

    CUDA_VISIBLE_DEVICES='0' python -u train_softmax.py --network y1 --ckpt 2 --loss-type 4 --lr-steps 120000,160000,180000,200000 --wd 0.00004 --fc7-wd-mult 10 --emb-size 128 --per-batch-size 512 --data-dir ../datasets/faces_ms1m_112x112 --pretrained ../models/MobileFaceNet/model-y1-softmax,60 --prefix ../models/MobileFaceNet/model-y1-arcface

4.agedb精调:从3步训练好的模型继续用arcface loss训练,s=128, m=0.5,起始lr=0.001,在[20000, 30000, 40000]步降低lr,这时能得到lfw acc 0.9955左右,agedb-30 acc 0.96左右的最终模型。

    CUDA_VISIBLE_DEVICES='0' python -u train_softmax.py --network y1 --ckpt 2 --loss-type 4 --lr 0.001 --lr-steps 20000,30000,40000 --wd 0.00004 --fc7-wd-mult 10 --emb-size 128 --per-batch-size 512 --margin-s 128 --data-dir ../datasets/faces_ms1m_112x112 --pretrained ../models/MobileFaceNet/model-y1-arcface,100 --prefix ../models/MobileFaceNet/model-y1-arcface

ncnn转换步骤

1.去除模型fc7层,切换insightface/deploy目录下

    python models_slim.py --model ../models/MobileFaceNet/model-y1-arcface,40

2.编译最新版本 ncnn的mxnet2ncnn工具; 或直接运行mxnet文件夹的mxnet2ncnn.bat脚本

    mxnet2ncnn.exe model-y1-arcface-symbol.json model-y1-arcface-0000.params mobilefacenet.param mobilefacenet.bin

3.速度测试,增加ncnn的benchncnn工程 复制ncnn目录文件到sdcard卡下,运行下列指令

    adb shell
cp /sdcard/ncnn/* /data/local/tmp/
cd /data/local/tmp/
chmod 0775 benchncnn
./benchncnn 8 8 0

ps:该转换与论文相比,缺少BN层合并至Conv层操作,速度和内存占用非最优值,相关测试大致可提速10%。

附高通625粗略测试结果: 四线程:

    loop_count = 8
num_threads = 4
powersave = 0
   mobilefacenet  min =   41.44  max =  125.16  avg =   61.43
 light_cnn_small  min =   28.45  max =   32.23  avg =   30.10
  LightenedCNN_A  min =  476.45  max =  489.83  avg =  482.24
  LightenedCNN_B  min =  100.70  max =  104.21  avg =  102.52
      squeezenet  min =   64.73  max =   83.19  avg =   68.53
       mobilenet  min =  120.67  max =  128.20  avg =  124.52
    mobilenet_v2  min =  110.60  max =  220.12  avg =  125.52
      shufflenet  min =   42.43  max =   50.24  avg =   44.86
       googlenet  min =  212.73  max =  228.50  avg =  217.07
        resnet18  min =  230.79  max =  285.95  avg =  246.40
         alexnet  min =  402.55  max =  429.71  avg =  414.41
           vgg16  min = 1622.61  max = 1942.04  avg = 1766.67
  squeezenet-ssd  min =  161.68  max =  290.63  avg =  186.38
   mobilenet-ssd  min =  213.72  max =  245.10  avg =  223.55

八线程:

    M6Note:/data/local/tmp $ ./benchncnn 8 8 0
loop_count = 8
num_threads = 8
powersave = 0
   mobilefacenet  min =   27.77  max =   31.11  avg =   28.87
 light_cnn_small  min =   19.77  max =   25.76  avg =   21.89
  LightenedCNN_A  min =  236.45  max =  341.60  avg =  262.61
  LightenedCNN_B  min =   75.45  max =   79.63  avg =   77.04
      squeezenet  min =   44.78  max =   74.40  avg =   49.59
       mobilenet  min =   75.61  max =   93.74  avg =   82.04
    mobilenet_v2  min =   76.06  max =  104.26  avg =   80.32
      shufflenet  min =   30.33  max =   79.53  avg =   36.89
       googlenet  min =  135.60  max =  276.84  avg =  179.23
        resnet18  min =  164.25  max =  224.34  avg =  181.24
         alexnet  min =  225.19  max =  342.46  avg =  250.83
           vgg16  min = 1631.73  max = 2040.82  avg = 1762.53
  squeezenet-ssd  min =  148.15  max =  260.45  avg =  169.15
   mobilenet-ssd  min =  163.48  max =  198.45  avg =  181.06

相关参考:

mobilefacenet论文

insightface

TODO

  • ncnn框架移植mobilefacenet

相关 [insightface 训练 mobilefacenet] 推荐:

基于insightface训练mobilefacenet的相关步骤及ncnn转换流程

- -
经多位网友的共同实验,原方案部分情况下迭代次数稍微不足,导致最终识别率略有小差异,为了相对容易获得论文的最佳结果,对训练方案进行简单更新,实际训练也可根据数据acc训练是否已稳定来判断lr下降的迭代次数:. 适当增大softmax迭代次数,4万-->12万;. 增大arcface第一级lr0.1的迭代次数,8万-->12万;.

ncnn 载入insightface训练好的性别年龄识别模型 - sinat_31425585的博客 - CSDN博客

- -
从insightface项目中下载mxnet模型:. 2、使用ncnn的模型转换工具mxnet2ncnn进行模型转换.

使用Mxnet进行图像深度学习训练工具 InsightFace - 使用篇, 如何一键刷分LFW 99.80%, MegaFace 98%. - 知乎

- -
开头先把论文和开源项目地址放一下:. InsightFace库是对我们上述论文中提出算法的开源实现. 其中不仅仅包括我们自己的算法, 也包括其他常见的人脸loss, 比如Softmax, SphereFace, AMSoftmax, CosFace, Triplet Loss等等. 除了代码实现以外, 我们还提供了打包对齐好的人脸训练数据供下载, 免除了一大堆数据准备的工作.

Leetcode 编程训练

- - 酷 壳 - CoolShell.cn
Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google、微软、Facebook、Amazon之类的这些公司,基本上是应试教育的功利主义. 我做这些题目的不是为了要去应聘这些公司,而是为了锻炼一下自己的算法和编程能力.

我的听力训练之路

- moz - 学习力就是竞争力
舍得上初中那会,基本谈不上什么听力训练,最多最多就是英语老师拿了个录音机让大家做听写,听的通常是单词.就算如此,舍得初中四年的英语听力训练加在一起不会超过两个小时.. 初中毕业后舍得上的是技校,学的是热处理专业,根本就没有英语这一科,哈哈.技校毕业就进了工厂,玩了三年后才觉得该学学英语了.于是买了个爱华录音机,买了一套新概念英语的磁带,就开始听起来了.那时候年轻贪玩,加上基础差,没有坚持下来..

训练免疫系统杀死癌症

- 微笑!?~ - Solidot
一年前,当化疗对白血病也无效时,65岁的William Ludwig签署协议参与了宾夕法尼亚大学的一项大胆的实验. 医生抽取出10亿T细胞——对抗病毒和肿瘤的白细胞——为T细胞加入能编程细胞去攻击癌细胞的新基因,然后这些修改过的细胞被重新滴入Ludwig的静脉. 他浑身发冷颤,然后体温上升,血压下降,最后他被医生送入重病特别护理室,向其家人发出去世警告.

胜利还得靠“精神训练法”

- Clover - 果壳网 guokr.com - 果壳网
机会常常只有一次,只许成功不许失败. 你竭尽全力奔向目标,努力准备每一个细节,可是当机会来了,却发现准备有余,熟练不足. 明明已经写在笔记本上的要点,发言时一紧张又忘了说. 怎样才能把握住这些难得的表现机会,让自己熟练发挥呢. 对此,运动心理学提倡使用“精神训练法”(mental practice),简单说就是在脑子里把事情过一遍.

38种摄影基本功训练

- freefish - 佳人
摄影,除了拥有好装备,良好的运气,超凡的耐心之外,更有有一手过硬的摄影技巧,分享摄影基本功训练,文末提供摄影基本功训练全文阅读. 被摄体:一般风景、花卉、城市建筑等冲击力较强的景物. 建 议:首先使用广角镜头:24MM—35MM拍摄,光圈:F11—16,光圈优先AE模式. 要 求:只把焦点对在主要被摄体上,浅景深.

怎样训练写故事的能力?

- - 知乎每日精选
介是个好问题,又到了半夜写知乎的时间啦~. 我的以下答案,都是基于如何训练 戏剧性故事创作,用 戏剧创作的方法和经验来谈一谈故事创作,希望可以给题主一些帮助. 首先要说一说,戏剧性,啥叫戏剧性呢. 抛开资料论述,我个人最喜欢的一个解读为——. 那为什么要强调故事创作的戏剧性呢. 因为戏剧性满足了人自身对故事的渴望和期待习惯.

软件天才都是训练出来的

- Weiye - cnBeta全文版
作者金旭亮发表了自己对薛涌《天才是训练出来的》的心得体会,以下是文章内容:长期以来,“软件业”一直被视为“智力密集”型的“朝阳”产业,大多数从业者都受过高等教育,其平均素质居于社会各行业的前列,这个产业的顶尖人物被公众视为“知识英雄”,比如微软公司的创始人比尔盖茨雄据世界首富之位多年,更是为人“津津乐道”.