.. _sec_multiscale-object-detection:
Çoklu Ölçekli Nesne Algılama
============================
:numref:`sec_anchor` içinde, bir girdi imgesinin her pikselinde
ortalanmış birden çok çapa kutusu oluşturduk. Esasen bu çapa kutuları
imgenin farklı bölgelerinin örneklerini temsil eder. Ancak, *her* piksel
için oluşturulmuşlarsa hesaplayamayacak kadar çok çapa kutusu elde
edebiliriz. Bir :math:`561 \times 728`'lik girdi imgesi düşünün. Merkez
alarak her piksel için farklı şekillerde beş çapa kutusu oluşturulursa,
iki milyondan fazla çapa kutusunun (:math:`561 \times 728 \times 5`)
imge üzerinde etiketlenmesi ve tahmin edilmesi gerekir.
.. _subsec_multiscale-anchor-boxes:
Çoklu Ölçekli Çapa Kutuları
---------------------------
Bir imgedeki çapa kutularını azaltmanın zor olmadığını fark
edebilirsiniz. Örneğin, üzerlerinde ortalanmış çapa kutuları oluşturmak
için girdi imgesindeki piksellerin küçük bir bölümünü tekdüze bir
şekilde örnekleyebiliriz. Buna ek olarak, farklı ölçeklerde farklı
boyutlarda farklı çapa kutuları üretebiliriz. Sezgisel olarak, daha
küçük nesnelerin imgede daha büyük olanlardan daha fazla görünme
olasılığı daha yüksektir. Örnek olarak, :math:`1 \times 1`,
:math:`1 \times 2` ve :math:`2 \times 2` nesneler :math:`2 \times 2`'lik
imgede sırasıyla 4, 2 ve 1 olası şekilde görünebilir. Bu nedenle, daha
küçük nesneleri algılamak için daha küçük çapa kutuları kullanırken daha
fazla bölgeyi örnekleyebiliriz, daha büyük nesneler için daha az bölgeyi
örnekleyebiliriz.
Birden çok ölçekte çapa kutuları nasıl oluşturulacağını göstermek için
bir imgeyi okuyalım. Yüksekliği ve genişliği sırasıyla 561 ve 728 piksel
olsun.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
%matplotlib inline
from d2l import mxnet as d2l
from mxnet import image, np, npx
npx.set_np()
img = image.imread('../img/catdog.jpg')
h, w = img.shape[:2]
h, w
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(561, 728)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
%matplotlib inline
import torch
from d2l import torch as d2l
img = d2l.plt.imread('../img/catdog.jpg')
h, w = img.shape[:2]
h, w
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(561, 728)
.. raw:: html
.. raw:: html
:numref:`sec_conv_layer` içinde, evrişimli bir katmanın iki boyutlu
bir dizi çıktısını bir öznitelik haritası olarak adlandırdığımızı
hatırlayın. Öznitelik haritası şeklini tanımlayarak, herhangi bir
imgedeki düzgün örneklenmiş çapa kutularının merkezlerini
belirleyebiliriz.
``display_anchors`` işlevi aşağıda tanımlanmıştır. Çapa kutusu merkezi
olarak her birim (piksel) ile öznitelik haritasında (``fmap``) çapa
kutuları (``anchors``) oluştururuz. Çapa kutularındaki :math:`(x, y)`
eksen koordinat değerleri (``anchors``), öznitelik haritasının genişlik
ve yüksekliğine bölünmüş olduğundan (``fmap``), ki bu değerler 0 ve 1
arasındadır, öznitelik haritasındaki çapa kutularının göreli konumlarını
belirtir.
Çapa kutularının merkezleri (``anchors``) öznitelik haritasındaki tüm
birimlere (``fmap``) yayıldığından, bu merkezler göreceli uzamsal
konumları bakımından herhangi bir girdi imgesine tekdüze şekilde
dağıtılmalıdır. Daha somut olarak, öznitelik haritasının sırasıyla
``fmap_w`` ve ``fmap_h``, genişliği ve yüksekliği, göz önüne
alındığında, aşağıdaki işlev, herhangi bir girdi imgesindeki ``fmap_h``
satırlarındaki ve ``fmap_w`` sütunlarındaki pikselleri *tekdüze* bir
şekilde örnekleyecektir. Bu eşit örneklenen pikseller üzerinde ortalanan
``s`` ölçek çapa kutuları (``s`` listenin uzunluğunun 1 olduğu
varsayılarak) ve farklı en-boy oranları (``ratios``) oluşturulur.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def display_anchors(fmap_w, fmap_h, s):
d2l.set_figsize()
# İlk iki boyuttaki değerler çıktıyı etkilemez
fmap = np.zeros((1, 10, fmap_h, fmap_w))
anchors = npx.multibox_prior(fmap, sizes=s, ratios=[1, 2, 0.5])
bbox_scale = np.array((w, h, w, h))
d2l.show_bboxes(d2l.plt.imshow(img.asnumpy()).axes,
anchors[0] * bbox_scale)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def display_anchors(fmap_w, fmap_h, s):
d2l.set_figsize()
# İlk iki boyuttaki değerler çıktıyı etkilemez
fmap = torch.zeros((1, 10, fmap_h, fmap_w))
anchors = d2l.multibox_prior(fmap, sizes=s, ratios=[1, 2, 0.5])
bbox_scale = torch.tensor((w, h, w, h))
d2l.show_bboxes(d2l.plt.imshow(img).axes,
anchors[0] * bbox_scale)
.. raw:: html
.. raw:: html
İlk olarak, küçük nesnelerin algılanmasını düşünün. Görüntülendiğinde
ayırt edilmeyi kolaylaştırmak için, buradaki farklı merkezlere sahip
çapa kutuları çakışmaz: Çapa kutusu ölçeği 0.15 olarak ayarlanır ve
öznitelik haritasının yüksekliği ve genişliği 4'e ayarlanır. Çapa
kutularının merkezlerinin imge üzerindeki 4 satır ve 4 sütuna eşit
olarak dağıtıldığını görebiliriz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
display_anchors(fmap_w=4, fmap_h=4, s=[0.15])
.. figure:: output_multiscale-object-detection_ad7147_21_0.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
display_anchors(fmap_w=4, fmap_h=4, s=[0.15])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
/home/d2l-worker/miniconda3/envs/d2l-tr-release-0/lib/python3.9/site-packages/torch/functional.py:478: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/src/ATen/native/TensorShape.cpp:2895.)
return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]
.. figure:: output_multiscale-object-detection_ad7147_24_1.svg
.. raw:: html
.. raw:: html
Öznitelik haritasının yüksekliğini ve genişliğini yarıya indirmeye ve
daha büyük nesneleri algılamak için daha büyük çapa kutuları kullanmaya
geçiyoruz. Ölçek 0.4 olarak ayarlandığında, bazı çapa kutuları
birbirleriyle çakışır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
display_anchors(fmap_w=2, fmap_h=2, s=[0.4])
.. figure:: output_multiscale-object-detection_ad7147_30_0.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
display_anchors(fmap_w=2, fmap_h=2, s=[0.4])
.. figure:: output_multiscale-object-detection_ad7147_33_0.svg
.. raw:: html
.. raw:: html
Son olarak, öznitelik haritasının yüksekliğini ve genişliğini yarıya
indirir ve çapa kutusu ölçeğini 0.8 seviyesine çıkarırız. Şimdi çapa
kutusunun merkezi imgenin merkezidir.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
display_anchors(fmap_w=1, fmap_h=1, s=[0.8])
.. figure:: output_multiscale-object-detection_ad7147_39_0.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
display_anchors(fmap_w=1, fmap_h=1, s=[0.8])
.. figure:: output_multiscale-object-detection_ad7147_42_0.svg
.. raw:: html
.. raw:: html
Çoklu Ölçekli Algılama
----------------------
Çoklu ölçekli çapa kutuları oluşturduğumuzdan, bunları farklı ölçeklerde
çeşitli boyutlardaki nesneleri algılamak için kullanacağız. Aşağıda,
:numref:`sec_ssd` içinde uygulayacağımız CNN tabanlı çoklu ölçekli
nesne algılama yöntemini tanıtıyoruz.
Bazı ölçekte, :math:`h \times w` şeklinde :math:`c` tane öznitelik
haritası olduğunu varsayalım. :numref:`subsec_multiscale-anchor-boxes`
içindeki yöntemi kullanarak, her kümenin aynı merkeze sahip :math:`a`
çapa kutusuna sahip olduğu :math:`hw` çapa kutusu kümeleri oluştururuz.
Örneğin, :numref:`subsec_multiscale-anchor-boxes` içindeki deneylerde
ilk ölçekte, on (kanal sayısı) :math:`4 \times 4` öznitelik haritası
verildiğinde, her kümenin aynı merkeze sahip 3 çapa kutusu içerdiği 16
adet çapa kutusu kümesi oluşturduk. Daha sonra, her çapa kutusu gerçek
referans değerinin kuşatan kutusunun ofseti ve sınıfı ile etiketlenir.
Geçerli ölçekte, nesne algılama modelinin, farklı kümelerin farklı
merkezlere sahip olduğu girdi imgesindeki :math:`hw` çapa kutuları
kümelerinin sınıflarını ve ofsetlerini tahmin etmesi gerekir.
Buradaki :math:`c` öznitelik haritalarının girdi imgesine dayalı CNN
ileri yayma tarafından elde edilen ara çıktılar olduğunu varsayalım. Her
öznitelik haritasında :math:`hw` farklı uzamsal konum bulunduğundan,
aynı uzamsal konumun :math:`c` birime sahip olduğu düşünülebilir.
:numref:`sec_conv_layer` içindeki alıcı alan tanımına göre, öznitelik
haritalarının aynı uzamsal konumundaki bu :math:`c` birimleri, girdi
imgesinde aynı alıcı alana sahiptir: Aynı alıcı alanındaki girdi imgesi
bilgisini temsil ederler. Bu nedenle, aynı uzamsal konumdaki öznitelik
haritalarının :math:`c` birimi, bu uzamsal konum kullanılarak
oluşturulan :math:`a` tane çapa kutusunun sınıflarına ve uzaklıklarına
dönüştürebiliriz. Özünde, girdi imgesindeki alıcı alana yakın olan çapa
kutularının sınıflarını ve ofsetlerini tahmin etmek için belirli bir
alıcı alandaki girdi imgesinin bilgisini kullanırız.
Farklı katmanlardaki öznitelik haritaları, girdi imgesinde farklı
boyutlarda alıcı alanlara sahip olduğunda, farklı boyutlardaki nesneleri
algılamak için kullanılabilirler. Örneğin, çıktı katmanına daha yakın
olan öznitelik haritalarının birimlerinin daha geniş alıcı alanlara
sahip olduğu bir sinir ağı tasarlayabiliriz, böylece girdi imgesinde
daha büyük nesneleri algılayabilirler.
Özetle, çoklu ölçekli nesne algılama için derin sinir ağları
aracılığıyla imgelerin katmansal temsillerini birden çok düzeyde
kullanabiliriz. Bunun :numref:`sec_ssd` içinde somut bir örnekle nasıl
çalıştığını göstereceğiz.
Özet
----
- Çoklu ölçekte, farklı boyutlardaki nesneleri algılamak için farklı
boyutlarda çapa kutuları üretebiliriz.
- Öznitelik haritalarının şeklini tanımlayarak, herhangi bir imgedeki
tekdüze örneklenmiş çapa kutularının merkezlerini belirleyebiliriz.
- Girdi imgesinde bir alıcı alana yakın olan çapa kutularının
sınıflarını ve uzaklıklarını tahmin etmek için o belirli alıcı
alandaki girdi imgesinin bilgisini kullanırız.
- Derin öğrenme sayesinde, çoklu ölçekli nesne algılama için imgelerin
katmansal temsillerini birden çok düzeyde kullanabiliriz.
Alıştırmalar
------------
1. :numref:`sec_alexnet` içindeki tartışmalarımıza göre, derin sinir
ağları imgeler için soyutlama düzeylerini artırarak hiyerarşik
öznitelikleri öğrenir. Çoklu ölçekli nesne algılamada, farklı
ölçeklerdeki öznitelik haritaları farklı soyutlama düzeylerine
karşılık geliyor mu? Neden ya da neden değil?
2. :numref:`subsec_multiscale-anchor-boxes` içindeki deneylerde ilk
ölçekte (``fmap_w=4, fmap_h=4``), çakışabilecek tekdüze dağıtılmış
çapa kutuları oluşturun.
3. :math:`1 \times c \times h \times w` şeklinde bir öznitelik haritası
değişkeni verilsin, burada :math:`c`, :math:`h` ve :math:`w`,
öznitelik haritalarının sırasıyla kanal sayısı, yüksekliği ve
genişliğidir. Bu değişkeni çapa kutularının sınıflarına ve
ofsetlerine nasıl dönüştürebilirsiniz? Çıktının şekli nedir?
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html