.. _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
.. 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
.. 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
.. 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
.. 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
.. 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
.. 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
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html