YutaroOgawa / pytorch_advanced

書籍「つくりながら学ぶ! PyTorchによる発展ディープラーニング」の実装コードを配置したリポジトリです
MIT License
842 stars 333 forks source link

【第4章 P.233 RGBの並べ替えについて】 #147

Open kawase621 opened 3 years ago

kawase621 commented 3 years ago

P.233のRGBの並べ替えについて質問させて下さい。

下記引用2行目のoriImg = cv2.cvtColor(oriImg, cv2.COLOR_BGR2RGB) によって、 対象画像の色情報はBGRからRGBに切り替えられているとの理解ですが、 引用最終行のpreprocessed_img = img.copy()[:, :, ::-1]によって再度、 色情報が並び替えられているように読めます。 後半部分の色情報並び替えは不要ではないでしょうか?

test_image = './data/hit-1407826_640.jpg'
oriImg = cv2.imread(test_image)  # B,G,Rの順番

# BGRをRGBにして表示
oriImg = cv2.cvtColor(oriImg, cv2.COLOR_BGR2RGB)                                                                                   
plt.imshow(oriImg)
plt.show()

 # 画像のリサイズ
size = (368, 368)                                                              
img = cv2.resize(oriImg, size, interpolation=cv2.INTER_CUBIC)                  

# 画像の前処理
img = img.astype(np.float32) / 255.

# 色情報の標準化
color_mean = [0.485, 0.456, 0.406]
color_std = [0.229, 0.224, 0.225]

preprocessed_img = img.copy()[:, :, ::-1]  # BGR→RGB
YutaroOgawa commented 3 years ago

@kawase621 さま

ありがとうございます。 OpenCVでBGRで読み込んだあと、2回変換されてBGRでネットワークに入力されていますね。。。

p. 203の class COCOkeypointsDataset(data.Dataset): を確認し、結局ネットワークにはBGRとRGBのどちらで入れているのか確認すると、

OpenCVで読み込んだものをimgにしているので、 ネットワークに投入する色情報はBGRが正しいことになります。

上記のコードでは、 途中で、可視化しやすいようにRGBにしたのですが、ネットワークに投入する前に、再度BGRに戻していることになります。

最後のコメント文が誤っているので、誤植として修正いたします。

preprocessed_img = img.copy()[:, :, ::-1] # BGR→RGBpreprocessed_img = img.copy()[:, :, ::-1] # RGB→BGR

ご指摘いただき、誠にありがとうございます。

kawase621 commented 3 years ago

ご回答ありがとうございます。

確かに、class COCOkeypointsDataset(data.Dataset)ではOpenCVで読み込んだものをimgにしていますが、その後に「画像前処理」としてclass DataTransformを通過していると思います。

このclass DataTransformでは、Normalize_Tensorメソッドの内部で、BGRがRGBに変換されているように読めます。

ということは、実際にネットワークに投入する色情報はRGBになりませんか?

YutaroOgawa commented 3 years ago

@kawase621 さま

早速の返答をありがとうございます。 おっしゃる通りですね。大変申し訳ございません。

ご指摘いただいた通り、inferenceのプログラム、おかしいですね。

整理しますと、

  1. 「BGRの画像」を投入
  2. DataTrasformのNormalize_Tensorで「RGBに変換」
  3. 「RGBの画像」がネットワークの「Featureモジュール」に入る

というのが、訓練の流れになります。

(もともと用意されている「ネットワークの重みデータ」、そしてクラスNormalize_Tensorなどのutilsを使用したかったので、流れが少しややこしくなっています)

ということは、4-7_OpenPose_inference.ipynbでの

後半部分の色情報並び替えは不要ではないでしょうか?

のご指摘の通り不要で、RGB形式で 3. へ入れないとおかしいですね。

誠にありがとうございます。

今環境がなく、すぐに後半の色変換を削除して姿勢推定した結果を確認できないのですが、 @kawase621 さま、確認可能でしょうか?後半の色変換をなくすと、結果はどう変わりますか?

kawase621 commented 3 years ago

以下のように変更して実行してみました。

preprocessed_img = img.copy()[:, :, ::-1] 
↓
preprocessed_img = img.copy()

推論結果は以下の通りです。  後ろの人間まで認識出来ているので、精度は上がっているように見えます。 image

一方で、heatmapでも、以下のように後ろの人間のところまで表示されます。おそらく左手首の部分なので問題はないのだと思いますが。 image

YutaroOgawa commented 3 years ago

@kawase621 さま

早速のご対応を誠にありがとうございます。

検証の依頼を御快諾いただき、結果まで感謝いたします。

最初の @kawase621 さまのご指摘の通りですので、以下対応させてください。

[1] 本Issueに誤植ラベルを付与します [2] プログラムにはコメントアウトで本Issueを参照し、修正を示します [3] 紙面には次、増刷されるタイミングがあれば、図とともに修正を入れます

本件、ならびに多々、非常に丁寧にコードを解読し、誤りの訂正まで誠にありがとうございます。 私も、多くの読者の皆様も非常に助かります。

代表して御礼申し上げます。 ありがとうございます!

kawase621 commented 3 years ago

ご対応頂きありがとうございます、お役に立てたならば良かったです!!