YOLO (You Look Only Once) Algoritması

Derya Çakmak
7 min readOct 14, 2020

--

YOLO ilk olarak 2015’te Joseph Redmon tarafından yayınlanan “You Only Look Once: Unified, Real-Time Object Detection,” makale ile tanıtıldı.

YOLO algoritması, gerçek zamanlı nesne takibinde kullanılan pek çok nesne tespiti algoritmalarına göre daha başarılı sonuç vermektedir. YOLO algoritmasını diğer algoritmalardan ayıran en önemli özelliği daha hızlı olmasıdır.

YOLO Neden Daha Hızlı?

YOLO, R-CNN veya benzeri algoritmaların aksine verilen görsel üzerinde sadece bir kez işlem yapıyor. Daha iyi anlaşılması için R-CNN algoritmasına bakalım:

R-CNN ve benzeri algoritmalar ilk başta verilen görüntülerdeki nesnelerin olabileceği muhtemel yerleri bulur. Bulduğu yerlere bölge önerileri (region proposals) denir. Daha sonra bu bölgelerden hangisinde nesne bulunduğuna bakar ve nesneleri sınıflandırır. YOLO algoritması ise daha öncesinden bir yer tahmini yapmaz tüm görüntüyü bir kere evrişimsel sinir ağına verirsiniz ve size çıktı olarak nesnelerin bulunduğu yeri ve nesnenin sınıfını verir.

YOLO Algoritması Nasıl Çalışır?

YOLO algoritması ilk olarak tüm resmi SxS boyutlarında ızgara dediğimiz grid bölgelerine ayırır. Her bir ızgara sinir ağından geçirilir. Burada amaç ızgara içinde bulunan nesneyi tespit etmek ve kapalı bir kutu içerisine almaktır. Izgaralar sinir ağından geçirilirken nesnenin orta noktası ızgara içinde bulunuyor mu, diye bakılır. Eğer nesnenin orta noktası ızgara içinde ise, tespit ettiği nesnenin yüksekliğini, genişliğini , sınıfını ve güven skorunu hesaplar.

Güven Skoru = Pr(obj)∗IoU

Pr(obj): ızgara içinde nesnenin bulunma olasılığı

IoU: gerçekte nesnenin bulunduğu kutu ile tahmin edilen kutunun kesişimi

Görüntü üzerinde gezdirilen kapalı kutunun (bounding box) toplamda 5 bileşeni vardır: [x, y, w, h, güven skoru]. Burada (x,y) kapalı kutunun orta noktasının koordinatları, (w,h) genişliği ve yüksekliğini temsil eder.

Örneğin yukarıdaki görselde arabanın orta noktası 7. ızgara içinde yer alıyor. Bunun tespiti yapıldıktan sonra ise kapalı kutuya ait bileşenler hesaplanır.

Her bir ızgara içinde yalnızca tek bir nesneyi tespit edebilir. Mesela 7. ızgarada başka bir nesnenin de orta noktası tespit edilseydi çıktı olarak yine sadece bir tane nesneye ait kapalı kutu olacaktı.

Ağ Tasarımı

YOLO’nun mimarisi, GoogleLeNet’ten son derece etkilenir. Ağ, özellik çıkarma için 24 evrişim katmanından ve ardından sınırlayıcı kutu koordinatlarını ve ilgili nesne olasılıklarını tahmin etmek için 2 tam bağlı katmandan oluşur.

Hata Fonksiyonları

YOLO’da hata fonksiyonlarını üç temel ana başlıkta inceleyebiliriz:

1-) Sınıflandırma kaybı: Tahmin edilen nesnenin ne kadar yanlış olduğu

2-) Konum kaybı: Tahmin edilen kutunun ne kadar yanlış olduğu.

3-) Güven kaybı: Izgaranın içinde nesne olup olmadığının ne kadar yanlış olduğu.

1- Sınıflandırma Kaybı

Eğer geçerli ızgarada nesne varsa, her sınıf için:

2- Konum Kaybı

