.. _sec_object-detection-dataset: Nesne Algılama Veri Kümesi ========================== Nesne algılama alanında MNIST ve Fashion-MNIST gibi küçük bir veri kümeleri bulunmamaktadır. Nesne algılama modellerini hızlı bir şekilde göstermek için küçük bir veri kümesi topladık ve etiketledik. İlk olarak ofisimizdeki bedava muzların fotoğraflarını çektik ve farklı dönüşlerde ve boyutlarda 1000 muz imgesi oluşturduk. Sonra her bir muz imgesini bir arka plan görüntüsü üzerinde rastgele bir konuma yerleştirdik. Sonunda, resimlerdeki bu muzlar için kuşatan kutuları etiketledik. Veri Kümesini İndirme --------------------- Tüm imgeler ve csv etiket dosyasıyla birlikte muz algılama veri kümesi doğrudan internetten indirilebilir. .. raw:: html
mxnetpytorch
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python %matplotlib inline import os import pandas as pd from d2l import mxnet as d2l from mxnet import gluon, image, np, npx npx.set_np() #@save d2l.DATA_HUB['banana-detection'] = ( d2l.DATA_URL + 'banana-detection.zip', '5de26c8fce5ccdea9f91267273464dc968d20d72') .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python %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') .. raw:: html
.. raw:: html
Veri Kümesini Okuma ------------------- Aşağıdaki ``read_data_bananas`` işlevinde muz algılama veri kümesini okuyacağız. Veri kümesi, bir csv dosyasında nesne sınıfı etiketlerini ve gerçek referans değeri kuşatan kutunun sol üst ve sağ alt köşelerdeki koordinatları içerir. .. raw:: html
mxnetpytorch
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python #@save def read_data_bananas(is_train=True): """Muz algılama veri kümesi imgelerini ve etiketlerini okuyun.""" 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}'))) # Burada `target` (hedef), tüm imgelerin aynı muz sınıfına # sahip olduğu (sınıf, sol üst x, sol üst y, sağ alt x, sağ alt y) # içerir (indeks 0) targets.append(list(target)) return images, np.expand_dims(np.array(targets), 1) / 256 .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python #@save def read_data_bananas(is_train=True): """Muz algılama veri kümesi imgelerini ve etiketlerini okuyun.""" 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}'))) # Burada `target` (hedef), tüm imgelerin aynı muz sınıfına # sahip olduğu (sınıf, sol üst x, sol üst y, sağ alt x, sağ alt y) # içerir (indeks 0) targets.append(list(target)) return images, torch.tensor(targets).unsqueeze(1) / 256 .. raw:: html
.. raw:: html
İmgeleri ve etiketleri okumak için ``read_data_bananas`` işlevini kullanarak, aşağıdaki ``BananasDataset`` sınıfı, muz algılama veri kümesini yüklemek için özelleştirilmiş bir ``Dataset`` örneği oluşturmamızı sağlayacaktır. .. raw:: html
mxnetpytorch
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python #@save class BananasDataset(gluon.data.Dataset): """Muz algılama veri kümesini yüklemek için özelleştirilmiş bir veri kümesi.""" 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) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python #@save class BananasDataset(torch.utils.data.Dataset): """Muz algılama veri kümesini yüklemek için özelleştirilmiş bir veri kümesi.""" 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) .. raw:: html
.. raw:: html
Son olarak, ``load_data_bananas`` fonksiyonunu hem eğitim hem de test kümeleri için iki veri yineleyici örneği döndürecek şekilde tanımlarız. Test veri kümesi için onu rastgele sırayla okumaya gerek yoktur. .. raw:: html
mxnetpytorch
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python #@save def load_data_bananas(batch_size): """Muz algılama veri kümesini yükleyin.""" 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 .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python #@save def load_data_bananas(batch_size): """Muz algılama veri kümesini yükleyin.""" 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 .. raw:: html
.. raw:: html
Bir minigrup okuyalım ve bu minigruptaki hem imgelerin hem de etiketlerin şekillerini yazdıralım. İmge minigrubunun şekli (grup boyutu, kanal sayısı, yükseklik, genişlik) tanıdık görünüyor: Önceki imge sınıflandırma görevlerimizle aynı. Minigrup etiketinin şekli (parti boyutu, :math:`m`, 5) şeklindedir; burada :math:`m`, veri kümesinde herhangi bir imgenin sahip olabileceği mümkün olan en büyük kuşatan kutu sayısıdır. Minigruplarda hesaplama daha verimli olmasına rağmen, tüm imge örneklerinin bitiştirme yoluyla bir minigrup oluşturması için aynı sayıda kuşatan kutu içermeleri gerektirir. Genel olarak, imgeler farklı sayıda kuşatan kutuya sahip olabilir; bu nedenle :math:`m`'den daha az kuşatan kutuya sahip imgeler, :math:`m`'e ulaşılana kadar geçersiz kuşatan kutularla doldurulacaktır. Daha sonra her kuşatan kutunun etiketi 5 uzunluğunda bir dizi ile temsil edilir. Dizideki ilk öğe, kuşatan kutudaki nesnenin sınıfıdır ve burada -1 dolgu için geçersiz bir kuşatan kutusunu gösterir. Dizinin kalan dört öğesi, kuşatan kutunun sol üst köşesinin ve sağ alt köşesinin (:math:`x`, :math:`y`) koordinat değerleridir (aralık 0 ile 1 arasındadır). Muz veri kümesi için, her imgede sadece bir kuşatan kutu olduğundan elimizde :math:`m=1` var. .. raw:: html
mxnetpytorch
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python batch_size, edge_size = 32, 256 train_iter, _ = load_data_bananas(batch_size) batch = next(iter(train_iter)) batch[0].shape, batch[1].shape .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output read 1000 training examples read 100 validation examples .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output ((32, 3, 256, 256), (32, 1, 5)) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python batch_size, edge_size = 32, 256 train_iter, _ = load_data_bananas(batch_size) batch = next(iter(train_iter)) batch[0].shape, batch[1].shape .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output read 1000 training examples read 100 validation examples .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output (torch.Size([32, 3, 256, 256]), torch.Size([32, 1, 5])) .. raw:: html
.. raw:: html
Kanıtlama --------- Gerçek referans değeri etiketli kuşatan kutularıyla on imge gösterelim. Muzun dönüşlerinin, boyutlarının ve konumlarının tüm bu imgelerde değiştiğini görebiliyoruz. Tabii ki, bu sadece basit bir yapay veri kümesidir. Uygulamada, gerçek dünya veri kümeleri genellikle çok daha karmaşıktır. .. raw:: html
mxnetpytorch
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python imgs = (batch[0][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][0:10]): d2l.show_bboxes(ax, [label[0][1:5] * edge_size], colors=['w']) .. figure:: output_object-detection-dataset_641ef0_48_0.png .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python imgs = (batch[0][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][0:10]): d2l.show_bboxes(ax, [label[0][1:5] * edge_size], colors=['w']) .. figure:: output_object-detection-dataset_641ef0_51_0.png .. raw:: html
.. raw:: html
Özet ---- - Topladığımız muz algılama veri kümesi, nesne algılama modellerini göstermek için kullanılabilir. - Nesne algılama için veri yükleme, imge sınıflandırmasındakine benzer. Bununla birlikte, nesne algılamasında etiketler ayrıca imge sınıflandırmasında eksik olan gerçek referans değeri kuşatan kutularla ilgili bilgileri de içerir. Alıştırmalar ------------ 1. Muz algılama veri kümelerinde gerçek referans değeri kuşatan kutularla diğer imgeleri gösterin. Kuşatan kutulara ve nesnelere göre nasıl farklılık gösterirler? 2. Nesne algılamaya rastgele kırpma gibi veri artırımı uygulamak istediğimizi varsayalım. Bu imge sınıflandırmasındakinden nasıl farklı olabilir? İpucu: Kırpılmış bir imge nesnenin yalnızca küçük bir bölümünü içeriyorsa ne olur? .. raw:: html
mxnetpytorch
.. raw:: html
`Tartışmalar `__ .. raw:: html
.. raw:: html
`Tartışmalar `__ .. raw:: html
.. raw:: html