機械学習を使用した数字認識に関する所感

本投稿は TECOTEC Advent Calendar 2020 の3日目の記事です。

なぜ機械学習を使用したか?

新規案件の下調べということで文字の識別を行う機能に関して大体一ヶ月程度の時間を費やして調査を行いました。
目的はAndroidの画面上で筆記された文字(数字のみ)を画像として文字の識別を行うことです。案件内で調査しなくてはならない環境がころころと変わったのですが実際に動作を見てみたものはそれぞれ以下のものになります。

調査内容

以下の環境にライブラリを導入して調査を行いました。

Unity

1.Open CV plus Unity
2.Tesseract

kotlin

1.TensorFlow Lite

Unity側で確認をお此方のはOpenCV plus UnityとTesseractです。こちらはOCR用のライブラリが主になりました。両方ともまず必要な機能である文字入力部分で入力遅延が起こるという問題がありました。そのため文字を正しく入力できず、文字認識に関してもあまり高い精度を出すことができないという課題がありました。今思えば文字認識のデータ周りの整備を行うことや入力周りの仕組みを最適化した方がよかったという反省点があります。
対してkotlin環境ではTensorFlow Liteを導入してみました。Googleから提供されているAndroid環境向けライブラリです。TensorFlowなどで作成したModelをもとに推論を行うことができます。機械学習ライブラリの画像推論機能をOCRに転用した形になります。
最終的に一番形に近づいたものがkotlin - TensorFlow Liteの組み合わせだったのでなにをやったのかまとめます。

機械学習調査として何をしたか?

調査にあたって以下の二つの環境を使用して学習データを用意しました。 Google Colabは無料でGoogleのサーバー上で全ての機能を完結させることができ、操作も容易でした。
デメリットとしては無料使用には時間制限があるという点で連続90分アイドル状態にする、または連続12時間使用することでインスタンスが強制的に終了されます。それなりに負荷の高い学習を行わない限り困ることがないため気になりませんでした。
対して開発PC内部に環境を持つ場合には時間制限が特にないです。意外にMacBook内に開発環境を用意した方が学習時間は短くすみました。
機械学習用に自前でPCを用意する場合には端末の性能の煽りをもろに受けるという点に関しては注意が必要だと思います。

文字認識にあたってMacBook内に用意した開発環境

・Anaconda Navigator
・Python: 3.6.9 (使用するTensorFlowが3.7未満までしか対応していない為)
・TensorFlow 2.0
・pip: 20.2.2 (1.9以降)

環境構築を行わない場合

・Google Colab

入門向けの記述をまとめているサイト

【TensorFlow 2.0 入門】TF 初心者でも分かるAPIの解説 | deepblue

インストールにあたっては以下を参照
TensorFlow

はじめに挑戦する場合には何から着手すればいいのかわからなくなるため、TensorFlowの公式ドキュメントから入るのは敷居が高く感じました。
私の場合は手書きの数字を識別したかったので先ずは入門向け記述をまとめているサイトを使用しました。まとめから目的に絞って必要な内容だけを公式ドキュメントで確認していきました。

また、それぞれの使い勝手も見たかったので複数環境触ってみました。使い勝手に関しては手元に開発機に環境を用意した場合から説明していきます。仮想環境を使用するためにAnaconda Navigatorをインストールしました。用意した仮想環境へPython、pip、TensroFlowをインストールする手順に関してはGoogleで手順が記載されているので詳細は割愛します。
手元でTensorFlow実行環境を用意する場合、ドキュメントの説明も多岐に渡るため、用意するのに少し時間がかかりました。また、機械学習自体、計算速度がものをいうため使用PCのスペックに自信がある場合や外部にそもそもサーバーとしてサービスを提供することを視野に入れない場合には悪くないかと思います。

対してGoogleが提供するGoogle Colabを使用する場合の導入手順です。

f:id:Teco_Yasui:20201002164225p:plain

f:id:Teco_Yasui:20201002164519p:plain 注)Google および Google ロゴは Google Inc. の登録商標であり、同社の許可を得て使用しています。

今回は既に追加されていますがGoogleドライブの新規メニューからその他>アプリを追加を選択しColaboratryを選択しインストールします。 これで環境の用意が完了しました。新規>その他>Google Colaboratryを選択しプロジェクトを作成し、実装を用意すればすぐに機械学習を開始できます。

f:id:Teco_Yasui:20201002170129p:plain

記述を行い、矢印ボタンを押下するとすぐに実行できます。実行結果は記述のすぐ下に表示されます。 学習結果Modelはフォルダーマークを押下しsample_dataフォルダー内に出力されるのでメニューからダウンロードを選択すればダウンロードを行えます。

学習結果の確認

画像認識を行うにあたってスマホアプリにTensorFlow Liteを導入し、学習結果のモデルを使用して画像認識を行いました。文字の識別に使用した画像はスマホアプリの筆記入力ビューに数字を入力し、それを画像として使用しました。

残った課題と考察、解決案

今回の実験ではある程度識別精度を向上させることができました。しかしうまくいかない文字も出てきました。学習Modelに使用した文字画像とあまりにかけ離れたものに関しては正しく認識を行えませんでした。また、共通の特徴をもつ数字の認識もあまりうまくできませんでした。
そこで考えたこととしてはユーザーの入力に関してどれだけうまく制限をかけるかの方が重要だったかもしれないという点です。学習モデルの精度に関してはある程度まで上げることはできます。しかし、学習した内容に近い特徴を持っていなければ理解が出来ないという問題が存在します。例えば筆記入力を行う枠の端に小さく書いた場合には正しく認識を行えませんでした。この場合には余白量が訓練データとはかけ離れているため図形としては完全に別のものとして認識されていると考えられます。
そこからさらに学習を行うことも可能ですがその方法を選択することは得策ではないもしれません。ゼロベースからのモデル作成、あるいはファインチューニングによる学習済みモデルからの再学習に関しても識別精度を考えるとそれなりに時間がかかってしまいます。 それよりも認識精度を上げるために入力されたデータを正しく加工するなどしてライブラリに渡すほうがより解決に近づけたかもしれません。

tecotec.co.jp