Cloud Vision APIで画像から情報を取り出してみる

こんにちは。廣田です。
今日は、GoogleのCloud Vision APIを使って画像の分析をしてみたいと思います。

Cloud Vision APIについて

Cloud Vision APIは、Google Cloud Platform(GCP)の機能として提供されている画像分析サービスです。機械学習を使って、入力された画像に何が写っているのかを認識することができます。2017年3月の時点では、以下の情報を取得することができます。

  • 顔検出(FACE_DETECTION)…写っている顔と感情(喜んでいる,怒っている,…)を認識する。
  • ランドマーク検出(LANDMARK_DETECTION)…写っている建物や場所を認識する。
  • ロゴ検出(LOGO_DETECTION)…写っている企業や商品のロゴを認識する。
  • ラベル検出(LABEL_DETECTION)…画像の内容をもとに、適切と思われるラベルを付ける。
  • テキスト検出(TEXT_DETECTION)…写っている文章を認識する。いわゆるOCR。
  • セーフサーチ検出(SAFE_SEARCH_DETECTION)…有害な内容を含んでいないか認識する。

今回は、Node.jsを使って3枚の写真をそれぞれランドマーク検出・ラベル検出・テキスト検出に入力し、取得できた情報を見てみます。


実行するコードは以下のとおりです。
Cloud Vision APIとの通信を行うため、https://github.com/tejitak/node-cloud-vision-apiというライブラリを使用しています。また、LABEL_DETECTIONの部分を変更することで、取得する情報を変えることができます。


'use strict'

const vision = require('node-cloud-vision-api');

// 引数から画像ファイル名取得
const filename = process.argv[2];

// APIキーを渡して初期化
vision.init({
    auth: '<APIkey>'
});

// APIリクエスト生成
const request = new vision.Request({
    image: new vision.Image(filename),
    features: [
        new vision.Feature('LABEL_DETECTION', 3),
    ]
});

// APIリクエスト発行
vision.annotate(request).then(response => {
    console.log(JSON.stringify(response.responses));
}, error => {
    console.log('Error:', e);
});

ラベル検出

まずは、こちらの写真をラベル検出にかけてみましょう。
ham

この写真に対して、Cloud Vision APIから以下のような分析結果が得られました。


[
  {
    "labelAnnotations": [
      {
        "mid": "/m/02wbm",
        "description": "food",
        "score": 0.95124674
      },
      {
        "mid": "/m/02q08p0",
        "description": "dish",
        "score": 0.93420345
      },
      {
        "mid": "/m/0cdn1",
        "description": "hamburger",
        "score": 0.9003164
      }
    ]
  }
]

food(95%)、dish(93%)、hamburger(90%)ということで、何が写っているのかきちんと認識できているようです。ここではラベルの数を3つにしていますが、数を増やすとmeat(84%)やbreakfast sandwich(75%)といったラベルも出てくるので、うまく使えば写真につけるタグのレコメンドなどはこれだけでも十分機能するものが作れそうですね(これを朝から食べるのか…?という気持ちはありますが)。

ランドマーク検出

続いてはこの写真をランドマーク検出にかけてみましょう。写っているのは東京タワーですが、夜の写真なので特徴的な赤と白ではなくオレンジっぽい色になっています。
tower

分析結果がこちら。


[
  {
    "landmarkAnnotations": [
      {
        "mid": "/m/0132_x",
        "description": "Tokyo Tower",
        "score": 0.7007429,
        "boundingPoly": {
          "vertices": [
            {
              "x": 47,
              "y": 175
            },
            {
              "x": 240,
              "y": 175
            },
            {
              "x": 240,
              "y": 614
            },
            {
              "x": 47,
              "y": 614
            }
          ]
        },
        "locations": [
          {
            "latLng": {
              "latitude": 35.65822,
              "longitude": 139.745728
            }
          }
        ]
      }
    ]
  }
]

ランドマークの名称(Tokyo Tower,70%)だけでなく、緯度経度(locations)も返してきました。もちろん写真についていた位置情報は削除してあるので、Googleマップの情報などを活用して東京タワーの場所を見つけてきたのでしょうか。また、boundingPolyにはオブジェクトを認識した場所が格納されているので、その位置に線を引くことでCloud Vision APIの気持ちを知ることができます。

tower

テキスト検出

最後はテキストの検出です。紙で渡されるけど情報の管理は電子化したいもの、ということでコンビニのレシートを読み込ませてみます。
slip

読み込み結果がこちら。


    "textAnnotations": [
      {
        "locale": "ja",
        "description": "盃サンクス\nsun\n中野坂上ハーモニー店\n電話 03-5333-2011\n東京都中野区本町一丁目3 2番2\n2017年3月1日(水) 8時52分\n領収書\n直巻焼しゃけ\n¥120\nY.ランチパックカレー(ラガービールイ ¥162\n午後のおいしい無糖500 ¥151\nセール値引\n472\n(商品合計\n¥433 )\n(値引合計\n-422 )\n合計\n¥41 1\n(うち消費税等 8.0%\n¥30)\nお預り\n¥1, 01 1\nお釣\n¥600\nお買上げ明細は上記のとおりです。\nNo. 274289\n責04\n04\n102 22\n0212\n2652\n",
        "boundingPoly": {
          "vertices": [
            {
              "x": 323,
              "y": 748
            },
            {
              "x": 1494,
              "y": 748
            },
            {
              "x": 1494,
              "y": 2421
            },
            {
              "x": 323,
              "y": 2421
            }
          ]
        }
      }
      

このままだと見づらいので、\nで改行して見た目を整えてみます。


盃サンクス
sun
中野坂上ハーモニー店
電話 03-5333-2011
東京都中野区本町一丁目3 2番2
2017年3月1日(水) 8時52分
領収書
直巻焼しゃけ
¥120
Y.ランチパックカレー(ラガービールイ ¥162
午後のおいしい無糖500 ¥151
セール値引
472
(商品合計
¥433 )
(値引合計
-422 )
合計
¥41 1
(うち消費税等 8.0%
¥30)
お預り
¥1, 01 1
お釣
¥600
お買上げ明細は上記のとおりです。
No. 274289
責04
04
102 22
0212
2652

店舗や地名・商品名はバッチリ、数字の間違いは値引き合計の¥と4を読み間違えた1ヶ所でした。分析結果が細切れになっていることから、「商品合計   ¥433」のように大きな空白が入る場所は2段組だと認識しているのかもしれません。

おわりに

いかがでしたでしょうか。少ないサンプルではありますが、コンピュータにも「見えているものを認識する」ことができるようになってきているようです。バズワード的ではありますが、人工知能(AI)にも不可欠な要素だと思いますので、今後の発展に期待したいと思います。

ありがとうございました!

SNSでもご購読できます。