ユーザーローカルの無料手書きOCRをPHPで試してみた。

先日、手書きOCRのAPIを無料で提供開始というニュースが入ってきました。

https://ledge.ai/userlocal-ocr-ai/

User Local 手書き文字認識AIの動作デモから、canvasに入力した文字を認識してくれる体験はできるものの自身でアップロードして試してみました。
>動作デモ自体はこちらです。
手書きOCR 無料 - 面倒なデータ入力をカンタン電子データ化
手書き書類を簡単2ステップですぐに電子データ化できます。同じレイアウトの大量の書類をまとめて処理可能。ユーザーローカルが無料で提供する文字認識AIです。

PHPで書いてみた

まんまサンプルコード通りですが、自身でアップロードしたファイルをチェックにかけてみたかったので作ってみました。

フォルダ構成は、
|-img/
|-index.php
です。下記の内容はindex.phpに貼り付ければ完了です。

<?php
$output = [];
$outputFlag = 0;
if(isset($_FILES)){
 if(isset($_FILES['file'])){
  $outputFlag = 1;
  $output = userLocalOcr();
  }
}
function userLocalOcr(){
 $fileExtension ="";
 if(preg_match("/^image/", $_FILES['file']['type']) == 1){
  $imgArr = explode("/",$_FILES['file']['type']);
  if($imgArr[1] == "jpeg"){
   $fileExtension = "jpeg";
  }elseif($imgArr[1] == "png"){
   $fileExtension = "png";
  }elseif($imgArr[1] == "gif"){
   $fileExtension = "gif";
 }
}else{
 die;
}
$fileNameKey = uniqid(rand().rand());
$fileName = "./img/".$fileNameKey.".".$fileExtension;
move_uploaded_file($_FILES['file']['tmp_name'],$fileName);

$url = '手書きOCRのAPI URL';
$curl = curl_init();
$postData = [
 'imgData' => new CURLFile("$fileName")
];
$options = [
 CURLOPT_URL => $url,
 CURLOPT_POST => true,
 CURLOPT_POSTFIELDS => $postData,
 CURLOPT_RETURNTRANSFER => true
];
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
 return $data;
}
?>
<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="UTF-8">
  <title>OCR PHPテスト</title>
 </head>
 <body>
  <form method="POST" id="submitForm" action="./" enctype="multipart/form-data">
   <input type="submit" value="SUBMIT"/>
   <input type="file" name="file">
 </form>
 <div class="output">
 <?php
  if($outputFlag):
   var_dump($output);
  endif;
 ?>
  </div>
 </body>
</html>

ちなみに、APIのURLやサンプルコードが載っている資料を手に入れるには、名前やメールアドレスの入力が必要だったため、念の為、こちらには記載いたしません。

301 Moved Permanently

上のリンクで必要事項を入力して送信すると、pdf形式のocr資料をダウンロードできます。

試してみた

手書きで書いた「あいうえお」をアップロードして試してみました。

きちんと、正しい文字列で返ってきました。

簡単な日本語や数字なら精度高いイメージです。
ただ、無償枠のリミット回数が不明で、繰り返しの使用や大規模データで実行する場合は、有償枠が必要そうですね。

単価0.5円程度の名刺データ入力バイトで、このOCR使って無限にまわして稼げそ・・・。

おわりに

せっかくならとフロントから非同期で直接APIリクエストを送りたくfetch APIを使ってリクエストを実行しようと試みましたが、CORSでハマって、うまくいきませんでした・・

仕方なく、サンプルコード通りに書きました。

”今のところ”無料枠でも間隔時間をある程度、設ければ十分に使えそうな気がしました。

