手書きの内容をデータ化する「Tegaki」をPHPで実装
みなさんはじめまして。日本情報システム株式会社 ICTソリューション部の真野です。
北風吹きすさぶこの季節、皆様いかがお過ごしでしょうか。
私事ですが、先日嬉しい事に若い女の人から声をかけられました。
・・・宗教の勧誘でした。
とりあえず煩悩を取り払う為に除夜の鐘を打ちにいこうと思います。
さて今回のお題ですが、最近私が従事しているTegakiについてご紹介いたします。
Tegakiとは
キヤノンマーケティングジャパンとAI関連サービスを手掛けるCogent Labsが協業して開発した、「手書き AI OCRソリューション」です。
- 公式サイト
https://www.tegaki.ai/
Tegakiが何をしてくれるのか
もう少し簡単にTegakiを説明すると、「画像データ内の文字をテキストデータとして返却してくれるサービス」になります。
例えばTegakiが力を発揮してくれそうなケースとして次のようなものがあります。
- 手書きのアンケート用紙をまとめてデータ化したい
- 手書きの申込用紙をまとめてデータ化したい
こういった定型フォーマットの手書き書類、それはもうTegakiの絶好の捕食対象であり、なされるがままにデータ化されていきます。
そしてこのTegaki、なんと学習するんです。怖いですね。
取り込む度にどんどん経験を積んで行きますので、その潜在能力たるや底知れぬものを感じます。
OCR(読み取りサービス)市場ではメーカーがさぞ戦々恐々としている事でしょう。
認識率99.22%達成という高い研究結果を持つTegakiですが、AI搭載ということで、ここからさらに成長していくとなれば、まさに鬼に金棒、虎に翼、竜に翼を得たる如しですね。
※ちなみに有料です。
Tegakiを使ってみる
それでは実際にどうやって使うかという所ですが、画像データを決まった形にして渡してあげないとTegakiは受け取ってくれません。
ぶっきらぼうに現物だけ渡すような事はせず、ちゃんと綺麗に包装し、体裁よくTegakiに渡す。まさに我々紳士が女性にプレゼントするときと同じことを行います。簡単ですね。
後述するPHPコードがその役割を担います。
PHPコード以外に用意するものとして次のものが挙げられます。
- 画像データ・・読取対象のデータです。
- APIキー・・・Tegakiを契約すると貰えます。
- テンプレートファイル・・・Tegakiの専用エディターから作成します。
APIキーを渡す事によって、ちゃんとお金を払って利用している人なのかを判別します。
お金を払っていない人はお断りされます。
テンプレートファイルは、画像データ内の文字位置の情報が入っています。
処理の流れ
サンプルコード
ここからはプログラマー向けになります。 範例としてPythonとBashでの実装方法は載っていたのですが、PHPで実装したかったのでサンプルを作成しました。 何かしらのお役に立つことができれば幸いです。
上図の①と②で示した部分のコードです。 JSON形式で画像を送信し、最終的に認識された文字がJSON形式で返ってきます。
①の処理
まず①のPOST処理です。
画像ファイルをTegakiに送信し、Tegakiから返却されるリクエストIDを取得する処理になります。
tegakiPost { //-------------------------------------------------- // POST処理 // $fileName・・・・・読取対象の画像ファイルのパス // $templateName・・・テンプレートファイルのパス // $apiKey・・・・・・APIキー //-------------------------------------------------- public function post($fileName, $templateName, $apiKey) { //Tegaki.aiが待ち構えている場所です $url = 'https://api.tegaki.ai/hwr/v1/form'; $key = $apiKey; //jsonテンプレートファイルを読み込み $jsonData = file_get_contents('./template/' . $templateName); //文字コードをUTF8にエンコード $jsonData = mb_convert_encoding($jsonData, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); //連想配列にする $arr = json_decode($jsonData,true); //画像データをbase64エンコード $data64 = base64_encode(file_get_contents($fileName)); //配列にイメージ項目を追加し、画像データを入れる $arr['imageData'] = json_encode(mb_convert_encoding($data64, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN')); $arr = json_encode($arr); //ヘッダー情報を設定 $headers = array( 'Authorization: apikey '.$key, // APIキーを使った認証 'Content-Type: application/json', // json形式のデータをpostするので必要 'Accept: application/json', // 利用可能なアプリケーションタイプ ); //コンテキストのオプションを生成 $options = array( 'http' => array( 'method' => 'POST', // POSTで送信 'header'=> implode(PHP_EOL, $headers), // ヘッダー情報を連結 'content' => $arr, // テンプレートデータ・画像データ ) ); $context = stream_context_create( $options ); // コンテキストの生成 $result = file_get_contents( $url, false, $context ); // コンテキストを指定してTegaki.aiのURLへ送信 //成功した時 if ($result != false) { //連想配列にする $result = json_decode($result,true); //fields項目を追加(画像の位置等がふくまれる) $arr = json_decode($arr, true); $result['fields'] = $arr['fields']; //JSON形式に戻す $result = json_encode($result); //文字コードをUTF8にエンコード $result = mb_convert_encoding($result, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); } return $result; } }
②の処理
次に②のGET処理です。
①のPOST処理で取得したリクエストIDを使用し、認識した文字がJSON形式で返却されます。
class tegakiGet { //-------------------------------------------------- // GET処理 // $requestID・・・リクエストID // $apiKey ・・・・APIキー //-------------------------------------------------- public function get($requestID, $apiKey) { //Tegaki.aiが待ち構えている場所です。アドレスの最後にリクエストIDを加えます。 $url = 'https://api.tegaki.ai/hwr/v1/form/' . $requestID; $key = $apiKey; //ヘッダー情報を設定 $headers = array( 'Authorization: apikey '.$key, // APIキーを使った認証 'Content-Type: application/x-www-form-urlencoded' // URLエンコード(既定値) ); $options = array( 'http' => array( 'method' => 'GET', // GET送信 'header'=> implode(PHP_EOL, $headers), // ヘッダー情報を連結 ) ); $context = stream_context_create( $options ); // コンテキストの生成 $result = file_get_contents( $url, false, $context ); // コンテキストを指定してTegaki.aiのURLへ送信 return $result; } }
Tegakiの認識結果
Tegakiが返却する認識文字はJSON形式になっています。
JSON形式とはどんなものかと申しますと、 キーがあり、そのキーに対する値が存在するといった形です。
例えば 「魚」といったキーがあり、それに対する値が サバ、イワシ、カツオ、マダイ、カンパチ、ヒラメ、アナゴ、ブリ、マグロ・・・ といった具合です。 古今東西ゲームみたいなものですね。
これらが記号を含んで一文で連なっているわけですから、 そのままだと非常に見にくいです。 目当ての情報を探すのにウォーリーを探せ状態になってしまいますので、 ここは整えて見やすくします。
以下は見やすいように一部分を切り取ったサンプルデータになります。
このサンプルの結果は 1段目が認識対象の画像です。(指定した範囲を切り取っています)
2段目以降がTegakiから返ってきた回答になります。
「10といったテキストデータで認識しました。」 「96.2%ぐらい自信があります。」 とTegakiがおっしゃっています。 100%にしない謙虚さ、何だか日本人として親近感を覚えます。
こういった数値の精度は非常に高いです(私調べによる)。 一方漢字やひらがな、カタカナが含まれているものについてはまちまちですね。 クセの強い字は特に精度が低いです。
昔小売業でアルバイトしている時、お客様に会員情報を手書きして貰う事がありましたが たまに達筆すぎて読めないんですよ。 なのでTegakiがとんちんかんな回答を出しても同情してしまう所もありますが。
やはり世界の難しい言語ランキングにランクインしている日本語は 一筋縄ではいかないです。
まとめ
いかがでしたか。 今回はTegakiについてご紹介しました。
結局のところ使えるのか。というところですが、Tegakiを使用する事により、画像ファイルを一括で文字化してくれるので、人的な入力作業を大幅に減らし、確認作業に時間を割くことができるので、データ入力業務においてかなりの効率化が図れるはずです。
今後のTegaki自身の学習で精度が上がる事を考えると、非常に楽しみなサービスになりそうです。