Vision API

Google CloudのVision APIとPHPを使って画像認識処理をロリポップサーバで動かしてみる

google-cloud-vision-アイキャッチ

こんにちは!

みなさん、画像認識してますか?

最近は、AI技術の発達も目まぐるしい中、最新技術がすぐ民間の一般人でも使えるようになっているので、とてもワクワクしているゆーたろうです。

さて、今回は画像認識についてのお話しです。

実は以前から画像認識を使ったWebアプリもしくはスマホアプリの構想があったのですが、

  • 画像認識の精度が分からない
  • 画像認識のライブラリは?Open CV?
  • そもそものハードルが高そう

などが脳裏をよぎりあまり進展しなかったのです。

しかし!本日見つけました。Googleが提供している画像処理サービス【Vision API】を!

私は今日初めて知りましたが、このサービス自体は2016年ころからあったみたいですね。

今まで考えていた構想を一気に前進させるであろうこのサービスを、私が愛用しているレンタルサーバー「ロリポップ」に取り入れ、使ってみるまでの流れを紹介していきます。

※なお、この記事の読者は基本的なプログラミングができることを前提としており、かつ、私の備忘録的な意味合いでこの記事を書いているので、端折っていたり雑多な部分は省略したりしているので、その点、ご了承ください。

それでは本題です。

前書き

今回導入するにあたり、以下のサイトを参考にしました。丁寧な解説、ありがとうございます<(_ _)>

Google Cloud Vision APIで画像分析をしてみよう【入門】

基本的にはこのサイトを見て進めれば実行できるかと思いますので、当記事では私が躓いたところを中心に書いていこうと思います。

頭記時に載せてある画像は、2020年5月16日現在の画面構成となっています。
今後、アップデートなどにより画面構成が変わる可能性もあります。
その際は置き換えて読み進めてください。

環境設定編

使用環境

今回は以下の環境で実装しています。

  • サーバ:ロリポップ スタンダードプラン
  • PHP:バージョン7.3

Vision APIプロジェクト側

躓いた個所1:支払い項目が変わっていた

上記サイトの「新しくプロジェクトを作成する」まではすんなりいきましたが、Vision APIプロジェクトを作成した際に課金を有効にするための画面が変わっており、探すのにてこずりましたので、メモしておきます。

今日現在の画面構成だと、「三 Google Cloud Platform>お支払い>アカウント管理」を選択してくと、請求を有効にできる画面に遷移できます。

google-cloud-vision-api-setting-payment-accountmanagement

躓いた個所2:vision apiの検索がうまく行かない

Cloud Vision APIを有効にするにあるように、検索欄で「vision api」を打って引っ張ってくる必要があるのですが、先ほどの支払い画面の検索欄から検索したら、うまく行きませんでした。

解決策:TOPページ(三 Google Cloud Platformを押したホーム画面)から検索したら、うまくヒットしました。

躓いた個所3:認証情報の場所が分からなかった

認証情報の設定を行う必要があるのですが、画面構成が変わっていたので、探すのに苦労しましたため、メモしておきます。

「三 Google Cloud Platform>APIとサービス>認証情報」から遷移することができました。

google-cloud-vision-api-setting-apiservice-authinfo

ロリポップサーバ側

躓いた個所1:環境変数の設定がうまくいかなかった

環境変数を設定するところで

$ export GOOGLE_APPLICATION_CREDENTIALS="/your-path/vision-api-sample-***.json"

のコマンドを実行する必要があるのですが、SSHから打ってもただ、一行、そのコマンドが表示されるだけで、うまく行きませんでした。

結論から言えば、実行するプログラムの冒頭に下記を追加すればいけました。

<?php
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . __dir__ . '/*****.json');
↑・・・この処理を追加

require __DIR__ . '/vendor/autoload.php';
use Google\Cloud\Vision\V1\ImageAnnotatorClient;
 
$imageAnnotator = new ImageAnnotatorClient();
 :
 :

参考にしたサイトは以下です。

また、SSHプロンプトから環境変数を設定する場合は

/home/users/0/pecori.jp-test0515/web$ export GOOGLE_APPLICATION_CREDENTIALS="/home/users/0/pecori.jp-test0515/web/*****.json"

