axinc-ai / ailia-models-unity

Unity version of ailia models repository
42 stars 2 forks source link

add text recognition. #118

Closed takky413 closed 5 months ago

takky413 commented 7 months ago

78

kyakuno commented 6 months ago

@takky413 PR、ありがとうございます。PRの中に、ailiaのライブラリが入ってしまっているのと、不要なDS_Storeも含まれてしまっているため、最小限の変更のみでPRをいただければと思います。別のブランチでPRを作った方が楽かもしれません。

AILIA-MODELS/TextRecognitionの追加だけにし、Pluginsの追加はしないようにしていただければと思います。

takky413 commented 6 months ago

Pluginsとそれに伴う.DS_Storeを除いたものをpushいたしました。

kyakuno commented 6 months ago

@takky413 下記を見ると、それ以外にios.metaなどに差分があるのと、他のフォルダにDSStoreがあるため、これらの差分も解消していただければと考えています。 https://github.com/axinc-ai/ailia-models-unity/pull/118/files

takky413 commented 6 months ago

承知しました。 全ての.DS_Storeを削除し、Plugins以下にios.meta、mac.meta、x86.meta、x86_64.metaを追加するという認識で良いでしょうか?

kyakuno commented 6 months ago

はい、PRのdiffを見て、不必要なdiffがなくなるように修正いただければと考えています。

takky413 commented 6 months ago

@kyakuno AILIA-MODELS/TextRecognitionに関するdiffのみに修正いたしました。

kyakuno commented 6 months ago

@takky413 ありがとうございます!修正、確認しました。また、私の手元でも実行を確認できました。一点、要望があるのですが、WEBカメラへの対応は可能でしょうか?VideoModeのチェックを入れた時に、WEBカメラで動くといいなと思います。現状ですと、下記のエラーになるようです。

IndexOutOfRangeException: Index was outside the bounds of the array.
ailiaSDK.AiliaPaddleOCR.Detection (AiliaModel ailia_model, UnityEngine.Color32[] camera, System.Int32 tex_width, System.Int32 tex_height) (at Assets/AXIP/AILIA-MODELS/TextRecognition/AiliaPaddleOCR.cs:81)
ailiaSDK.AiliaTextRecognizersSample.Update () (at Assets/AXIP/AILIA-MODELS/TextRecognition/AiliaTextRecognizersSample.cs:228)
kyakuno commented 6 months ago

スクリーンショット 2023-12-18 17 45 49

kyakuno commented 6 months ago

後、RecognizedTextがかなり増殖するので、フォルダに入れるイメージで、何かのGameObjectの子要素になると嬉しいです。

スクリーンショット 2023-12-18 17 47 10

takky413 commented 6 months ago

承知しました。 VideoModeへの対応とGameObjectの管理に関しては明日以降対応いたします!

takky413 commented 6 months ago

こちらへのご連絡を失念しておりました。 VideoModeへの対応とGameObjectの管理に関しまして、対応したものを12/21にpushいたしましたのでご確認お願いいたします。

kyakuno commented 6 months ago

@takky413 対応、ありがとうございます。サーバモデルへの対応を追加しておきました。

kyakuno commented 6 months ago

@takky413 一点、入力画像のアスペクト比を維持していないために、ビデオモードの精度が落ちている気がしまして、GetResizedでアスペクト比を維持する(黒帯を入れる)ようにしていただくことは可能でしょうか?合わせて、表示用のrawImageも下記のようなコードで、1536:832の比率で表示できればと思います。

            float rawImageRatio = rawImageSize.x / rawImageSize.y;
            float ratio = AiliaImageSource.Width / (float)AiliaImageSource.Height;
            raw_image.rectTransform.sizeDelta = new Vector2(ratio / rawImageRatio * rawImageSize.x, rawImageSize.y);
takky413 commented 6 months ago

承知しました。随時対応いたします。

takky413 commented 6 months ago

ビデオモードでの精度改善と表示画面のアスペクト比の調整を行いましたのでご確認よろしくお願いいたします。

kyakuno commented 6 months ago

@takky413 アスペクト比の調整、ありがとうございます!WEBカメラモードで名刺をかざして動かしていると、たまに下記のエラーが発生するようです。

IndexOutOfRangeException: Index was outside the bounds of the array.
ailiaSDK.AiliaPaddleOCR.ExtractROI (System.Int32[,] binary_camera, System.Collections.Generic.List`1[T] cornerCoordinates) (at Assets/AXIP/AILIA-MODELS/TextRecognition/AiliaPaddleOCR.cs:715)
ailiaSDK.AiliaPaddleOCR.Classification (AiliaModel ailia_model, UnityEngine.Color32[] camera, System.Int32 tex_width, System.Int32 tex_height, System.Collections.Generic.List`1[T] result_detections) (at Assets/AXIP/AILIA-MODELS/TextRecognition/AiliaPaddleOCR.cs:182)
ailiaSDK.AiliaTextRecognizersSample.Update () (at Assets/AXIP/AILIA-MODELS/TextRecognition/AiliaTextRecognizersSample.cs:240)

