目標(biāo)檢測(cè)領(lǐng)域沒(méi)有MNIST和Fashion-MNIST這樣的小型數(shù)據(jù)集。為了快速演示對(duì)象檢測(cè)模型,我們收集并標(biāo)記了一個(gè)小型數(shù)據(jù)集。首先,我們從辦公室拍攝了免費(fèi)香蕉的照片,并生成了 1000 張不同旋轉(zhuǎn)和大小的香蕉圖像。然后我們將每個(gè)香蕉圖像放置在一些背景圖像上的隨機(jī)位置。最后,我們?yōu)閳D像上的那些香蕉標(biāo)記了邊界框。
14.6.1。下載數(shù)據(jù)集
帶有所有圖像和 csv 標(biāo)簽文件的香蕉檢測(cè)數(shù)據(jù)集可以直接從互聯(lián)網(wǎng)上下載。
%matplotlib inline import os import pandas as pd import torch import torchvision from d2l import torch as d2l #@save d2l.DATA_HUB['banana-detection'] = ( d2l.DATA_URL + 'banana-detection.zip', '5de26c8fce5ccdea9f91267273464dc968d20d72')
%matplotlib inline import os import pandas as pd from mxnet import gluon, image, np, npx from d2l import mxnet as d2l npx.set_np() #@save d2l.DATA_HUB['banana-detection'] = ( d2l.DATA_URL + 'banana-detection.zip', '5de26c8fce5ccdea9f91267273464dc968d20d72')
14.6.2。讀取數(shù)據(jù)集
我們將在 read_data_bananas下面的函數(shù)中讀取香蕉檢測(cè)數(shù)據(jù)集。數(shù)據(jù)集包括一個(gè) csv 文件,用于對(duì)象類標(biāo)簽和左上角和右下角的地面實(shí)況邊界框坐標(biāo)。
#@save def read_data_bananas(is_train=True): """Read the banana detection dataset images and labels.""" data_dir = d2l.download_extract('banana-detection') csv_fname = os.path.join(data_dir, 'bananas_train' if is_train else 'bananas_val', 'label.csv') csv_data = pd.read_csv(csv_fname) csv_data = csv_data.set_index('img_name') images, targets = [], [] for img_name, target in csv_data.iterrows(): images.append(torchvision.io.read_image( os.path.join(data_dir, 'bananas_train' if is_train else 'bananas_val', 'images', f'{img_name}'))) # Here `target` contains (class, upper-left x, upper-left y, # lower-right x, lower-right y), where all the images have the same # banana class (index 0) targets.append(list(target)) return images, torch.tensor(targets).unsqueeze(1) / 256
#@save def read_data_bananas(is_train=True): """Read the banana detection dataset images and labels.""" data_dir = d2l.download_extract('banana-detection') csv_fname = os.path.join(data_dir, 'bananas_train' if is_train else 'bananas_val', 'label.csv') csv_data = pd.read_csv(csv_fname) csv_data = csv_data.set_index('img_name') images, targets = [], [] for img_name, target in csv_data.iterrows(): images.append(image.imread( os.path.join(data_dir, 'bananas_train' if is_train else 'bananas_val', 'images', f'{img_name}'))) # Here `target` contains (class, upper-left x, upper-left y, # lower-right x, lower-right y), where all the images have the same # banana class (index 0) targets.append(list(target)) return images, np.expand_dims(np.array(targets), 1) / 256
通過(guò)使用read_data_bananas函數(shù)讀取圖像和標(biāo)簽,下面的BananasDataset類將允許我們創(chuàng)建一個(gè)自定義Dataset實(shí)例來(lái)加載香蕉檢測(cè)數(shù)據(jù)集。
#@save class BananasDataset(torch.utils.data.Dataset): """A customized dataset to load the banana detection dataset.""" def __init__(self, is_train): self.features, self.labels = read_data_bananas(is_train) print('read ' + str(len(self.features)) + (f' training examples' if is_train else f' validation examples')) def __getitem__(self, idx): return (self.features[idx].float(), self.labels[idx]) def __len__(self): return len(self.features)
#@save class BananasDataset(gluon.data.Dataset): """A customized dataset to load the banana detection dataset.""" def __init__(self, is_train): self.features, self.labels = read_data_bananas(is_train) print('read ' + str(len(self.features)) + (f' training examples' if is_train else f' validation examples')) def __getitem__(self, idx): return (self.features[idx].astype('float32').transpose(2, 0, 1), self.labels[idx]) def __len__(self): return len(self.features)
最后,我們定義load_data_bananas函數(shù)為訓(xùn)練集和測(cè)試集返回兩個(gè)數(shù)據(jù)迭代器實(shí)例。對(duì)于測(cè)試數(shù)據(jù)集,不需要隨機(jī)讀取。
#@save def load_data_bananas(batch_size): """Load the banana detection dataset.""" train_iter = torch.utils.data.DataLoader(BananasDataset(is_train=True), batch_size, shuffle=True) val_iter = torch.utils.data.DataLoader(BananasDataset(is_train=False), batch_size) return train_iter, val_iter
#@save def load_data_bananas(batch_size): """Load the banana detection dataset.""" train_iter = gluon.data.DataLoader(BananasDataset(is_train=True), batch_size, shuffle=True) val_iter = gluon.data.DataLoader(BananasDataset(is_train=False), batch_size) return train_iter, val_iter
讓我們讀取一個(gè) minibatch 并打印這個(gè) minibatch 中圖像和標(biāo)簽的形狀。圖像小批量的形狀(批量大小、通道數(shù)、高度、寬度)看起來(lái)很熟悉:它與我們之前的圖像分類任務(wù)相同。label minibatch的shape是(batch size,m, 5), 其中m是任何圖像在數(shù)據(jù)集中具有的最大可能數(shù)量的邊界框。
雖然 minibatch 的計(jì)算效率更高,但它要求所有圖像示例都包含相同數(shù)量的邊界框,以通過(guò)連接形成一個(gè) minibatch。通常,圖像可能具有不同數(shù)量的邊界框;因此,圖像少于m 邊界框?qū)⒈环欠ㄟ吔缈蛱畛洌钡?m到達(dá)了。然后每個(gè)邊界框的標(biāo)簽用一個(gè)長(zhǎng)度為5的數(shù)組表示,數(shù)組的第一個(gè)元素是邊界框中物體的類,其中-1表示填充的非法邊界框。數(shù)組的其余四個(gè)元素是 (x,y)-邊界框左上角和右下角的坐標(biāo)值(范圍在0到1之間)。對(duì)于香蕉數(shù)據(jù)集,由于每張圖像上只有一個(gè)邊界框,我們有m=1.
batch_size, edge_size = 32, 256 train_iter, _ = load_data_bananas(batch_size) batch = next(iter(train_iter)) batch[0].shape, batch[1].shape
read 1000 training examples read 100 validation examples
(torch.Size([32, 3, 256, 256]), torch.Size([32, 1, 5]))
batch_size, edge_size = 32, 256 train_iter, _ = load_data_bananas(batch_size) batch = next(iter(train_iter)) batch[0].shape, batch[1].shape
read 1000 training examples read 100 validation examples
((32, 3, 256, 256), (32, 1, 5))
14.6.3。示范
讓我們演示十張帶有標(biāo)記的真實(shí)邊界框的圖像。我們可以看到香蕉的旋轉(zhuǎn)、大小和位置在所有這些圖像中都不同。當(dāng)然,這只是一個(gè)簡(jiǎn)單的人工數(shù)據(jù)集。實(shí)際上,真實(shí)世界的數(shù)據(jù)集通常要復(fù)雜得多。
imgs = (batch[0][:10].permute(0, 2, 3, 1)) / 255 axes = d2l.show_images(imgs, 2, 5, scale=2) for ax, label in zip(axes, batch[1][:10]): d2l.show_bboxes(ax, [label[0][1:5] * edge_size], colors=['w'])
imgs = (batch[0][:10].transpose(0, 2, 3, 1)) / 255 axes = d2l.show_images(imgs, 2, 5, scale=2) for ax, label in zip(axes, batch[1][:10]): d2l.show_bboxes(ax, [label[0][1:5] * edge_size], colors=['w'])
14.6.4。概括
我們收集的香蕉檢測(cè)數(shù)據(jù)集可用于演示對(duì)象檢測(cè)模型。
目標(biāo)檢測(cè)的數(shù)據(jù)加載類似于圖像分類。然而,在目標(biāo)檢測(cè)中,標(biāo)簽還包含圖像分類中缺少的真實(shí)邊界框信息。
14.6.5。練習(xí)
演示香蕉檢測(cè)數(shù)據(jù)集中帶有真實(shí)邊界框的其他圖像。它們?cè)谶吔缈蚝蛯?duì)象方面有何不同?
假設(shè)我們要將數(shù)據(jù)增強(qiáng)(例如隨機(jī)裁剪)應(yīng)用于對(duì)象檢測(cè)。它與圖像分類中的有何不同?提示:如果裁剪后的圖像只包含物體的一小部分怎么辦?
-
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1205瀏覽量
24644 -
pytorch
+關(guān)注
關(guān)注
2文章
803瀏覽量
13150
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論