Open kawase621 opened 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→RGB
↓
preprocessed_img = img.copy()[:, :, ::-1] # RGB→BGR
ご指摘いただき、誠にありがとうございます。
ご回答ありがとうございます。
確かに、class COCOkeypointsDataset(data.Dataset)ではOpenCVで読み込んだものをimgにしていますが、その後に「画像前処理」としてclass DataTransformを通過していると思います。
このclass DataTransformでは、Normalize_Tensorメソッドの内部で、BGRがRGBに変換されているように読めます。
ということは、実際にネットワークに投入する色情報はRGBになりませんか?
@kawase621 さま
早速の返答をありがとうございます。 おっしゃる通りですね。大変申し訳ございません。
ご指摘いただいた通り、inferenceのプログラム、おかしいですね。
整理しますと、
というのが、訓練の流れになります。
(もともと用意されている「ネットワークの重みデータ」、そしてクラスNormalize_Tensorなどのutilsを使用したかったので、流れが少しややこしくなっています)
ということは、4-7_OpenPose_inference.ipynbでの
後半部分の色情報並び替えは不要ではないでしょうか?
のご指摘の通り不要で、RGB形式で 3. へ入れないとおかしいですね。
誠にありがとうございます。
今環境がなく、すぐに後半の色変換を削除して姿勢推定した結果を確認できないのですが、 @kawase621 さま、確認可能でしょうか?後半の色変換をなくすと、結果はどう変わりますか?
以下のように変更して実行してみました。
preprocessed_img = img.copy()[:, :, ::-1]
↓
preprocessed_img = img.copy()
推論結果は以下の通りです。 後ろの人間まで認識出来ているので、精度は上がっているように見えます。
一方で、heatmapでも、以下のように後ろの人間のところまで表示されます。おそらく左手首の部分なので問題はないのだと思いますが。
@kawase621 さま
早速のご対応を誠にありがとうございます。
検証の依頼を御快諾いただき、結果まで感謝いたします。
最初の @kawase621 さまのご指摘の通りですので、以下対応させてください。
[1] 本Issueに誤植ラベルを付与します [2] プログラムにはコメントアウトで本Issueを参照し、修正を示します [3] 紙面には次、増刷されるタイミングがあれば、図とともに修正を入れます
本件、ならびに多々、非常に丁寧にコードを解読し、誤りの訂正まで誠にありがとうございます。 私も、多くの読者の皆様も非常に助かります。
代表して御礼申し上げます。 ありがとうございます!
ご対応頂きありがとうございます、お役に立てたならば良かったです!!
P.233のRGBの並べ替えについて質問させて下さい。
下記引用2行目のoriImg = cv2.cvtColor(oriImg, cv2.COLOR_BGR2RGB) によって、 対象画像の色情報はBGRからRGBに切り替えられているとの理解ですが、 引用最終行のpreprocessed_img = img.copy()[:, :, ::-1]によって再度、 色情報が並び替えられているように読めます。 後半部分の色情報並び替えは不要ではないでしょうか?