Karelerinin toplamı (sum of square root error), aynı zamanda büyük ve küçük kutulardaki hatayı eşitler, bu da ideal değildir çünkü küçük bir sapma küçük bir kutuda büyük bir kutuya göre daha belirgindir. Bunu çözmek için, doğrudan yükseklik ve genişlik yerine yükseklik ve genişlik koordinatlarının karekökünü hesaplıyoruz.

Eğer tahmin edilen kutu ile gerçekte olan kutu birbirine çok yakınsa bu da hataya katkının az olacağı anlamına gelir. Bu durumu çözmek için de λ kullanılır.

3- Güven Kaybı

Izgaranın içinde nesne olup olmadığının ne kadar yanlış olduğudur.

Tüm hata fonksiyonlarını bir araya toplarsak:

YOLO’daki bazı sınırlandırmalar

Her bir ızgarada tek bir nesneyi tahmin etmeye çalıştığımız için özellikle gruplar halinde bulunan nesnelerin tahmininde başarısız sonuç vermektedir.

YOLO, eğitim setindeki sınırlayıcı kutuların çok ötesine genelleme yapmadığından, yeni veya alışılmadık şekillerdeki nesneleri doğru şekilde algılayamaz.

YOLO, yüksek bir lokalizasyon hatası skoru elde edebiliyoruz.

YOLO’nun başlıca özellikleri

YOLO, sınırlayıcı kutu koordinatlarını doğrudan giriş görüntülerinden tahmin ederek, nesne algılamayı sınıflandırıcı tabanlı yöntemlerin aksine bir regresyon sorunu olarak ele alır.

YOLO gerçek zamanlı görüntüler üzerinde 45 FPS hızına sahip olabiliyor.

YOLOv2

YOLO’daki lokalizasyon hatalarını azaltmak ve performansını arttırmak için YOLOv2 önerildi.

67 FPS’de YOLOv2, PASCAL VOC 2007'de% 76,8 mAP alır. 40 FPS’de YOLOv2, ResNet ve SSD kullanan Faster R-CNN’den daha iyi olan% 78,6 mAP alır. Bu kadar iyi sonuçlarla YOLOv2, 2017 CVPR’de yayınlandı.

Daha iyi bir YOLO için ayarlamalar

Batch normalization: Tüm evrişimli katmanlara batch normalizasyon eklendi. mAP’de% 2 iyileştirme.

Yüksek çözünürlüklü girişlere göre sınıflandırma: Yolo, 224x224 çözünürlük girişlerini kullanarak ImageNet üzerinde sınıflandırıcıyı önceden eğitir, ardından algılama için çözünürlüğü 448x448'e yükseltir, yeni çözünürlük girişine aynı anda uyum sağlamak ve algılama görevini gerçekleştirmek için belirli bir zamana ihtiyaç duyar.

Ancak YOLOv2 bunu şu şekilde çözer:

  1. Öncelikle sınıflandırıcıyı ImageNet üzerinde 224x224 çözünürlükte eğitin.
  2. İkinci olarak, sınıflandırıcıyı 448x448 çözünürlükte 10 epoch için ayarlayın, bu, ağ filtrelerinin daha yüksek çözünürlüklü girişlere ayarlanmasını sağlar.
  3. Ardından, sinir ağında gerekli ayarlamaları yapın.

Sınıflandırıcının daha yüksek çözünürlüklü girişlerde ayarlanması, doğruluğu % 4 mAP oranında artırır.

Anchor boxes: Normalde her bir ızgarada yalnızca bir nesnenin tespitini yapabiliyorduk. SSD ve Faster R-CNN’de kullanılan anchor boxes metodu ile aynı ızgara içinde birden fazla nesne tespiti yapabiliriz.

Anchor Boxes Nedir?

Ağımızı eğitmeden önce veri kümesindeki nesnelerin tahmin etmek için önceden belirlenmiş bir yükseklik ve genişliğe sahip kutulardır.

Anchor Box denilen kutuların boyutu, veri kümenizde performansı artırmak için belirlemeniz gereken önemli parametrelerden biridir. Boyutu iyi ayarlanmadığında görüntüde bulunan çok küçük veya çok büyük nesnelerin tespitini yapamayabilir.

Daha önceden nesneyi bulup orta noktasını takip edip kutu çizmek yerine şimdi var olan kutuya uygun nesneyi bulmaya çalışıyoruz. Aynı ızgara içinde de birden fazla nesne de bulabiliyoruz.

