びくんびくんしながらコードを書く。

いしきひくい系エンジニアのらくがき帳

Google Vision APIをつかってPHPでOCRする。

掲題の通り。
画像認識の機械学習?のAPIgoogleさんが用意してくれていてAPIに投げればいい感じに検知してくれて値を返してくれるというやーつです。

印刷物のOCRだと結構検知率が良いのではないか?ということで試してみたいと思った次第というか会社で名刺取り込みに使えないか?ということで試してみた。

前提条件

  • APIの有効化済みにしておくこと。
  • API用のアクセスキーを用意していること。
  • 画像はuploadするのではなくディレクトリに静的に置いたものを利用する。
  • echoで取得結果を出すだけのコマンドライン型で実装。

注意

  • Vision APIは有料API(無料枠もある)のでやりすぎて金かかっちまった!というのは自己責任で。
  • APIキーなどべた書きしてGitHubにpublicで上げないようにしましょう。

実装

<?php
$apiKey = 'API_KEY';
$file = file_get_contents('File_Path');

//APIに送りつけるパラメータの設定
$json = json_encode([
  "requests" => [
    [ "image"   => [ "content" => base64_encode(file_get_contents($file)), ], // ファイルをbase64エンコードしたものを指定。
      "features" => [ [ "type" => "TEXT_DETECTION", "maxResults" => 10, ], ], //OCRを指定
    ],
  ],
]);

// 各種オプションを設定
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://vision.googleapis.com/v1/images:annotate?key=" . $apiKey);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($curl, CURLOPT_TIMEOUT, 15); // タイムアウト時間の設定(秒)
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);

//curlの実行
$res = curl_exec($curl);
//取得データの配列化
$data = json_decode($res, true);

print_r($data, true);

コレだけでOCR化されたデータが取得出来る。

実行結果

  • 特殊なフォントを利用していると精度が落ちる。
  • 文字と絵が入り混じっていると絵を頑張ってOCRしようとするのか大変なことになる。
  • 表組みはちょっと苦手みたい。