RailsでGoogle Cloud Visionを使って画像とテキスト認識をしてみる

水谷です。

前回の記事でTensorFlowをアプリから呼び出して画像に何が写っているか認識するアプリを紹介しました。

その後、Google Could Vision APIの発表があり、より画像認識を使いやすいかたちで提供されることになりました。

発表ブログ

Could Vision APIが何なのかやそのすごさはこちらの動画を参照してください。

先行プレビューの登録ができたので、ここではRailsアプリに組み込んで使ってみたいと思います。

画像認識

前回の記事と同じように、写真にあるものを認識してみましょう。

まず、APIには以下の形式で送信します。

{
  "requests": [
    {
      "image": {
        "content": "jisYIujijJIUJI...."
      },
      "features": [
        {
          "type": "LABEL_DETECTION",
          "maxResults": 10
        }
      ]
    }
  ]
}

contentにはBase64でエンコードした画像ファイルをいれます。typeには写真の中に何があるかを認識されるためのLABEL_DETECTIONを指定します。

レスポンスは下記のようなJSONになります。

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/07dm6",
          "description": "tiger",
          "score": 0.9995195
        },
        {
          "mid": "/m/01280g",
          "description": "wildlife",
          "score": 0.96001059
        },
        {
          "mid": "/m/09686",
          "description": "vertebrate",
          "score": 0.85704827
        },
        {
          "mid": "/m/04rky",
          "description": "mammal",
          "score": 0.85094059
        },
        {
          "mid": "/m/089v3",
          "description": "zoo",
          "score": 0.788213
        },
        {
          "mid": "/m/0cdnk",
          "description": "panthera",
          "score": 0.73796427
        },
        {
          "mid": "/m/0307l",
          "description": "felidae",
          "score": 0.57086021
        },
        {
          "mid": "/m/01lrl",
          "description": "carnivora",
          "score": 0.56989247
        },
        {
          "mid": "/m/0891tx",
          "description": "toyger",
          "score": 0.52950406
        }
      ]
    }
  ]
}

labelAnnotationsに認識した物体をその物体である可能性を示すscoreとともに配列で返ってきます。

今回は簡単にscoreが高いものを表示するようにします。実際のコードはこちらを参照ください。

GitHub

それでは結果をみてみましょう。

虎

ちゃんとtiger(虎)と認識しましたね。

もう一つやってみましょう。

クマ

これも、brown bear(クマ)と認識してくれます。

テキスト認識

Google Cloud Visionのもう一つ文字を認識する機能があります。それを試してみましょう。

まず、リクエストからみてみましょう。

{
  "requests": [
    {
      "image": {
        "content": "Yjiijijii54ji...."
      },
      "features": [
        {
          "type": "TEXT_DETECTION",
          "maxResults":10
        }
      ]
    }
  ]
}

先ほどの画像認識と同じような内容で、typeにTEXT_DETECTIONを指定します。

レスポンスは次のようになります。

{
  "responses": [
    {
      "textAnnotations": [
        {
          "locale": "ja",
          "description": "アルバイト募集\\n一緒にお店を盛り上げてくれる\\n仲間を募集しています。\\n業 務内容:ホール·厨房\\n年 齢:18歳以上\\n時給:アルバイト希望900円以上\\n社員希望相談\\n●シフト制\\n昇給あり\\n食事付き\\n·制服貸与\\n/※まずは、お電話またはスタッフまでお問い合わせください。\\nTEL : 04674485n担 当体木\\n",
          "boundingPoly": {
            "vertices": [
              {
                x: 275,
                y: 742
              },
              {
                x: 1910,
                y: 742
              },
              {
                x: 1910,
                y: 2908
              },
              {
                x: 275,
                y: 2908
              }
            ]
          }
        }
      ]
    }
  ]
}

descriptionに認識したテキストがはいります。

それでは、実際に写真をあげた結果はこのようになります。

0

ほぼ、認識できてますね。

手書きの場合も試してみましょう。

1

おしいですね。やはりところどころ認識できてないです。ただ、数字はちゃんと認識できてます。

まとめ

今回ご紹介した機能以外にも、顔、ロゴや建物などのランドマークなども認識することができます。

いままでも画像認識やOCRなどの技術はあったものの精度の面で不安があり、実際にサービスに使うためにはいくつもの壁を越える必要がありました。このGoogle Cloud VisionではGoogleのサービスの中で蓄積されたデータを基にしているので高い精度を期待できるのではないでしょうか。

そういえば、Google Photoがでた当初、「結婚式」と入力して結婚式で撮った写真が一覧にでたあの衝撃を思い出します。その技術がこんなにも手軽に使えるのはとてもわくわくしますね。

この記事を読んでギルドワークスに興味を持たれた方はお気軽に【ギルドワークスに依頼する】をご覧の上、お問合せください。

TensorFlowをアプリで使ってみる

水谷です。

先週、Googleが機械学習システム「TensorFlow」をオープンソースで公開しました。

曖昧な言葉や口語を的確に理解して検索結果をだすRankBrain、最近Inboxアプリに搭載された自動応答機能や、スマートフォンのカメラで看板の文字などを写して、その文字を翻訳してくれるGoogle翻訳アプリも、このTensorFlowをベースに開発されているようです。

