首先,这是一篇没搞懂为什么但是做出来了东西的博客。主要用于本人备忘,参考价值有限。
Faster RCNN用于人脸识别已经有一些人做过,我只是一个重现者。有篇《Face Detection with the Faster R-CNN》的paper讲述了相关内容,大致意思就是用WIDER FACE库去训练模型。因此,我尝试了此种方法。
按照惯例,感谢以下链接的作者给我的参考:
https://www.cnblogs.com/linyuanzhou/p/6043436.html
http://blog.csdn.net/zhangzm0128/article/details/72593745
http://blog.csdn.net/a8039974/article/details/77628717
一、下载WIDER FACE库
可在链接http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/中下载,建议使用Baidu Drive,同时,Face annotations和Examples and formats of the submissions最好也下载。(最后那个好像没啥用,但是Face annotations必须下载)
二、widerface数据库转voc2007数据集
为了方便faster rcnn做训练,必须先把wider face数据库转为voc2007格式。
按照链接https://www.cnblogs.com/linyuanzhou/p/6043436.html中的代码即可完成。
值得注意的是,转换出来后,和voc2007相比,\ImageSets\Main路径下只有train.txt和val.txt,并没有trainval.txt和val.txt。这是由于widerface库的wider_face_split路径下没有wider_face_trainval_bbx_gt和wider_face_test_bbx_gt(根据我的分析是这样,不知道对不对)。
三、训练Faster RCNN
首先,训练之前需要一些模型文件。根据官方给出的方法https://github.com/rbgirshick/py-faster-rcnn,需要先下载好imagenet_models和VOCdevkit2007,并放置在data路径下。
imagenet_model是预训练模型,用来初始化网络参数。VOCdevkit2007是实际用来训练的数据。这里我提供自己的网盘文件供下载。链接:https://pan.baidu.com/s/1qZHGcwO 密码:p26g。
然后根据http://blog.csdn.net/zhangzm0128/article/details/72593745的方法进行训练。
首先要把widerface得到的voc2007格式分别替换掉data\VOCdevkit2007\VOC2007\下的JPEGImages、ImageSets\Main、Annotations文件夹内容。然后再进行训练。
但是这里会有几个问题,按照该方法,会报错VOCdevkit2007\VOC2007\ImageSets\Main路径下没有trainval.txt文件(第2节提到过这个问题)。于是我把train.txt复制了一份并命名为trainval.txt。
其次,可能会出现TypeError: slice indices must be integers or None or have an __index__ method和TypeError: 'numpy.float64' object cannot be interpreted as an index等问题。这其实是由于numpy的版本问题造成的,numpy版本过高(大于1.11.0版本)。所以本来是可以把numpy将为1.11.0版本来解决的。然而,降级后,会出现新的错误,ImportError: numpy.core.multiarray failed to import。这个坑爹的错误是由于numpy版本过低,需要升级。作者在这里卡了很久很久,终于找到了一篇博客完美解决了问题。
http://blog.csdn.net/a8039974/article/details/77628717
不要用该博客中升级numpy的方法,而是安装其修改文件内容的方法去做,即可解决问题。
接着只需要继续训练网络即可。我是2GB显存的1050显卡,大概跑了3个多小时。然后报错没有test.txt文件(第二节提到过)。不过我发现其实这时模型已经训练好了存储在\output\faster_rcnn_end2end\voc_2007_trainval路径下,所以就没有再管它了。事实证明,确实不需要管它。
四、模型的demo
到这一步之后,仍然按照http://blog.csdn.net/zhangzm0128/article/details/72593745的方法去做,但是会有问题,就是什么东西都检测不出。后来我发现,还需要进行以下修改:
1、找到\models\pascal_voc\VGG_CNN_M_1024\faster_rcnn_end2end路径下的test.prototxt,将最后输出层的类别改好:
2、把tools文件夹下的demo.py进行修改:
完成以上修改以后,在cmd中运行python demo.py即可。