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

まとめ

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

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

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

Robot Frameworkで自動受け入れテスト

ギルドワークスさんとパートナーとして一緒にお仕事させていただいています、木目沢(@pilgrim_reds)と申します。

Robot Frameworkの紹介

Robot Frameworkは受け入れテスト、受け入れテスト駆動開発のための、python製の自動テストフレームワークです。

海外では利用されているようですが、日本ではなじみの薄いツールのようなので紹介したいと思います。

特徴は、キーワード駆動です。
「キーワード」と「キーワードの実際の動作」を定義し、テストケースでそのキーワードを組み合わせてテストを実行させます。

また、予めキーワードが実装されたライブラリを使用することができます。
例えば、Selenium2 Web Driverのラッパーである、Selenium2Libraryを使用することでRobot FrameworkでSelenium2 Web Driverを使用できます。

OperatingSystemLibraryを使用するとOSやファイルの操作ができますし、DatabaseLibraryを使用するとデータベースの操作ができます。

他にも、AndroidやiOSのテストツールAppiumのラッパーであるAppiumLibraryや、SSHが利用できるSSHLibrayなど多様なライブラリがあります。詳しくは、ドキュメントを御覧ください。

Robot Frameworkの例

早速、Robot FrameworkとSelenium2Libraryを使用した例をみてみましょう。
インストールはpythonがインストールされていれば、

pip install robotframework-selenium2library

でインストール完了です。

以下はテストファイルです。

*** Settings ***
Documentation  RobotFramework,Selenium2Libraryテスト
Library  Selenium2Library

*** Variables ***
${browser}  firefox
${login_url}  https://◯◯.com/login

*** Test Cases ***

ログイン画面を開く
  ログイン画面を開く

ログインできない
  ユーザーを入力する  user
  パスワードを入力する  no-password
  ログインボタンを押す
  ログインエラーが出力される

ログインできる
  ユーザーを入力する  user
  パスワードを入力する  password
  ログインボタンを押す
  ログイン成功の画面が表示される

[Teardown] Close Browser

*** Keywords ***

ログイン画面を開く
  Open Browser  ${login_url}  ${browser}
  Title Should Be  トップ

ユーザーを入力する  [Arguments]  ${user}
  Input Text  username  ${user}

パスワードを入力する  Arguments]  ${password}
  Input Text  password  ${password}

ログインボタンを押す
  Click Button  login

ログインエラーが出力される
  Wait Until Page Contains  ログイン
  Page Should Contain  ログインIDまたはパスワードに誤りがあります。

ログイン成功の画面が表示される
  Wait Until Page Contains  ログイン成功
  Page Should Contain  ログイン成功

これは普通のテキストファイルです。拡張子も何でも大丈夫です。
上のようなファイルを用意して、

pybot ファイルのパス

で実行できます。ファイルのパスではなく、フォルダを指定するとフォルダ内のテストを全て実行します。

*** Settings ***は使用するライブラリを定義したり、テスト結果(HTMLファイルで出力されます)に表示するドキュメントを定義したりします。

*** Variables ***でテストケースやキーワードで使用できる変数を定義できます。

*** Test Cases ***でテストケースを定義します。タブ分開けて(または空白を2文字以上開けて)定義したテストケースが実行されるキーワードになります。

*** Keywords ***でテストケースで記述したキーワードの定義とその実装を記述します。「Input Text」や「Click Button」などはSelenium2Libraryで定義されているキーワードです。Selenium2Libraryのキーワードは、Selenium2Libraryのキーワード一覧ドキュメントを御覧ください。他のライブラリを使う際もそれぞれ同様のドキュメントが用意されています。
また、キーワードは引数が取れます。キーワードと引数はタブ分開けて(または空白を2文字以上開けて)定義します。

他、注目すべき点を挙げておきます。

  • 日本語が使えます。ファイル名も日本語でOKです。
  • Selenium2Library はfirefox driverを標準で備えています。ただ、Chromeで動かしたい場合は別途ChromeDriverが必要です。
  • 上記は1つのファイルで全部記述していますが、ファイルは分けることが可能です。その場合、*** Settings *** にて参照するファイルを「Resource ファイルのpath」と記述することで読み込むことが可能です。
    Library定義や変数定義用のファイル、各画面ごとのテストケース用ファイル、各画面ごとのキーワード定義ファイル等ファイルを分割するとよいでしょう。

Robot Frameworkのここが便利

  • python製ですが、インストール以外でpython を意識するところはありません。
  • 文法がない。キーワードから必要なものを引用するだけなので学習コストが低いです。
  • ファイル名もテストケースも日本語で自由に書けるのでエンドユーザー向けにも使えるのではないでしょうか。

いかがでしょうか。とにかく、簡単にWebの自動テストが書けてしまうツールですので、ぜひ、試してみてください。

また、長い文字列のテストデータを簡単に作成する方法や、ローカル・ステージング等環境別に実行する方法、JenkinsやCircleCIなどCIツールで実行する方法などのTIPSをまた機会がありましたら紹介したいと思います。

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

リモートiOS開発成功の処方箋、早期のCI導入

どうも、ギルドワークス 前川です。京都からリモート作業を行っていますが、この二週間は、祇園祭でとんでもない人出となっております。

リモートでの開発に必要なもの

ギルドワークスでは、Webサービスだけでなく、iOSやAndroidの開発もリモートで行ってきています。その中で、最近一つのパターンとなっているのが「可能な限り初期に継続的ビルド(CI)を導入する」ことです。

もちろんCIは手段でしかありません。その目的は、「全員が同じものを見て確認する」ためです。対象がWebサービスならば、例えばHerokuにデプロイされたものを正として扱ってやれば、事は済みます。