詳しくはこちらなどを参照してください。

http://googledevjp.blogspot.jp/2015/11/tensorflow-google.html
http://www.publickey1.jp/blog/15/googletensorflow.html
http://www.itmedia.co.jp/news/articles/1511/10/news055.html

ここでは、手っ取り早くアプリを動かしてその技術を体験していきたいと思います。

準備

Java JDK

まずJDKが必要になるので以下よりダウンロードします。

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

私の場合は、Macなのでjdk-8u66-macosx-x64.dmgをダウンロードして、ダウンロードしたファイルを開いて「JDK 8 Update 66.pkg」ダブルクリックして、その後ウィザードに従ってインストールします。

Android SDK

次にAndroid SDKを以下のページからダウンドールしていれます。

https://developer.android.com/sdk/index.html

ページの下の方にある「android-sdk_r24.4.1-macosx.zip」をダウンロードします。

ダウンロードしたファイルを解凍して、アプリケーションフォルダに配置しておきます。

$ cd ~/Downloads
$ unzip android-sdk_r24.4.1-macosx.zip
$ mv android-sdk-macosx ~/Applications

NDK

あと、NDKも必要になるので、以下よりダウンロードします。

http://developer.android.com/ndk/downloads/index.html

実行形式のファイルになっているので実行権を付与して実行します。できたファイルをアプリケーションフォルダに配置します。

$ cd ~/Downloads
$ chmod +x android-ndk-r10e-darwin-x86_64.bin
$ ./android-ndk-r10e-darwin-x86_64.bin
$ mv android-ndk-r10e ~/Applications

Bazel

Bazelも以下よりダウンロードします。

https://github.com/bazelbuild/bazel/releases

インストールスクリプトを実行します。

$ cd ~/Downloads
$ chmod +x bazel-0.1.1-installer-darwin-x86_64.sh
$ ./bazel-0.1.1-installer-darwin-x86_64.sh --user

PATHの設定

SDKとNDKのPATHを設定しときます。

# android
export ANDROID_HOME="$HOME/Applications/android-sdk-macosx"
export NDK_HOME="$HOME/Applications/android-ndk-r10e"
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$NDK_HOME

# bazel
export PATH="$PATH:$HOME/bin"

Build Tools

SDK Managerで23.0.2をいれます。

SDK Managerを起動します。

$ android

23.0.2をチェックしてインストールします。

Android_SDK_Manager

アプリのビルドとインストール

準備ができたのでアプリをビルドして実機にいれていきます。

TensorFlow

TensorFlowのソースをGitからcloneします。

$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow

ビルド

SDKとNDKの場所を指定する必要があるのでWORKSPACEというファイルを編集します。

$ cd tensorflow
$ vi WORKSPACE

上記の手順のとおりであれば以下を追加します。

android_sdk_repository(
name = "androidsdk",
api_level = 23,
build_tools_version = "23.0.2",
# Replace with path to Android SDK on your system
path = "/Users/hirotaka/Applications/android-sdk-macosx",
)

android_ndk_repository(
name="androidndk",
path="/Users/hirotaka/Applications/android-ndk-r10e",
api_level=21)

ビルドをします。

$ bazel build //tensorflow/examples/android:tensorflow_demo -c opt --copt=-mfpu=neon
.
.
THIS TOOL IS DEPRECATED. See --help for more information.

INFO: From Generating signed apk:

THIS TOOL IS DEPRECATED. See --help for more information.

Target //tensorflow/examples/android:tensorflow_demo up-to-date:
bazel-bin/tensorflow/examples/android/tensorflow_demo_deploy.jar
bazel-bin/tensorflow/examples/android/tensorflow_demo_unsigned.apk
bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
INFO: Elapsed time: 294.089s, Critical Path: 283.02s

ワーニングはいくつかでるのですが、エラーがなければ5分くらいでパッケージができます。

実機にいれます。

$ adb install -r bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
5101 KB/s (97789592 bytes in 18.718s)
pkg: /data/local/tmp/tensorflow_demo.apk
Success

試してみる

アプリが追加されているのでアイコンをタップして起動します。

カメラが起動している状態になるので、その画面をとおして何かを表示します。そうすると、アプリがそれが何なのかを青い部分に名称を表示します。

これは、事前にいくつかの画像を学習して、いままでみたことない画像でも学習した内容からアプリが推測しているのです。

とはいえ、あまりにもいままで学習した内容からかけ離れているとうまく表示されないようですね。

学習している内容は以下にまとめてあります。

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/assets/imagenet_comp_graph_label_strings.txt

なるべく特徴のあるのが認識されやすいみたいです。ふぐ(puffer)は見事に認識しました!

IMG_1288

まとめ

今回はアプリを動かすまでで終わってしまいましたが、機会があれば中の処理もおっていきたいと思います。

実際のサービスで使われている技術が、こうして手軽に使えるのは非常にうれしいですね。これでどんなアプリをつくろうか考えるとわくわくします。

この記事を読んでギルドワークスに興味を持たれた方はお気軽に【ギルドワークスに依頼する】をご覧の上、お問合せください。