axinc-ai / ailia-models

The collection of pre-trained, state-of-the-art AI models for ailia SDK
2.04k stars 325 forks source link

前処理のベクトルをBGR形式で評価するように修正 #1323

Closed takumi2786 closed 11 months ago

takumi2786 commented 11 months ago

Issue Link

https://github.com/axinc-ai/ailia-models/issues/1225

作業内容

表題の通りです。前処理のベクトルについて、BGR形式で読み込んだ画像RGB順序の変換ベクトルを適用してしまっていたため、正しい順序で評価されるように修正しました。

確認した項目

README記載の参照コードを確認しました。

該当の前処理ベクトルは、以下の箇所で定義されています。 https://github.com/microsoft/human-pose-estimation.pytorch/blob/49f3f4458c9d5917c75c37a6db48c6a0d7cd89a1/pose_estimation/valid.py#L139

このコードでは画像をRGB形式で読み込んでいるため、以下のベクトルはRGB順序です。

mean=[0.485, 0.456, 0.406]
std=[0.229, 0.224, 0.225]

その他メモ

以下のIssue曰く、pytorch のresnetにはRGB形式の画像を入力する必要があるとあります。 https://github.com/microsoft/human-pose-estimation.pytorch/issues/73

一方、こちらの箇所でailia.NETWORK_IMAGE_FORMAT_RGBを指定しています。

これにより、推論時にBGRからRGBへ変換され問題なく動作すると理解しました。

takumi2786 commented 11 months ago

@kyakuno こちら対応しました:bow:

確認お願いします。

kyakuno commented 11 months ago

対応、ありがとうございます。NETWORK_IMAGE_FORMAT_RGBはyolov3への指定であり、内部でBGRからRGB変換が行われます。対して、PoseResNetはBGRをそのまま、ネットワークに入力しているのですが、実は、meanとstdはそのままで、src_imgをinput_dataに代入する際に、BGRからRGB変換してrunに流すのが正しそうな気がしてきたのですが、いかがでしょうか。

kyakuno commented 11 months ago

poseresnetの大元のコードで、学習をBGRに対してRGBのmeanを適用してしまっているのであれば、現状のコードのままでも問題ないような気もしますね。

kyakuno commented 11 months ago

・poseresnetの大元のリポジトリで、imreadしてBGRのデータに対して、RGB順のmeanとstdを適用している ・ailiaのサンプルはこの手順に沿った実装になっている ・学習時の前処理と推論時の前処理は合わせる必要があり、大元が間違った学習をされている以上、現状のままの方が精度が良いのではないか?

takumi2786 commented 11 months ago

レビューありがとうございます 確認します!

takumi2786 commented 11 months ago

対応、ありがとうございます。NETWORK_IMAGE_FORMAT_RGBはyolov3への指定であり、内部でBGRからRGB変換が行われます。対して、PoseResNetはBGRをそのまま、ネットワークに入力しているのですが、実は、meanとstdはそのままで、src_imgをinput_dataに代入する際に、BGRからRGB変換してrunに流すのが正しそうな気がしてきたのですが、いかがでしょうか。

ありがとうございます。読み違えていました。 Detectorのほうを見てしまっていました :bow:

poseresnet読み込み箇所はこちらで、確かにBGRの画像computeに入力しているようでした。

takumi2786 commented 11 months ago

@kyakuno

・poseresnetの大元のリポジトリで、imreadしてBGRのデータに対して、RGB順のmeanとstdを適用している ・ailiaのサンプルはこの手順に沿った実装になっている ・学習時の前処理と推論時の前処理は合わせる必要があり、大元が間違った学習をされている以上、現状のままの方が精度が良いのではないか?

参照レポジトリの学習コードでは以下の箇所で画像を読み込んでいるのですが、cv2.IMREAD_COLORが利用されているため、BGRで読まれています。 https://github.com/microsoft/human-pose-estimation.pytorch/blob/49f3f4458c9d5917c75c37a6db48c6a0d7cd89a1/lib/dataset/JointsDataset.py#L73-L74

また、ここ以外にRGB・BGR変換などを行っている箇所はなさそうでした。

Issueは解決済みになっていますが、該当箇所のコードは5年前から変更されていないようです。

以上のことから、参照レポジトリ・修正前コードはともに、

となっていそうです。

なのでご指摘通り、今回の修正は不要だと思いました:bow:

kyakuno commented 11 months ago

了解しました!詳細調査、ありがとうございます。 ということで、このIssueは完了とさせていただきます。