通过前几节的介绍,读者应该对Fast R-CNN有了基本的了解,并且准备好了训练和测试的数据集。本节基于Fast R-CNN源码分别介绍训练、测试、评估和优化网络的方法,训练和测试过程主要参考文献[8]。
5.7.1 训练阶段
下面以侧脸数据集在Fast R-CNN上训练人脸检测网络模型为例,说明Fast R-CNN的训练过程。
1.下载预训练网络
首先下载预训练网络,本实验使用的是ImageNet模型。
2.准备数据集
在FRCNN项目下,新建一个DataSet文件夹存放训练和测试的数据集和对应的文件,目录结构如下:
在 5.6 节中使用EdgeBoxes方法在训练数据集上提取了对应的OP矩阵:edges_celianTrain.mat,将该矩阵放在FRCNN/data/selective_search_data路径下。
3.修改程序
FRCNN/lib/datasets下的文件是与训练和检测相关的程序,因此本实验对pasca_voc.py、factory.py、imdb.py和__init__.py进行修改。
将pascal_voc.py重命名为wang_detect_face.py,修改的一些主要代码如程序2所示。
程序2:wang_detect_face.py
程序3是factory.py修改后的代码,如下所示。
程序3:factory.py
此外,将wang_detect_face.py、factory.py、imdb.py和__init__.py头文件中的from.pascal_voc import pascal_voc修改为from.wang_detect_face import wang_detect_face。
读者可以按照参考文献[8]修改这些文件。
4.修改网络
在FRCNN/data下的fast_rcnn_models文件夹和imagenet_model文件夹内,分别有3个网络,表5-1所示为每个网络模型对应的类型。
表5-1 网络模型的介绍
本实验使用的网络模型是imagenet_models文件夹中的VGG_CNN_M_1024.v2.caffemodel。在选择好预训练模型后,还需要对网络中的参数进行修改。打开FRCNN/models/VGG_CNN_M_1024/train.prototxt,进行如下修改。
首先,将data层的num_classes 21修改为2(原来是20类+背景,本实验为人脸+背景,即2类)。
其次,将cls_score层的num_output 21修改为2。
最后,将bbox_pred层的num_output 84 修改为8(类别数乘以4)。
5.运行训练命令
通过前面几个步骤,已经完成了数据的处理、程序的调整和训练网络参数的修改。接下来,使用如下命令训练人脸检测模型。
训练结果模型保存在FRCNN/output/default下。
5.7.2 测试阶段
在进行测试前,首先需要修改测试网络和测试程序。
1.修改测试网络
将FRCNN/models/VGG_CNN_M_1024/test.prototxt文件中cls_score层的num_output 21修改为2,bbox_pred层的num_output 84修改为8。
2.修改测试程序
本书使用MATLAB测试程序,需要修改 FRCNN/matlab/fast_rcnn_demo.m文件,修改后的文件如程序4所示。
程序4:fast_rcnn_demo.m
3.运行测试程序
修改完成后,将待测试的图片路径和名称放在FRCNN/DataSet/test.txt内,并且每张图片的同级目录下,需要存放对应的OP矩阵,以_boxes.mat为后缀。
最后,执行如下命令:
运行完成后,检测结果会保存在detect_result.txt文件中,如下是本实验的运行结果文件。图5-2所示是一些测试图片的检测结果。
运行结果文件:detect_result.txt
图5-2 一些测试图片的检测结果
5.7.3 评估阶段
在测试完成后,需要对测试数据集进行评估。本书使用的评估方法和通常的评估方法一致,即若检测框和真实边界框的面积交集/面积并集 0.5,则认为该检测框检测到的为人脸区域。程序5是本书的评估程序。
程序5:eval_result.m
按照程序5评估后,可得到如表5-2所示的结果。
表5-2 检测结果
5.7.4 优化阶段
由表5-2可知,本次训练出的人脸检测模型的正确率只有86.4%。为了获得更优的人脸检测模型,需要调整modelsVGG_CNN_M_1024solver.prototxt文件中的参数,主要调整base_lr和stepsize。
网络参数文件:solver.prototxt