27
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

食べログAdvent Calendar 2019

Day 21

たった10行でOCR!RubyとGoogle Cloud Vision APIで飲食店のメニュー画像を文字認識してみた

Last updated at Posted at 2019-12-20

はじめに

今回はRubyとGoogle Cloud Platform(GCP)を利用して、飲食店のメニュー画像の中から料理名や金額等の文字を抽出してみます。

一般的に光学文字認識(OCR)と呼ばれる技術ですが、導入にはすごくハードルが高そうな気がしますよね。
しかし、Google Cloud Platform(GCP)が提供しているCloud Vision APIを利用することでとっても簡単に実装することができます。

今回は例として以下のメニュー画像を使用します。
menu.jpg
まずはこの画像の文字が正しく認識できるか不安なので、Googleの提供しているAPIのデモで試してみましょう。
デモではこのように画像をアップロードするだけで解析結果の確認ができます。
image.png
デモURL:https://cloud.google.com/vision/?hl=ja#vision-api-

実際に解析した結果がこちらです。
image.png
なぜかラーメンと餃子は認識できませんでしたが、それ以外は問題なさそうですね。
また、単語がブロックごとに区切られて識別されていることがわかります。
こちらのデモでは他にレスポンスのJSON等も確認することができます。
開発に着手する前に、まずはデモで確認しておくと安心ですね。

(ラーメンと餃子はさておき)無事画像が解析できそうだとわかったので、今回はこちらの結果をAPIで取得することをゴールに進めていきます。

事前準備

Cloud Vision APIを利用するために、以下の事前準備を行います。

  • Google Cloud Platform(GCP)に登録する
  • Vision APIを有効にする
  • 認証情報を設定する
  • クライアントライブラリをインストールする

Google Cloud Platform(GCP)に登録する

GCPへの登録方法の説明はここでは省略します。

Vision APIを有効にする

Vision APIを有効にするGCPプロジェクトを選択または作成します。
その後、GCP管理画面の検索窓で「Cloud Vision API」を検索し、「有効にする」を押してAPIを有効化します。

※請求先が登録されていない場合はエラーになるので事前に登録してください
image.png

認証情報を設定する

クライアントライブラルを使用するために、以下2つの作業を行い認証情報の設定を行います。

  • サービスアカウントの作成
  • 環境変数の設定

詳細は省略しますので、以下の公式ドキュメントを参考にして実施します。
https://cloud.google.com/vision/docs/libraries#client-libraries-usage-ruby

※言語を日本語にしていると情報が古い可能性があります。Englishでの閲覧をオススメします。

クライアントライブラリをインストールする

今回はmac+Rubyを使用するので、以下のコマンドで「google-cloud-vision」gemをインストールします。

gem install google-cloud-vision

以上で事前準備は完了です。

実装

ほとんど公式の例と同じですが、実装は以下のようになりました。
コードの記述量としては10行もありません。

require "google/cloud/vision"

image_annotator = Google::Cloud::Vision::ImageAnnotator.new

file_path = "/tmp/menu.jpg"

response = image_annotator.text_detection(image: file_path)

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

実行結果

それでは先ほどのコードを実行してみましょう。
実行した結果がこちらです。

"メニュー\n750 円\nラーメン\n800 円\nチャーハン\n餃子\n500 円\n"
"メニュー"
"750"
"円"
"ラーメン"
"800"
"円"
"チャーハン"
"餃子"
"500"
"円"

認識した文字全体と、個々の単語が出力されました。
デモでは認識されなかったラーメンと餃子も無事認識されています:clap:

おわりに

ハードルの高そうなOCRですが、GCPを使えば簡単に実装できることがわかりました。
事前にトレーニング済みの機械学習モデルを利用することができるので、こちらがトレーニングを行わなくてもかなり精度の高い解析ができる環境が整っているのも大きな強みだと感じました。

ただし、GCPの使い方によっては課金が発生してしまう場合があるので、注意してご利用ください。(2019/12/21時点ではCloud Vision APIは1000リクエスト/月まで無料)

また、今回は触れていませんが、Cloud Vision APIには物体の検出や顔認識等の機能もあるので試してみると面白いかもしれません。

明日は@tayu1605さんの「はじめてのElasticsearch」です!お楽しみに〜:snowman2:

27
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?