検索
連載

Google Cloud Vision APIDev Basics/Keyword

Google Cloud Vision APIはグーグルが提供する画像分析サービス。画像に何が含まれているかや、文字認識など、高度な画像分析をREST API経由で簡単に行える。

Share
Tweet
LINE
Hatena
「Dev Basics/Keyword」のインデックス

連載目次

 Google Cloud Vision API(以下、Vision API)はグーグルが提供する画像分析サービス。画像に何が含まれているかや、文字認識など、高度な画像分析をREST API経由で簡単に行える。

Vision APIの特徴

 Vision APIはバックグラウンドに機械学習モデルを持ち、以下のような機能をREST APIを介して利用できる。

  • ラベル検出
  • 有害コンテンツ検出
  • ロゴ検出
  • ランドマーク検出
  • 文字認識
  • 顔検出
  • 画像特性

APIs ExplorerでのVision APIの利用

 一番簡単にVision APIを試すには、グーグルのAPIs Explorerを利用することだ。ここではまずこれを利用して、Vision APIがどんなものかを見てみよう。

APIs ExplorerでVision APIを検索したところ
APIs ExplorerでVision APIを検索したところ

 上の画面で[Services]でも[Methods]でもクリックしていくと、最終的には次のような画面に到達する。一番下にある[Execute without OAuth]リンクをクリックすれば、特に認証を必要とすることなくAPIを試せる。

Vision APIをブラウザから実行できる
Vision APIをブラウザから実行できる

 この画面で[Request body]ボックスにJSON形式で必要な情報を入力していく。

リクエストを組み立てているところ
リクエストを組み立てているところ

 見れば分かるように、このボックスにはドロップダウンが表示されるので、そこで適宜必要なプロパティを選択し、その値を手入力していけばよい。試してみるだけなら、必要なのは上の画像にあるrequestsプロパティと、そこにネストしたfeatures、features→type、image、image→source→imageUriの各プロパティ(つまり、どんな検出を行うかを指定するtypeプロパティと、検出対象の画像を指定するimageUriプロパティ)だけである。

 以下に、type/imageUriプロパティを指定したところを示す。なお、検出対象を指定するにはこの他にも、画像ファイルをテキスト形式に変換してJSONデータのcontentプロパティに含める方法とGoogle Cloud Storage上に作られたストレージに保存されている画像をJSONデータのgcsImageUriプロパティに指定する方法もある(後述)。

組み立てたリクエスト
組み立てたリクエスト

 ここでは、typeプロパティに「TEXT_DETECTION」(文字認識)を、画像分析の対象として記事「Python 3の組み込み関数を速攻理解しよう: オブジェクト/スコープ/モジュール/動的評価/入出力編」のタイトルビットマップ画像を指定している。そして、[Execute without OAuth]リンクをクリックすると、次のような実行結果が得られる。

実行結果
実行結果

 このように簡単に文字認識ができていることが分かる(日本語のテキストであってもある程度は認識してくれるようだ)。

 Cloud Storage上の画像ファイルを指定するにはimageUriプロパティではなく、gcsImageUriプロパティに「gs://Cloud Storageのバケット名/ファイル名」といった形式で指定を行う。例を以下に示す。なお、Cloud StorageについてはVision APIの「クイックスタート」などでその設定方法などが説明されているので、詳細はそちらを参照されたい。

{
 "requests": [
  {
   "features": [
    {
     "type": "LABEL_DETECTION"
    }
   ],
   "image": {
    "source": {
     "gcsImageUri": "gs://insidernetbucket/domezero.jpg"
    }
   }
  }
 ]
}


Cloud Storage上の画像ファイルを指定

 ここでは、typeプロパティには「LABEL_DETECTION」を指定し、画像に何が写っているかの検出を行うようにして、検出対象には筆者が以前に撮影したスーパーカーを指定した。

 以下に実行結果を示す。「car」「vehicle」「sports car」など、きちんと検出されていることが分かる。

{
 "responses": [
  {
   "labelAnnotations": [
    {
     "mid": "/m/0k4j",
     "description": "car",
     "score": 0.98995584
    },
    {
     "mid": "/m/07yv9",
     "description": "vehicle",
     "score": 0.9690318
    },
    {
     "mid": "/m/01prls",
     "description": "land vehicle",
     "score": 0.9427383
    },
    {
     "mid": "/m/012mq4",
     "description": "sports car",
     "score": 0.86044693
    },
    {
     "mid": "/m/0ncqpsr",
     "description": "race car",
     "score": 0.78326666
    }
   ]
  }
 ]
}


実行結果

