R-CNN, Faster R-CNN: Bölgesel Nesne Algılama (Object Detection) Ağlarının gelişimi
Önceki yazılarımızda Nesne Sınıflandırma ağlarını incelemiştik.
Bu yazıyla birlikte nesne sınıflandırma ağlarını içinde kullanan, nesnelerin koordinatlarını veren nesne algılama ağlarına geçiş yapıyoruz.
Nesne Sınıflandırma ağları fotoğrafın tamamına bakar ve tüm fotoğraf için tek bir nesne tahmininde bulunurlar. Ancak nesne algılama ağları fotoğrafın içinde birden fazla nesneyi ve sınırlarını bulurlar.
Kayan Pencere:
Bu işlemi yapmak için ilk akla gelen yöntem fotoğrafı parçalara ayırıp her parçayı Nesne Sınıflandırma ağına beslemek olabilir.
Ancak böyle yaptığımız zaman büyük ve küçük nesneler için ayrı ayrı pencereler oluşturmamız gerekiyor. Peki ya kareye birden fazla nesne giriyorsa? O zaman sınıflandırma ağımız şaşıracaktır. Bazı nesnelerin şekilleri farklı, bunun önüne geçmek için dikdörtgen şeklinde yatay ve dikey sınırlar belirlememiz gerek. Peki kaç farklı boyutta, kaç tane ayrı kırpılmış alanı Nesne Sınıflandırma ağına vereceğiz? Bir fotoğraf için 3000 veya 5000 kere nesne sınıflandırma ağını çalıştırmamız bize işlem gücüne mal olacaktır.
Seçilimli Arama (Selective Search):
Bu şekilde kaba kuvvetle arama yapmak yerine biraz daha akılcı bir yöntemle aday bölgeler (ROI) oluşturmaya çalışacağız.
Seçilimli arama bize aynı nesne ihtimali olan pikselleri grup olarak veriyor. Bu gruplama ise 5 özellik üzerine kurulu:
- Renk benzerliği
- Doku benzerliği
- Boyut benzerliği
- Şekil benzerliği
- Üstteki kavramların toplam benzerliği
İlk olarak her bir pikseli bir grup olarak alacağız, daha sonra her grubun doku yapısını hesaplayacağız, bu doku yapısının benzerliğini renk,ışık ve histogram benzerliklerine bakarak karar veriyoruz. Bir birine en yakın pikselleri tekrar gruplayacağız. Küçük grupları birbiriyle birleştirerek her adımda daha büyük gruplar elde ediyoruz. Bu işlem sonucunda elimizde matematiksel olarak birbirine yakın yerlerin konumları var. Artık daha az pencereyi sınıflandırma ağına besleyerek işlem yükünden kurtulmuş olduk.
R-CNN (2013):
R-CNN üstteki bahsettiğimiz şekilde yaklaşık 2000 adet aday bölge (ROI) çıkartmaktadır. Her aday bölgenin boyutu nesne sınıflandırma ağının kabul ettiği boyuta gelecek şekilde yeniden boyutlandırılır ve ayrı ayrı nesne sınıflandırma ağına verilir.
Daha sonra nesne sınıflandırma ağının sonuna ayrıca bir kapsayan kutu koordinatlarını veren paralel bir regresyon ağı da eğitilir. Böylece aday bölgelerin koordinatlarını ince ayar ile düzenlenebilir.
Ancak her eğitimde bir resmin dahi çok fazla kez nesne sınıflandırma ağına verilmesi yine de oldukça yavaş bir işlemdir.
adaylar = aday_bölge_çıkarıcı(resim)
for aday in adaylar
bölge = kırp(resim, aday)
sonuçlar = nesne_sınıflandırıcı(bölge)
Fast R-CNN (2015):
R-CNN’ de nesne tespiti yapmak için 2000 bölgeyi tek tek nesne sınıflandırma ağına sokuyorduk. Bu oldukça yavaş bir işlem.
Fast R-CNN’de ise her bir imgeyi ayrı ayrı nesne sınıflandırmaya sokmak yerine, tüm resmi bir öznitelik (feature) çıkaran CNN ağına sokuyoruz. Bu son katmanları silinmiş bir nesne sınıflandırma ağı olabilir. Ayrıca yine Selective Search gibi dış bir aday bölge çıkarma ağı ile aday sınırlarımızı resimden elde ediyoruz. Ancak her aday bölgeyi sıfırdan ağa sokup özniteliklerini çıkarmak yerine zaten elimizde elimizde olan öznitelik imgesi üzerinde aday bölgeleri kırpıyoruz. Böylece çok büyük bir işlem yükünden kurtulmuş oluyoruz.
Kırptığımız öznitelikleri sabit bir boyuta gelecek şekilde yeniden boyutlandırıyoruz ve tam bağlı katmanlara aktarıyoruz. Son katmanlar R-CNN ile aynı. Ancak bu şekilde çok büyük bir işlem yükü tasarrufu yapmış olduk ve eğitim süremiz önemli ölçüde azaldı.
öznitelikler = nesne_sınıflandırıcı(resim)
adaylar = aday_bölge_çıkarıcı(resim)
for aday in adaylar
bölge = aday_bölge_boyutlandır(öznitelikler, aday)
sonuçlar = son_katmanlar(bölge)
Pseudo-code’da görüldüğü gibi sınıflandırıcı ağı artık sadece 1 kere çalıştırıyoruz
Faster R-CNN (2015):
Fast R-CNN işlemlerimizi hızlandırmış olmasına rağmen selective search gibi dış bir aday bölge çıkarıcı algoritmaya ihtiyaç duyuyor. Bu algoritmalar da CPU üzerinde çalışıyor ancak biz eğitimimizi GPU üzerinde yapıyoruz. Ayrıca selective search gibi algoritmalar eğitilebilir değil.
Faster R-CNN verimliliği bir adım daha öteye taşımak adına aday bölge çıkarıcıyı, girişini direk öznitelik haritasından alan bir CNN ile değiştiriyor.
Aday bölge çıkarma ağı — Region proposal network (RPN):
Aday bölge çıkarıcı için daha önce öğrendiğimiz VGG ve ResNet ağlarını kullanabiliriz ancak bu derin ağlar sistemi yavaşlatacaktır, ayrıca 2 sınıflı aday bölge için çok kapsamlı bir ağa ihtiyaç duymamaktayız. Faster R-CNN’nin yapısında ZF ağı kullanılmıştır. Girişinde ağdan aldığı öznitelik haritasını 3x3 konvulüsyon filtresinden geçirir. Toplam 5 konvulüsyon ağından oluşan ZF sonda 256 uzunluğunda öznitelik vektörü verir. Sınıfın ne olduğuna bakmadan nesne olan yerleri tespit etmeye çalışır.
Sonda 2 Tam Bağlı (Fully Connected) katmanı kapsayan kutunun sınırlarını ve bu kutunun içinde nesne olduğundan veya olmadığından ne kadar emin olduğunu vermektedir. Arkaplan sınıfı ve nesne sınıfı sonucu veren 2 sınıflı bir Nesne Sınıflandırıcı ağı olarak düşünebiliriz.
RPN her bir nokta için k kadar tahmin yapar. Alttaki diyagramda öznitelik haritamız 8x8 boyutunda ve filtermiz 3x3 boyutunda olduğundaki durum gösterilmiştir. k=3 aldığımızda bize 8x8x3 adet aday bölge verir.
Burada 3x3 filtreyi öznitelik haritası üzerinde kaydırıyoruz ve filtre merkezindeki her nokta için 3 adet aday bölge veriyor. Bu bölgeleri daha sonra ince ayar yapacağız o yüzden ilk tahmin olarak olabildiğince çeşitli vermesi daha iyi. Diyagramda sağ tarafta gördüğünüz üzere farklı boyutlarda ve şekillerde aday bölgelerimiz var. Bu bölgelerin boyutları ve şekilleri rastgele değildir ve daha önceden belirlenmiştir. Faster R-CNN tahminlerini bu merkezi çapa (anchor) lara göre 𝛿x, 𝛿y şeklinde yapmaktadır.
Faster R-CNN her nokta için 3 farklı şekil ve 3 farklı boyut olmak üzere 3x3=9 çapa vermektedir. Bu nedenle her bir koordinat için 2x9 nesne tahmini ve 4x9 kapsayan kutu koordinatı vermektedir.
öznitelikler = CNN_Konvulüsyon(resim)
adaylar = aday_bölge_çıkarıcı(öznitelikler)
for aday in adaylar
bölge = aday_bölge_boyutlandır(öznitelikler, aday)
sonuçlar = son_katmanlar(bölge)
Bu sefer aday bölgeleri de öznitelik kullanarak çıkarıyoruz.
Özet:
Bu yazımızda Nesne Algılama ağlarına giriş yaptık. Bölgesel aday çıkaran algoritmaların gelişimi ve hızlanmasını gördük.
Bu üç ağ için hızlara bakarsak eğer:
- R-CNN her bir aday bölgenin özniteliklerini çıkardığı için çok yavaş kalıyordu.
- Fast R-CNN bu durumu, aday bölgelerin sınırlarını bulup resimden bir kere çıkarılan öznitelik vektöründe kırparak çözdü ve hızlandırdı. Ancak aday bölge bulma algoritması CPU üzerinde çalıştığından ve baştan başa eğitilemediğinden yaklaşık 2 saniye sürüyordu.
- Faster R-CNN ise aday bölge bulmanın girişini de öznitelik vektörü üzerinden alarak ve eğitilebilir bir ağa vererek çözdü ve gerçek zamanlı nesne algılamayı başardı.
Bir sonraki yazımızda her bir aday bölge üzerinden geçen for döngüsünü tamamen kaldıran Tek Geçişli Algılayıcı ( Single Shot Detectors ) lara bakacağız.
Kaynaklar:
- https://www.pyimagesearch.com/2020/06/29/opencv-selective-search-for-object-detection
- http://people.cs.uchicago.edu/~pff/papers/seg-ijcv.pdf
- Selective Search: http://www.huppelen.nl/publications/selectiveSearchDraft.pdf
- R-CNN: https://arxiv.org/pdf/1311.2524.pdf
- Fast R-CNN: https://arxiv.org/pdf/1504.08083.pdf
- Faster R-CNN: https://arxiv.org/pdf/1506.01497.pdf
- https://medium.com/@jonathan_hui/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9
- Fotoğraf: Ian Badenhorst@capetown_guy