Closed takky413 closed 5 months ago
@takky413 PR、ありがとうございます。PRの中に、ailiaのライブラリが入ってしまっているのと、不要なDS_Storeも含まれてしまっているため、最小限の変更のみでPRをいただければと思います。別のブランチでPRを作った方が楽かもしれません。
AILIA-MODELS/TextRecognitionの追加だけにし、Pluginsの追加はしないようにしていただければと思います。
Pluginsとそれに伴う.DS_Storeを除いたものをpushいたしました。
@takky413 下記を見ると、それ以外にios.metaなどに差分があるのと、他のフォルダにDSStoreがあるため、これらの差分も解消していただければと考えています。 https://github.com/axinc-ai/ailia-models-unity/pull/118/files
承知しました。 全ての.DS_Storeを削除し、Plugins以下にios.meta、mac.meta、x86.meta、x86_64.metaを追加するという認識で良いでしょうか?
はい、PRのdiffを見て、不必要なdiffがなくなるように修正いただければと考えています。
@kyakuno AILIA-MODELS/TextRecognitionに関するdiffのみに修正いたしました。
@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)
後、RecognizedTextがかなり増殖するので、フォルダに入れるイメージで、何かのGameObjectの子要素になると嬉しいです。
承知しました。 VideoModeへの対応とGameObjectの管理に関しては明日以降対応いたします!
こちらへのご連絡を失念しておりました。 VideoModeへの対応とGameObjectの管理に関しまして、対応したものを12/21にpushいたしましたのでご確認お願いいたします。
@takky413 対応、ありがとうございます。サーバモデルへの対応を追加しておきました。
@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 アスペクト比の調整、ありがとうございます!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 Python版と比較すると、まだ精度が出ていないようでして、コードを見ていると、Pythonで行なっている正規化(a - 0.5) * 2を行なっていないのではないかと考えています。
Python
Unity
ROIはとれていそうでした。
@takky413 手元でWEBカメラの画像を、PythonとUnityで比較して、Unity版の前処理などを調整いただければと思います。
検証用のテスト画像とPythonの出力です。python3 paddleocr.py -i test.png -c serverで推論しています。
test.pngをunityに入れた場合の出力です。
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;
@kyakuno 正規化の追加と精度の検証ありがとうございます。 いただいたtest.pngの出力精度がpythonと同程度になるよう、Unity側の前処理を修正いたします...!
@kyakuno お疲れ様です。 推論精度が低くなっている原因に関しまして、ROIの画素を抽出する際に、Color32ToArray関数内で設定した閾値で0 or 1を判別してグレースケール化しており、その閾値が今まで入力していった白黒のサンプル画像に基づいて決められていたため、今回のカラフルな画像を入れた際に推論精度が低くなっている可能性がありました。 したがって、
@kyakuno お疲れ様です。 こちらの画像のように推論精度が改善できました! ご確認よろしくお願いいたします。
@takky413 対応、ありがとうございます!DrawTextに引数が追加されているようなので、AIliaRenderer.csもコミットいただいても良いでしょうか?
動作は良さそうです。
AIliaRenderer.csも追加いたしました。
対応、ありがとうございました!いい感じに動きました。
78