プログラムからのVision APIの利用

 APIs ExplorerでのVision APIの利用はあくまでも「使ってみる」というものであって、さまざまな言語用にVision APIにアクセスするためのフレームワーク/ライブラリが提供されている。

 ただし、それらのフレームワーク/ライブラリを利用するには、Google Cloud Platformのコンソールでアカウント/プロジェクトを作成して、さらにVision APIの利用設定、課金設定、認証情報の作成などを、Vision APIの「クイックスタート」ページを参考にして、事前に行っておく必要がある(本稿では説明は割愛する)。課金については「Cloud Vision API」ページを参考にされたい。比較的安価に使えるはずだ(お試しであれば、無料で使えるだろう)。

 ここでは準備を行ったものとして、JavaScript用の「@google-cloud/vision」パッケージを利用し、Vision APIにアクセスするコードを示す(「npm install @google-cloud/vision --dev」などを行っておく必要がある)。

 実際のコード例を以下に示す。

var Vision = require("@google-cloud/vision");

var vision = Vision();

vision.detectLabels("carp.jpg", {},
  (err, labels) => output("label;", err, labels));

vision.detectLogos("google_logo.png", {},
  (err, logos) => output("logo:", err, logos));

vision.detectFaces("smiles.jpg", {}, 
  (err, faces) => output("faces:", err, faces[0]));

vision.detectLabels("matsuhima.jpg", {}, (err, lables, apiResponse) => {
  if (err) console.log(err);
  console.log(lables);
  console.log(apiResponse);
});

function output(tag, err, response) {
  console.log(tag);
  if (err) console.log(err);
  console.log(response);
}

Vision APIにJavaScriptからアクセス

 上に示したように、「@google-cloud/vision」パッケージが提供する「detect〜」メソッドを呼び出すだけでよい。ここではローカルに存在するファイルをメソッドに渡しているが、これらのファイルは最終的にテキストデータにエンコードされ、(最初に述べたcontentプロパティにセットされた後に)APIに渡される。

 最初の幾つかのメソッド呼び出しでは、コールバックには2つの引数だけが渡されているが、API呼び出しの生の結果は第3引数のapiResponseに渡されるので、必要に応じて、このデータも参照されたい。また、実際に上のコードを試してみるという場合には、ファイル名を手元にあるものに変更する必要がある。

 ここではプロジェクトの作成や認証情報の構成などの説明を割愛しているが、それさえ終わってしまえば、後は上のようなコードで簡単にVision APIを利用できることが分かるはずだ。参考までに実行結果を以下に示す(非同期実行されるので、出力順がコードと異なっている点には注意)。

> node visionsample.js
logo:
[ 'Google' ]
label;
[ 'koi',
  'geological phenomenon',
  'fish',
  'vehicle',
  'extreme sport' ]
[ 'vehicle', 'passenger ship', 'boat', 'sea', 'water' ]
{ responses:
   [ { faceAnnotations: [],
       landmarkAnnotations: [],
       logoAnnotations: [],
       labelAnnotations: [Object],
       textAnnotations: [],
       fullTextAnnotation: null,
       safeSearchAnnotation: null,
       imagePropertiesAnnotation: null,
       cropHintsAnnotation: null,
       webDetection: null,
       error: null } ] }
faces:
{ angles:
   { pan: -12.292580604553223,
     roll: 23.758848190307617,
     tilt: -11.249908447265625 },
  bounds:
   { head: [ [Object], [Object], [Object], [Object] ],
     face: [ [Object], [Object], [Object], [Object] ] },
  features:
   { confidence: 49.712032079696655,
     chin: { center: [Object], left: [Object], right: [Object] },
     ears: { left: [Object], right: [Object] },
     eyebrows: { left: [Object], right: [Object] },
     eyes: { left: [Object], right: [Object] },
     forehead:
      { x: 700.2377319335938,
        y: 653.2457275390625,
        z: -85.85015869140625 },
     lips: { bottom: [Object], top: [Object] },
     mouth: { center: [Object], left: [Object], right: [Object] },
     nose: { bottom: [Object], tip: [Object], top: [Object] } },
  confidence: 99.35615062713623,
  joy: true,
  joyLikelihood: 4,
  sorrow: false,
  sorrowLikelihood: 0,
  anger: false,
  angerLikelihood: 0,
  surprise: false,
  surpriseLikelihood: 0,
  underExposed: false,
  underExposedLikelihood: 0,
  blurred: false,
  blurredLikelihood: 0,
  headwear: false,
  headwearLikelihood: 1 }


実行結果


 Vision APIはグーグルが提供する画像分析サービス。画像に何が含まれているかや、文字認識など、高度な画像分析をREST API経由で簡単(かつ安価)に行える。機械学習といえば、その仕組みから学ぶ必要がありそうにも思えるが、その技術をバックグラウンドで活用したこうしたAPIを利用することでも、その恩恵を受けることができるはずだ。

参考資料


「Dev Basics/Keyword」のインデックス

Dev Basics/Keyword

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る