しかしiOS開発では、そうはいきません。全員が「同じもの」を見ることが非常に重要ですが、それにはCIされた成果物を共通の場所においておき、それを参照する、これしかありません。

ここは結構厳格にやらなければいけない、と私は思ってます。例えばレビュー指摘をしても「ここは自分の環境では動いてますんで」などと言われると、そこで会話が止まってしまい、フィードバックが割と根本から絶たれてしまうのです。

「masterにpushされたものが唯一にして絶対の正」これを守るのは、簡単で、そしてもとても即効性のある、リモートiOS開発改善の処方箋なのです。

ギルドワークスが利用しているサービス:Circle CI

iOSのビルドはまだまだローカルJenkinsが主流だとは思いますが、リモートワークを掲げる当社としては、やはりCIを行ってくれるWebサービスを使用したいところです。

というわけで、ギルドワークスが利用しているサービスがCircle CIとなります。

Circle CIは”Experimental Setting(実験的な設定)”ながらもiOSのビルドを行うことができます。しかも、ビルド速度に制限はかかってしまうものの、Private レポジトリを含めて無料 でCIサービスを利用できます。

詳しい設定は、以下の公式ドキュメント(英語)をご覧ください。

iOSビルドの便利ツール、Schenzen

CircleCIでは、基本的にコマンドラインでビルドを実行していきます。

一応Xcodeにもxcodebuildというビルドツールが付属しているのですが、設定項目が結構多く、なかなか使いこなすのは大変です。また、iOSのファイル配布型式であるIPAファイルを作るのには、別のコマンドを色々叩く必要があり、大変です。

そんな時便利なのが、schenzenというコマンドラインツールです。

このツールを使えば、環境変数さえ適切に設定していれば、以下のように非常にシンプルなスクリプトで、ipaのビルドから、DeployGateなどのベータ配布サービスへの配信までやってくれます。

ipa build
ipa distribute

これらのサービスを活用して、ギルドワークスでは、以下の様なデプロイメントパイプラインを、手軽に組むことができています。

スクリーンショット 2015-07-14 18.45.01

これからのCIのトレンド

こういったギルドワークスでの取り組みを踏まえて、先日大阪の「CI勉強会」という勉強会で発表をしてきました。

タイトルは、「ポストJenkins時代のビルド戦略」

Jenkins一択時代から、色々なサービスを組み合わせる時代へ。今、結構大きな転換点が来ていると思っています。新しいツールやサービスとしっかり向き合って、自分たちの組織に最適な解を導きたいですよね。

もし、このようなCI周りの技術的悩みがおありなら、ギルドワークスにお気軽にお問い合わせください!

「よいコード」を書くためのはじめの2歩

ギルドワークスさんとパートナーとして一緒にお仕事させていただいています
木目沢(@pilgrim_reds)と申します。

このような場で記事を書かせていただけることになりまして大変緊張しております。

今回は、Kent Beckが書いた「実装パターン」という本を紹介したいと思います。

出版社の都合で絶版になってしまっているのですが、素晴らしい本ですので、もし手に取る機会がありましたらぜひ読んでみてください。

この本のテーマは、「よいコードを書く方法」です。
190ページという薄い本ながら、「よいコードを書く」ためのパターンが100個近く掲載されています。

なにより素晴らしいのは、パターンを紹介するだけでなく、

  • そもそもよいコードとは何か?
  • なぜよいコードを書く必要があるのか?
  • パターンとは何か?
  • どのようにパターンを選択し、適用すればよいのか?

という本のテーマの「前提」となる部分がきちんと説明されていることです。(まえがき、1章〜4章)

全てをこの場では紹介しきれませんので、今回はこのなかから、「よいコードを書くためのはじめの2歩」を紹介します。これは、Kent Beck自身が歩んだ最初のステップということで「1章 はじめに」で紹介されています。

1歩目・・・プログラミングを行うと同時に意識的になること。

Kent Beckがこの本を執筆しはじめたころの話だそうですが、当時、すでに、何年もプログラミングの経験があり、プログラミング上の決定はスムーズにすばやく行われているのに、なぜメソッド名をその名前にしたのか、そのオブジェクトにそのロジックを含ませるべきだと確信した理由は何なのかを説明できなかったことに気がついたそうです。

そこで、よいコードを書くための第一歩は「自分で何を考えているかを意識できるぐらいに思考速度を落とす」こと、直感でコードを書く「振り」をやめることを挙げています。

2歩目・・・他人の重要性を認識すること。

プログラミングというのは、1人の人間と1台のマシンとの孤独なコミュニケーションであることは、ほとんどありません。
また、他人を気に掛けるということは、意識的な決定であって、練習しないと身につかないものです。

同じくKent Beckが書いた「XPエクストリーム・プログラミング入門 — 変化を受け入れる 第2版」の原書出版が2004年。「実装パターン」原書出版が2007年ですから、当時、すでに達人の域に入っていたといってもいいでしょう。
つまり、新人でも中級者・上級者であっても気がつかなければ最初の一歩も踏み出せないということです。

ここまで、こんなことを言っておいてなんですが、私自身、はじめの2歩を忘れてコードを書いていることが未だに多いです。
まだまだ、練習が足りませんね。

誤解していただきたくないのは、「常にゆっくり」コードを書けといっているわけではありません。いわばトレーニングの一環といったところです。
最終的にはよいコードを書くことを「習慣化」するというのが、そもそもの本書の目的であります。

最後にこの「実装パターン」ですが、ギルドワークスの増田さんが、ドメイン駆動設計を実践する中で、何度も読み返して参考になさっている文献のなかの一冊に挙げられています。

ドメイン駆動設計を実践されている方にもぜひ手に取っていただきたい一冊です。

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