insightface原理,insightface训练
MX框架用于图像相关项目时,读取图像的方式主要有两种:
第一种是读.rec格式的文件
,类似于Caffe框架中的LMDB。好处是。rec文件是稳定的,当移植到其他计算机时可以复制。缺点是占用空间(的大小。rec文件和图片的存储大小基本相同),添加或删除数据不灵活。第二种是.lst和图像结合的方式
首先。lst文件将在前面生成。记录文件。这个。lst文件是相应的图像路径和标签列表。也就是说,维护这个列表可以控制你的训练集和测试集的变化。优点是灵活,不占空间。缺点是如果图像格式不符合要求,很容易出错。如果删除了列表中某些图像路径对应的图像文件夹中的图像,将找不到它。此外,如果你
1、.rec
主要分两步:生成.lst和生成.rec
1.1、生成.lst
需要准备的就是你的图像。
假设你的图像数据放在/home/image文件夹下,在/home/image文件夹下有10个子文件夹,每个子文件夹都保存着属于这个类的图像文件。你可以用英文名字给这些子文件夹命名来表示类别,也没关系,哪怕你用1到10的10个数字来给这10个子文件夹命名。另外,假设你想把生成的。lst文件,并且您的mxnet项目的路径是~/incubator-mxnet,那么您可以生成。lst文件,方法是运行以下命令:python ~/initiator-mxnet/tools/im 2 rec . py-list True-recursive True-train-ratio 0.9/home/lst/data/home/image1list参数必须为True,这意味着您正在生成一个。lst文件。recursive参数必须为True,表示应该写入所有图像路径。lst文件。- train-ratio参数表示train和val被划分了多少,默认值为1,表示它们都是train的数据。
这样,/home/lst文件夹中就会生成data_train.lst和data_val.lst两个文件。
的例子。lst文件:第一列是索引,第二列是标签,第三列是图像路径。
当然有时候可能你的数据图像不是按照一个类别放在一个文件夹这种方式,那么就要考虑修改这个脚本来生成相同格式的.lst文件才能用于后续生成.rec文件。
1.2、生成.rec
需要准备的就是第一步生成的.lst文件和你的图像。
假设您想要放置生成的。rec文件与。lst文件(这是通常的情况),那么您可以生成。rec文件,方法是运行以下命令:
python ~/initiator-mxnet/tools/im 2 rec . py-num-thread 4/home/lst/home/image1
这里倒数第二个参数:/home/lst是你的.lst文件所放的路径,可以不用指明.lst文件名称,因为代码会自动搜索/home/lst文件夹下所有以.lst结尾的文件。最后一个参数:/home/image是你的图像所放的路径。
num-thread 4该参数表示由4个线程执行。当jjdxmg有大量数据时,生成的过程。rec会比较慢,所以可以加速。成功操作后,data_train.rec和data_val.rec文件在/home/rec文件夹中生成,然后。rec文件可以用
mxnet.io.ImageRecordIter
类导入。另外两个。会生成idx文件,可以忽略。
2、.lst + 图像
的产生。这里的lst文件与前面1.1节中的文件相同。然后用
mxnet.image.ImageIter
类导入。lst和图像数据。可以参考博客:MXNet如何用mxnet.image.ImageIter直接导入图片2.Insightface的培训设置了制作rec和idx的要求
rec和idx中的数据集需要首先对齐。作者的$INSIGHTFACE/src/align的对齐代码可以用来对齐生成lst。使用face2rec2.py将在指定目录中找到以lst结尾的文件,因此可以将lst重命名为example.lst运行face2rec2.py将在指定目录中生成example.rec和example.idx。属性定义数据集的格式。整体内容如下:1000,112,112,其中1000代表人脸的类别数,图片格式为112x112。CD $ insight face src data python face 2 rec 2 . py-encoding=。png $ insight face/datasets/face clubs _ aligned 12过程中我把lst中的相对路径改成了绝对路径,发现相对路径会有一些小问题。
如果用自己的lst,需要注意格式,举个栗子。
1 path/Adam_Brody/Adam_Brody_277.png 25
第一个参数“1”表示对齐的图片,第二个参数表示图片的路径,第三个参数表示图片的标签号。
中间不能用空格隔开,必须用/t(TAB)隔开。使用空格会产生错误。
2、训练模型的入口
我们知道训练一个模型需要定义一个网络结构,然后输入网络数据,最后训练得到一个合适的模型。现在微调基本都是在预训练模型上做的,这里直接介绍一下MxNet中微调的快速操作。详细讲解可以参考博文:MXNet的前期训练:fine-tune.py源代码。
在fine-tune.py的脚本中,最重要的是调用fit.fit()函数training。关于这个fit.py脚本的介绍,可以参考博客:MXNet的培训入口:fit.py源代码详解。这个剧本也是最后培训前打包的剧本。那么具体训练的细节在哪里呢?答案是base_module.py和module.py.Base_module.py是MxNet训练模型的基类的脚本,而module.py是在Base_module中继承基类的具体实现,包括前向和后向转移等。相关博文请参考:MXNet的训练基础脚本:base_module.py和MXNet的训练实现脚本:module.py。
3、关于数据读取和预处理
Fine-tune.py这个脚本是MxNet官方写的。默认的数据读取方法是。rec,类似于咖啡馆里的LMDB。数据读取请参考博文:MXNet的数据读取:data.py源代码详细解释。一般这个。rec格式的数据需要更多的存储空间,jjdxmg需要重新生成一个新的。rec文件时,它需要灵活地增加或减少数据,这不是很灵活。所以建议使用lst列表和原图结合的数据读取方法。请参考博文:MXNet如何用mxnet.image.ImageIter直接导入图像这种数据读取的方法还涉及到图像预处理。在原来的MxNet项目中没有相应的例子。详见博文:MXNet的数据预处理:mxnet.image.CreateAugmenter源代码。了解如何在mxnet.image.ImageIter中进行图像预处理
这里有几个例子来说明,
1.最具成本效益的模式:
CUDA_VISIBLE_DEVICES=0,1,2,3 Python-U Train _ softmax . py-network r100-Loss-Type 4-Margin-m 0.5-Data-Dir./Datasets/Faces _ MS1m _ 112 x12-前缀./Model-R100-NetworkR100表示使用LRESNet
-损耗-类型4和-余量-m 0.5表示使用我们的附加角度损耗。
- data-dir指定训练数据目录。
- prefix指定模型输出目录。
每张卡的默认每批大小为128,可以根据每批大小进行修改。
默认情况下,每2000个迭代器输出一次验证集结果,包括LFW、CFP和AGEDB-30。可以通过- verbose对其进行修改。
硬件要求:4*P40。如果只有12G卡,请参考问题32。
这个模型可以完美复现我们提交的MegaFace结果, 并且lfw能达到99.81或99.83.
(提供的训练数据集已经用FaceScrub消除了重复字符。如果没有,MegaFace有可能达到98.5左右。与此同时,在另一个用LFW消除重复字符的实验中,LFW的准确率并没有下降。)
2.火车移动ETV 1,软件最大。
CUDA_VISIBLE_DEVICES=0,1,2,3 python-u train _ softmax . py-network m1-loss-type 0-data-dir./datasets/faces_ms1m_112x112 -前缀./除了-网络m1和-损耗类型0之外,模型-m1-softmax基本上与上面的例子相同。-loss-type 0代表Softmax Loss,m1代表MobileNetV1。我们还支持InceptionResNetV2、DPN、DenseNet等等。
3.微调三重损耗,基于上述模型。
CUDA_VISIBLE_DEVICES=0,1,2,3 python-u train _ soft max . py-network m1-loss-type 12-lr 0.005-mom 0.0-每批大小150 - data-dir./datasets/Faces _ MS1m _ 112 x12-预训练./model-m1-softmax,50前缀./model-m1-triplet注意以下参数(lr、重量衰减、动量等。).-损耗-类型12代表三重损耗。此外,我们已经把半硬开采
模型测试和部署:
0. 预训练模型下载:
0.1 lres net 50-IR:https://pan . Baidu . com/s/1 mj 6 x7m klfw:99.80
0.2 lres net 34-IR:https://pan.baidu.com/s/1JKHEXWLFW: 99.65。单图模型推理时间(包括对齐):17ms
1. Verification Test.
LFW、CFP和AGEDB-30在训练中不断接受测试。如果想用训练好的模型测试这些项目的得分,请参考src/eval/verification.py .
2.MegaFace Test.
参考src/megaface/目录,分三步:第一步,对齐FaceScrub和megaface牵引器。其次,生成相应的特征(src/megaface/gen _ megaface.py)。第三,运行megaface开发包。
3.模型部署.
我们为模型部署提供了一些脚本。值得注意的是,输入图像不需要对齐,只需要在人脸检测后进行裁剪。
3.1进入部署/文件夹。
3.2训练或下载训练好的模型。
3.3参考deploy/test.py输入一张检测并切割的人脸照片,返回512维嵌入。使用上面提到的LResNet34-IR模型,一次推断只需要17毫秒(英特尔E5-2660 @ 2.00GHz,特斯拉M40)。