vlambda博客
学习文章列表

迁移学习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 格式,如下图,有一张原始图像:


迁移学习SSD深度网络模型,实现文本行检测

迁移学习SSD深度网络模型,实现文本行检测


迁移学习SSD深度网络模型,实现文本行检测


x上面代码运行结果是得到如下的 XML 文件,同样用上面的 100.jpg 图像示例,其转换结果如下:


迁移学习SSD深度网络模型,实现文本行检测


上面代码生成的 XML 文件,与图像文件存储在一个地方。


生成训练图像与 XML 标签的位置文件

这一步,按照 SSD 训练的需求,将图像位置,及其对应的 XML 文件位置写入一个 txt 文件,供训练时读取,一个文件名称叫做:trainval.txt 文件,另一个叫做:test.txt 文件。形式如下:


迁移学习SSD深度网络模型,实现文本行检测


生成的代码如下:


迁移学习SSD深度网络模型,实现文本行检测


生成 test name size 文本文件

这一步,SSD 还需要一个名叫:test_name_size.txt 的文件,里面记录训练图像、测试图像的图像名称、height、width。内容形式如下:


迁移学习SSD深度网络模型,实现文本行检测


准备标签映射文件 labelmap

这个 prototxt 文件是记录 label 与 name 之间的对应关系的,内容如下:


迁移学习SSD深度网络模型,实现文本行检测


我的 prototxt 文件名称,被我重命名为:labelmap_voc.prototxt


生成 lmdb 数据库

准备好上述的几个文本文件,将其放置在如下位置:

迁移学习SSD深度网络模型,实现文本行检测


训练模型


将 SSD 用于自己的检测任务,是需要 Fine-tuning a pretrained network 的。


具体的,需要加载 SSD 作者提供的 VGG_ILSVRC_16_layers_fc_reduced.caffemodel,在这个预训练的模型上,继续用我们的数据训练。

https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6


下载下来后,放在如下位置下面:


迁移学习SSD深度网络模型,实现文本行检测


我的训练参数


其实还需要修改一些,如训练时的参数。因为一开始若直接用作者 ssd_pascal.py 文件中的默认的 solver.prototxt 参数,会出现如下情况: 


迁移学习SSD深度网络模型,实现文本行检测


跑着跑着,loss 就变成 nan 了,发散了,不收敛。

我调试了一段时间,我的 solver.prototxt 参数设置如下,可保证收敛:

base_lr: 0.0001


其余参数可看自己设置。学习率一定要小,原先的 0.001 就会发散。

训练结束: 


迁移学习SSD深度网络模型,实现文本行检测


可以看见,最后的测试精度为 0.776573,感觉 SSD 效果还可以。


我自己训练好的模型,上传到云端了:

http://share.weiyun.com/1c544de66be06ea04774fd11e820a780 

(密码:ERid5Y)


这个需要在下一阶段的测试中用到。



用训练好的 model 进行 predict


SSD 的作者也给我们写好了 predict 的代码,我们只需要该参数就可以了。


用 jupyter notebook 打开 ~/caffe/examples/ssd_detect.ipynb 文件,这是作者为我们写好的将训练好的 caffemodel 用于检测的文件。


指定好 caffemodel,deploy.txt,详细的看我上传的代码吧。


测试几张图像,结果如下: 


迁移学习SSD深度网络模型,实现文本行检测


迁移学习SSD深度网络模型,实现文本行检测







阅读过本文的人还看了以下文章:






























































不断更新资源

深度学习、机器学习、数据分析、python

迁移学习SSD深度网络模型,实现文本行检测



机器学习算法资源社群

不断上传电子版PDF资料

技术问题求解




海淘美妆