作者parcequetoi (Sky)
看板DataScience
标题[问题] OCR实务经验请益
时间Thu Apr 5 22:18:23 2018
作业系统: Linux
问题类别: OCR
使用工具: Python 3, Google Vision API
问题内容:
最近正在玩Google Vision API,
目标是透过OCR辨认出一份报告/成绩单的内容(格式不限),
并转存成後续可再利用分析的档案(e.g. json, csv, txt...
这部分还没想好)。
想像有以下三种成绩单:
--------
XXX高中
姓名:王小明 性别:男
考试日期:2018/01/10
语文能力
科目 分数 班平均
国文 70 75
英文 86 87
自然科学
科目 分数 班平均
物理 40 30
化学 93 60
--------
实事求是 精益求精
姓名:李大同 性别:男
考试日期:2018-01-09
科目 分数 班平均
国文
CHINESE 90 80
数学
MATHEMATICS 89 90
--------
姓名:黄小美
性别:女
学号:970284
试验日期:2018-01-08
考试科目 全班平均 实得分数
CHINESE 国文 60 84
MATHEMATICS 数学 90 92
--------
这三种照片如果整理成CSV,大概都会希望长得像:
科目,分数,班平均
国文,70,75
英文,86,87
物理,40,30
化学,93,60
即英文科目名称忽略不计,留下分数及班平均。
至於照片最上面的个人资料都忽略。(如果能留下考试日期当然也不错)
目前我已经做到透过Google Vision API的text detection读出照片上的文字资讯,
(document text detection我也试过但效果不好)
(
https://cloud.google.com/vision/docs/ocr)
并且把每个文字框内容依像素座标由上到下、由左到右排列。
但紧接着碰到两个问题:
1. 成绩单上同列资料y座标轴可能不同
可能因为成绩单纸张不平整或照相时有歪斜,
所以由上到下、由左到右排列完後,
可能会有「75,国文,70」这样的顺序,而非期待的「国文,70,75」。
这部分我想到或许可手动用rule-based的方法,
如任两个文字框y座标不超过n单位就视为同一列之类的,
但也想请问有没有更好的做法?
2. 分辨各栏位内容
各家的个人资料排列方式与位置均不同(置中置左置右),
有些的科目名称只有中文,有些是中英文对照,
中英文对照的又可以有在同一行写或分两行写等变化,
有些把班平均摆前面栏位,有些摆後面......
我曾经想过初步的想法是把每个文字框的x座标做x-means clustering,
再从x座标小的群开始,把每个cluster的内容依y座标排列下来,
原本预期可以避开上述问题1,
但是这方法却不能排除无用的文字框
(e.g. 「姓名」、「语文能力」、多余的英文科目列),
导致每个cluster的元素数量不会一样多,却又不是每个元素都需要;
另外也不能分辨每一个cluster内表示的究竟是班平均还是个人分数。
想请问板上高手,有没有人有相关的资源或实务经验可以分享?谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.42.158.246
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1522937906.A.2C5.html
※ 编辑: parcequetoi (114.42.158.246), 04/05/2018 22:35:23
1F:推 ThxThx: 我最近做的问题和第一点相关 04/06 00:26
2F:→ ThxThx: 我的方式是利用传统CV的方法找出表格框线来切割元素。我是 04/06 00:26
3F:→ ThxThx: 用OpenCV的canny edge detection 04/06 00:26
4F:→ lucien0410: multi task learning 04/06 01:17
5F:推 lucien0410: ocr 辨识加上中英翻译! 04/06 01:22
6F:→ parcequetoi: @ThxThx 我大略Google了一下,看起来它需要图上原本 04/06 11:15
7F:→ parcequetoi: 就有线条或光影颜色的边界,请问是这样吗?我担心它 04/06 11:15
8F:→ parcequetoi: 能辨认出的边界就是文字本身。 04/06 11:15
9F:→ parcequetoi: @lucien0410 抱歉我不太能理解,中英翻译後好处是什 04/06 11:18
10F:→ parcequetoi: 麽?去除重复文字框?但CHINESE的中文翻译也不见得是 04/06 11:18
11F:→ parcequetoi: 国文啊? 04/06 11:18
12F:推 lucien0410: 不要理我好了 我讲的跟你的问题只有一咪咪咪咪关连 04/06 11:52
13F:→ lucien0410: 我看了看其实你这个问题应该完全可以用规则来解 04/06 13:49
14F:→ lucien0410: 应该写一个复杂一点的regular expression来抓取 04/06 13:50
15F:→ lucien0410: 你想要的栏位的资料 你熟regular experssion吗 04/06 13:52
16F:→ lucien0410: perl 跟python 都有满好用的内建的regular expression 04/06 13:53
17F:→ lucien0410: 不知道有没有误解你的问题? 04/06 13:56
18F:推 lucien0410: 如果你可以给一个google ocr实际给你的输出的例子 04/06 13:58
19F:→ lucien0410: 再给一个你想要这个输出变成什麽形状的例子 04/06 13:59
20F:推 ThxThx: 给原Po:对他要本来就有框线。没有框线的话就比较难,不 04/06 14:37
21F:→ ThxThx: 过如果是我还是会用CV方法来做(如果更简单的方法不行的话 04/06 14:37
23F:→ parcequetoi: @ThxThx 好的,谢谢你 04/07 10:25
24F:→ parcequetoi: @lucien0410 regular expression有概念但不敢说熟 04/07 10:26
※ 编辑: parcequetoi (114.42.158.246), 04/07/2018 13:11:56
25F:推 gatheringbc: 推雄中校训XD 04/08 02:46
26F:→ parcequetoi: 哎唷 不错 有人认出是雄中校训 XD (握手) 04/08 17:53