FSA-Net项目是用来做人脸角度计算的模型,网络是基于SSR-Net网络(测年龄的)改进而来的,改进的过程中也形成了几个相互有所差别的版本。该模型的github链接为:https://github.com/shamangary/FSA-Net,作者的网络实现是基于keras+tensorflow实现的。由于项目需要的是caffe或者MXNet版的模型,因此做了两方面的尝试,一个是keras模型转caffe,另一个是重新训练一个mxnet版的FSA。这里记录后者,先选取简单版本的FSA来复现,也就是最接近其前身SSR的版本,因为不同版本的效果其实相差不大,但简单版本的就方便复现很多。实现mxnet版的网络,主要是参考上述的FSA模型、SSR年龄检测mxnet版https://github.com/wayen820/gender_age_estimation_mxnet、和一些mxnet基础应用https://blog.youkuaiyun.com/scythe666/article/details/83058528。
1.整体
总文件夹如下:
FSA-MXNet
|---dataset #放mxnet数据的文件夹
|---300W_ALL.rec
|---AFLW2000_ALL.rec
|---model_output #保存输出的文件夹,没有训练模型
|---
|---test_img #用来测试的图片,这些图都是已经把人脸截取出来的了
|---xxx.jpg
|---train_ssr_angle.py #训练代码,我的github上面的为train_ssr_angle.py功能一样,下同
|---model_slim_angle.py #模型代码
|---test_ssr_angle.py #测试代码
|---data.py #数据读取的库文件
|---make_data # some code to make .rec dataset
|---300wlp2lst.py # make all data file's .lst
|---im2rec.py # python file from mxnet and I make some change to fit our net
|---div_data_lst.py # divide a large .lst into two small ones, which can be used as training set and test set respectively.
主要步骤范围mxnet模型建立,rec数据转化,写训练代码及训练,测试与验证。以下分别来说一下。具体的代码和数据,可以在我的github上面(github链接这几天会更新一下)找到,这里就不贴代码了,太长,影响阅读。例如train_ssr_angle.py 等我可能命名改为了train_fsa_angle.py ,功能是一样的。
2.模型建立
模型为model_slim_angle.py,是参考FSA-keras和SSR-mxnet来写的,整体还是比较简单的,主要是FSA后面的处理形成3个角度的部分有一点点复杂,我将这个部分合并成了网络计算的形式了。
3.数据转换
训练数据是用300W_LPhttp://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/Database/300W-LP/main.htm
验证集是AFLW2000http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/Database/AFLW2000-3D.zip
首先是需要把以上的数据转换成为mxnet的rec格式,这个过程主要是分为两步,生成lst文件,生产rec文件。
3.1 生成lst文件
这里实际上还对图片进行了预处理,把人物脸部截取出来,并过滤掉人脸超出边界的和角度值过大的(正负90度)。同样的,这个代码也简单,各位看懂也问题8大。代码为300wlp2lst.py。这样就可以生成lst文件了,下面是文件的部分截图
3.2 生成rec文件
网上的绝大部分说生成mxnet的rec的博客,都是针对分类,一个图片对应一个标签。但这种方式在本网络不太可行,我用这种方式试过,最终只读了一个标签出来,而我的网络是3个标签,然后就报错了。因此是要先修改一下im2rec.py文件:
、
如截图部分修改一下,header所读取的东西变成了3个数,而不是一个标签了,然后就在终端运行:
python im2rec.py ./300W_ALL.lst ./300W_ALL
im2rec.py文件是mxnet自带的,可以复制出来到自己的工程中再修改和调用,然后,./300W_ALL.lst是之前生成的lst文件,./300W_ALL是放处理过的图片的文件夹。运行过后可以生成最终的rec文件了,这个文件的大小会和这个300W_ALL文件差不多大的,如果你生产的rec大小差了很多,那就有问题的,需要注意。另外,lst里面所包含的图片名字,必须在300W_ALL里面都包含有相应的图片,反过来,300W_ALL里面有的图片,lst中可以没有。所以当你想用同一个数据集来测试和训练,可以将这个大的lst拆分层两个,最后制作rec的时候,就可以都指向这个300W_ALL文件夹。
4.训练代码
感觉mxnet的训练,和keras的有些像,粒度比tensorflow大,比caffe小。train_fsa_angle.py 是训练代码
训练的时候,直接终端调用就行了:
python train_ssr_angle.py
下面是训练的时候的部分截图,暂时还有点过拟合,训练我写的同样的keras网络,是没有问题的,有点尴尬咯~~~~
5.测试代码
测试代码就是加载模型和运行模型,test_fsa_angle.py
运行的时候,也是直接python:
python test_ssr_angle.py
测试部分,有一点是需要注意的,我测试的图是已经抠出来的人脸图片(这个图片集不能共享),具体抠出来的图人脸占比应该多大,是有参考值的。就是一开始制作lst文件的时候,Python脚本也进行了抠图,具体看可以发现,是数据集自带的人脸边界框再往外扩0.6倍的长宽,自己制作测试的图片的时候也应该参考这个值。