Google謹製のCloud Vision APIを利用してみた

Google謹製のCloud Vision APIは米Googleが提供する機械学習の画像認識APIです。物体検知、OCR、有害コンテンツ検知、顔検知など、多岐にわたって画像認識を行うことができます。ここでは、Cloud Vision APIについて解説していきます。

Cloud Vision APIは有料APIではありますが、トライアル用の無料枠が用意されていて、各機能ごとに月1000リクエストまで無料です。まずは無料トライアルから利用してみてはいかがでしょうか。

01: 環境

  • Windows 7 Professional
  • PHP 5.6.28

02: 無料トライアルの利用方法

Cloud Vision APIへアクセスし、「無料トライアル」ボタンを押下する。 下記項目を入力して、「同意して続行」ボタンを押下する。
  • 国: 日本
  • 受託: いいえ
  • Google Cloud Platform 無料トライアルの利用規則を... : はい
下記項目を入力して、「無料トライアルを開始」ボタンを押下する。今なら300ドル相当のクレジットが無料で貰えます。
  • アカウントの種類: 個人
  • 名前と住所: 個別
  • メインの連絡先: 個別
  • お支払い方法: クレジットカード
「ホーム」に遷移する。 「すべてのプロジェクト」から「プロジェクトを作成」をクリックする。 プロジェクトを作成する。
  • プロジェクト名: 任意
「ホーム」→「API Manager」→「ライブラリ」→「Vision API」から「有効にする」をクリックする。 「課金を有効にする」をクリックする。 「請求先アカウント」を選択する。

03: APIキー作成

「認証情報」から「認証情報を作成」ボタンを押下する。 「APIキー」を選択する。 「キーを制限」をクリックする。「自分のAPIキー」はプログラムで使用するので記録しておく。 保存ボタンをクリックする。

04: 実際に利用してみる

先ほどのAPIキーをPHPで使用して物体検知、OCR、有害コンテンツ検知、顔検知などを行います。

物体検知

ソースプログラム

object_detection.php


<?php
// APIキー
$api_key = "<APIキー>";

// 画像へのパス
$image_path = $argv[1];

// タイプ
$feature = $argv[2];

// パラメータ設定
$param = array("requests" => array());
$item["image"] = array("content" => base64_encode(file_get_contents($image_path)));
$item["features"] = array(array("type" => $feature, "maxResults" => 3));
$param["requests"][] = $item;

// リクエスト用のJSONを作成
$json = json_encode($param);

// リクエストを実行
$curl = curl_init() ;
curl_setopt($curl, CURLOPT_URL, "https://vision.googleapis.com/v1/images:annotate?key=" . $api_key);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 15);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
$res1 = curl_exec($curl);
$res2 = curl_getinfo($curl);
curl_close($curl);

// 取得したデータ
$json = substr($res1, $res2["header_size"]);
$array = json_decode($json, true);

// 出力
var_dump($array);

テスト

画像
実行

bash


$ php object_detection.php ichigo.jpg LABEL_DETECTION

結果


array(1) {
  ["responses"]=>
  array(1) {
    [0]=>
    array(1) {
      ["labelAnnotations"]=>
      array(3) {
        [0]=>
        array(3) {
          ["mid"]=>
          string(9) "/m/07fbm7"
          ["description"]=>
          string(10) "strawberry"
          ["score"]=>
          float(0.9841124)
        }
        [1]=>
        array(3) {
          ["mid"]=>
          string(8) "/m/0fbdb"
          ["description"]=>
          string(12) "strawberries"
          ["score"]=>
          float(0.97571874)
        }
        [2]=>
        array(3) {
          ["mid"]=>
          string(8) "/m/02wbm"
          ["description"]=>
          string(4) "food"
          ["score"]=>
          float(0.9522514)
        }
      }
    }
  }
}

OCR

テスト

画像
実行

bash


$ php object_detection.php receipt.jpg TEXT_DETECTION

結果(抜粋)


          ["description"]=>
          string(650) "お買上明細
パステムセゾン 2092500064000
トクシュフィルムハリツケー 1点
500
合計
500
(内消費税37含む)
現金支払い額
500
お預かり額 1,000
つり銭
500
《ポイント情報》
今回お求め時のポイント発生
60
お客様の合計ポイント残高 1,056
ポイント有効期限 2019年04月30日
(*********8331) (0007)
【引取り・出張修理専用ダイヤル】
0120-203044(受付時間9:30-20:00)
当商品の返品・交換等につきまして
は必ずこのレシートとお会計時のポ
イントカードをお持ち下さい。
持参なき場合は対応出来かねます。
65
21
"

有害コンテンツ検知

テスト

画像
実行

bash


$ php object_detection.php test.jpg SAFE_SEARCH_DETECTION

結果


array(1) {
  ["responses"]=>
  array(1) {
    [0]=>
    array(1) {
      ["safeSearchAnnotation"]=>
      array(4) {
        ["adult"]=>
        string(13) "VERY_UNLIKELY"
        ["spoof"]=>
        string(13) "VERY_UNLIKELY"
        ["medical"]=>
        string(13) "VERY_UNLIKELY"
        ["violence"]=>
        string(13) "VERY_UNLIKELY"
      }
    }
  }
}

顔検知

ソースプログラム

vision.php


<?php
$api_key = "<APIキー>";
 
// 画像へのパス
$image_path = $argv[1];
 
// リクエストデータの作成
$request = array(
    'requests' => array(
        array(

            // 画像ファイルをBase64でエンコード
            'image' => array(
                'content' => base64_encode(file_get_contents($image_path)),
            ),

            // 顔検出(FACE_DETECTION)機能を指定
            'features' => array(
                array(
                    'type'          => 'FACE_DETECTION',
                    'maxResults'    => 1,
                ),
            ),
        ),
    ),
);
 
// リクエストを実行
$url = 'https://vision.googleapis.com/v1/images:annotate?key=' . $api_key;
$opts['http'] = array(
    'method'    => 'POST',
    'header'    => 'Content-Type: application/json',
    'content'   => json_encode($request),
);
$context = stream_context_create($opts);
$response_json = file_get_contents($url, false, $context);
 
// 取得したデータ
$response_arr = json_decode($response_json, true);
$data = $response_arr['responses'][0]['faceAnnotations'][0];
$Likelihood = array(
    'UNKNOWN'       => 'UNKNOWN',
    'VERY_UNLIKELY' => '*',
    'UNLIKELY'      => '**',
    'POSSIBLE'      => '***',
    'LIKELY'        => '****',
    'VERY_LIKELY'   => '*****',
);

// 出力
echo "喜び :{$Likelihood[$data['joyLikelihood']]}\n";
echo "悲しみ:{$Likelihood[$data['sorrowLikelihood']]}\n";
echo "怒り :{$Likelihood[$data['angerLikelihood']]}\n";
echo "驚き :{$Likelihood[$data['surpriseLikelihood']]}\n";
echo "検出精度:{$data['detectionConfidence']}\n\n";

テスト

画像
実行

bash


$ php vision.php face.jpg

結果


喜び :*****
悲しみ:*
怒り :*
驚き :*
検出精度:0.8832495

05: 所感

Cloud Vision APIを利用した感想は「なんじゃこりゃすげー!!」です。正直ビックリしました。使い勝手も認識精度も一昔前に比べて格段に高くなっています。これなら有料APIって言われても納得ですね。