作者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://www.ptt.cc/bbs/DataScience/M.1522937906.A.2C5.html
※ 編輯: parcequetoi (114.42.158.246), 04/05/2018 22:35:23
推 ThxThx: 我最近做的問題和第一點相關 04/06 00:26
→ ThxThx: 我的方式是利用傳統CV的方法找出表格框線來切割元素。我是 04/06 00:26
→ ThxThx: 用OpenCV的canny edge detection 04/06 00:26
→ lucien0410: multi task learning 04/06 01:17
推 lucien0410: ocr 辨識加上中英翻譯! 04/06 01:22
→ parcequetoi: @ThxThx 我大略Google了一下,看起來它需要圖上原本 04/06 11:15
→ parcequetoi: 就有線條或光影顏色的邊界,請問是這樣嗎?我擔心它 04/06 11:15
→ parcequetoi: 能辨認出的邊界就是文字本身。 04/06 11:15
→ parcequetoi: @lucien0410 抱歉我不太能理解,中英翻譯後好處是什 04/06 11:18
→ parcequetoi: 麼?去除重複文字框?但CHINESE的中文翻譯也不見得是 04/06 11:18
→ parcequetoi: 國文啊? 04/06 11:18
推 lucien0410: 不要理我好了 我講的跟你的問題只有一咪咪咪咪關連 04/06 11:52
→ lucien0410: 我看了看其實你這個問題應該完全可以用規則來解 04/06 13:49
→ lucien0410: 應該寫一個複雜一點的regular expression來抓取 04/06 13:50
→ lucien0410: 你想要的欄位的資料 你熟regular experssion嗎 04/06 13:52
→ lucien0410: perl 跟python 都有滿好用的內建的regular expression 04/06 13:53
→ lucien0410: 不知道有沒有誤解你的問題? 04/06 13:56
推 lucien0410: 如果你可以給一個google ocr實際給你的輸出的例子 04/06 13:58
→ lucien0410: 再給一個你想要這個輸出變成什麼形狀的例子 04/06 13:59
推 ThxThx: 給原Po:對他要本來就有框線。沒有框線的話就比較難,不 04/06 14:37
→ ThxThx: 過如果是我還是會用CV方法來做(如果更簡單的方法不行的話 04/06 14:37
→ parcequetoi: @ThxThx 好的,謝謝你 04/07 10:25
→ parcequetoi: @lucien0410 regular expression有概念但不敢說熟 04/07 10:26
※ 編輯: parcequetoi (114.42.158.246), 04/07/2018 13:11:56
推 gatheringbc: 推雄中校訓XD 04/08 02:46
→ parcequetoi: 哎唷 不錯 有人認出是雄中校訓 XD (握手) 04/08 17:53