クリエイター手抜きプロジェクト[459]機械学習編 Google Cloud Vision APIを使ってみる/古籏一浩

投稿:  著者:  読了時間:9分(本文:約4,000文字)



今週はちょっと気が変わって、機械学習のネタです。とは言っても、数学的な難しい話とかはありません(難しい数学の話はGrowhairさんにお任せ)。

GoogleのAlphaGoが囲碁で人間との対局に勝利したということで、非常に注目を集めている人工知能ですが、これは深層学習(ディープラーニング)を利用しています。

深層学習を利用したGoogleのTensorFlowですが、ページを作ってみたものの難しくて分かりません……。多分、専門知識を持った人なら使えると思います。

しかし、TensorFlowは難しいので機械学習に関してあきらめてしまうのは、将来的にもったいない気がします。そこで、もっと手軽に深層学習を利用できないか、ということで現在はβ版となっているGoogle Cloud Vision APIを使ってみました。

・Google Cloud Vision API
https://cloud.google.com/vision/




これを使えば、Webブラウザやコマンドラインから画像に何が写っているかなど手軽に得ることができます。学習はGoogleがやってくれますし、定期的に精度があがっているのではないかと。メンテも不要ですから機械学習のいいところだけを利用できそうです。

特にAPIで手軽に使えるというのは、Webのノウハウを持つ人にとっては便利です。Webブラウザがなくても、コマンドライン(シェル・ターミナル)から手軽に使えるのも便利ですし、バッチ処理でいろいろできそうです(トライアルの60日間を超えるとお金がかかる感じですが)。

Google Cloud Vision APIを使うには、APIを使うための登録やキーの取得をしなければなりません。公式ページに登録手順とAPIキーの取得方法が書かれています。

https://cloud.google.com/vision/docs/getting-started

しかし、英語でよく分からない人もいるでしょう。検索すると細かい手順を書いた日本語のページがありました。

・Cloud Vision APIの使い方まとめ(サンプルコード付き)
https://syncer.jp/cloud-vision-api

登録して5分くらい経過すると、Cloud Vision APIが使えるようになります。とりあえず、いくつか試してみました。Webやプレゼン資料みると、何か凄いことが書いてありますし、実際これまでの画像解析とは桁違いの結果が得られています。

ということで、まずは富士山の画像を認識するかどうかやってみます。使用したのは以下のページにあるサムネール画像です。

http://footage3.openspc2.org/HDTV/footage/4K/30f/mountain/fuji/0013/

誰が見ても富士山です。さて、これを認識させるには以下の内容のJSONファイル(要はテキストファイル)を作成し、ローカルディスクに保存します。

以下の "画像をBASE64エンコードした文字列" は "/9j/4AAQSkZJRgABAgEASABIAAD4QlBRXhpZgAATU0AKgAAAAgABwESAAMAAAAB" といったBASE64にエンコードした文字列になります。

{
"requests":[
{
"image":{
"content":"画像をBASE64エンコードした文字列"
},
"features":[
{
"type":"LABEL_DETECTION",
"maxResults":1
}
]
}
]
}

MacでBASE64に変換するには、以下のようにターミナルからコマンドを入力します。(10.6.8の場合)

fuji3.jpgは変換元の画像でfuji3.txtがBASE64エンコードしたデータ(結果、出力ファイル)になります。

openssl base64 -in fuji3.jpg -out fuji3.txt

あとはfuji3.txtの内容を、先ほどの "画像をBASE64エンコードした文字列" にコピー&ペーストすればOKです。ペーストしたらファイルを保存します。ここではデスクトップにfuji3.jsonという名前で保存しておきます。

次にターミナルから、以下のようにコマンドを入力します。◎の部分には取得したAPIキーを指定します。

@/Users/dgcr/Desktop/fuji3.jsonはfuji3.jsonファイルがあるパスです。

この場合、ユーザー名dgcrのデスクトップにあるfuji3.jsonファイルを指定しています。

curl -v -k -s -H "Content-Type: application/json" \
https://vision.googleapis.com/v1/images:annotate?key=◎ \
--data-binary @/Users/dgcr/Desktop/fuji3.json

コマンドを入力するとサーバーにアクセスし、その結果が表示されていきます。この場合、以下のような結果になりました(いつでも、この結果になるわけではなさそうです。この原稿を書いている間にも学習しているのでしょう。最初に実行した時は反転画像と認識されてました)。

{
"responses": [
{
"labelAnnotations": [
{
"mid": "/m/015kp7",
"description": "stratovolcano",
"score": 0.89470172
}
]
}
]
}

volcanoとあるので「火山」だと認識されているようです。確かに富士山は火山ですが、できれば富士山という名称付きで返して欲しいところです。複数の情報を取得したい場合はJSONファイルの

"maxResults":1

の1をより大きい値にします。3だと最大で3つまでの情報を返します。

"maxResults":3

変更して実行すると以下のようになりました。

{
"responses": [
{
"labelAnnotations": [
{
"mid": "/m/015kp7",
"description": "stratovolcano",
"score": 0.89470178
},
{
"mid": "/m/02jwqh",
"description": "vacation",
"score": 0.80489373
},
{
"mid": "/m/0dx1j",
"description": "town",
"score": 0.729697
}
]
}
]
}

vacation...間違ってはないけど富士山という名称は戻ってきません。名称を取得するにはJSONファイルの "type":"LABEL_DETECTION" で取得する種類を変更します。

"type":"LANDMARK_DETECTION"

にすると、地名などを返してくれます。エベレストの場合は以下のように山の名前と位置の情報まで返してくれます。

{
"responses": [
{
"landmarkAnnotations": [
{
"mid": "/m/0blbd",
"description": "Everest",
"score": 0.94971591,
"boundingPoly": {
省略
},
"locations": [
{
"latLng": {
"latitude": 27.983333,
"longitude": 86.827397
}
}
]
},

ということで、再度富士山に挑戦してみたところ、以下のような空しい結果になりました。

{
"responses": [
{}
]
}

何も返ってこない。Wikiにある富士山の画像でテストすると富士山ではなく富士川に。Googleの人工知能、まだまだ偏っていて使いものにならない感じがします。現状では学習が足りないということで、賢くなるまで待つしかないようです。


【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/

地元の山(長野県の常念岳)で試しても、山とか稜線とかは認識するけど、やはり山の名前は駄目でした。実用レベルにまでなるには、相当の時間がかかるんじゃないかなという気がします。

今月、地元で機械学習の講座を予定しているっぽいのですが、その前に機械学習の前知識についての講座がありました。聞いたけど、わかるような分からないようなというか求められる知識などが、これまでの経験とノウハウとは違うので、すごくもやもやというか、蜃気楼のような感じはあります。

・Premiere Pro & Media Encoder自動化サンプル集
http://www.amazon.co.jp/dp/4802090471/

・JavaScriptによるデータビジュアライゼーション入門
http://www.amazon.co.jp/dp/4873117461/

・Photoshop自動化基本編
http://www.amazon.co.jp/dp/B00W952JQW/

・Illustrator自動化基本編
http://www.amazon.co.jp/dp/B00R5MZ1PA/

・Adobe JavaScriptリファレンス
http://www.amazon.co.jp/dp/B00FZEK6J6/

・ExtendScript Toolkit(ESTK)基本編
http://www.amazon.co.jp/dp/B00JUBQKKY/

・データビジュアライゼーションのためのD3.js徹底入門
http://www.amazon.co.jp/dp/4797368861

・4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/

・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/