👁️

Azure Computer Vision APIの日本語OCR機能を使ってみる

2021/02/13に公開2

AzureのComputer Vision APIで日本語OCR機能が使えるようになっていたので、日本語の文章が書かれた画像ファイルで文字認識をさせ、文字認識率を計測してみました。コードはNode.jsを使用しています(文字認識率測定はPythonを使用しています)。

Azure Computer Vision API OCR機能の利用

AzureでComputer Visionのリソースを作成します。私は、リージョンは「米国西部2 (westus2)」、価格レベルは「Free」で作成しました。リソースが作成されたら、リソース管理メニューの「キーとエンドポイント」を開き、「キー1」と「エンドポイント」の情報をコピーしておきます。

コードは、@azure/cognitiveservices-computervisionのサンプルコードをベースに作成します。最初に下記2つのnpmパッケージをnpm installします。

$ npm install @azure/cognitiveservices-computervision
$ npm install @azure/ms-rest-azure-js

index.jsを作成し、以下のコードを記述しました。computerVisionKeyの値は上記で取得した「キー1」の値、computerVisionEndPointの値は同じく「エンドポイント」の値で差し替えてください。urlの値は文字認識させたい画像のURLを記載します。今回は実行の度に直接値を修正しました。

const { ComputerVisionClient } = require("@azure/cognitiveservices-computervision");
const { CognitiveServicesCredentials } = require("@azure/ms-rest-azure-js");
 
async function main() {
  const computerVisionKey = "a12b3456c7d890ebfg1234hi56789012"; // 「キー1」の値に置き換える
  const computerVisionEndPoint = "https://yourcomputervisionendpoint.cognitiveservices.azure.com/"; // 「エンドポイント」の値に置き換える
  const cognitiveServiceCredentials = new CognitiveServicesCredentials(computerVisionKey);
  const client = new ComputerVisionClient(cognitiveServiceCredentials, computerVisionEndPoint);
 
  const url = "https://www.contoso.com/images/01.jpg"; // 文字認識させたい画像ファイルのURLに置き換える
  const options = {
      language: "ja"
  };
  client
    .recognizePrintedText(true, url, options)
    .then((result) => {
        for (let i=0; i<result.regions.length; i++){
            const resultRegionsLines = result.regions[i].lines;
            for (let j=0; j<resultRegionsLines.length; j++) {
                const resultRegionsLinesWords = resultRegionsLines[j].words;
                let currentLineTexts = "";
                for (let k=0; k<resultRegionsLinesWords.length; k++) {
                    currentLineTexts += resultRegionsLinesWords[k].text;
                }
                console.log(currentLineTexts);
            }
        }
    })
    .catch((err) => {
        console.log("An error occurred:");
        console.error(err);
    });
}

main();

準備が出来たら、node index.jsでスクリプトを実行します。最初はテストとして、こちらの画像を文字認識させてみます。

$ node index.js
一行目おはようございます
二行目こんにちは
ニ行目こんばんは

漢数字の「三」がカタカナの「ニ」になっていますが、文字認識結果が返ってくることを確認しました。

文字認識テストと文字認識率の測定

いつくかの画像をComputer Vision APIに渡して、文字認識結果を正答と比較して文字認識率を測定します。

今回は、まったく同じ文章を、フォントだけ変えた4種類の画像を用意してテストしました。文章はオスカー・ワイルド原作、結城浩翻訳の『わがままな大男』の冒頭部分を使用します。テストに使用したフォントは「游ゴシック」「メイリオ」「MS P明朝」「あんずもじ2020」です。あんずもじ2020を試したのは、手書き文字への対応力を評価するためです。

文字認識率は、PythonのPython-Levenshteinを使用し、正答とのレーベンシュタイン距離を算出しています。文字認識率は(正答の文字数 - 正答と文字認識結果のレーベンシュタイン距離 ) / 正答の文字数で算出しています。フォントによって改行位置は変わりますが、今回は改行位置は考慮せず、改行を除去して一行の状態にして文字認識率を測定しています。また、原文テキストの半角スペースも一括除去しています。

