Google Cloud Vision APIを使って画像(主に京都関係)を判定させてみる

最新のネタではないようですが、最近読んだ本でGoogle Cloud VisionというGoogleの機械学習APIを使って画像の判定ができる、という紹介があって面白そうだったので自分でも試してみました。

Google Cloud VisionとはウェブAPIを用いてGoogleの機械学習により画像を認識するサービスです。
公式サイトはこちら

現時点(2018年1月14日時点)で一ヶ月に1000回までは無料で判定することができ、それを上回ると回数に応じて料金が請求されます。
とはいえ1000回を上回ってもそこから追加で1000回あたり$1.5程度と大したことのない価格でサービスを受けられます。
認識する種類によって料金が微妙に異なります。詳細は下記を参照ください。

料金 | Google Cloud Vision API ドキュメント | Google Cloud Platform

Google Cloud Visionは次の機能をサポートしています。

機能のタイプ 説明
LABEL_DETECTION 画像コンテンツに基づいてラベルを追加します(ラベル検出を参照)。
TEXT_DETECTION 画像内のテキストに対して光学式文字認識(OCR)を実行します(テキスト検出を参照)。
SAFE_SEARCH_DETECTION 画像の画像セーフサーチ プロパティを判別します(セーフサーチ プロパティの検出を参照)。
FACE_DETECTION 画像内の顔を検出します(顔の検出を参照)。
LANDMARK_DETECTION 画像内の地理的ランドマークを検出します(ランドマークの検出を参照)。
LOGO_DETECTION 画像内の企業ロゴを検出します(ロゴの検出を参照)。
IMAGE_PROPERTIES 画像の一連のプロパティ(画像のドミナント カラーなど)を計算します(画像プロパティの検出を参照)。
WEB_DETECTION 画像内のニュース、イベント、有名人などの時事的なエンティティを検出し、Google 画像検索の機能を使用してウェブ上で同様の画像を検索します(ウェブ エンティティとページの検出をご覧ください)
DOCUMENT_TEXT_DETECTION ドキュメントなどの高密度テキスト画像に対して OCR を実行します(ドキュメントの検出を参照)
切り抜きヒント 画像上のクロップ領域の推奨頂点を調べます(クロップヒントの検出を参照)

今回使うのはLABEL_DETECTIONという画像が何についての画像なのかを判定してくれるサービスです。

【準備(APIキーの取得)】

さて、これを利用するためにはまず自分のGoogleアカウントを使ってAPIを有効にする必要があります。
もちろん上記の書籍にその手順が説明されており私はそれを参考にしましたが、ウェブ上では下記のサイトが非常に丁寧に解説しています。

Cloud Vision APIの使い方まとめ (サンプルコード付き)

もしやってみたいと思われた方はこのサイトの手順1を読んでAPIキーを取得してください。

【判定結果を得るRのコード】

コードは下記のサイトと上記書籍を参考にしました。

RからGoogle Cloud Vision APIを使う – 盆栽日記

#R
# Cloud Vision APIに画像データをバイナリとしてを含めたjsonをPOSTし、判定結果のjsonを得る
# 結果として受け取るラベルの種類数の最大値は10
library(httr)
getResult <- function(file, type = "LABEL_DETECTION", max.res = 10){
  CLOUD_VISION_KEY <- "あなたのキー"
  u <- paste0("https://vision.googleapis.com/v1/images:annotate?key=", CLOUD_VISION_KEY)
  img <- readBin(file, "raw", file.info(file)[1, "size"])
  body <- list(requests = list(image = list(content = img), features = list(type = type, maxResults = max.res)))
  res <- POST(url = u, encode = "json", body = body, content_type_json())
}

# Cloud Visionの判定結果を図示する
library(jsonlite)
library(ggplot2)
library(dplyr)
plotResult <- function(res){
  res_text <- fromJSON(content(res, as = "text"), flatten = TRUE)
  res_text$responses$labelAnnotations[[1]] %>%
    mutate(description = reorder(description, score, sum)) %>%
    ggplot(aes(description, score)) +
      geom_col() + coord_flip() + ylim(0,1) +
      geom_text(aes(label = round(score, 2)), size = 5, hjust = -0.5, vjust = 0.5) +
      theme(axis.text.y = element_text(size=10), axis.text.x = element_text(size = 10)) 
}

