Intersection Over Union

Alfi Salim
BISA.AI
Published in
5 min readMar 25, 2020
example of intersection over union
Intersection Over Union

Pada masalah deteksi objek, output yang dihasilkan berupa bounding box (kotak pembatas) hasil prediksi sistem terhadap objek yang telah ditentukan. Bounding box ini merepresentasikan posisi objek dalam sebuah gambar. Untuk mengevaluasi model deteksi objek yang telah kita latih terdapat beberapa cara, salah satu caranya adalah dengan menggunakan metode Intersection Over Union (IOU). IOU memanfaatkan bounding box yang terdapat pada gambar.

Intersection Over Union (IOU) adalah nilai berdasarkan statistik kesamaan dan keragaman set sampel yang tujuannya untuk mengevaluasi area tumpang tindih (area yang beririsan) antara dua bounding box, yaitu bounding box hasil prediksi dan bounding box ground truth (kebenaran). Jadi, syarat untuk menerapkan IOU adalah mempunyai kedua bounding box tersebut. Berawal dari menerapkan IOU, kita dapat mengetahui nilai-nilai evaluasi yang lainnya, seperti precision, recall dan lain sebagainya. Persamaan intersection over union sebagai berikut:

Formula IOU
Formula IOU

Persamaan Intersection Over Union dapat diilustrasikan dalam gambar berikut:

Ilustrasi Formula IOU
Ilustrasi Formula IOU

Berdasarkan ilustrasi di atas, dapat kita lihat bahwa persamaan untuk mendapatkan nilai IOU hanyalah sebuah perbandingan dari area irisan dibagi dengan area gabungan. Dengan membagi kedua area tersebut, maka kita akan mendapatkan skor Intersection Over Union (IOU). Setelah mendapatkan skor IOU, aturan yang ada untuk menilai apakah skor IOU yang kita dapat baik atau buruk adalah semakin beririsan atau semakin dekat jarak antara bounding box prediksi dengan bounding box ground truth. Untuk lebih jelasnya, saya akan mengilustrasikan skor IOU yang kita kategorikan sebagai skor yang baik, lumayan dan buruk.

Ilustrasi Skor IOU
Ilustrasi Skor IOU

Dari ilustrasi diatas dapat kita simpulkan bahwa skor akan semakin tinggi jika jarak antara bounding box prediksi dengan bounding box ground truth semakin dekat (area yang berisisan antara kedua bounding box semakin besar).

Untuk teman-teman yang masih bertanya-tanya bagaimana kita mendapatkan bounding box ground truth akan saya jelaskan sedikit. Jadi, bounding box ground truth didapatkan dengan cara mengannotasi atau memberi label pada dataset secara manual. Telah banyak tools-tools yang mempermudah kita dalam mengannotasi sebuah data, khususnya data gambar. Pada artikel ini, kita tidak akan membahas mengenai data gambar dan cara mengannotasinya, mungkin materi tersebut akan dibahas secara lebih rinci pada artikel yang berbeda. Jadi, terus ikuti Medium kami.

Implementasi IOU pada Python

Setelah mengetahui beberapa hal tentang IOU, langsung saja kita implementasikan menggunakan bahasa pemrograman Python. Pada kasus ini, kita akan mencari nilai IOU pada gambar-gambar berikut:

Data
Data Image IOU

Sebelumnya, kita asumsikan bahwa kita telah memiliki model yang telah bisa memprediksi objek burung dalam gambar dengan cara mengeluarkan bounding box. Gambar-gambar di atas saya simpan di sebuah folder. Masing-masing gambar mempunyai satu file anotasi yang disimpan dalam folder yang sama dengan gambar.

CODE

import os
import cv2
import matplotlib.pyplot as plt
path = '/content/drive/My Drive/konten/Dataset'
images = []
for i, values in enumerate(os.listdir(path)):
if values.endswith('.jpg'):
print(i, values)
image = cv2.imread(os.path.join(path, values))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
images.append(image)

Langkah awalnya yaitu mengimport semua library yang dibutuhkan. selanjutnya read semua dataset :

  • Tentukan direktori path tempat data berada
  • Simpan semua data yang telah berhasil terbaca didalam list Images. Default dari OpenCV adalah BGR, jadi sebelum saya tambahkan ke list, saya konversi terlebih dahulu gambarnya menjadi RGB.
def fungsi_iou(Bbox_GroundT, Bbox_prediksi):
x = max(Bbox_GroundT['x'], Bbox_prediksi['x'])
y = max(Bbox_GroundT['y'], Bbox_prediksi['y'])
w = min(Bbox_GroundT['w'], Bbox_prediksi['w'])
h = min(Bbox_GroundT['h'], Bbox_prediksi['h'])
if (x > w) or (y > h):
return 0.0
area_irisan = (w-x)*(h-y) area_bboxGT = (Bbox_GroundT['w']-Bbox_GroundT['x'])*(Bbox_GroundT['h']-Bbox_GroundT['y'])

