图片文字提取项目
检测网络:CRAFT,基于字符区域感知的文本检测;
CRAFT源码:https://github.com/clovaai/CRAFT-pytorch
识别网络:crnn+seq2seq,编解码结构,文字识别;
crnn+seq2seq源码:https://github.com/bai-shang/crnn_seq2seq_ocr_pytorch
1. 写在最前面
项目花了一个星期,基本上也是去github上拿现有得模型拼凑起来得项目。
效果也达不到商业级别。只可供学习交流,也欢迎各位大佬大神交流学习,批评指教。
附上我在github上上传的代码。https://github.com/ooooxianyu/craft_rcnn_forch
检测部分,即问文字检测。本来想自己用yoloV5试着自己训练做一下,但是文本检测和物体检测还是很不同的。比如文字的长短,方向……查了查网上基于yoloV3的文本检测,看了有一个用的CTPN对训练数据的标注信息做预处理的,先做文本分割,检测时候检测的文本也是分割一块一块的,在进行合并。附上这一篇,有兴趣的可以看看。自然场景OCR检测(YOLOv3+CRNN)
(内心:劝退,这有没有简单的方法。)
后来就找到现成的文本检测项目CRAFT。(连权重包都给我了,而且效果还贼好,那我还自己搞个啥子。(′д` )…彡…彡)
识别部分:之前整过验证码识别。然后那时候也学了RNN的一些实用操作。当然也了解了,文本识别为什么这么难。就比如,我们检测出来一行文字,但是却不知道它由多少个字符组成。也就是长短不一。
网上大部分的文本识别,基本上也都是基于CRNN的,大同小异,不同的模型之间顶多就是主干网络换一换啥的。
找了一篇CRNN+CTC的讲解:https://zhuanlan.zhihu.com/p/43534801
然后代码实现的话我自己选的是crnn&seq2seq,为什么选这个呢?(我是不会告诉你们,github的其他代码都好**的长,只有这个才几个代码几百行代码。d=====( ̄▽ ̄)b)另外,源码的权重包emmmm,识别特别差。所以我自己跑了训练集,训练集在这里拿,https://github.com/chineseocr/chineseocr,非常大的文本数据集。我也只用了里面的十几万张。(而且跑的时间很短,就几轮,跑了我半天 /(ㄒoㄒ)/~~)
事先说明,识别效果不是很好,还需要后续优化。比如训练久一点,提高一下数据集的多样性啥的。
而且,只能识别正图,就是图片文字是正方向的而且一行一行识别的,旋转和翻转以及竖着都会识别不出来。
接下来直接上干货。
2. CRAFT文本检测
CRAFT的基本原理看这里。我也只是大概看了一下,大概的意思就是说,这个算法就是基于字符的,我们一个一个字符检测,通过精确地定位每一个字符,然后再把检测到的字符连接成文本目标。我们只需要关注字符以及字符之间的距离,不需要关注整行文本,所以不需要很大的感受野。阿巴阿巴阿巴……
然后就git一下代码,然后上谷歌上下载下权重包。然后放进去权重,再把要测试的图片放进去,改改配置文件。跑一下test.py,就……出来了。
输出的结果由三个啊。我们只需要box的信息,然后再原图上进行裁剪,之后放入识别网络。
下面两张测试图片。(第一张是自己的车票,第二张是百度直接找的。)总体效果还是不错的嘛。好的,那就进入下一步识别!( •̀ ω •́ )y
3. CRNN&seq2seq文本识别
(1)啥是CRNN?
CRNN就是一个CNN加一个RNN组合起来就是CRNN。。。ㄟ( ▔, ▔ )ㄏ
(2)CRNN有啥用?
我们知道文本识别最大的问题就是,不知道文本的长度和大小,CRNN就可以解决这样的问题。只要把图片缩放成它输入的格式,网络是端到端的,就直接输出结果。(也就解决了文本长短大小不一的问题)而且这个网络小,速度快啊。
流程:
首先CNN提取图像卷积特征
然后seq2seq进一步提取图像卷积特征中的序列特征。
训练集,https://github.com/chineseocr/chineseocr,非常大的文本数据集。我自己在他模型的基础上跑了这个数据集。(样本标签为两个文本文件train.txt和test.txt,格式为:图片路径 文本)注意代码里面需要打开txt 文本的代码都要加上encoding=“UTF-8” 如下:(然后基本上没其他问题就能跑得通了)
with open('', encoding="UTF-8") as f:
把权重包放进去,(decoder和encoder)然后运行detect.py 。(修改好配置文件)
然后看看结果哈:(以上面那个我的火车票为例……emmmm部分没啥问题嘛反正,效果确实也看得出来不好。还得优化,等我挂个几天再看看效果。)
——————————————————————————————————————————————————————
又跑了10多个小时。至少把我名字和身份信息打对了哈(所以就马赛克一下)。不过还是有错误。(可能就是数据集中有很多字体样式不一样,具体到商业项目的话可以根据场景收集数据集,训练效果应该也不会那么差。)