معیار IoU(Intersection over union)

به نام خدا

یکی از کاربردهای این معیار در مسائل تشخیص شی است. همان طور که از نام آن نیز مشخص است میزان همپوشانی را محاسبه می کند. اگر در تصویری جعبه ی محاطی برای شیئی پیش بینی شود برای اینکه بدانیم چقدر این جعبه درست پیش بینی شده است می توان از این معیار استفاده کرد.

مثال زیر بسیار خوب این مفهوم را می رساند.

https://datahacker.rs/deep-learning-intersection-over-union/
https://datahacker.rs/deep-learning-intersection-over-union/

همان طور که در شکل بالا نشان داده شده است جعبه ی قرمز رنگ جعبه ی محاطی درست برای شی ماشین و جعبه ی پیش بینی شده نیز با رنگ بنفش مشخص شده است. برای اینکه بدانیم چه میزان این پیش بینی خوب انجام شده است از IoU استفاده می کنیم. مساحت مشترک دو جعبه را در صورت کسر و میزان کل مساحتی که این دو جعبه دارند در مخرج کسر قرار می دهیم و حاصل عددی بین 0 و 1 خواهد بود. اگر این دو جعبه هیچ همپوشانی نداشته باشند این عدد صفر و اگر کاملا روی هم قرار گیرند مقدار 1 خواهد شد. این معیار با جزئیات بیشتر در شکل زیر آمده است.(نکته ای که وجود دارد این است که در مخرج این کسر ناحیه ی مشترک نباید دوبار حساب شود. )

https://www.researchgate.net/figure/Intersection-over-Union-IOU-calculation-diagram_fig2_335876570
https://www.researchgate.net/figure/Intersection-over-Union-IOU-calculation-diagram_fig2_335876570

این معیار می تواند برای محاسبه ی mAP یا حتی در محاسبه ی تابع خطای این مسائل استفاده شود. برای محاسبه ی این معیار می توانید از کد زیر استفاده کنید.

def _interval_overlap(interval_a, interval_b):
    x1, x2 = interval_a
    x3, x4 = interval_b

    if x3 < x1:
        if x4 < x1:
            return 0
        else:
            return min(x2,x4) - x1
    else:
        if x2 < x3:
             return 0
        else:
            return min(x2,x4) - x3

def bbox_iou(box1, box2):
    intersect_w = _interval_overlap([box1.xmin, box1.xmax], [box2.xmin, box2.xmax])
    intersect_h = _interval_overlap([box1.ymin, box1.ymax], [box2.ymin, box2.ymax])

    intersect = intersect_w * intersect_h

    w1, h1 = box1.xmax-box1.xmin, box1.ymax-box1.ymin
    w2, h2 = box2.xmax-box2.xmin, box2.ymax-box2.ymin
    
    union = w1*h1 + w2*h2 - intersect
    
    return float(intersect) / union

این معیار مشکلاتی دارد که نسخه های بعد ار آن مثل CIoU, DIoU و GIoU سعی می کنند آن ها را برطرف کنند. نسخه های دیگر را در پست های بعدی معرفی خواهیم کرد.

منبع کد:

https://github.com/sanazkhalili/YOLOv3/blob/master/codes/TestYolov3.ipynb