フレクトのクラウドblog re:newal

http://blog.flect.co.jp/cloud/からさらに引っ越しています

Cloud Vision APIでWebサイトを比較する

みなさんこんにちは。エンジニアの佐藤です。今回はCloud Vision APIの活用について書かせていただきたいと思います。

モチベーション

先日の Google I/O 2018 で、チャットボットが電話をかけて音声で美容室を予約するデモがあり、先進的事例として話題になりました。こうなると「この種の単純作業はAIに置き換わり、失業が社会問題になるのではないか。」という不安が募ります。しかし筆者の知っている範囲では、コンピュータの認識能力の柔軟性は、未だ人間には遠く及ばないと思います。 ただし、現時点で既に人間が追い越されている特性もあると思います。それは スピードと評価の安定性です 。24時間休みなく多数の画像判断を完全に一定の基準で実行することは、人間にはできません。しかしコンピュータは十八番です。 今回はこの特性を評価して、 Webサイトの画像全部の総合評価とWebサイト間の比較 を試みたいと思います。

筆者が選んだのは、大手リテールサイトのR社とA社です。どちらもホームページには100枚以上の商品などの画像があり、商品ジャンルも多岐にわたっています。 比較しようにも、評価観点が定まりそうにありません。そこで、これらの画像を全部、Cloud Vision APIでラベル検出させてみます。

道具立て

最初に両サイトの画像を個別ファイルとして保存し、次にそれぞれのファイルをCloud Vision APIでラベル検出させます。 結果はすべてPostgresqlに保存し、SQL言語でクエリして評価します。

Cloud Vision APIの結果

ラベル検出の仕様は以下のサイトに書かれていますが、

https://cloud.google.com/vision/docs/labels そのレスポンスは以下のように、「何が」「どのくらい確からしく」写っていたのかを答えてくれるというものです。

