Insightface项目实践爬坑指南(MXNET版)

前言

公司希望使用新的人脸识别算法去升级老的算法,于是有了此次爬坑之旅
使用的是Mxnet的版本,直接从git上lclone一份代码,目前我拉下来的代码里是有问题的,我会在后续里写出。
ps,第一次使用MXNET,如果有说的不对的地方请指出谢谢~

安装准备

按照git地址上先将Mxnet安装成功,地址如下
https://github.com/deepinsight/insightface
因为要求使用的是python2.x,我这边直接在py27这个环境下配置的程序,大家也可以单独新建一个环境,都ok~然后按照要求安装好各种包。

数据准备

Mxnet要求的数据格式是与tensoflow不同的,这里需要的是:

    /
       train.lst
       train.idx
       train.rec
       property
       lfw.bin
       cfp_fp.bin
       agedb_30.bin

其中train.idx 和 train.rec分别是数据偏移索引和数据本身的文件. property代表数据集属性
.idx和.rec可以理解为TF里的Tf.record,是mxnet的数据形势,proprty是一个文件,里面记录里有多少个种类,图像的shape的信息。剩下的。bin文件是在Validation部分用的,用来自动寻找一个区分不同人的阈值。

直接运行时会遇到 AttributeError: module ‘facenet’ has no attribute ‘store_revision_info’, AttributeError: module ‘facenet’ has no attribute ‘get_dataset’,的错误, 这是导入时的错误, 直接修改导入

insightface的代码mtcnn转换的代码也有问题,使用下载facenet的工程,使用代替

import facenet.src.facenet as facenet

将文件复制到上一级目录下使用,因为align.face_detect和矫正代码在同一目录下。

insightface的代码face2rec2.py代码有些问题,猜测时作者更新以后忘记里。
使用incubator-mxnet里的im2rec.py

生成.lst文件,最新的mxnet代码里,直接使用–list和–recursive,不用添加ture。地址最好选择绝对地址,不用相对地址
生成rec和idx文件时,使用同一个.py。–num-thread为多线程操作
生成的.lst .rec .idx 都在Mxtest目录下

python im2rec.py --list  --recursive  /opt/app/OCR/face-for-train/Mxtest/train /opt/app/OCR/face-for-test/lfw_mxnet/ 
 python im2rec.py --num-thread 4  /opt/app/OCR/face-for-train/Mxtest/train /opt/app/OCR/face-for-test/lfw_mxnet/

之后会生成

在这里插入图片描述

出现这种问题,cudaMalloc failed: out of memory

Traceback (most recent call last):
  File "train.py", line 1025, in 
    main()
  File "train.py", line 1022, in main
    train_net(args)
  File "train.py", line 1016, in train_net
    epoch_end_callback = epoch_cb )
  File "/opt/app/anaconda3/envs/py27/lib/python2.7/site-packages/mxnet/module/base_module.py", line 529, in fit
    self.update()
  File "/opt/app/anaconda3/envs/py27/lib/python2.7/site-packages/mxnet/module/module.py", line 664, in update
    self._kvstore, self._exec_group.param_names)
  File "/opt/app/anaconda3/envs/py27/lib/python2.7/site-packages/mxnet/model.py", line 153, in _update_params_on_kvstore
    kvstore.push(name, grad_list, priority=-index)
  File "/opt/app/anaconda3/envs/py27/lib/python2.7/site-packages/mxnet/kvstore.py", line 234, in push
    self.handle, mx_uint(len(ckeys)), ckeys, cvals, ctypes.c_int(priority)))
  File "/opt/app/anaconda3/envs/py27/lib/python2.7/site-packages/mxnet/base.py", line 252, in check_call
    raise MXNetError(py_str(_LIB.MXGetLastError()))
mxnet.base.MXNetError: [11:07:49] src/storage/./pooled_storage_manager.h:143: cudaMalloc failed: out of memory

实际上就是爆显存了,降低batchsize到64就好累

CUDA_VISIBLE_DEVICES='0,1' python -u train.py --network r100  --data-dir ../datasets/faces_glintasia/ --ckpt 2 --target lfw --version-se 0 --per-batch-size 64 
CUDA_VISIBLE_DEVICES='0,1' python -u train.py --network r100  --data-dir ../datasets/faces_glintasia/ --ckpt 2 --target lfw --version-se 0 --per-batch-size 64  --pretrained ../models/model-r100-ii/model,0 --lr 0.001 --prefix ../model_v2/model-r100-v2

作者在issus里说,他移除里fc7点全部权重,所以我们在新的数据集上训练的acc会从0开始上升,可以看到上升的很快,远比我们从0开始训练的快的多。
参考何凯明大神去年关于pre-trained model的论文,在预训练模型上进行训练会加快训练速度,但最终的结果的精度并不会有本质上的提高。这里如果可以在网络结构里加入GroupN,应该会有1%到2%mAP的提升,当然不知道人脸识别里这个参数会是多少

Insightface项目实践爬坑指南(MXNET版)_第1张图片
这里的准确度就是在lfw上跑的准确度,因为我们是在其基础上进行finetuning的,所以在lfw上的acc已经达到99.8%

[lfw][4000]XNorm: 23.678398
[lfw][4000]Accuracy-Flip: 0.99817+-0.00229

在训练了10个epoch后,网络基本收敛,在glint-asia上的acc达到92%左右

05-13 07:05 root         INFO     Epoch[8] Train-acc=0.922817
05-13 07:05 root         INFO     Epoch[8] Train-lossvalue=0.503714

打包 lfw2pack.py
需要制作pairs.txt
pairs.txt第一行需要写清有多少个set的数据,和每个set多少个正样本
http://vis-www.cs.umass.edu/lfw/README.txt

parser.add_argument('--data-dir', default='', help='')
parser.add_argument('--image-size', type=str, default='112,96', help='')
parser.add_argument('--output', default='', help='path to save.')

你可能感兴趣的:(工作日志)