2017.03.06
機械学習で遊ぼう! APIサービスやTensorFlowを使ったサンプルレシピ集
第1回 写真アルバムアプリで学ぶ Vision API / Translation API の使い方
連載第1回目では、Cloud Vision APIとCloud Translation APIを用いた写真アルバムのWebアプリケーションを紹介しながら、PythonのアプリケーションからこれらのAPIを利用する方法を解説します。
1.はじめに
さまざまなサンプルアプリケーションを通して、機械学習やディープラーニングの活用方法を学んでいきましょう! 最近は、アイドル画像の認識や音楽の自動生成など、多数のディープラーニングの応用例がネットで公開されるようになりました。しかしながら、このような機能を組み込んだアプリケーションを自分で作ろうと思うと、どうしてよいのかなかなかすぐにはわかりません。そこで、本連載では、実際に動作するサンプルアプリを用いて、機械学習/ディープラーニングの活用方法を解説していきます。本連載を参考にして、オリジナルアプリの開発にもぜひ挑戦してみてください。
第0回の冒頭でも説明してしていますが、ここでは、次の2種類の方法で機械学習を利用していきます。
●APIサービス
学習済みのモデルを用いて、API経由で利用できるクラウドサービスです。本連載で利用するGoogle Cloud Platform (GCP) が提供するサービスでは、2017年3月時点で、表1のようなサービスが提供されています。
●TensorFlowによる学習モデル
オープンソースのTensorFlow(Googleが開発した機械学習のソフトウェアライブラリ)を用いて、独自モデルの学習を行います。学習処理には、多くの計算リソースが必要ですが、学習済みのモデルをアプリケーションに組み込んで利用する際は、一般的なサーバー環境でも問題ありません。
サービス名 | 説明 |
---|---|
Cloud Vision API | 画像分析サービス |
Cloud Speech API | 音声のテキスト変換サービス |
Cloud Translate API | テキスト翻訳サービス |
Cloud Natural Language API | 自然言語分析サービス |
Cloud Machine Learning | TensorFlowを用いた機械学習サービス |
第1回となる今回は、Cloud Vision APIとCloud Translation APIを用いた写真アルバムのWebアプリケーションを紹介しながら、PythonのアプリケーションからこれらのAPIを利用する方法を解説します。GCPのAPIサービスを利用する際は、アカウント作成などの事前準備が必要ですので、必要な手順については、第0回の記事を参考にしてください。
2.アプリケーションの全体像
まずはじめに、サンプルアプリケーションの内容を説明しておきます。今回のアプリケーションは、複数のユーザーが写真画像をアップロードして公開することができる簡易的な写真アルバムサービスです。画像ファイルをアップロードすると、写真の内容に対応した日本語のラベルが自動的に付与されて、ラベルによるフィルタリングができるようになります(図1)。このラベル付けの処理に、Cloud Vision APIとCloud Translation APIを利用しています。Cloud Vision APIの物体認識機能で英語のラベルを取得した後に、それをCloud Translation APIで日本語に翻訳しています。
なお、このアプリケーションが提供するユーザー認証機能は、Googleアカウントによる認証のみで、Googleアカウントを持っているユーザーであれば誰でも利用することができます。実際にアプリケーションを公開する際は、利用ユーザーを制限するなどの追加機能が必要です。あくまで、APIサービスの利用方法を学ぶためのサンプルとして活用するようにしてください。
また、今回は、GCPが提供するGoogle App Engine(GAE)の環境を用いてアプリケーションを実行します。GAEは、一般に、Platform as a Service(PaaS)と呼ばれるタイプのサービスで、アプリケーションのプログラムコードをアップロードするだけで、即座にインターネット上にアプリケーションを公開することができます。特に、GAE上で実行されるアプリケーションの場合は、GCPのAPIサービスを呼び出す際の認証処理が自動的に行われるため、認証用のAPIキーの作成といった事前準備が不要になります。
アプリケーションの全体像は、図2のようになります。ユーザーがアップロードした画像ファイルは、オブジェクトストアーのCloud Storageに保存された後、Cloud Vision API/Cloud Translation APIによるラベル付けが行われます。取得したラベル情報は、分散データストアのCloud Datastoreに保存されます。Webアプリケーション全体は、PythonのWebフレームワークであるflaskを利用して作成されています。
3.アプリケーションの利用手順
それでは、実際にアプリケーションをデプロイして、動作確認を行ってみましょう。アプリケーションのコードは、GitHubの以下のリポジトリで公開されています。コードの内容については、この後で改めて説明します。
GoogleCloudPlatform/appengine-photoalbum-example
はじめに、第0回の「2. アカウントを登録しよう」から「3. プロジェクトを作成しよう」に従って、GCPのアカウント登録を行って新規のプロジェクトを作成しておきます。続いて同じく第0回の「5. Vision APIで画像認識してみよう」の「[1] APIの有効化」に従って、Cloud Vision APIとCloud Translation APIを有効化しておきます。ここでは、Cloud Vision APIに加えて、Cloud Translation APIも有効化する必要があるので注意してください。なお、前述のように、GAEからCloud Vision API/Cloud Translation APIを使用する場合、APIキーの作成は不要になりますので、「[2] APIキーの発行」は不要です。この後は、Cloud Shellのコマンド端末からデプロイ作業を進めます。Google Cloud Platformのコンソール画面の右上にあるボタンから、Cloud Shellの端末画面を開きます(図3)。
図4のコマンド端末が開いたら、次のコマンドでGitHubからサンプルコードをダウンロードします。「git clone https://github.com/GoogleCloudPlatform/appengine-photoalbum-example.git」の部分を入力してください。
$ git clone https://github.com/GoogleCloudPlatform/appengine-photoalbum-example.git Cloning into 'appengine-photoalbum-example'... ...
次に、ダウンロードしたサンプルコードのディレクトリにカレントディレクトリを変更します。
$ cd appengine-photoalbum-example
ここで、カレントディレクトリにある設定ファイル app.yaml をエディタで開いて、下記の部分を修正します。テキストエディタの起動方法については、すぐ後の説明を参照してください。
env_variables: LANG_TAG: 'ja' ← 'it' を 'ja' に変更 TIMESTAMP_TZ: 'Asia/Tokyo' ← 'Europe/Rome' を 'Asia/Tokyo' に変更
これは、Cloud Translation APIで翻訳する先の言語と、画像ファイルのアップロード時刻を表示するタイムゾーンを指定するものです。ここでは、日本語、および、日本のタイムゾーンを設定しています。
Cloud Shellの端末上では、viエディタが使用できますが、Cloud Shellの端末画面の上部にあるメニューから「ファイル」→「コードエディタを起動」を選択すると、ブラウザ上でGUI形式のテキストエディタを使用することも可能です(図5)。
この後は、以下のコマンドを順に実行していきます。まず、アプリケーションの実行に必要なライブラリ群をディレクトリlibの下にインストールします。
$ pip install -r requirements.txt -t lib
続いて、GAEのアプリケーション環境をセットアップします。GAEを利用するリージョンの選択を求められるので、ここでは、「asia-northeast1」(日本国内のリージョン)を選択しておきます。
$ gcloud app create You are creating an app for project [PROJECT ID]. WARNING: Creating an App Engine application for a project is irreversible and the region cannot be changed. More information about regions is at https://cloud.google.com/appengine/docs/locations. Please choose the region where you want your App Engine application located: [1] asia-northeast1 (supports standard and flexible) [2] us-central (supports standard and flexible) [3] europe-west (supports standard) [4] us-east1 (supports standard and flexible) [5] cancel Please enter your numeric choice: 1 ← 1 を選択 ...
次に、Cloud Datastoreのインデックスを作成します。
$ gcloud datastore create-indexes index.yaml You are about to update the following configurations: - [PROJECT ID]/index (from [/home/[USER]/[PROJECT NAME]/index.yaml]) Do you want to continue (Y/n)? Y ← Y を入力
最後にアプリケーションのコードをGAEの環境にアップロードすれば、デプロイは完了です。
$ gcloud app deploy You are about to deploy the following services: - [PROJECT ID]/default/20170213t161504 (from [/home/[USER]/[PROJECT NAME]/app.yaml]) Deploying to URL: [https://[PROJECT ID].appspot.com] Do you want to continue (Y/n)? Y ← Y を入力 ...
上記の [https://[PROJECT ID].appspot.com] の部分に表示されたURLから、デプロイしたアプリケーションにアクセスすることができます。ただし、Cloud Datastoreのインデックス作成が完了して、アプリケーションが利用可能になるまで少し時間がかかります。コンソールのメニューから「データストア」→「インデックス」を選択して、図6のように2種類のインデックスができていることを確認してください。
この後は、Webブラウザから[https://[PROJECT ID].appspot.com]にアクセスして、冒頭の図1の手順に従ってアプリケーションを利用していきます。初回のアクセス時はGoogleアカウントによる認証が必要ですが、ブラウザのキャッシュ機能が有効であれば、2回目以降のアクセスでは認証処理は不要となります。好みの写真をアップロードして、どのようなラベルが付与されるか試してみるとよいでしょう。
4.google-cloudライブラリを用いたAPIサービスの利用方法
ここからは、今回のサンプルアプリケーションのプログラムコードについての説明です。上で紹介した https://github.com/GoogleCloudPlatform/appengine-photoalbum-example を参照しながら説明を読むとよいでしょう。
このサンプルアプリケーションでは、google-cloudライブラリを用いてCloud Vision APIとCloud Translation APIに対するアクセスを行っています。これは、Pythonのプログラムコードから、GCPのさまざまなAPIを呼び出すためのクライアントライブラリになります。下記の公式Webサイトにある「Read the Docs」のリンクから、詳細なドキュメント参照することができます。
今回のアプリケーションコードの中では、設定ファイル requirements.txt の以下の行(6行目)で、ライブラリのインストールが指示されており、これによって、GAEの環境内でgoogle-cloudライブラリが利用可能になります。
google-cloud==0.22.0
アプリケーションのメインとなるコード main.py では、冒頭の下記の部分(30行目)で、このライブラリからCloud Vision APIとCloud Translation APIを使用するためのモジュールをインポートしています。
from google.cloud import vision, translate
そして、実際にCloud Vision APIを用いてラベルを取得する関数は次になります(88~92行目)。
def get_labels(photo_file): vision_client = vision.Client() image = vision_client.image( source_uri = 'gs://%s/%s' % (bucket_name, photo_file)) return image.detect_labels(limit=3)
まず、89行目では、Cloud Vision APIを利用するためのクライアントオブジェクトを取得しています。この部分では、通常は、APIを利用するための認証設定が必要になりますが、GAEの環境では、認証処理は自動で行われるので特別な設定は不要です。その後、90~91行目では、分析の対象となる画像ファイルを指定したimageオブジェクトを用意して、最後に92行目のdetect_labelsメソッドで、実際のラベルの取得を行います。ここでは、オプション指定(limit=3)により、最大で3種類のラベルを取得しており、ラベルの文字列が保存されたリストが得られます。
続いて、Cloud Translation APIを用いて、ラベルの文字列を翻訳する関数は次になります(95~100行目)。
def translate_text(text): if tag_language == 'en': return text translate_client = translate.Client() result = translate_client.translate(text, target_language=tag_language) return result['translatedText']
この関数では、グローバル変数 tag_language で翻訳先の言語が指定される前提となっており、翻訳先が英語(en)の場合は何もせずに与えられた文字列をそのまま返却しています(96~97行目)。98行目では、Cloud Translation APIを利用するためのクライアントオブジェクトを取得しており、その後、99行目では、translateメソッドで実際の翻訳処理を行います。このメソッドでは、翻訳処理の他に、翻訳前の言語の種別判定なども行われています。最後の100行目では、ここから翻訳文のみを取り出して返却しています。
以上の例からわかるように、google-cloudライブラリを使用すれば、Pythonのプログラムコードから、とても簡単にAPIを利用することができます。Cloud Vision APIでは、物体認識によるラベル付けの他にも、顔認識や感情分析など、さまざまな機能が提供されており、これらの機能も同様の手順で利用することができます。たとえば、感情分析機能を利用して、笑顔の写真には特別なラベルを付けるなどの機能拡張も考えられます。次は、画像に含まれる最大10個の顔を検出して、過半数が笑顔であればTrueを返す関数の例になります。
def is_happy(photo_file): vision_client = vision.Client() image = vision_client.image( source_uri = 'gs://%s/%s' % (bucket_name, photo_file)) num_faces, joy_faces = 0, 0 for face in image.detect_faces(limit=10): num_faces += 1 if face.joy == vision.likelihood.Likelihood.VERY_LIKELY: joy_faces += 1 if joy_faces > num_faces * 0.5: return True return False
オリジナルのアプリケーションを作成する際は、公式ドキュメント「Using the Vision API」も参考にするとよいでしょう。
5.後片付け
サンプルアプリケーションの動作確認ができたら、公開中のアプリケーションは停止しておきましょう。前述のように、Googleアカウントを持っているユーザーは誰でも利用できますので、公開したままで放置しないように注意してください。アプリケーションを停止するには、コンソール画面の「App Engine」→「設定」メニューから表示される画面で、「アプリケーションを無効にする」ボタンを押します(図7)。アプリケーションID(プロジェクトID)の入力を求められるので、該当のIDを入力すると停止処理が行われます。
この時、アプリケーションからアップロードした画像ファイルは、Cloud Storageに保存されたままになります。Cloud Datastoreに保存されたデータも同様です。作成したプロジェクトを削除すれば、このような使用中のリソースも完全に破棄することができます。プロジェクトを削除する際は、コンソール画面の「IAMと管理」→「設定」メニューで、「削除」ボタンを押します。この時もプロジェクトIDの入力を求められるので、該当のIDを入力すると削除処理が行われます。
【編集部注】この記事は、執筆時の2017年3月現在の情報に基づくものです。記事公開後、サービス内容や画面などに変更が発生する可能性がありますのでご注意ください。
春のエンジニア応援セール開催中!対象書籍200点以上が全て50%OFF!