/home/users/0/pecori.jp-test0515/web$ export GOOGLE_APPLICATION_CREDENTIALS=/home/users/0/pecori.jp-test0515/web/*****.json

/home/users/0/pecori.jp-test0515/web$ export "GOOGLE_APPLICATION_CREDENTIALS=/home/users/0/pecori.jp-test0515/web/*****.json"

のどれかを行えば行けます。

※成功したらなにかロードされたりsuccessなどのメッセージでたりするのかなと思ったのですが、特になかったので特定できてないです^^;

記録のため、以下に私のトライ&エラーを残しておきます。

■1回目:環境変数未設定で実行した時は、まぁ当然ながら失敗
コマンド
なし

PHP実行
/home/users/0/pecori.jp-test0515/web$ /usr/local/php/7.3/bin/php vision-api-test-4.php

エラー
PHP Fatal error:  Uncaught DomainException: Unable to read the credential file specified by  GOOGLE_APPLICATION_CREDENTIALS: file http://test0515.pecori.jp/*****.json does not exist in /home/users/0/pecori.jp-test0515/web/vendor/google/auth/src/CredentialsLoader.php:74
Stack trace:
#0 /home/users/0/pecori.jp-test0515/web/vendor/google/auth/src/ApplicationDefaultCredentials.php(150): Google\Auth\CredentialsLoader::fromEnv()
#1 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(194): Google\Auth\ApplicationDefaultCredentials::getCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler), NULL, NULL)
#2 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(113): Google\ApiCore\CredentialsWrapper::buildApplicationDefaultCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler))
#3 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/GapicClientTrait.php(339): Google\ApiCore\CredentialsWrapper::build(Array)
#4 /home in /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php on line 200

■2回目:exportで環境変数を設定してみるが、失敗
コマンド
/home/users/0/pecori.jp-test0515/web$ export GOOGLE_APPLICATION_CREDENTIALS="/*****.json"

PHP実行
/home/users/0/pecori.jp-test0515/web$ /usr/local/php/7.3/bin/php vision-api-test-4.php

エラー
PHP Fatal error:  Uncaught DomainException: Unable to read the credential file specified by  GOOGLE_APPLICATION_CREDENTIALS: file http://test0515.pecori.jp/*****.json does not exist in /home/users/0/pecori.jp-test0515/web/vendor/google/auth/src/CredentialsLoader.php:74
Stack trace:
#0 /home/users/0/pecori.jp-test0515/web/vendor/google/auth/src/ApplicationDefaultCredentials.php(150): Google\Auth\CredentialsLoader::fromEnv()
#1 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(194): Google\Auth\ApplicationDefaultCredentials::getCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler), NULL, NULL)
#2 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(113): Google\ApiCore\CredentialsWrapper::buildApplicationDefaultCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler))
#3 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/GapicClientTrait.php(339): Google\ApiCore\CredentialsWrapper::build(Array)
#4 /home in /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php on line 200

■3回目:パスにスラッシュをつけたりしてみるも失敗
コマンド
/home/users/0/pecori.jp-test0515/web$ export GOOGLE_APPLICATION_CREDENTIALS="/*****.json"
/home/users/0/pecori.jp-test0515/web$ export GOOGLE_APPLICATION_CREDENTIALS="*****.json"

PHP実行
/home/users/0/pecori.jp-test0515/web$ /usr/local/php/7.3/bin/php vision-api-test-4.php

エラー
PHP Fatal error:  Uncaught DomainException: Unable to read the credential file specified by  GOOGLE_APPLICATION_CREDENTIALS: file http://test0515.pecori.jp/*****.json does not exist in /home/users/0/pecori.jp-test0515/web/vendor/google/auth/src/CredentialsLoader.php:74
Stack trace:
#0 /home/users/0/pecori.jp-test0515/web/vendor/google/auth/src/ApplicationDefaultCredentials.php(150): Google\Auth\CredentialsLoader::fromEnv()
#1 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(194): Google\Auth\ApplicationDefaultCredentials::getCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler), NULL, NULL)
#2 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(113): Google\ApiCore\CredentialsWrapper::buildApplicationDefaultCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler))
#3 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/GapicClientTrait.php(339): Google\ApiCore\CredentialsWrapper::build(Array)
#4 /home in /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php on line 200


■4回目:httpからのフルパスが必要か?と思い付与するが、失敗
コマンド
/home/users/0/pecori.jp-test0515/web$ export GOOGLE_APPLICATION_CREDENTIALS="http://test0515.pecori.jp/*****.json"

PHP実行
/home/users/0/pecori.jp-test0515/web$ /usr/local/php/7.3/bin/php vision-api-test-4.php

エラー
PHP Fatal error:  Uncaught DomainException: Unable to read the credential file specified by  GOOGLE_APPLICATION_CREDENTIALS: file http://test0515.pecori.jp/*****.json does not exist in /home/users/0/pecori.jp-test0515/web/vendor/google/auth/src/CredentialsLoader.php:74
Stack trace:
#0 /home/users/0/pecori.jp-test0515/web/vendor/google/auth/src/ApplicationDefaultCredentials.php(150): Google\Auth\CredentialsLoader::fromEnv()
#1 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(194): Google\Auth\ApplicationDefaultCredentials::getCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler), NULL, NULL)
#2 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(113): Google\ApiCore\CredentialsWrapper::buildApplicationDefaultCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler))
#3 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/GapicClientTrait.php(339): Google\ApiCore\CredentialsWrapper::build(Array)
#4 /home in /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php on line 200


■5回目:うまく行かないので、先にこれを入れてみる
コマンド
/home/users/0/pecori.jp-test0515/web$ composer require google/cloud-vision

結果
Using version ^1.0 for google/cloud-vision
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

PHP実行
/home/users/0/pecori.jp-test0515/web$ /usr/local/php/7.3/bin/php vision-api-test-9.php

エラーになる...
PHP Fatal error:  Uncaught DomainException: Could not load the default credentials. Browse to https://developers.google.com/accounts/docs/application-default-credentials for more information in /home/users/0/pecori.jp-test0515/web/vendor/google/auth/src/ApplicationDefaultCredentials.php:171
Stack trace:
#0 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(194): Google\Auth\ApplicationDefaultCredentials::getCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler), NULL, NULL)
#1 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php(113): Google\ApiCore\CredentialsWrapper::buildApplicationDefaultCredentials(Array, Object(Google\Auth\HttpHandler\Guzzle6HttpHandler))
#2 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/GapicClientTrait.php(339): Google\ApiCore\CredentialsWrapper::build(Array)
#3 /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/GapicClientTrait.php(321): Google\Cloud\Vision\V1\Gapic\ImageAnnotatorGapicClient->createCredentia in /home/users/0/pecori.jp-test0515/web/vendor/google/gax/src/CredentialsWrapper.php on line 200



■6回目:以下のどれかで成功
コマンド
/home/users/0/pecori.jp-test0515/web$ export GOOGLE_APPLICATION_CREDENTIALS="/home/users/0/pecori.jp-test0515/web/*****.json"
/home/users/0/pecori.jp-test0515/web$ export GOOGLE_APPLICATION_CREDENTIALS=/home/users/0/pecori.jp-test0515/web/*****.json
/home/users/0/pecori.jp-test0515/web$ export "GOOGLE_APPLICATION_CREDENTIALS=/home/users/0/pecori.jp-test0515/web/*****.json"

PHP実行
/home/users/0/pecori.jp-test0515/web$ /usr/local/php/7.3/bin/php vision-api-test-17.php

成功!!SSH側からでも環境変数の設定ができました!
GOOGLE_APPLICATION_CREDENTIALS=/home/users/0/pecori.jp-test0515/web/*****.json
:
:ここに、APIのレスポンス結果が出れば、成功です。

補足ですが、下記図のように私は/web直下にjsonファイルを置いているので、「/home/users/0/pecori.jp-test0515/web/*****.json」としています。

google-cloud-vision-api-setting-json-posting

/web直下ではない場合は適宜、パスを変更してください。

私が躓いた点は、こんなところでした。

いざ実行→画像認識が成功できた!

参考にしたサイトにあるサンプルプログラムを基に、環境変数設定など少し付け加えて実行してみました。

<?php
ini_set( 'display_errors', 1 );
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . __dir__ . '/*****.json');

require __DIR__ . '/vendor/autoload.php';
use Google\Cloud\Vision\V1\ImageAnnotatorClient;
 
$imageAnnotator = new ImageAnnotatorClient();

$imagepath="画像のフルパス.jpg";

$image = file_get_contents($imagepath);// ここにファイル名

$response = $imageAnnotator->labelDetection($image);
$labels = $response->getLabelAnnotations();
 
if ($labels) {
    echo("Labels:" . PHP_EOL);
    foreach ($labels as $label) {
        echo($label->getDescription() . PHP_EOL);
    }
} else {
    echo('No label found' . PHP_EOL);
}

そして今回は写真ACにあったフリー画像の、この写真を読み込ませてみようと思います。

photo-ac-子供-パソコン-プログラミング

そして実行すると・・・

google-cloud-vision-api-running-success

無事に、できました!

ブラウザからももちろん確認できてます。

google-cloud-vision-api-running-success-browser

取得された情報は以下の通りです。すごく精度よく解析されてますね。

Child子供
Facial expression表情
Toddler幼児
Learning学習中
Reading読んでいる
Technology技術
Play遊んでいる
Smile笑顔
Electronic device電子機器   
Sitting座っている

設定さえできてしまえば、本当に数十行のソースだけで情報解析ができるなんて、便利な世の中になったものです。

まとめ

いかがだったでしょうか。

APIや画像認識、AIなどときくと個人が実用的なものをつくるのはとても難しそうに思えますが、こんなに手軽に実装できます。

私も初めて触りましたが、Google Cloud Platform会員登録~プログラム実行までだいたい1時間ほどで完了できました。

こういったサービスに何かを掛け合わせることで新しいものを生み出すことが、これからの時代ではさらに重要になってくるので、とりあえずどんなことができるのかを知っておくだけでも、勉強になりますね。

参考サイト

以下に、参考になる他のサイトも載せておきます。併せて確認してみてください。