YutaroOgawa/pytorch_advanced

2-2-3 Datasetの実装(p.74上部)についての質問

Closed this issue · 5 comments

anno_list[:,:4],anno_list[:,4] の意味がよくわかりません。

自分でやってみた結果、trainの方は4でないとエラーが生じるということです。
エラーの内容は、index 3 is out of bounds for axis 1 with size 3 というような感じです。
省略された引数も含めて教えていただけると大変助かります。

よろしくお願い致します。

@Semayuki さま

ご質問いただき、ありがとうございます。

p. 74の

img_transformed, boxes, labels = transform(img, phase, anno_list[:, :4], anno_list[:, 4])

の部分を指していると解釈しました。

ここの変数anno_listは、p. 73 の下部で

# 2. アノテーションをリストに
transform_anno = Anno_xml2list(voc_classes)
anno_list = transform_anno(train_anno_list[0], width, height)

で定義されています。
transform_annoは、クラスAnno_xml2listのオブジェクトです。

よって、anno_listはAnno_xml2listのreturnしている変数になります。

そして、p. 69にて、
class Anno_xml2list()を定義しており、
このクラスは、1枚の画像に対する「XML形式のアノテーションデータ」を、
画像サイズで規格化してからリスト形式に変換しており、

return は [xmin, ymin, xmax, ymax, label_ind],

となっています。

そのため、p.73の**部分

anno_list[:, :4] はアノテーションデータのBBoxの座標情報を示し、anno_list[:,4] は物体のクラス名に対応したインデックスの情報です。

という記載の通り、変数anno_listの中身は [xmin, ymin, xmax, ymax, label_ind],
になります。

どうぞ宜しくお願い致します。

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

とてもわかりやすいです。
しかし、私が知りたいのは、[:,:4],[:,4]の表記の意味です。
ご回答いただけますと幸いです。

よろしくお願い致します。

@Semayuki さま

p. 71の**部分に

transform_anno = Anno_xml2list(voc_classes)


# アノテーションをリストで表示
transform_anno(val_anno_list[ind], width, height)

のあとに、

array([[ 0.09 , 0.03058104, 0.998 , 1.01529052, 18. ],
[ 0.122 , 0.57798165, 0.164 , 0.74006116, 14. ]])

と、anno_listの中身の例を記載しています。

この通り、anno_listは1行N列(Nはミニバッチサイズなど、一度に処理する画像枚数に対応)となります。
この1行が入っていて、その中に [xmin, ymin, xmax, ymax, label_ind]が、入っているのが、今回疑問に思われた原因かもしれません。

そのため、[:,:4]の表記の、最初の:は1行目を表しているだけで、[0,:4]でも動作する(と思います)。

そして、Pythonのスライス機能で、アノテーションデータのxmin, ymin, xmax, ymaxを取得しているのが、
,:4] になります。

[:,4]も同様で、4つ目のインデックスのlabel_indを取得しています。

だったら、1行N列にしなければ良いのではと思うところであり、私もパッとはその通りだと思います

ですが、プログラム全体と参考に使用した対象のGitHubから持ってきた関数などとの整合性を見て、
ここをN列でなく、1行N列のarrayにしている理由を確かめないといけないので、その点はすぐに回答ができず、大変申し訳ございません。

どうぞよろしくお願い致します。

大変よくわかりました。
ありがとうございます。

@Semayuki さま

限られた範囲での回答となり、大変申し訳ございませんが、誠にありがとうございます。