ビジョンとcoreMLを用いたテキスト認識

Core MLは、すでに訓練された学習モデルをiOSアプリケーションに統合できるAppleの新しいフレームワークです。開発者は次のように、人気のある深層学習の枠組みから訓練されたモデルを使用することができるカフェKerasSKLearnLIBSVMXgBoostAppleが提供するcoremltoolsは、上記のフレームワークの訓練されたモデルをiOS Core MLモデルに変換することができます。これは、アプリケーションに簡単に統合できます。次に、GPUとCPUの両方を使用してデバイス上で予測が行われます(現時点で適切なものに応じて異なります)。つまり、インターネットに接続する必要はなく、アプリにインテリジェンスを提供するために外部Webサービスを使用する必要もありません。また、予測はかなり速いです。これは非常に強力なフレームワークですが、以下に示すように、多くの制限があります。

テキスト認識プログラム

この記事では、画像を入力とするアプリケーションを作成し、それに含まれる文字を認識します。これは、ホワイトボード上に図やテキストを描画する開発者にとっては非常に便利です。図面の写真を撮る必要はなく、アプリでそれをスキャンし、データを機械可読フォーマットにすることができる。プロセスは2つのステップで構成されます。まず、画像内のどのオブジェクトが文字であるかを検出する必要があります(検出ステップ)。このために、AppleのVisionフレームワークを使用します次に、それらの文字が何であるかを把握する必要があります(認識ステップ)。これを達成するために、訓練されたCore MLモデルを使用します。
Core MLモデルを作成してiOSアプリケーションに統合するために、私たちが何をする必要があるかを見てみましょう。次の図はこれを示しています。
実装は2つのステップで構成されています。機械学習のステップは、データ科学者に適しています。適切なデータセットを選択し、適切な機械学習アルゴリズムを実装し、微調整し、パラメータを変更するには、この分野で多くの専門知識が必要です。モデルを機械学習フレームワークで作成した後、AppleのCore MLフォーマットに変換する必要があります。2番目のステップであるiOS統合は、開発者の出番です。Core MLモデルを簡単に統合し、確立されたモバイルテクノロジとコンセプトを活用して、アプリケーションを作成することに最も重点を置いています。

実装

私たちの場合、ユーザーは写真を(カメラか写真アルバムから)提供します。画像は処理され、1文字ずつの小さな画像に分割されます。次に、私たちが提供した画像を文字として検出できるかどうかCore MLに尋ねます。テキストの順序を失わないように、これらの画像の位置を追跡し、最終的には、認識されたテキストが得られることを願っています。
このアプリケーションのユーザーインターフェイスは非常にシンプルです。画像を表示するより大きな画像ビュー、認識されたテキストを表示するラベル、画像を選択するためのボタンで構成されます。