Aşağıdaki resimde 5 tane anchor boz görüyoruz (Sadece sarı olanlar).

Anchor box genişliğine ve yüksekliğine manuel olarak karar vermek yerine YOLOv2 veri seti üzerinde ortalama bir yükseklik ve genişliğe sahip 5 tane anchor box belirler.

YOLO9000

YOLOv2, yalnızca 20 farklı nesneyi sınıflarken bazen bundan daha fazla nesnenin sınıflandırılması gerekir. YOLO9000 bunu yapar. 9000’den fazla nesnenin sınıflandırılmasını ve tespitini yapan gerçek zamanlı bir frameworktür.

YOLOv2’de sinir ağı ilk başta sınıflandırma yapmak için eğitiliyor, daha sonra nesne tespiti için eğitiliyordu. Bunun için de farklı veri setleri kullanılıyordu. Sınıflandırma için kullanılan veri setleri daha detaylıdır. Mesela köpeklerin cinsleri de veri setinde yer alabilir. Fakat nesne tespiti yaparken, sınıflandırma yaparken kullanılan sınıftan bir köpek cinsi olmasa bile köpeği tespit etmeli. YOLOv2’de bu tür sorunlar çıkabiliyordu. Bu tür sorunları ortadan kaldırmak sinir ağını eğitirken hem sınıflandırma hem de nesne tespiti için aynı veri setini kullanmak için YOLO9000 önerildi.

YOLO9000, ImageNet ve COCO veri setlerinin birleştirilmesiyle oluşan WordTree veri setini kullanıyor.

COCO veri setini (algılama için) ve tam ImageNet veri setinden (sınıflandırma için) en iyi 9000 sınıfı birleştirilir — birleşik veri seti 9418 sınıf içerir.

YOLOv2 de 5 anchor box kullanılırken YOLO9000’de 3 anchor box kullanılır.

YOLOv3

Bir Pascal Titan X’te görüntüleri 30 FPS’de işler ve COCO test-dev’de% 57.9'luk bir mAP’e sahiptir.

Sınıf Tahmini

Normalde YOLO algoritmasında sınıfların “mutual exclusive” olduğu varsayılır. Yani bir nesne yalnızca bir sınıfa ait olabilir. Bu yüzden sınıf tahmini yapılırken softmax kullanılır ve tüm skorlar olasılık tahminine dönüştürülür. YOLOv3’te ise çoklu sınıf tahmini yapılabilir. Örneğin bir nesne hem yaya hem de insan sınıfına ait olabilir. Bu yüzden YOLOv3 softmax fonksiyonu yerine “ logistic classifier” kullanır ve nesnenin hangi sınıfa ne kadar benzediğine bakar. Sum square error haat fonksiyonu yerine de her bir sınıf için “ binary cross-entropy loss “ fonksiyonu kullanır.

Sınırlayıcı kutu tahmini ve maliyet fonksiyonu hesaplaması

YOLOv3, lojistik regresyon kullanarak her sınırlayıcı kutu (bounding box) için bir objektiflik skoru tahmin eder. YOLOv3, maliyet fonksiyonunun hesaplanma şeklini değiştirir. Gerçekte örtüşmesi gereken (ground truth) nesne ile en çok örtüşen kutunun objektiflik skoru 1 olur ve önceden tanımlanmış bir eşikten (varsayılan 0,5) daha büyük çakışmaya sahip diğer kutular hiçbir maliyete neden olmaz.

Küçük nesnelerin tespiti

YOLO küçük nesnelerin tespitinin yapılmasında bazı sorunlar yaşıyordu. YOLOv3 ile bu sorunlar daha az oldu ve küçük nesne tespitinde daha başarılı sonuçlar elde edildi. Çünkü YOLOv3 short cut connections kullanır. Bu yöntemle nesneler eşleştirilmeden önce daha ayrıltılı özellikler öğrenilir. Fakat YOLOv3 orta veya daha büyüklü nesnelerin tespitinde başarısız olabilir.

YOLOv5 ve YOLOv4 ile ilgili yazıma da buradan erişebilirsiniz.

--

--