[PHP]Google Cloud Vision APIを使用して画像のテキスト情報を抽出する方法

Google Cloud Vision APIは画像をAPIに処理させ、画像の中のテキストや画像にある物体の種類などをJSONなどで受け取ることができるサービス

ここではPHPを使用してGoogle Cloud Vision APIを使用して画像のテキスト情報を抽出する方法を記述する

目次

Composerでライブラリをインストール

composer require google/apiclient

を実行してライブラリをダウンロードする

 

実行した場所に/vendorというフォルダができるので、これらのライブラリを実行するPHPプログラムの近くに配置したほうがよい。

コマンドが変わる可能性があるので、公式を参照すること↓

https://cloud.google.com/vision/docs/libraries#client-libraries-install-php

Google Cloud Consoleでの作業

プロジェクトを作成する

https://console.cloud.google.com/projectselector2/home/dashboard

に移動し、プロジェクトを作成する。課金も有効にしておくこと

VISON APIを有効化する

https://console.cloud.google.com/flows/enableapi?apiid=vision.googleapis.com

に移動し、VISON APIを有効化する

 

サービスアカウントキーを生成・取得

https://console.cloud.google.com/apis/credentials/serviceaccountkey

を開くとサービスアカウントキー画面に移動する

*プロジェクトは作成済みとしている。

上図のように入力

  • サービスアカウント=新しいサービスアカウント
  • アカウント名=任意
  • ロール=不要
  • サービスアカウントID=自動で作成される
  • キータイプ=JSON

で作成を押下する

ロールがないという警告メッセージが表示されるが問題なし。

作成するとJSONファイルがダウンロードされるのでサーバ上に配置する。PHPプログラムから参照しやすいところがよい。

サーバ上ではGOOGLE_APPLICATION_CREDENTIALS変数は設定しなくてよい

公式ページにはGOOGLE_APPLICATION_CREDENTIALS変数をサーバ上に設定するとよいと書かれているが、Google Cloud Vision APIではうまく動作せず

Fatal error: Uncaught DomainException: Could not load the default credentials.

というエラーが出てしまうので、プログラムの中でGOOGLE_APPLICATION_CREDENTIALS変数を設定するようにしている

 

PHPプログラムの作成

//authエラー回避に変数を書いておく putenv('GOOGLE_APPLICATION_CREDENTIALS='.__DIR__ . '/xxxxx.json'); require_once ( __DIR__ . '/vendor/autoload.php'); 
use Google\Cloud\Vision\V1\ImageAnnotatorClient; 
$imagePath = "画像のパス(URLでも可能)"; 
$imageAnnotator = new ImageAnnotatorClient(); 
$image = file_get_contents($imagePath); 
$response = $imageAnnotator->textDetection($image); 
$texts = $response->getTextAnnotations(); 
foreach ($texts as $text) {
 unset($result);
 $result = $text->getDescription();
 //整形、日本語ではよく「〜」が半角チルダになっているので
 $result = trim($result);
 $result = preg_replace("/\~/", "ー", $result );
 $result = str_replace(array("\r\n","\r","\n"), '', $result);
 $resultArr[] = $result;
} 
//返り値が結構バラバラなので文字数が多い順に並び替え 
array_multisort( array_map( "strlen", $resultArr ), SORT_DESC, $resultArr ) ; 
$imageAnnotator->close(); 
//最も長い文字列だけを取得 
echo $resultArr[0];

1つの画像でも複数の返り値が帰ってくるので、最も長い文字を選択するようにしている。

公式のサンプルコードはこちら

https://cloud.google.com/vision/docs/ocr

 

感想

なかなか細かく拾ってくれるが、縦読みが読めなかったりする

日本語よりも英語の識字率の方が高い。結構小さな文字も読み込んでくれていて以外な文章を発見してくれたりもする

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です