使用画像と文字認識率は下記のとおりでした。

フォント 画像 文字認識率
游ゴシック 画像 92.4% (353/382)
メイリオ 画像 96.3% (368/382)
MS P明朝 画像 99.2% (379/382)
あんずもじ2020 画像 66.7% (255/382)

MS P明朝、メイリオ、游ゴシック、あんずもじ2020の順番に文字認識率が良く、上位3つは文字認識率が90%を大きく超えました。あんずもじ2020は文字認識率は66.7%でした。

内容を目視で比較してみると、原文のテキストでは全角英数字で表現している箇所に対して、Computer Vision APIは半角英数字で結果を返しているため文字認識失敗と判定しているという、機械的な測定方法を使ったがゆえの問題もありました。

游ゴシックの画像は、テキストの認識結果の表示箇所が入れ替わっていました。具体的には『「ここで遊ぶのはなんて』が『歌声を響かせるので~』とは別行扱いになり、かつ順序が入れ替わったため、その部分だけ文字認識率が下がりました。そこを除けばメイリオとMS P明朝の間の文字認識率になります。行の箇所が意図せずずれることがあるようであれば、文字認識結果と一緒に返ってくる座標情報も使って順序を調整した方がいいかもしれません。

あんずもじ2020は手書き風フォントで、日本語を母国語とする成人の方であれば、おそらく100%に迫る精度で文字認識できる文字だと思います。Computer Vision APIは3文字あれば2文字認識に成功し、1文字認識に失敗しているわけですが、これはAPIで文字認識されたテキストだけを初めて読む場合だと、文意を把握するのが正直厳しい程度の文字認識率だと思います。一方、人間が写真などを見て文字起こしする状況であれば、ゼロから全部文字起こしするよりは、Computer Vision APIの文字認識結果をベースに作業するほうが格段に作業が楽になると思います。あんずもじ2020を使った画像のOCR機能確認は、手書き文字を想定した一つのテストに過ぎませんが、使い方によっては手書き文字に対しても有用性はあると感じました。

以上、AzureのComputer Vision APIの日本語OCR機能を使ってみた結果です。

手書き帳票のOCR読み取りに対する期待など、日本語OCR機能に対する需要は依然として大きいと思います。日本語の場合は、漢字など使用する文字数が元々多いので、アルファベットを利用する文化圏と比べてもOCRは技術的に難しいものだと思いますが、Google CloudのVision API以外にもメジャーなクラウドで日本語OCR機能が利用できることは、利用者にとって選択肢が増えて良いことだと思います。

Discussion

tfukumoritfukumori

すばらしい記事ありがとうございます。

私もTesseractで手書き文字認識に関するチャレンジをしているのですが、認識率が悪くとも「写真などを見て文字起こしする状況」での利用価値があるのではというご意見は、大変頷かされるものがありました。

※Computer Vision APIの日本語正式対応はごく最近(2月9日発表)なのですね。
 日本語記事:https://www.publickey1.jp/blog/21/microsoft_azurecomputer_vision_apiocr.html
 原文:https://azure.microsoft.com/ja-jp/updates/computer-vision-read-ocr-languages-update-preview/

手書き文字の分野では、帳票であればTegakiというサービスが今のところ一番良いようですが、おっしゃるように選択肢が増えてより良いものとなってほしいと思います。

私もぜひComputer Vision APIを試してみたいと思います。

Hiroshi TomiokaHiroshi Tomioka

tfukumoriさん

エントリーを読んでいただきありがとうございます。

手書き文字になると、「人間の作業を完全に置き換える」だけの精度の達成はかなりハードルが高いと思いますが、「人間の作業を支援する」というのでもAIが価値を発揮できる場面はあると思いますので、そこはアイディア次第かなと思っています。

Freeプランの範囲でも結構な回数使えますので、是非お試しください。