BEACHSIDE BLOG

Azure とか C# 好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

Cognitive Services: Read API 3.x - OCR の API を試す (2020/10月)

2020 年は1月から9月の間で Cognitive Services の Vision カテゴリーの中の OCR の機能がちょろちょろとアップデートしてました。
OCR の今までのアップデートを振り返りつつ、最新の Read API v3.1 Preview2 を試してみます。

Cogbot #29でもお話しした内容ですが、資料らしい資料を作ってなかったのでブログでサンプルコードなどをフォローしてみます。

🚀 Cognitive Services の OCR の歴史

OCR の機能は Cognitive Services の初期から存在

  • 日本語も対応してた
  • Computer Vision API v2.1 までは 3つの API があった: "OCR"、"Recognize Text"、"Batch Read File“

Computer Vision API v3.0 時代の到来

  • 2020年1月に Public preview で “Read” が登場で OCR の精度はめっちゃよくなったが、対応言語が英語とスペイン語のみ (´-ω-`)...
  • v2.x であった “Recognize Text”、“Batch Read File” は v3 で亡くなった。“OCR” は残ってるけど非推奨扱い。
  • 旧 API を利用している方向けのアップグレードのフローのドキュメントはある。
  • 2020年5月にユーロ圏の言語追加と精度向上。
  • 2020年7月にv3.1 で中国語(簡体)、2020年9月に日本語が追加

余談

今回のブログではふれませんが、Cognitive Services の OCR で帳票特化の Form Recognizer があります。2020年9月の Ignite で GA しました。
日本語はまだ未対応ですが今回 Read API で日本語の対応が入ったので、Form Recognizer も対応する時期は近いかもしれませんね...と期待してます。

🚀 Read API を試す

サブスクリプションキーとエンドポイントの取得

Azure ポータルからサクッとリソースを作ります。以下のドキュメントのまんまやればいい感じなので説明は省略します。補足があるとすれば、キーには2パターンあります。

  • Multi-service resource: ドキュメントに記載がありますが複数のサービスをいっぺんに利用できます。課金とかもまとまるので楽です。
  • Single-service resource: Multi-service で利用できるサービスが個別でしか利用できません。

どちらがよいとかないので、用途に応じて使えばよいです。ものによってはエンドポイントや送信に必要な情報が微妙に変わったりするので、使うサービスに応じてエンドポイントや設定する内容をドキュメントで確認する点だけは気を付けましょう。

docs.microsoft.com

キーのリソースを作成したら開きましょう。下図は Multi-service resource のキーを作成したときの画面ですが、Keys and Endpoint を見るとサブスクリプションキーとエンドポイントが見えます。これを後述の実装編で使います。

f:id:beachside:20201009192050p:plain

HttpClient を使った実装編

SDK を利用してサクッとアクセスしたいところでしたが日本語対応の v3.1 preview2 の API に投げてくれないので、2020年10月時点では HttpClient を使って API にアクセスします。
雑にサンプルコードを書いてみました。
C#、.NET Core 3.1 でコンソールアプリで作っています。 TODO が3つあるので、必要な情報を埋め込んで実行すれば動きます。

普段仕事で100%書かないコメントをコードに書いてみました。 (状況や理由みたいなコメントは書きますが、メソッドの英語を翻訳しただけやんってのを日本語でコメント書かないって意味です)
ブログとかだとコードにコメント書いて説明した方が簡単だなって今更気づきました。

ちょっとだけ補足すると...

  • 48行目で Read API をコールして正常の場合、HttpStatusCode は 202 (Accepted) が返ってきます。渡した URL が Read API から読み込めなかったり画像を認識できなかったりすると BadRequest が返ってきます。
  • 82行目のステータスの確認は、最近仕様が変わりました。SDK に Microsoft.Azure.CognitiveServices.Vision.ComputerVision.Models.OperationStatusCodes ってあるんですが、API の仕様が変わってステータスの文字列が変わった(以前はパスカルケースだったのがキャメルケースになった)のでそこも今はとりあえず使わず API の Reference) みて正しい評価をしてあげるとよいです。
  • 今回は画像の URL を指定しましたが、ローカルの画像を送信したい場合は普通にヘッダーのMIMEタイプ を application/octet-stream にして body に binary をつけて送信すればよいです。

SDK を使った実装編

SDK は、NuGet package の *Microsoft.Azure.CognitiveServices.Vision.ComputerVision** です。
2020年10月時点で 最新の v6.0.0-preview.1 をインストールします。
前述でちょっとふれましたがこの SDK は Read API の v3.0 のエンドポイントへアクセスしています。そのため日本語の画像を送っても文字を認識しません。動作確認をするには英語とか対応してる言語の画像を投げましょう。

つまり日本語の対応版の v3.1 preview2 を動かすことでできません。まぁそのうち対応すると思うのでこっちも試して雰囲気を見てみましょう。
HttpClient でやってくれてたやつをなんか型もってやってくれてるんだなーって雰囲気はつかめると思います。

参考