[問題] OCR實務經驗請益

看板DataScience作者 (Sky)時間6年前 (2018/04/05 22:18), 6年前編輯推噓6(6020)
留言26則, 4人參與, 6年前最新討論串1/2 (看更多)
作業系統: 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

04/06 00:26, 6年前 , 1F
我最近做的問題和第一點相關
04/06 00:26, 1F

04/06 00:26, 6年前 , 2F
我的方式是利用傳統CV的方法找出表格框線來切割元素。我是
04/06 00:26, 2F

04/06 00:26, 6年前 , 3F
用OpenCV的canny edge detection
04/06 00:26, 3F

04/06 01:17, 6年前 , 4F
multi task learning
04/06 01:17, 4F

04/06 01:22, 6年前 , 5F
ocr 辨識加上中英翻譯!
04/06 01:22, 5F

04/06 11:15, 6年前 , 6F
@ThxThx 我大略Google了一下,看起來它需要圖上原本
04/06 11:15, 6F

04/06 11:15, 6年前 , 7F
就有線條或光影顏色的邊界,請問是這樣嗎?我擔心它
04/06 11:15, 7F

04/06 11:15, 6年前 , 8F
能辨認出的邊界就是文字本身。
04/06 11:15, 8F

04/06 11:18, 6年前 , 9F
@lucien0410 抱歉我不太能理解,中英翻譯後好處是什
04/06 11:18, 9F

04/06 11:18, 6年前 , 10F
麼?去除重複文字框?但CHINESE的中文翻譯也不見得是
04/06 11:18, 10F

04/06 11:18, 6年前 , 11F
國文啊?
04/06 11:18, 11F

04/06 11:52, 6年前 , 12F
不要理我好了 我講的跟你的問題只有一咪咪咪咪關連
04/06 11:52, 12F

04/06 13:49, 6年前 , 13F
我看了看其實你這個問題應該完全可以用規則來解
04/06 13:49, 13F

04/06 13:50, 6年前 , 14F
應該寫一個複雜一點的regular expression來抓取
04/06 13:50, 14F

04/06 13:52, 6年前 , 15F
你想要的欄位的資料 你熟regular experssion嗎
04/06 13:52, 15F

04/06 13:53, 6年前 , 16F
perl 跟python 都有滿好用的內建的regular expression
04/06 13:53, 16F

04/06 13:56, 6年前 , 17F
不知道有沒有誤解你的問題?
04/06 13:56, 17F

04/06 13:58, 6年前 , 18F
如果你可以給一個google ocr實際給你的輸出的例子
04/06 13:58, 18F

04/06 13:59, 6年前 , 19F
再給一個你想要這個輸出變成什麼形狀的例子
04/06 13:59, 19F

04/06 14:37, 6年前 , 20F
給原Po:對他要本來就有框線。沒有框線的話就比較難,不
04/06 14:37, 20F

04/06 14:37, 6年前 , 21F
過如果是我還是會用CV方法來做(如果更簡單的方法不行的話
04/06 14:37, 21F

04/06 14:37, 6年前 , 22F

04/07 10:25, 6年前 , 23F
@ThxThx 好的,謝謝你
04/07 10:25, 23F

04/07 10:26, 6年前 , 24F
@lucien0410 regular expression有概念但不敢說熟
04/07 10:26, 24F
※ 編輯: parcequetoi (114.42.158.246), 04/07/2018 13:11:56

04/08 02:46, 6年前 , 25F
推雄中校訓XD
04/08 02:46, 25F

04/08 17:53, 6年前 , 26F
哎唷 不錯 有人認出是雄中校訓 XD (握手)
04/08 17:53, 26F
文章代碼(AID): #1QnZ0oB5 (DataScience)
文章代碼(AID): #1QnZ0oB5 (DataScience)