Datawhale干货
作者:王浩,结行科技算法工程师
参加了“世界人工智能创新大赛”——手写体 OCR 识别竞赛(任务一),取得了Top1的成绩。队伍随机组的,有人找我我就加了进来,这是我第一次做OCR相关的项目,所以随意起了个名字。下面通过这篇文章来详细介绍我们的方案。
![478af0112b51351aae8199f4f2190cb3.png](https://i-blog.csdnimg.cn/blog_migrate/8989b38e0beb61dabe053507103b361f.png)
实践背景
赛题背景
银行日常业务中涉及到各类凭证的识别录入,例如身份证录入、支票录入、对账单录入等。以往的录入方式主要是以人工录入为主,效率较低,人力成本较高。近几年来,OCR相关技术以其自动执行、人为干预较少等特点正逐步替代传统的人工录入方式。但OCR技术在实际应用中也存在一些问题,在各类凭证字段的识别中,手写体由于其字体差异性大、字数不固定、语义关联性较低、凭证背景干扰等原因,导致OCR识别率准确率不高,需要大量人工校正,对日常的银行录入业务造成了一定的影响。
赛题地址:http://ailab.aiwin.org.cn/competitions/65
赛题任务
本次赛题将提供手写体图像切片数据集,数据集从真实业务场景中,经过切片脱敏得到,参赛队伍通过识别技术,获得对应的识别结果。即:
输入:手写体图像切片数据集
输出:对应的识别结果
本任务提供开放可下载的训练集及测试集,允许线下建模或线上提供 Notebook 环境及 Terminal 容器环境(脱网)建模,输出识别结果完成赛题。
赛题数据
A. 数据规模和内容覆盖
B.数据示例
原始手写体图像共分为三类,分别涉及银行名称、年月日、金额三大类,分别示意如下:
![4cfda26453767dec3b2d436540d3c6b8.png](https://i-blog.csdnimg.cn/blog_migrate/0392ba24bee926ed50cd737fde8bde36.png)
相应图片切片中可能混杂有一定量的干扰信息,分别示例如下:
![cd77146fdad3c8b41f455b2992a6b784.png](https://i-blog.csdnimg.cn/blog_migrate/744f791be9df0c36e0bc7968c62dcfe5.png)
识别结果 JSON 在训练集中的格式如下:
json 文件内容规范:
{
"image1": "陆万捌千零贰拾伍元整",
"image2": "付经管院工资",
"image3": "",
...
}
实践方案
通过在网上查阅资料,得知OCR比赛最常用的模型是CRNN+CTC。所以我最开始也是采用这个方案。
![67d53ddb400059fa88f885b8a9a8f35b.png](https://i-blog.csdnimg.cn/blog_migrate/34888e4d7b9a2958deda4932a6a82ee0.png)
上图是我找到的资料,有好多个版本。因为是第一次做OCR的项目,所以我优先选择有数据集的项目,这样可以快速的了解模型的输入输出。
所以我选择的第一个Attention_ocr.pytorch-master.zip,从名字上可以看出这个是加入注意力机制,感觉效果会好一些。
构建数据集
下图是Attention_ocr.pytorch-master.zip自带的数据集截图,从截图上可以看出,数据的格式:“图片路径+空格+标签”。我们也需要按照这样的格式构建数据集。
![53061bb93c916ab64926814ebac5f02c.png](https://i-blog.csdnimg.cn/blog_migrate/cb462bcf6d74b838ee081e89e51798ba.png)
新建makedata.py文件,插入下面的代码。
import os
import json
#官方给的数据集
image_path_amount = "./data/train/amount/images"
image_path_d