http://blog.csdn.net/hduxiejun/article/details/54234766
FCN网络的训练——以燃气表数字识别为例
目录
用 [TOC]
来生成目录:
(0)写在前面
知乎上面曾有个文章讲用全卷积神经网络(Fully Convolutional Networks for Semantic Segmentation)的方法识别燃气表数字识别的项目,训练阶段, 标定燃气表数字中心一块区域的像素点为该类数字的正样本,, 不同数字的中心区域的像素被标定为不同的类别, 十种数字加上背景一共十一类, 不同颜色表示不同类别的标注, 其他的都是背景类。最后对每个像素计算softmax loss。
测试阶段通过全卷积网络得到输入燃气表图像每一个像素的分类结果, 接着进行非极大值抑制, 形态学变换等后续操作, 可直接得到上图的识别结果”000470”, 整个系统十分高效。原作者开源了基于Caffe的实现,代码链接 GitHub - SHUCV/digit: digital meter numbers detection.
但git下来之后发现有些问题,比如训练后的loss在训练1000次之后基本不下降,最后loss还是很大,识别准确率差,最后识别的数字位置和原数字位置对不上等问题。因此对原网络进行好了修改,修改后的网络已上传Git。
修改后的github链接:
https://github.com/CrazyVertigo/digits2.0
下面讲一下训练步骤:
(1)训练
1. 下载预训练模型:下载预训练模型:fcn-32s-pascalcontext.caffemodel,然后解压至CAFFE_ROOT下的models/fcn-32s-pascalcontext.caffemodel;
下载地址:
2. 下载训练数据:下载训练数据:然后解压至CAFFE_ROOT下的data/;
下载地址:
3. 转换数据格式:执行 python examples/fdigit/convert.py;
注:要根据自己的CAFFE_ROOT目录修改代码中的CAFFE_ROOT路径
CAFFE_ROOT = ‘/home/hdu/caffe/’
4. 开始训练:执行python solve.py
默认在GPU上运行,loss在迭代训练期间很快下降。
(2) 测试
1. 下载模型参数文件: fcn-32s-pascalcontext.caffemodel ,然后放置到CAFFE_ROOT下的models/fcn-32s-pascalcontext.caffemodel;
下载地址:
2. 测试样本图片:matlab examples/fdigit/test_fcn11_full.m 需要成功安装Matlab and matcaffe
(3)数据说明
1.输入原图
2.对应ground truth:
上图对应的标注如下所示:
可以看出对不同的数值用不同的颜色进行标注,加上背景一共有11总颜色。
(4)主要修改如下:
1.prototxt修改:
layer {
type: "Crop"
name: "score"
top: "score"
bottom: "upscore_new"
bottom: "data"
crop_param{
axis:2
offset:19
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2.matlab的test_fcn11_full.m文件:
主要修复了原始版本中分割结果显示重叠的问题,详见github中test_fcn11_full.m文件。
(5)结果展示
1.输入test图片
原始版本
5.1 识别结果
识别的结果如下图所示:
5.2 loss曲线如下所示:
可以看到整个网络在10000次以后基本属于震荡阶段。
可以看到识别的结果整体偏右下方移动,可能是原先网络的crop层的参数有问题。
新的版本
5.3 识别结果
在识别多张图片的时候,显示重叠的Bug也得到修复,如下图所示。
5.4 修改之后的loss曲线
可以看到loss曲线图相比之前1.5左右降低很多,稳定在0.4左右,识别准确率也有所增加。
网络结构可视化如图
网络结构可视化如图
知乎地址:
https://zhuanlan.zhihu.com/p/21930884?refer=intelligentunit
原github链接:
https://github.com/SHUCV/digit
我的github链接如下所示:
https://github.com/CrazyVertigo/digits2.0