res <- getResult("img/filename.jpg")
plotResult(res)

【実践】

上記のコードで準備は整いました。
早速Googleの人工知能様に判定してもらいましょう。
まずは京都のメイン観光地清水寺はどうでしょう。

清水寺

清水寺の判定結果

1位がchinese architecture!ブブー間違い。
とはいえ2位japanese architecture、3位historic site、4位tree以下すべて正解といえば正解です。
1位だけが合わないのが惜しかったですが、中国の建築も日本の建築も似たようなものという理解は逆に正しいのかもしれません。

次は外国人観光客から日本の観光地目的地ランキング一位に選ばれ続けているらしい伏見稲荷でいきます。
建物など一般的なモノではなく特殊なモノなので、人工知能ちゃんはそもそも何か分からないのではないか。
とくに外国人には難しいでしょう。Made in USAのGoogleくんは大丈夫かな?

伏見稲荷の千本鳥居
千本鳥居の判定結果

でたー。torii!!
よく鳥居なんて知っていますね。Googleくんは十分に博識なことが証明されました。
マイナーなモノまで記憶しているとは素晴らしいですが、よくよく考えるとこういうロングテールはプログラムが最も得意とするところではあります。

では次は舞妓はん。
ただの女性ではなく特別な女性であること、そしてその特徴を見いだせるかに注目です。

舞妓はん
舞妓はんの判定結果

出ましたgeisha
加えてwoman, kimonoなどとほぼ完璧な仕事です。
あえてケチを付けるとすればこの女性たちは舞妓はんであってゲイシャでは無いということくらいでしょうか。
Oxford Dictionaryでもgeishamaikoは区別しているようなのでGoogleくんは精進を続けて区別できるようになっていただきたい。
ただ髪型まで判定してくるのは、凄いを通り越して少し恐ろしいです。(shimada)

では次のいらすとやはどうでしょうか?
画像としては上の画像と全く違う特徴を持っていますが、人間が見れば同じ舞妓はんだと簡単に分かります。
プログラムでこの二つを結びつけるのはかなり難易度が高いはず。

舞妓はん(いらすとや)
舞妓はん(いらすとや)の判定結果

またwoman, geisha!これは凄い!!
この二つを結びつけるプログラムを、理解することができる気がしません。
まさにDeep Learningの本領発揮です。
そもそもこういうヒト型の画像から男なのか女なのかなんていったいどうやって判断するのだろうか。

Googleくん思ったより強いので難易度を上げます。大文字焼き
ほとんど真っ暗の写真です。知らない人にはネオンサインか超常現象にしか見えないはずですが、果たして宗教行事であることや山火事であることが分かるでしょうか?

大文字焼き
大文字焼き判定結果

light, night, heatといったあたりは間違いとは言えませんが、一番のキーである宗教行事であることを自然現象(geological phenomenon)を間違っているのは痛いですね。

なるほど、ヒトモノ系は強いが無形であるイベント系は弱いのではないかと推測できます。
ということで次は祇園祭

祇園祭の山鉾巡行
祇園祭の山鉾巡行の判定結果

はいブブー!
Googleくんの弱点見つけたり!
モノの名前は分別できても写真の中で起こっている出来事は難しいのですね。

最後に次の写真でいきましょう。
誰か知っていますか?

後醍醐天皇
後醍醐天皇の肖像画の判定結果

やっぱり難しかったみたいです。
ただしかろうじてmiddle agesを判定できているあたりは世界最強人工知能Googleくんの面目躍如といったところでしょうか。

【まとめ】

まず、判定が2,3秒で返ってくるという驚異的な処理速度に飽きもせず毎回驚いてしまいます。
そしてその判定精度は”プログラム”というレベルは遥かに通り過ぎ、

「中におっさん入ってるやろ!」

という人工”知能”の領域に到達しつつあることがよく分かりました。
こんな世界最先端の人工知能が無料で使えるなんて、Googleはなんて素晴らしい企業でしょうか。

そしてこのサービスを使って何か面白いことはできないかなと想像を膨らませてみたいです。

つづき

Google Cloud Vision APIを使って画像を判定させる(逆襲篇)

参考サイト

参考書籍