私たちは、さまざまなフォントを使って、グレースケール画像をたくさん訓練し畳み込みニューラルネットワークモデルを使用します。テストセットを含むモデルの精度は約86〜90%です。モデルはAppleのcoremltoolsを使用してCore MLに変換します。モデルをiOSアプリケーションに組み込みましょう。
名前、タイプ、サイズ、作成者、説明、ライセンスなど、モデルに関する情報が表示されます。モデル評価パラメータセクションでは、モデルが入力として期待するものと出力として返すものを確認できます。28×28のグレースケール画像が必要です。確率の辞書(各文字または数字をキーとし、その文字が我々が探している値である確率)を返します。また、クラスが返されます。クラスは、最も高い確率を持つ英数字です。
モデルをXcodeに統合すると、自動的に生成されたSwiftモデルクラスが利用可能になります。クラスを使用してモデルを読み込んで予測を行うことができます。
次に、画像を取り込むためのボタンの@IBActionを実装しましょう。ここでは、フォトアルバムから画像を取り出すか、カメラから直接取り出すかの2つのオプションがあるアクションシートを表示します。
ユーザーが画像を選択すると、選択した画像と共にimagePickerController(_ picker :, didFinishPickingMediaWithInfo info :)のdelegateメソッドが呼び出されます。ここでは、まず画像が適切な方向(上)かどうかを確認する必要があります。その後、イメージをイメージビューに表示してテキスト検出を開始します。
detectText(image :)の実装を見る前に、Forward Pipe演算子を定義しましょう少数のフィルタで画像を処理する必要があります。これらはすべて純粋な関数なので、この演算子を使用してコードを読みやすくします。
これで、detectText(image :)メソッドを見る準備が整いました。
まず、画像の色を調整して、グレースケール画像に変換しています。その後、変換されたイメージでVNImageRequestHandlerを作成しています。このクラスは、Visionフレームワークへのリクエストを実行するために使用されます。次に、VNDetectTextRectanglesRequestを使用して、テキストを長方形として検出する要求を作成します。ここで重要なのは、リクエストのreportCharacterBoxesプロパティをtrueに設定することです。これで、なぜcharacterBoxesが必要なのかをすぐに説明します。補完ハンドラでは、標準エラーと空の結果のチェックの後、見つかった結果を調べます。これらの結果は、それぞれ、文字または数字の1つのセクションからなる、検出され、切り取られた画像である。たとえば、1つの行のすべての文字が1つの結果オブジェクトに含まれます。それらはVNTextObservation型のオブジェクトで、
検出された領域の各文字を取得するには、characterBoxesプロパティを使用します。これらは個々の文字の境界ボックスです。イメージの各文字の位置を知るようになったので、元のイメージを1文字からなる小さなイメージに切り抜くことができます。分類のためにコアMLに画像を送る前に、まずそれを前処理する必要があります。トレーニングデータに基づいて、より良い分類のためにいくつかのパディングを挿入する必要があります。また、イメージを予想される28×28サイズにリサイズし、グレースケールに変換する必要があります。preProcess(image :)メソッドはそれを行います。認識された領域を反復する間、numberOfWordsとnumberOfCharactersの値は、画像の順序を保持するために必要となるため、追跡します。
次に、画像を分類する方法を見てみましょう。それは、分類される必要がある画像、それに含まれる単語の数、および単語中の文字の数を期待する。
このメソッドでは、最初に作成したCore MLモデルを使用してVNCoreMLRequestを作成しています。VNImageRequestHandlerを使用してリクエストを実行しています。要求のコールバックでは、VNClassificationObservation型の結果(存在する場合)を受け取ります。私たちはトップの結果に興味があります。ただし、ユーザーオプションを提供して、探している可能性のある別のオプションを選択したい場合は、他の結果も使用できます。次に、wordNumber、characterNumber、および分類結果を含む辞書を作成します。この辞書をhandleResult()メソッドに送ります。
handleResultメソッドは、必要な値が指定された辞書にあるかどうかをまずチェックします。次に、見つかったすべての単語を保存するtextMetadataという辞書を使用しています。このデータ構造へのキーは単語の数であり、値として、その単語のすべての文字とその位置を持つ別の辞書があります。分類タスクはバックグラウンドスレッドで実行されているため、このコードチャンクをobjc_sync_enterメソッドでロックして、並行性の問題を回避します。終了後、メインスレッドを取り、アクティビティインジケータを削除し、テキストを表示します。
このメソッドはtextMetadataの内容を調べ、ソートされた単語と文字番号に基づいて単語を形成します。
これは、基本的なテキスト認識アプリを使用するために必要なすべてです。アプリを実行して画像を選択すると、一部の文字に誤りがあるかもしれませんが、一般的に結果が正確であることがわかります。
現在のところ、Visionがスペースをあまりうまく検出しないという問題があります。たとえば、次の例では、すべてを1つの単語として処理することがわかります。
ただし、単語が別の行にある場合は、正しく分割されます。コアMLモデルの改善の余地もある。しばしば、RとB(および他の同様の文字)を混在させます。

Core MLインプレッション

Core MLの最大の問題は、ユーザーがアプリの使用を開始した後、モデルをさらに訓練することができないことです。例えば、キャラクターが間違った文字として分類されている場合、ユーザーがそれを入力として提供することができれば、Core MLモデルはそれを知ることができず、将来、同様の要求のために修正することができない。Core MLは以前に訓練されたモデルの予測だけを行いますが、それは機械学習フレームワークではありません。これが将来のバージョンで有効になることを期待しましょう。1つの回避策は、予測が正しいかどうかをユーザーに尋ね、その答えをバックエンドに送信することです。このような修正が十分にある場合は、モデルを再トレーニングしてアプリのアップデートを送信できます。それはエレガントではありませんが、良い方法ができるまで試してみることができます。
また、カスタマイズされたユーザーエクスペリエンスを提供することもできません。ユーザーの嗜好を習得し、それに基づいて推奨事項を提示したい場合(たとえば、音楽アプリなど)、これは現在Core MLでは不可能です。
Core MLのもう1つの問題は、サイズ、追加するテストデータ、モデルのサイズが大きくなることです。100〜200MBを超えるアプリをインストールする人はいません。
いずれにしても、Core MLは、iOSソフトウェアエンジニアにMachine Learningを開始するための素晴らしいツールを提供します。Core MLの主な役割は、学問(研究のプロセス、アルゴリズムと訓練のデータセットの設計を行う)と開発者(機械学習の専門知識はあまりなく、現実世界への準備アプリ)。フレームワークはまだ初期段階にあり、一般的な機械学習のノウハウとともに、多くが改善されます。

ソースコード

ここで完全なソースコードを確認することができます

コメント