前提・実現したいこと
pascalVOCデータセットを読み込んで、確認のために画像にバウンディングボックスを描画してみたいです。
エラー
該当のソースコード
python
1image, target, image_id = train_dataset[1] 2boxes = target['boxes'].cpu().numpy().astype(np.int32) 3 4nim = image.permute(1,2,0).cpu().numpy().astype(float) 5 6fig, ax = plt.subplots(1, 1, figsize=(16, 8)) 7 8for box in boxes: 9 cv2.rectangle(nim, (box[0], box[1]), (box[2], box[3]), (0, 1, 0), 2) 10ax.set_axis_off() 11ax.imshow(nim)
参考
https://www.kaggle.com/shonenkov/training-efficientdet
データセット作成は自分で行い、描画のところだけ参照しています。
同じようにデータセットからはimage, target, image_idが返されるようにはしているはずです。
試したこと
numpyで適当に真っ黒の画像を作成してやってみるとそれに関してはうまくいっています。
なぜか描画したい画像ではcv2.rectangleが機能していないように思います。
補足情報(FW/ツールのバージョンなど)
補足の情報を詳細に記載します。
nimは描画したい画像
boxesは矩形の座標(xmin, ymin, xmax, ymax)
nim
1array([[[0.51372552, 0.57254905, 0.59215689], 2 [0.50588238, 0.56470591, 0.58431375], 3 [0.50588238, 0.56470591, 0.58431375], 4 ..., 5 [0.48627451, 0.54509807, 0.53333336], 6 [0.45490196, 0.51372552, 0.50196081], 7 [0.43137255, 0.49019608, 0.47843137]], 8 9 [[0.51372552, 0.56470591, 0.58823532], 10 [0.50588238, 0.55686277, 0.58039218], 11 [0.50588238, 0.55686277, 0.58039218], 12 ..., 13 [0.42352942, 0.48235294, 0.4627451 ], 14 [0.41568628, 0.47450981, 0.45490196], 15 [0.41176471, 0.47058824, 0.4509804 ]], 16 17 [[0.50588238, 0.5411765 , 0.56862748], 18 [0.50588238, 0.5411765 , 0.56862748], 19 [0.50980395, 0.54509807, 0.57254905], 20 ..., 21 [0.41960785, 0.47450981, 0.47450981], 22 [0.42745098, 0.48235294, 0.48235294], 23 [0.43921569, 0.49411765, 0.49411765]], 24 25 ..., 26 27 [[0.43529412, 0.48627451, 0.50980395], 28 [0.43529412, 0.48627451, 0.50980395], 29 [0.43529412, 0.48627451, 0.50980395], 30 ..., 31 [0.41960785, 0.47843137, 0.50588238], 32 [0.42352942, 0.48235294, 0.50980395], 33 [0.42745098, 0.48627451, 0.51372552]], 34 35 [[0.43921569, 0.49019608, 0.51372552], 36 [0.43529412, 0.48627451, 0.50980395], 37 [0.43137255, 0.48235294, 0.50588238], 38 ..., 39 [0.41960785, 0.47843137, 0.50588238], 40 [0.41960785, 0.47843137, 0.50588238], 41 [0.41960785, 0.47843137, 0.50588238]], 42 43 [[0.43137255, 0.48235294, 0.50588238], 44 [0.42745098, 0.47843137, 0.50196081], 45 [0.43137255, 0.48235294, 0.50588238], 46 ..., 47 [0.42352942, 0.48235294, 0.50980395], 48 [0.41960785, 0.47843137, 0.50588238], 49 [0.42352942, 0.48235294, 0.50980395]]])
nimdtype
1dtype('float64')
nimshape
1(334, 500, 3)
boxes
1array([[ 31, 140, 116, 173], 2 [193, 183, 260, 201]], dtype=int32)
データセット
class MyDataset(torch.utils.data.Dataset): def __init__(self, df, image_dir): super().__init__() self.image_ids = df["image_id"].unique() self.df = df self.image_dir = image_dir def __getitem__(self, index): transform = transforms.Compose([ transforms.ToTensor() ]) # 入力画像の読み込み image_id = self.image_ids[index] #image = Image.open(f"{self.image_dir}{image_id}.jpg") image = cv2.imread(self.image_dir + image_id + '.jpg') image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB).astype(np.float64) image /= 255.0 image = transform(image) # アノテーションデータの読み込み records = self.df[self.df["image_id"] == image_id] boxes = torch.tensor(records[["x", "y", "w", "h"]].values, dtype=torch.float32) boxes[:, 2] = boxes[:, 0] + boxes[:, 2] boxes[:, 3] = boxes[:, 1] + boxes[:, 3] area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0]) #area = boxes[:, 2] * boxes[:, 3] area = torch.as_tensor(area, dtype=torch.float32) labels = torch.tensor(records["class"].values, dtype=torch.int64) iscrowd = torch.zeros((records.shape[0], ), dtype=torch.int64) target = {} target["boxes"] = boxes target["labels"]= labels target["image_id"] = torch.tensor([index]) target["area"] = area target["iscrowd"] = iscrowd return image, target, image_id def __len__(self): return self.image_ids.shape[0]
いろいろいじっている中で、Umat形式とやらが関係しているような気もするのですが、確かなことは私の方ではわかっておりません。
大変長くなり恐縮ですが、どなたか分かる方がいらっしゃればご教授のほうよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー