Ruby で Google Cloud Vision API を使って OCR を試してみる
概要
先日、次のバスの出発時刻を聞ける Alexa スキルを作りました。
その際、バスの時刻表を csv にして、プログラムから使ったのですが、
今だったら Cloud Vision API でバス時刻表の画像から時刻を読み取れるのでは、と思ったので試してみました。(Alexa スキルではバス会社の HP をスクレイピングして csv を作りました)
手順
ドキュメント通りに進めます。
Google Cloud Platform プロジェクトを作成
課金を有効に
サービス アカウントキーを作成(役割は「編集者(roles/editor)」にしました)
ruby スクリプト
Ruby Cloud Vision API クライアントライブラリは v0.32.0 以降と、それ以前のバージョンと大きな違いがあるようで注意が必要です。クイックスタートは古いバージョン用でした。
新しい v0.32.0 以降のバージョンのドキュメントもありました。
今回使ったコードはこちら
require "bundler/setup" require "google/cloud/vision" image_annotator = Google::Cloud::Vision::ImageAnnotator.new(version: :v1p3beta1) file_name = "./images/bus-stop.png" response = image_annotator.document_text_detection image: file_name response.responses.each do |res| res.text_annotations.each do |text| puts "------------------------" puts text.description end end
OCR 試す
こちらの png で試します。
結果
$ bundle exec ruby main.rb ------------------------ 渋谷駅 のりば:5 渋12 渋12 渋12 二子玉川駅ゆき 高津営業所ゆき <三軒茶屋・駒沢経由>二子玉川駅・高津営業所ゆき 土曜 平日 休日 |06 51 |07| 112946 los|03203754 |09|11305485 |1008528Ⓡ485 |11082848 |12082848 13082848 [1408"28"48" |15082848 |16082848 |17|0828485 |18|08" 28" 49 |19| 113355 |20|2045 |21| 10" 35 2205" 35 51 112947- 0626" 46" | 06"26" 46 062646 0626461 065 2646 | 06"26" 46 062646 06 2748 082848 093050 | 10"31"52" 13355751 2045 10" 35" 05" 35" 51 1740 002040- 0020"40" 00~20540 | 002040- | 002041 0223" 43 | 03"2343 032343 | 032343 032445 | 0729"51" 133557 | 2045 | 10" 355 05"35" - 2017年7月1日 改定| 無印・・・二子玉川駅行き 高・二子玉川経由高津営業所行 スロープ板付バスで運行致します。尚整備等により一般車両で運行する場合がありますのでご了承ください。 道路混雑等のため予定時刻どおりに運行できないことがありますので、ご了承願います お問合せ先:東急バス 高津営業所 044-833-3241 ------------------------ 渋谷駅 ------------------------ のりば ------------------------ (以下略)
表の枠を「1」と認識してしまったり、「112946」のように時刻のスペースがなかったり、、
今の状態では、プログラムで加工して csv にするのは厳しそうです。。
ML 勉強して、独自の学習モデルを作れるようになりたいな。