训练深度网络模型
OpenFace还不是运用faceNet的model作为训练模型,所以在准确性上比faceNet要低,如果你只是做一个简单的分类,建议你看看官网的demo3(http://cmusatyalab.github.io/openface/demo-3-classifier/),如果你想自己训练一个模型,建议提供一个大于500k的图片集作为训练集。(这里的500k应该是50w张图片来理解更合适)
Openface暂时还没提供该faceNet模型的支持。
注意:在K40Gpu的机器上训练数据估计要耗费很多的内存还有一整天的时间,所以务必准备相应的硬件支持。
1)创建原生图片目录data/mydataset/raw
Raw目录下再建立各个分类目录,这些分类目录的名字将是分类的标签名,在子目录下面就存放各个分类的图片。
2)预处理原生图片
如果你想比较你图片集跟LFW数据集的准确率,你可以使用项目中提供的脚本来清除你图片集中带有LFW特征的图片(data/casia-facescrub/remove-lfw-names.py)
我们启用8个线程来预处理图片:
for N in {..}; do ./util/align-dlib.py <path-to-raw-data> align outerEyesAndNose <path-to-aligned-data> --size & done
注:<> 括号里是自己的目录,自己需要根据实际改写
然后修剪生成分类目录,在每个分类目录下存放3张精选的图片:
./util/prune-dataset.py <path-to-aligned-data> --numImagesThreshold
注:3这个阈值,你可以根据情况自己设置
3)训练模型
执行 training/main.lua文件去训练模型(在 training/opts.lua文件里编辑选项或者通过命令行传参执行)然后会产生损失函数和处理模型到training/work这个目录里。对于GPU内存来说,大概需要耗费128G内存,需设置-peoplePerBatch和-imagesPerPerson(默认分别是15和20)来减少内存的消耗。(这些参数可限制每批次处理的上限)
注意:数据目录的metadata(元数据)存放在缓存里training/work/trainCache.t7;如果数据目录发生改变了,删除这些元数据,他会重新生成一个。
停止或者重启训练
每次训练迭代都会把模型存放在work里面,如果训练进程被kill掉,你可以通过-retain参数重启。你也可以设置不同人工种子-manualSeed来作为图片序列采样,-epochNumber设置迭代次数。
这里需要你懂点lua语言的应用的,不然真的一头雾水,主要的翻译就这样了
4)分析训练结果
验证损失函数: training/plot-loss.py.
需要装相应的依赖,相应依赖存放在 training/requirements.txt,可以执行以下命令安装:
pip2 install -r requirements.txt
模型的正确率:
Openface 官方有说明默认是使用nn4.small2,有3733968个参数,预计准确率为93左右
LFW数据集在国外训练model挺流行,可是在国内感觉不怎么行,毕竟采集的人物大都是外国人为准;关于模型的正确率,你可以参考这个链接:
http://cmusatyalab.github.io/openface/models-and-accuracies/
http://cmusatyalab.github.io/openface/training-new-models/