迁移学习SSD深度网络模型,实现文本行检测
向AI转型的程序员都关注了这个号👇👇👇
论文阅读:SSD: Single Shot MultiBox Detector 中,讲了这个最新的 Object Detection 算法。
https://blog.csdn.net/u010167269/article/details/52563573
既然 SSD 是用来检测物体的,那么可不可以将 SSD 用来检测自然场景图像中的文字呢?答案肯定是可以的~
这篇文章记录我自己将 SSD 用于文字检测的过程。
本文项目代码 获取方式:
准备与转换数据集
ICDAR 2011 数据集训练集共有 229 张图像,我将其分为 159 张、70张图像两部分。前者用作训练,后者用于训练时进行测试。
http://robustreading.opendfki.de/trac/wiki/SceneText
下面就是要将这些图像,转换成 lmdb 格式,用于 caffe 训练;将文字区域的标签,转换为 Pascal VOC 的 XML 格式。
将 ground truth 转换为 Pascal VOC XML 文件
先将 ICDAR 2011 给定的 gt_**.txt 标签文件转换为 Pascal VOC XML 格式。
先看下原来的 gt_**.txt 格式,如下图,有一张原始图像:
x上面代码运行结果是得到如下的 XML 文件,同样用上面的 100.jpg
图像示例,其转换结果如下:
上面代码生成的 XML 文件,与图像文件存储在一个地方。
生成训练图像与 XML 标签的位置文件
这一步,按照 SSD 训练的需求,将图像位置,及其对应的 XML 文件位置写入一个 txt 文件,供训练时读取,一个文件名称叫做:trainval.txt 文件,另一个叫做:test.txt 文件。形式如下:
生成的代码如下:
生成 test name size 文本文件
这一步,SSD 还需要一个名叫:test_name_size.txt
的文件,里面记录训练图像、测试图像的图像名称、height、width。内容形式如下:
准备标签映射文件 labelmap
这个 prototxt
文件是记录 label 与 name 之间的对应关系的,内容如下:
我的 prototxt
文件名称,被我重命名为:labelmap_voc.prototxt
生成 lmdb 数据库
准备好上述的几个文本文件,将其放置在如下位置:
训练模型
将 SSD 用于自己的检测任务,是需要 Fine-tuning a pretrained network 的。
具体的,需要加载 SSD 作者提供的 VGG_ILSVRC_16_layers_fc_reduced.caffemodel,在这个预训练的模型上,继续用我们的数据训练。
https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6
下载下来后,放在如下位置下面:
我的训练参数
其实还需要修改一些,如训练时的参数。因为一开始若直接用作者 ssd_pascal.py
文件中的默认的 solver.prototxt
参数,会出现如下情况:
跑着跑着,loss 就变成 nan
了,发散了,不收敛。
我调试了一段时间,我的 solver.prototxt
参数设置如下,可保证收敛:
base_lr: 0.0001
其余参数可看自己设置。学习率一定要小,原先的 0.001 就会发散。
训练结束:
可以看见,最后的测试精度为 0.776573,感觉 SSD 效果还可以。
我自己训练好的模型,上传到云端了:
http://share.weiyun.com/1c544de66be06ea04774fd11e820a780
(密码:ERid5Y)
这个需要在下一阶段的测试中用到。
用训练好的 model 进行 predict
SSD 的作者也给我们写好了 predict 的代码,我们只需要该参数就可以了。
用 jupyter notebook 打开 ~/caffe/examples/ssd_detect.ipynb 文件,这是作者为我们写好的将训练好的 caffemodel 用于检测的文件。
指定好 caffemodel,deploy.txt,详细的看我上传的代码吧。
测试几张图像,结果如下:
阅读过本文的人还看了以下文章:
不断更新资源
深度学习、机器学习、数据分析、python
机器学习算法资源社群
不断上传电子版PDF资料
技术问题求解
海淘美妆