画像/動画認識のComputer Vision APIをOCRとして使うには? フォントごとの精度は?:認識系API活用入門(5)(3/4 ページ)
コグニティブサービスのAPIを用いて、「現在のコグニティブサービスでどのようなことができるのか」「どのようにして利用できるのか」「どの程度の精度なのか」を検証していく連載。今回は、Computer Vision APIの概要と使い方を解説し、OCR機能について、日本語/英語、フォントごとの精度の違いを検証する。
処理の作成
MainWindow.xaml.csで実際にプログラムから呼び出すところを作成します。プログラムの流れは下記のように非常にシンプルです。
- 画像ファイルを選択する
- OCR機能のAPIに画像ファイルを渡し、テキスト(JSON形式)を取得する
これまでの連載で使用してきたAPIと違う点は、Tokenを使用しないということです。これまでの連載で使用してきたAPIではOcp-Apim-Subscription-KeyをToken取得専用のエンドポイントに投げてTokenを先に取得し、その後にAPIにTokenを含めたリクエストヘッダーを生成してリクエストを投げる、というやり方でした。それに対してComputer Vision APIでは、Tokenを取得せずに直接APIにOcp-Apim-Subscription-Keyを渡すようになっています。
今回は、OCR機能のAPIから返ってくるデータがJSON形式なので、まずはこのJSON形式で返ってくるデータを受け取るためのクラスを作成します。以下のように、メニューバーの「プロジェクト」から「クラスの追加」をクリックします。
追加するのは通常のクラスです。名前を「OCRResult.cs」として「追加」ボタンをクリックします。
クラスが追加されたら、以下の内容をコピーして、そのクラスにペーストしてください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 追加
using System.Runtime.Serialization;
namespace ComputerVisionAPI
{
[DataContract]
class OCRResult
{
[DataMember]
public string language { get; set; }
[DataMember]
public float textAngle { get; set; }
[DataMember]
public string orientation { get; set; }
[DataMember]
public Region[] regions { get; set; }
[DataContract]
public class Region
{
[DataMember]
public string boundingBox { get; set; }
[DataMember]
public Line[] lines { get; set; }
}
[DataContract]
public class Line
{
[DataMember]
public string boundingBox { get; set; }
[DataMember]
public Word[] words { get; set; }
}
[DataContract]
public class Word
{
[DataMember]
public string boundingBox { get; set; }
[DataMember]
public string text { get; set; }
}
}
}
続いて、画像ファイルを渡してテキストを取得する処理です。APIのリクエストメソッドはPOSTになります。OCR機能のAPIでは、リクエストのパラメーターとして以下の値がありますが、どちらもオプション扱いです。
| 名前 | 必須 | 型 | 説明 |
|---|---|---|---|
| language | オプション | String | 言語コード(en、jaなど) 既定はunk (自動識別) |
| detectOrientation | オプション | Boolen | 文字の方向を検知するか |
またリクエストヘッダーとして以下の値を設定します。
| 名前 | 必須 | 型 | 説明 |
|---|---|---|---|
| Content-Type | オプション | String | 画像をURLで指定する場合はapplication/json、画像ファイルをバイナリ生データでアップロードする場合はapplication/octet-streamを指定 |
| Ocp-Apim-Subscription-Key | 必須 | String | Azure上で取得したキーを指定 |
プログラムとしては以下のようになります。
private OCRResult GetOCRResult(string pAccessKey, string pLanguage, string pFile)
{
try
{
string url = " https://westus.api.cognitive.microsoft.com/vision/v1.0/ocr";
if(pLanguage != null && pLanguage != "") url += "?language=" + pLanguage;
// リクエスト作成
HttpWebRequest request = WebRequest.CreateHttp(url);
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.Headers.Add("Ocp-Apim-Subscription-Key", pAccessKey);
// 画像ファイルの読み込み
FileStream fs = new FileStream(pFile, FileMode.Open, FileAccess.Read);
byte[] bs = new byte[fs.Length];
fs.Read(bs, 0, bs.Length);
fs.Close();
Stream writer = request.GetRequestStream();
writer.Write(bs, 0, bs.Length);
WebResponse webResponse = request.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(OCRResult));
OCRResult result = (OCRResult)dcjs.ReadObject(responseStream);
return result;
}
catch(WebException webException)
{
Stream responseStream = webException.Response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream);
tboxResult.Text = streamReader.ReadToEnd();
return null;
}
catch(Exception exception)
{
tboxResult.Text = exception.Message;
return null;
}
}
最後に、コンストラクタやボタンクリック時のイベントを含むMainWindow.xaml.csはこちらのようになります(※クリックしてダウンロードできます)。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
ボットにCognitive Servicesを組み込んでみる
マイクロソフトが提供するCognitive Servicesがどんなものかを、Text Analytics APIを使いながら見てみよう。
米IBMがビッグデータ分析基盤サービスを拡充、コグニティブコンピューティングの研究成果も搭載
米IBMは、センサ情報などの大量データを基に人間のように意思決定するコグニティブコンピューティングの研究成果を、実製品やサービスに取り込んでいくと発表した。SoftLayer環境も想定する。
Google Cloud Vision APIのパブリックβ版が公開
米グーグルは2016年2月18日、「Google Cloud Vision API」のパブリックβ版を公開した。APIコールのみで画像の特徴的な要素や一般的なランドマークなどをラベル付けしたり、多様な言語の文字認識(OCR)機能を利用できる。

