kawabatas技術ブログ

試してみたことを書いていきます

Ruby で Google Cloud Vision API を使って OCR を試してみる

概要

先日、次のバスの出発時刻を聞ける Alexa スキルを作りました。

その際、バスの時刻表を csv にして、プログラムから使ったのですが、

今だったら Cloud Vision API でバス時刻表の画像から時刻を読み取れるのでは、と思ったので試してみました。(Alexa スキルではバス会社の HP をスクレイピングして csv を作りました)

手順

cloud.google.com

ドキュメント通りに進めます。

  1. Google Cloud Platform プロジェクトを作成

  2. 課金を有効に

  3. Cloud Vision API を有効に

  4. サービス アカウントキーを作成(役割は「編集者(roles/editor)」にしました)

ruby スクリプト

Ruby Cloud Vision API クライアントライブラリは v0.32.0 以降と、それ以前のバージョンと大きな違いがあるようで注意が必要です。クイックスタートは古いバージョン用でした。

新しい v0.32.0 以降のバージョンのドキュメントもありました。

cloud.google.com

今回使ったコードはこちら

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

github.com

OCR 試す

こちらの png で試します。

f:id:kawabatas:20190916224037p:plain

結果

$ 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 勉強して、独自の学習モデルを作れるようになりたいな。