RubyとGoogle Cloud Vision APIで光学式文字認識(OCR)を試してみました


My Redmine

こんにちは。
最近全然Rubyのコードを書いてないので意地でもRuby使ってやる!
そこそこ訓練されているRubyistの吉岡です。

さて、今回はGoogle CloudのCloud Vision APIというサービスを利用して光学式文字認識(OCR)を試してみたのでご紹介します。 (クライアントはもちろんRubyです!)

やりたいこと

ローカルにある画像をRubyとVision API(GCP)を使ってテキスト情報を取得する。

準備

  1. Rubyの実行環境(この記事は2.7で実行しています。)
  2. GCPのアカウント
  3. Cloud Vision APIとクライアントの設定

以下のドキュメントを参考に、テスト用のプロジェクトの作成、Vision APIの有効化、認証設定を行い、最後にRubyでGCPのAPIにアクセスするためのクライアントライブラリー(gem)をインストールします。
クイックスタート: クライアント ライブラリの使用

gem install google-cloud-vision

実行方法

以下、ページを参考にして、画像とサンプルコードを準備し、実行します。
画像内のテキストを検出する

サンプル画像

sample.png

サンプルコード1

sample.rb

require "google/cloud/vision" 

image_path = 'sample.png'

image_annotator = Google::Cloud::Vision.image_annotator

response = image_annotator.text_detection(
  image:       image_path,
  max_results: 1 # optional, defaults to 10
)

response.responses.each do |res|
  res.text_annotations.each do |text|
    puts text.description
  end
end

構成

├── xxxxxx-xxxxxxxxxx.json # 認証用のサービスアカウントキー
├── sample.png
└── sample.rb

実行

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/xxxxxxxx-xxxxxxxx.json" 
ruby sample.rb

出力結果1

テスト項目1
テスト1
テスト1 テスト1
テスト1
テスト項目2
テスト2 テスト2 テスト2 テスト2
テスト3 テスト3 テスト3 テスト3
テスト4 テスト4 テスト4 テスト4
テスト項目3
テスト項目4

サンプル画像

とりあえず、簡単に文字が取得できることが確認できます。

もう少し詳しい情報を取得するためにコードを少し変更してみます。

サンプルコード2

require "google/cloud/vision" 
require "pry" 

image_path = 'sample.png'

image_annotator = Google::Cloud::Vision.image_annotator

response = image_annotator.text_detection(
  image:       image_path,
  max_results: 1 # optional, defaults to 10
)

response.responses.each do |res|
  res.text_annotations.each do |text|
    puts text.description
    text.bounding_poly.vertices.each do | vertex |
      puts "  x: #{vertex.x}, y: #{vertex.y}" 
    end
  end
end

以下の三行を追加した形になります。
先ほどのサンプルコード1は、text.descriptionで文字情報のみの取得でした。今度は文字情報と一緒に、単語の位置情報も取得できるように修正しました。(便利ですねー)

text.bounding_poly.vertices.each do | vertex |
  puts "  x: #{vertex.x}, y: #{vertex.y}" 
end

出力結果2

テスト項目1
テスト1
テスト1 テスト1
テスト1
テスト項目2
テスト2 テスト2 テスト2 テスト2
テスト3 テスト3 テスト3 テスト3
テスト4 テスト4 テスト4 テスト4
テスト項目3
テスト項目4
  x: 8, y: 12
  x: 437, y: 12
  x: 437, y: 113
  x: 8, y: 113
テスト
  x: 10, y: 12
  x: 55, y: 12
  x: 55, y: 30
  x: 10, y: 30
項目
  x: 57, y: 12
  x: 86, y: 12
  x: 86, y: 30
  x: 57, y: 30
1
  x: 90, y: 15
  x: 94, y: 15
  x: 94, y: 26
  x: 90, y: 26

・・・

テスト
  x: 10, y: 68
  x: 56, y: 69
  x: 56, y: 86
  x: 10, y: 85
項目
  x: 58, y: 69
  x: 89, y: 69
  x: 89, y: 86
  x: 58, y: 86
3
  x: 89, y: 71
  x: 97, y: 71
  x: 97, y: 83
  x: 89, y: 83
テスト
  x: 8, y: 95
  x: 54, y: 95
  x: 54, y: 113
  x: 8, y: 113
項目
  x: 56, y: 95
  x: 88, y: 95
  x: 88, y: 113
  x: 56, y: 113
4
  x: 88, y: 98
  x: 97, y: 98
  x: 97, y: 109
  x: 88, y: 109

期待通り、それぞれの単語の位置情報(座標情報)の取得もできました。
この情報を利用すれば、その文字が画像のどの部分か、印をつけて表示することもできますので、期待通り読み込みができているかチェックも楽にできそうです。

まとめ

久しぶりにGoogle Cloudを使ってみましたが、以前よりもドキュメントが整理されていて、使いやすくなった印象です。
(本当はAWSのAmazon Amazon Textract を使いたかったけど、日本語対応してなかったので、GoogleのVision APIを使ったのは内緒です)

今回は使用しませんでしたが、画像を解析した際にランドマークを元に位置情報を取得(locations)したり、表示されている画像と文字が説明として正しいか(score)なども取得できるようです。色々と使い道が広がりそうです。
今後も機会を作って積極的に触りたい気持ちになりました。

詳細は以下のドキュメントを確認してみてください。
https://www.rubydoc.info/gems/google-cloud-vision/0.24.0/Google/Cloud/Vision/V1


My Redmine

こちらの記事もオススメです!
Rubyで動くCMS、「RefineryCMS」を動かしてみた話
Rubyで動くCMS「RefineryCMS」を使ってサイトを作成し、Herokuに公開。
非エンジニアがAWSクラウドプラクティショナーの試験を受けてみた
AWSクラウドプラクティショナー試験向けの学習に使った教材などを紹介。
Redmine改善活動では、実装済のコードを読んで学べることもあります
多くの人が試行錯誤して創り出したコードを参考にすることで機能を知ることができます。
学ばず使えるAdobe Premiere Rushはみんなにやさしい
「Adobe Premiere Rush」は初心者にはおすすめの画編集ソフト。
クラウドサービス「My Redmine」 2020年の改善まとめ
2020年中にファーエンドテクノロジーのサービス「My Redmine」で行われた改善をいくつかピックアップして紹介します。
ファーエンドテクノロジーからのお知らせ(2024/03/27更新)
2024年4月14日 オライリー本の全冊公開日のお知らせ(もくもく勉強会も同時開催)
ファーエンドテクノロジーが所蔵するオライリー本(全冊)公開日のご案内です。公開日には「もくもく勉強会」も同時開催します。
My Redmine スタンダードプランおよびAdminサポートデスクプランの料金改定のお知らせ【2024年4月ご利用分より】
2024年4月ご利用分より、My Redmine スタンダードプラン(民間企業・個人向け及び官公庁向け)とAdminサポートデスクプランの料金を改定いたします。
My Subversion 一部のプラン・料金改定のお知らせ【2024年4月ご利用分より】
2024年4月ご利用分より、My Redmine スタンダードプラン(民間企業・個人向け及び官公庁向け)とAdminサポートデスクプランの料金を改定いたします。
My Subversion ストレージ容量増量のお知らせ(一部プランを除く)
My Subversionではミディアムプラン以上の各プランのストレージ容量を増量します。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け