area_bboxP = (Bbox_prediksi['w']-Bbox_prediksi['x'])*(Bbox_prediksi['h']-Bbox_prediksi['y'])
iou = area_irisan/float(area_bboxGT+area_bboxP-area_irisan)

return iou

Selanjutnya, buat fungsi untuk mengitung skor IOU, disini saya beri nama fungsi_iou dengan 2 parameter yaitu bounding box ground truth (BBox_GroundT) dan bounding box prediksi (Bbox_prediksi)

  • Tentukan koordinat yang menjadi irisan dari kedua bounding box.
  • Seleksi kondisi, jika koordinat tidak memungkinkan untuk mendapatkan area yang beririsan, maka akan mengembalikan nilai 0.
  • Hitung nilai area yang beririsan, hitung nilai area bounding box ground truth dan prediksi.
  • Setelah mendapatkan nilai-nilai yang diperlukan dalam formula IOU, maka hitung nilai IOU. Hasil perhitungan akan dikembalikan oleh fungsi tersebut.
groundTruth = (23,21,208,150), (101,181,710,513), (23,42,192,160), (127,32,207,176)prediksi = (43,41,228,170), (91,171,700,503), (33,72,222,190), (132,37,212,181)

Koordinat bounding box ground truth dari semua gambar disimpan sebagai list pada variabel groundTruth. Output prediksi koordinat dari model kita, disimpan juga sebagai list pada variabel prediksi.

result = []
image = []
for e, values in enumerate(images):
baseImage = values.copy()
gtImage = values.copy()
pImage = values.copy()
iouImage = values.copy()
zam2 = baseImage, gtImage, pImage, iouImage
image.extend(zam2)
x = groundTruth[e][0]
y = groundTruth[e][1]
w = groundTruth[e][2]
h = groundTruth[e][3]
x2 = prediksi[e][0]
y2 = prediksi[e][1]
w2 = prediksi[e][2]
h2 = prediksi[e][3]
cv2.rectangle(gtImage, (x,y), (w,h), (0,255,0), 2, cv2.LINE_AA) cv2.rectangle(pImage, (x2,y2), (w2,h2), (255,0,0), 2, cv2.LINE_AA) cv2.rectangle(iouImage, (x,y), (w,h), (0,255,0), 2, cv2.LINE_AA)
cv2.rectangle(iouImage,(x2,y2),(w2,h2), (255,0,0), 2, cv2.LINE_AA)
resized = []
for i, values in enumerate(image):
size = cv2.resize(values,(1000,1000))
resized.append(size)
iou = fungsi_iou({'x':x,'y':y,'w':w,'h':h},{'x':x2,'y':y2,'w':w2,'h':h2})
result.append(iou)

Visualisasikan bounding box ground truth dan prediksi pada masing-masing gambar. Terakhir, hitung nilai IOU nya.

  • Proses semua gambar yang telah berhasil tersimpan di dalam list images.
  • Copy menjadi 4 gambar dengan fungsi .copy(), yang nantinya masing-masing dari gambar tersebut akan menampilkan bounding box ground truth, bounding box prediksi dan menampilkan keduanya sekaligus beserta nilai IOU nya. Proses ini opsional, saya melakukannya karena ingin menunjukkan semua visualisasi bounding box kepada teman-teman.
  • Export nilai dari masing koordinat dalam list groundTruth dan prediksi. Perlu dipastikan lagi bahwa file ground truth harus sama dengan gambarnya, karena file ground truth kita buat dengan cara mengannotasi gambar. Sedangkan untuk koordinat prediksi nantinya akan dikeluarkan sendiri oleh model, jika teman-teman sudah mempunyai model yang dapat memprediksi koordinat. Namun karena kita belum memiliki modelnya, koordinat prediksi juga saya buat sendiri dan saya asumsikan sebagai output dari model.
  • Lakukan visualisasi dengan menggunakan koordinat-koordinat tersebut hingga membentuk sebuah bounding box dengan menggunakan fungsi cv2.rectangle().
  • Hitung nilai IOU dengan memanggil fungsi_IOU yang telah kita buat sebelumnya, dan kirim parameter yang dibutuhkan.
fig, axs = plt.subplots(4,4, figsize =(10,10))for ax in axs.flat:
ax.label_outer()
axs[0, 0].set_title("Dataset")
axs[0, 1].set_title("Ground Truth")
axs[0, 2].set_title("Prediksi")
for i, values in enumerate(result):
axs[i, 3].set_title("IOU : {:.4f}".format(values))
baris = 0
kolom = 0
for i, values in enumerate(resized):
axs[baris, kolom].imshow(values)
kolom+=1

if kolom == 4:
kolom = 0
baris+=1

Terakhir, kode di atas adalah untuk menampilkan hasil gambar dengan semua bounding box dan hasil IOU nya dari masing-masing gambar. Adapun output yang dihasilkan :

Hasil Perhitungan IOU

Terima kasih, sekian dari saya. Semoga bermanfaat!

Referensi

  1. https://github.com/rafaelpadilla/Object-Detection-Metrics

--

--