Intersection over Union(IoU) Açıklaması ve PyTorch ile İmplementasyonu — YOLO Seri 2

Nuriye AKIN
5 min readFeb 11, 2021

--

Bu yazımızda bounding boxlarımızı nasıl değerlendireceğimizden bahsedeceğiz.

Bir nesne için hedef bounding boxımız ve tahmin bounding boxımız var.

Bir nesne için bu tahmin bounding boxımız ne kadar iyi onu değerlendireceğiz. Bunun için intersection over union (IoU) kavramını öğreneceğiz ve bunu pytorchta implement edeceğiz.

Bir bounding boxın ne kadar iyi olduğunu nasıl ölçeriz?

Bir nesne için kırmızı ile gösterilen bir tahmin bounding boxımız var bir de yeşil ile gösterilen hedef bounding boxımız var.

Bu tahmin bounding boxımızın ne kadar iyi olduğunu ölçmek için bazı hesaplamalar yapmamız gerekiyor.

Öncelikle bu iki bounding boxımızın kesişimini (intersection) hesaplıyoruz.(Resimde sarı ile gösterilen kısım)

Daha sonra bu iki bounding boxın birleşimini (union) hesaplıyoruz. (Pembe ile gösterilen )

Bunları kullanarak intersection over union (IoU) değerimizi hesaplayacağız.

IoU= intersection(kesişim) alanı / union(birleşim) alanı

Yani yukarıdaki resimlerde gösterdiğimiz sarı alan / pembe alan.

IoU 0 ile 1 arasında bir değer almaktadır ve bounding box tahmininin ne kadar iyi olduğunu gösterir.

Örneğin IoU eğer 1 ise çok iyi, 0 ise kesişim alanı bile yok demektir. Ancak neredeyse hiçbir zaman tam olarak 1 değerine ulaşılamaz.

IoU > 0.5 “iyi”

IoU > 0.7 “oldukça iyi”

IoU > 0.9 “neredeyse mükemmel” şeklinde değerlendirilebilir.

Peki bu kesişimi nasıl elde ettik?

Elimizde sadece sayılar var.

Koordinatları verilen mavi ve kırmızı bounding boxımızı çizdiğimizi ve yukarıdaki gibi bir sonuç elde ettiğimizi düşünelim. Görsel olarak kesişimlerini görebiliyoruz ancak hesaplamaya gelince tam olarak açık değil.

Burada hatırlamamız gereken bir nokta var:

Resim için orijin noktasının (0,0) sol üst köşe olarak alındığını biliyoruz. Bundan dolayı resimde sağa doğru gittikçe x değerimiz artacaktır. Aşağı doğru gittikçe de y değerimiz artacaktır.

Peki sadece yukarıdaki rakamlardan kesişimi nasıl elde ediyoruz?

Resimde kesişim alanının köşe noktalarına baktığımızda sol üst köşe noktasının kırmızı bounding boxın sol üst köşe noktasına karşılık geldiğini ve sağ alt köşe noktasının da mavi bounding boxın sağ alt köşe noktasına karşılık geldiğini görüyoruz.

Bunu daha genel bir formülle bulabiliriz.

Kesişim bölgemizin sol üst köşe noktası için:

x1 = max (box1[0],box2[0]) şeklinde bulunur. Yani her iki kutuda 0. İndekse karşılık gelen değerlerden maksimum olanı alınır.

Resimde baktığımızda box2deki x1 değerinin daha büyük olacağını görüyoruz.

y1 = max(box1[1],box2[1]) şeklinde bulunur. Yani her iki kutuda 1. indekse karşılık gelenlerden maksimum olanı alınır.

Resimde baktığımızda box2deki y1 değerinin daha büyük olacağını görüyoruz.

Yani formüller sonucu da gördüğümüz üzere kesişim alanının sol üst köşe noktası kırmızı bounding boxın sol üst köşe noktasıyla aynı noktadır.

Kesişim bölgemizin sağ alt köşe noktası için:

Bu kez formülümüzde minimum değerleri alacağız.

x2 = min(box1[2], box2[2]) şeklinde bulunur.

Yani her iki kutuda 2. indekse karşılık gelenlerden minimum olanı alınır.

Resimde baktığımızda box1deki x2 değerinin daha küçük olacağını görüyoruz.

y2 = min(box1[3], box2[3]) şeklinde bulunur.

Yani her iki kutuda 3. indekse karşılık gelenlerden minimum olanı alınır.

Resimde baktığımızda box1deki y2 değerinin daha küçük olacağını görüyoruz.

Yani tahmin ettiğimiz gibi, formüller sonucu da gördüğümüz üzere, kesişim alanının sağ alt köşe noktası mavi bounding boxın sağ alt köşe noktasıyla aynı noktadır.

Bir örnekle daha toparlamak gerekirse:

Yine iki tane bounding boxımız var. Amacımız sarı bölgenin köşe noktalarını bulmak.

Sol üst köşeyi bulmak için :

Denklemden yola çıkarak kırmızı bounding boxta yer alan x1 değerimiz büyük olduğu için bu değeri aldığımızı görüyoruz.

Sol üst köşenin ikinci değerini bulmak için:

Denklemden yola çıkarak mavi bounding boxta yer alan y1 değerimiz büyük olduğu için bu değeri aldığımızı görüyoruz.

Sarı bölgenin sol alt köşe noktasını bulmak için yine formülden yola çıkarak bu kez minimum değerleri alıyoruz.

Sağ alt köşenin birinci değerini bulmak için:

Denklemden yola çıkarak mavi bounding boxta yer alan x2 değerimiz küçük olduğu için bu değeri aldığımızı görüyoruz.

Sağ alt köşenin ikinci değerini bulmak için:

Denklemden yola çıkarak kırmızı bounding boxta yer alan y2 değerimiz küçük olduğu için bu değeri aldığımızı görüyoruz.

Toparlamak gerekirse resimde görüldüğü şekilde formülümüzü kullanıyoruz ve intersection yani kesişim noktasını bulmamız için gereken noktaları elde etmiş oluyoruz.

Bunun dışında bir de union (birleşim) alanının köşe noktalarına ihtiyacımız var buna kodda değineceğiz.

İmplementasyonumuzun doğru olup olmadığını kontrol etmek üzere unit testini yapacağız. Bunun için aşağıda yer alan kodu kullanacağız.

Bu kodu ayrıntılı şekilde anlatmayacağım ancak siz inceleyebilirsiniz.

Şimdi implementasyonumuzu yapmak üzere iou.py dosyamızı oluşturuyoruz.

Kodda midpointten (orta noktadan) sol üst ve sağ alt noktaya çevirme:

x için:

box_preds → İlki midpoint bir genişliği 2ye bölüp o midpointten çıkarırsak buluyoruz.

y için:

yüksekliği 2ye bölüp o midpointten çıkarırsak buluyoruz.

Yani yükseklik ve genişlğin yarısını alıp orta noktaya ekleyerek ve çıkararak sol üst ve sağ alt noktalara dönüşüm yapmış oluyoruz.

Kod üzerinde yapılan açıklamalarla kodun daha iyi anlaşılması amaçlanmaktadır.

Sonraki yazıda görüşmek üzere…

--

--

Nuriye AKIN
Nuriye AKIN

Written by Nuriye AKIN

A multidisciplinary person who researches applies continues to learn… Computer Vision — Deep Learning — Data Science — Data Engineering

No responses yet