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

先日、Google Cloud Vision APIを使って画像(主に京都関係)を判定させてみるという記事でGoogleくんとかいうイケてる人工知能が画像データを見て何の画像か識別するデモンストレーションを行いました。
その中でGoogleくんは千本鳥居やら舞妓はんやらを認識することはできた反面、大文字焼きや祇園祭の画像の識別はうまくいかなかったため、この結果をもってGoogleくんはヒトやモノは判別できても、無形であるイベントの判別は難しいのではないかという仮説を提示しました。

しかしいま私はこの発言に対して後悔をしています。
Googleくんの学習能力は僕の想像を越えていました。
アホなのはGoogleくんではなく僕だったのです。


あらためて言わせてもらう。
奴はパーフェクトだった。

【Google Cloud Vision】

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

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で、前回の記事ではこれを用いて画像の識別を行いました。
今回はWEB_DETECTIONという機能を使います。
WEB_DETECTIONは要するにGoogle画像検索の逆、画像から検索ワードを導き出す感じの機能だと思います。
これを使っていくつかの画像を分析してみました。

【判定】

では前回Label Detectionでうまく判定できなかった画像たちを判定させてみます。

まずは清水寺です。

清水寺

Label Detectionでは判定結果chinese architectureと識別に失敗しました。
しかし中国建築の血を濃く引いているのも事実ですし二番目の候補はjapanese architectureだったため、惜しかったとも言えます。
この画像をWeb Detectionにかけた結果が次です。

WEB_DETECTIONによる清水寺の判定結果

なんということでしょう。
一位は圧倒的Kiyomizu-dera!
余裕の正解です。これがWeb Detectionの力か。。
伏見稲荷とか東大寺とかノイズが混ざっているのが少し気になりますが。

次は大文字焼き。

大文字焼き

Label DetectionではLightやらgeological phenomenonやらと本質を捉えられませんでした。
Web Detectionではどうか。

WEB_DETECTIONによる大文字焼きの判定結果

Gozan no Okuribi、正解です。なんなら私が正式名称に訂正された形です。すいません。
またスコアは低いですがBon Festival, Bonfire(かがり火)もニクい補足説明です。

次は祇園祭。

祇園祭の山鉾巡行

Label Detectionではurbal areaやらcityやらと大ハズレ。
街中の画像であることしか判定できず、前回の記事の中でも最大の惨敗でした。
Web Detectionの結果は次になります。

WEB_DETECTIONによる祇園祭の判定結果

Yasaka Shrine, Gion Matsuriとパーフェクト解答です。前回の苦戦はなんだったのか。
また固有名詞だけでなく一般名詞Festivalが出るのもいいですね。

ここまで前回の苦戦を覆す圧倒的完封勝利の様相。
しかしいくらなんでも次の人は難しいでしょうよ。

後醍醐天皇
WEB_DETECTIONによる後醍醐天皇の判定結果

ギャー!!
Kenmu Restorationすなわち建武の新政、そしてその次がEmperor of Japanつまり天皇!
室町時代と鎌倉時代の両方を生きた人ですから両方出るのは正解!
また南北朝時代という微妙な用語もしっかりと抑えています。
筆記試験で「この人について説明せよ」と聞かれたとしても正解するレベルです。
なんならこれが一番精度が高いのではないでしょうか。
ただNorthern Court(北朝)だけは間違い、後醍醐天皇は南朝です。
あと名前は思い出せなかったみたいです。

【まとめ】

前回、僕はGoogleくんは無形であるイベント系の判定が苦手と言いましたが前言を撤回します。
Googleくんに死角はありません。
イベント、人物、名称を判定したければWeb Detectionがそれを可能にします。
特に固有名詞を引き出したいときは無条件でこちらを使うべきでしょう。

この結果から一つ学べることは、Googleくんがいくら優秀だったとしても使う人がアホだと(それは僕です)正しい答えを得ることはできないということです。
それは昨今の言説『AIがとんでもなく進歩すれば、とりあえずAIにまかせたら全部やってくれるようになる』は実現しないという意味だと思います。
Label Detectionは一般語を使って安定した識別をしてくれます。
Web Detectionはウェブ上の集合知からマニアックな対象についても関連語を見つけてくれます。
その使い分けは画像分析で何をしようとしているかという目的によるわけで、それを知っているのは使う人間だけです。使われる機械が知るわけがないです。

よっていくらAIの性能が上がっても、AIを使う人間が何も考えなくて良くなる、何も理解しなくて良くなる、ということは決して無いでしょう。
むしろそのテクノロジーをよく理解する人だけが効果的に使い大きな成果を上げていく、そういう時代になるのではないでしょうか。

最後に思いつきで次の画像をやってみました。

いらすとや清水寺

WEB_DETECTIONによるいらすとや清水寺の判定結果

これってすごすぎるんじゃないかと僕なんかは思うわけですけど、どうでしょうか?

関連記事

参考サイト

【(補足)分析詳細】

本記事の画像分析の具体的な手順を下記にしめします。

Google Cloud Vision APIの利用のためにはまずAPIキーを取得しなければなりません。
取得方法を非常に丁寧に手順を説明されている下記サイト

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

の手順1を読んでAPIキーを取得してください。

ローカルファイルからAPIを呼び出して結果をプロットするために、Rのコードを下記のように書きました。

#R
# Cloud Vision APIに画像データをバイナリとしてを含めたjsonをPOSTし、判定結果のjsonを得る
# 結果として受け取るラベルの種類数の最大値は10
library(httr)
getResult <- function(file, type = "WEB_DETECTION"){
  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 = 10)
                                )
              ) 
  res <- POST(url = u, encode = "json", body = body, content_type_json())
}

# Cloud Visionの判定結果を図示する
library(jsonlite)
library(ggplot2)
library(dplyr)
plotResultWD <- function(res){
  res %>%
    content(as = "text") %>%
    fromJSON(flatten = TRUE) %>%
    extract2("responses") %>%
    extract2("webDetection.webEntities") %>%
    first() %>%
    mutate(description = reorder(description, score, sum)) %>%
    filter(!is.na(description)) %>%
    ggplot(aes(description, score)) +
      geom_col() + coord_flip() +
      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)) 
}

WEB_DETECTIONの場合、スコアが0~100で返ってくるようです。(ちなみにLABEL_DETECTIONでは0~1でした)

得られるスコアはLABEL_DETECTIONよりも変動が激しいように感じます。
清水寺では最大63が得られたのに対して、大文字は最大でも4.73しか得られません。

コメントを残す