[caffe]MTCNN实践
实现参考:https://github.com/foreverYoungGitHub/MTCNN
MTCNN作者提供了matlab版的测试代码,但是实验室的生产环境是caffe,这篇文章记录下使用C++改写MTCNN的一些注意点。
类似于caffe提供的examples里的cpp_classification,创建MTCNN类用于其他函数调用。
1、MTCNN构造函数中使用模型文件和训练文件初始化网络
2、预处理:与matlab按列存储数据不同,caffe按行存储数据,因此,如果想要使用作者提供的caffemodel和prototxt文件,需要在预处理阶段将图像进行转置处理
3、P-Net:多尺度缩放图像,全卷积输出得到边界框校正回归向量和类别向量,根据边界框校正回归向量(归一化值)生成在输入图像上的边界框表示(左上点坐标、宽度、高度),这里需要注意的是记住P-Net中池化下采样的倍数,然后才能根据每幅图的输出大小乘以相应的下采样倍数还原到输入图像大小。得到每幅图像的一系列候选框后,进行NMS处理。
4、R-Net:在原图上裁剪P-Net输出的矩形区域进行归一化作为输入,送入网络输出边界框偏移量,在P-Net边界框的基础上进行校正计算,然后进行NMS处理。
5、O-Net:操作类似于R-Net。
训练:
(1)使用caffe进行训练时由于输入是多标签数据,可以考虑定义自己的层类型、Python数据输入层或者HDF5文件。
(2)因为是多任务训练,所以损失函数需要多个损失组合。