コメント

  1. SQSSQS より:

    「ユーザーローカルOCRをgooglecolabで試してみました」が、
    no image になってしまいます。

    「pyhonでも試してみた」をお待ちしています~(お願いします~)

  2. haseth-blog より:

    SQSSQS様 コメントありがとうございます。

    簡易的ではございますが、
    googlecolab環境でpython3を使用して試してみました。
    下記で期待する結果が得られたのでぜひご参考ください。

    import json
    import requests
    from google.colab import files
    
    uploaded_file = files.upload()
    uploaded_file_name = next(iter(uploaded_file))
    
    url = "一括文字認識APIのエンドポイント"
    img_path = uploaded_file_name
    
    with open(img_path, "rb") as img:
     data = {"imgData": img}
     response = requests.post(url, files=data)
    result = json.loads(response.content)
    print(f"text: {result['text']}")
    
    • SQSSQS より:

      早速の返答大変ありがとうございます。

      >一括文字認識APIのエンドポイント
      部分にユーザーローカルさんの仕様書にありますurlをいれ
      実行しますと、
      アップロードのボタンが出ましたので、
      手持ちの画像を選択したところ、
      今度は

      —————————————————————————
      KeyError Traceback (most recent call last)
      in ()
      13 response = requests.post(url, files=data)
      14 result = json.loads(response.content)
      —> 15 print(f”text: {result[‘text’]}”)

      KeyError: ‘text’

      となってしまいました。
      本当に申し訳ありません、、、
      8月に触り始めたばかりで、ご迷惑おかけしています。

      よろしくお願いいたします。

      • haseth-blog より:

        SQSSQS様 ご連絡ありがとうございます。

        当該エラーは、該当のキーが存在しない際に発生するエラーだそうです。
        サンプルコードを一部変更してエラーコードの確認をお願いいたします。
        変更前=>print(f”text: {result[‘text’]}”)
        変更後=>print(result)

        相変わらず
        {‘status’: ‘error’, ‘message’: ‘No image’}
        というエラーを吐いてるかも知れませんね。。。

        お手数ですが、本記事の画像(あいうえお)でテストしていただいてもよろしいでしょうか。

  3. SQSSQS より:

    ご親切に対応いただき、本当にありがとうございます。

    画像(おいうえお)を aiueo.jpeg で保存し、テストさせていただきました。

     変更前=>print(f”text: {result[‘text’]}”) では

      aiueo.jpg(image/jpeg) – 9466 bytes, last modified: 2021/9/21 – 100% done
      Saving aiueo.jpg to aiueo.jpg
      text: 廳憑瀨寶瀨

     変更後=>print(result) では

      aiueo.jpg(image/jpeg) – 9466 bytes, last modified: 2021/9/21 – 100% done
      Saving aiueo.jpg to aiueo (1).jpg
      {‘status’: ‘ok’, ‘text’: ‘廳憑瀨寶瀨’, ‘candidates’: [[‘廳’, ‘認’, ‘聽’, ‘穗’, ‘[blank]’],
      [‘憑’, ‘3’, ‘鴻’, ‘顯’, ‘[blank]’], [‘瀨’, ‘鴻’, ‘蹠’, ‘轡’, ‘遮’], [‘寶’, ‘遮’, ‘瀨’, ‘蹠’,
      ’虫’], [‘瀨’, ‘[blank]’, ‘潔’, ‘漕’, ‘溥’]]}

    と出力されました。
    文字化けしていますが、エラーは出ていません。

    これは、・・私の手持ち画像に問題があるのでしょうか。
    たしか自宅の複合機でスキャンした後、”ペイント”でトリミングしたと記憶しています。

    よろしくお願いいたします。

  4. SQSSQS より:

    追加で、、

    ユーザーローカルさんのサンプルコード+画像(おいうえお)
    で試したところ、

     text:あいうえお

    がきちんと出力されました!?

    やはり画像に問題がある感触です。

    • haseth-blog より:

      SQSSQS様 ご連絡ありがとうございます。

      きちんと出力できてよかったです!

      特定の画像でエラーが出る原因ですが、
      恐らく画像サイズかと存じます。

      ファイル名、画像形式問わず10KBの画像は成功しますが
      200KBあたりの画像は”no image”で失敗してしまいます。

      リクエストがタイムアウトしているような感じですね。
      ドキュメントには記載はありませんでしたが、
      無料枠なのでアップロードサイズの上限が低いのかも知れません。

      • SQSSQS より:

        >ファイル名、画像形式問わず10KBの画像は成功しますが
        >200KBあたりの画像は”no image”で失敗してしまいます。
        >無料枠なのでアップロードサイズの上限が低いのかも知れません。

        時間を割いて丁寧に調べていただき、ありがとうございます。

        実は学校の考査の採点にどうかと考えていました。
        実用には程遠いですが、これから研究していきたいと思います。
        (ところが最近は考査をなくす方向に動いているようです(笑))

        ここまでご親切に対応いただけるとは思いませんでした、
        本当にありがとうございました。

        • haseth-blog より:

          SQSSQS様 ご連絡ありがとうございます。

          いえいえ、こちらこそありがとうございました。
          Google Colabというサービスを知らなかったので知ることができて大変勉強になりました。

          考査自動化への研究、応援しております。

  5. SQSSQS より:

    イイ感じで終わったところすみません、、

    どうやらはねられた理由は画像のファイル名を
    「日本語」にしていたからのようです、
    アルファベットに直してみると、受け付けてもらえました!
    初心者の罠ですかね(笑)

    それでは失礼します。。。

スポンサーリンク
スポンサーリンク
タイトルとURLをコピーしました