"labelAnnotations": [
    {
        "topicality": 0.9604079,
        "score": 0.9604079,
        "mid": "/m/01bqk0",
        "description": "bicycle wheel"
    },
    {
        "topicality": 0.9501146,
        "score": 0.9501146,
        "mid": "/m/019sc",
        "description": "black"
    },
    ...
    {
        "topicality": 0.58060855,
        "score": 0.58060855,
        "mid": "/m/0h8n8m2",
        "description": "ventilation fan"
    },
    ...

この通りレスポンスには複数のラベルが返され、色や形状など、様々な観点が含まれています。この場合は黒色の卓上クリップ扇風機なのですが、認識結果として最も正しいのは最もscoreの低い「ventilation fan」です。(やはり単発では、コンピュータは人間にはかなわないのです。)

なお、ラベル検出を行う場合は、追加料金を払うことなく「セーフサーチ」チェックも仕掛けることができます。これはアダルト画像などを検出するもので、上記の卓上クリップ扇風機の写真の場合は、以下のような結果になります。

"safeSearchAnnotation": {
    "violence": "VERY_UNLIKELY",
    "racy": "VERY_UNLIKELY",
    "adult": "VERY_UNLIKELY",
    "medical": "VERY_UNLIKELY",
    "spoof": "VERY_UNLIKELY"
}

セーフサーチについては、以下のサイトに仕様が書かれています。 https://cloud.google.com/vision/docs/other-features#safe_search

結果

一応計数してみましょう。

  • 総画像数: 522
  • 検出されたラベルの総数: 4917
  • 検出されたラベルの種類: 661

661種類、4917個ものラベル検出があったわけですが、この結果をどうやって取りまとめたものでしょうか?

一番単純な方法は、「ラベルごとにスコアを加算する」やり方です。これをサイト画像全体について集計すると、どんな画像が多いのかを摑むことができそうです。以下のような結果になりました。

        url        |   label         |      score
-------------------+-----------------+------------------
 www.ra*****.co.jp | product         |     249.13065277
 www.ra*****.co.jp | font            |     178.09255501
 www.ra*****.co.jp | text            |     174.66525343
 www.ra*****.co.jp | line            |     115.06299671
 www.ra*****.co.jp | brand           |     112.54623938
 www.ra*****.co.jp | logo            | 96.9688526700001
 www.ra*****.co.jp | graphics        |      87.28768391
 www.ra*****.co.jp | black           |       82.1643062
 www.ra*****.co.jp | black and white |      79.13861794
 www.ra*****.co.jp | monochrome      |      54.89684521
(10 rows)

       url        | label       |    score
------------------+-------------+-------------
 www.am****.co.jp | product     | 203.6307481
 www.am****.co.jp | font        | 44.40389657
 www.am****.co.jp | text        | 32.15153994
 www.am****.co.jp | brand       | 30.75662519
 www.am****.co.jp | technology  | 22.13816894
 www.am****.co.jp | line        | 17.98218844
 www.am****.co.jp | yellow      | 13.99654375
 www.am****.co.jp | black       | 13.39340801
 www.am****.co.jp | hardware    | 12.35800936
 www.am****.co.jp | sleeve      | 12.21443735
(10 rows)

結果は両サイトでよく似ています。両サイトともリテールサイトですから、「product」や「brand」が上位に来るのは当然です。また、画像の中には商品画像だけでなく、Webサイト自身のフレームやアイコンも多量に含まれている他、商品写真にも文字が埋め込まれているものが多数あります。このため「font」「text」「line」や色名も共通で上位に入っています。

強いて傾向を指摘するとすれば、R社の「logo」と、A社の「technology」です。R社のサイトが企画サイトへのポータルサイトの機能を重視したデザインになっているのに対し、A社のサイトは家電の写真が大写しになっていました。このような大雑把なやり方でも、少しは両サイトの傾向の違いが出ていると言えるのではないでしょうか。とは言え、もう少しなんとかならないでしょうか。

次に思いついた方法は、サイトごと、各ラベルごとに1~100までの相対スコアを計算し、これを相互に比較する方法です。例えばあるサイトで最も合計スコアの高いラベルには100を、最も合計スコアが低いラベルには0を設定します。ラベルごとに突き合わせれば、片方のサイトで扱いの小さい(または無い)ラベルが他方のサイトでは大きく取り上げられている、などの傾向がわかるかもしれません。

この結果はなかなか興味深いものとなりました。以下に抜粋します。

                description                | r_rel_score | a_rel_score | rel_score_diff 
-------------------------------------------+-------------+-------------+----------------
 bottled water                             |             |          81 |            -81
 toy                                       |          10 |          87 |            -77
 electronics accessory                     |          23 |          92 |            -69
...

 clothing                                  |          93 |          94 |             -1
...
 product                                   |         100 |         100 |              0
...

 recipe                                    |          90 |          10 |             80
 hair coloring                             |          91 |             |             91

今度ははっきり以下の傾向が見て取れます。

  • A社のみ: bottled water
  • A社多い: toy, electronics accessory
  • 同じ: clothing, product
  • R社多い: recipe
  • R社のみ: hair coloring

確かにA社のサイトには、ミネラルウォーターとおもちゃが多いのです。また両サイトとも衣料品がかなりのスペースを占めています。更に、この時のR社サイトには食材販売企画の広告が多く、これが「recipe」と認識されたと考えられます。 水とおもちゃ・家電重視のA社と、食品と美容重視のR社という傾向が、かなりはっきりと抽出されました。

セーフサーチの結果

今回は大手リテール業者のトップサイトのため、セーフサーチで問題が指摘された画像はほとんどありませんでした。 しかし、ただひとつ、 「adult = POSSIBLE」となった商品があり、それは「目元エステ家電」でした 。商品紹介画像では女性が仰向けになって分厚いアイマスクのような商品を装着していたので、誤解されてしまったようです。

しかしこの指摘、わからないでもありません。今回評価した画像の中ではこの画像以上に指摘されそうな画像はありませんでしたので、これはこれで正しい評価と言えます。

終わりに

Cloud Vision APIは既成のモデルを使用しますので、ラベルの結果については受け入れるしかありません。 しかし、もう少し使い方のノウハウが蓄積できれば実用になりそうだ、というのが筆者の感想です。 既成AIサービスを効果的に使うには、それなりの経験を積む必要があるのかもしれません。

最後までお読みいただき、ありがとうございました。