下記のコードの、originalXとoriginalYがオーバフローしている可能性がある気がします。また、マジックナンバーの832はPADDLEOCR_DETECTOR_INPUT_HEIGHT_SIZEなどに置き換えていただけると嬉しいです。

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    int originalX = (int)(bottomLeft.x) + x;
                    int originalY = 832 - ((int)(bottomLeft.y) + y);

                    ROI[x, height - y - 1] = binary_camera[originalX, originalY];
                }

            }
takky413 commented 6 months ago

承知しました。オーバーフローとマジックナンバーについて、対応いたします!

takky413 commented 6 months ago

オーバーフローとマジックナンバーについて対応いたしましたのでご確認よろしくお願いいたします。

kyakuno commented 5 months ago

@takky413 Python版と比較すると、まだ精度が出ていないようでして、コードを見ていると、Pythonで行なっている正規化(a - 0.5) * 2を行なっていないのではないかと考えています。

Python

スクリーンショット 2024-01-12 15 13 38

Unity

スクリーンショット 2024-01-12 15 14 07

ROIはとれていそうでした。

スクリーンショット 2024-01-12 15 17 34

kyakuno commented 5 months ago

@takky413 手元でWEBカメラの画像を、PythonとUnityで比較して、Unity版の前処理などを調整いただければと思います。

kyakuno commented 5 months ago

検証用のテスト画像とPythonの出力です。python3 paddleocr.py -i test.png -c serverで推論しています。

test

output

kyakuno commented 5 months ago

test.pngをunityに入れた場合の出力です。

スクリーンショット 2024-01-12 15 48 47

kyakuno commented 5 months ago

Pythonと見比べると、下記が正しいかなと思うのですが、これでも検知できなかったので、他にも何かありそうです。

Detection

data[(y * w + x) + 0 * w * h] = ((float)((camera[(tex_height - 1 - y2) * tex_width + x2].r) / 255.0f - 0.485f) / 0.229f);
data[(y * w + x) + 1 * w * h] = ((float)((camera[(tex_height - 1 - y2) * tex_width + x2].g) / 255.0f - 0.456f) / 0.224f);
data[(y * w + x) + 2 * w * h] = ((float)((camera[(tex_height - 1 - y2) * tex_width + x2].b) / 255.0f - 0.406f) / 0.225f);

Classification

data[(y * w + x) + 0 * w * h] = ((float)(ROI_list[r][x,y]) / 255.0f - 0.5f) * 2;
data[(y * w + x) + 1 * w * h] = ((float)(ROI_list[r][x,y]) / 255.0f - 0.5f) * 2;
data[(y * w + x) + 2 * w * h] = ((float)(ROI_list[r][x,y]) / 255.0f - 0.5f) * 2;    

Recognition

data[(y * w + x) + 0 * w * h] = ((float)(ROI_list[r][x,y]) / 255.0f - 0.5f) * 2;
data[(y * w + x) + 1 * w * h] = ((float)(ROI_list[r][x,y]) / 255.0f - 0.5f) * 2;
data[(y * w + x) + 2 * w * h] = ((float)(ROI_list[r][x,y]) / 255.0f - 0.5f) * 2;    
takky413 commented 5 months ago

@kyakuno 正規化の追加と精度の検証ありがとうございます。 いただいたtest.pngの出力精度がpythonと同程度になるよう、Unity側の前処理を修正いたします...!

takky413 commented 5 months ago

@kyakuno お疲れ様です。 推論精度が低くなっている原因に関しまして、ROIの画素を抽出する際に、Color32ToArray関数内で設定した閾値で0 or 1を判別してグレースケール化しており、その閾値が今まで入力していった白黒のサンプル画像に基づいて決められていたため、今回のカラフルな画像を入れた際に推論精度が低くなっている可能性がありました。 したがって、

  1. 閾値の値を調整する。
  2. グレースケール化せず、3チャネルを持たせたままClassificationとRecognitionに入力する。 のどちらかで対応していこうと思います。
takky413 commented 5 months ago

@kyakuno お疲れ様です。 こちらの画像のように推論精度が改善できました! ご確認よろしくお願いいたします。

SampleJapanese test
kyakuno commented 5 months ago

@takky413 対応、ありがとうございます!DrawTextに引数が追加されているようなので、AIliaRenderer.csもコミットいただいても良いでしょうか?

kyakuno commented 5 months ago

動作は良さそうです。

スクリーンショット 2024-01-16 17 03 14

takky413 commented 5 months ago

AIliaRenderer.csも追加いたしました。

kyakuno commented 5 months ago

対応、ありがとうございました!いい感じに動きました。