caffe crnn windows上编译多标签分类版本
目的是解决caffe crnn+ctc识别定长字符串的问题,参考代码地址:https://github.com/yalecyu/crnn.caffe。作者是linux+pycaffe,我尝试改为windows+vs编译。
1.vs2013编译crnn-caffe
参考的代码是pycaffe实现生成验证码识别,无奈对python不熟悉,打算在VS2013上编译cuda8.0+cudnn-v5的多标签caffe.exe,输入数据为ImageData,方便后续自动生成图像后进行训练。
首先需要修改caffe源码,我的源码是caffe-windows,参考的是这篇博客:https://blog.csdn.net/u013010889/article/details/54614067,修改相关image_data_layer代码,实现多标签输入。再把crnn.caffe工程中的continuation_indicator_layer、ctc_loss_layer、labelsequence_accuracy_layer、permute_layer以及第三方库相关文件复制到相对应的目录下,包括.cpp、.cu、.hpp文件。对比crnn-caffe和caffe源码caffe.proto,修改caffe.proto内容。参考VS2013编译GPU版本caffe:https://www.cnblogs.com/xqy1205/p/10295862.html,将上述crnn的文件添加到工程的libcaffe目录下,进行编译。至此,就实现了多标签输入的crnn-caffe.exe,在window平台可以直接使用命令行进行训练。使用caffe.exe time -model deploy.proto可以测试是否编译成功。
2.准备训练图
生成一些图像,resize到固定尺寸,生成标签。根据修改的image_data_layer代码,标签格式为 图像地址 标签1 标签2 标签3,地址和标签之间间隔一个空格。修改prototxt文件内的路径,参考网上教程和crnn-caffe的网络结构,修改路径和网络参数。需要注意的是多标签输入为ImageData格式,参数需要增加一个label_dim;crnn网络中Reshape层的w*h参数要根据自己图像的宽高进行调整,作者默认为宽128*高32的图像经过卷积后为13*1,之后的ContinuationIndicator层、CtcLoss层time_step也要对应修改。测试使用的图像比较少,需要根据实际修改batch_size、test_interval、test_iter参数,我测试使用大概100张图像,训练几秒就收敛了。
3.测试识别效果
把crnn-caffe的examples\cpp_recognition\recognition.cpp代码替换caffe源码的classification.cpp,编译生成classification.exe,安装作者说明的格式,运行./build/examples/cpp_recognition/recognition.exe (your).jpg deploy.prototxt (your).caffemodel可以查看识别结果。
参考博客:
https://github.com/yalecyu/crnn.caffe
https://blog.csdn.net/u013010889/article/details/54614067
https://www.cnblogs.com/xqy1205/p/10295862.html
https://blog.csdn.net/pkuhyz/article/details/82427384