交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,是产生的候选框(candidate bound)与原标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1。
计算公式:
#include"function.h"
#include"roi.h"
double calculateIoU(roi& candidateBound, roi& groundTruthBound)//计算交并比
{
int cx1 = candidateBound.getX();
int cy1 = candidateBound.getY();
int cx2 = candidateBound.getX() + candidateBound.getWidth();
int cy2 = candidateBound.getY() + candidateBound.getHeight();
int gx1 = groundTruthBound.getX();
int gy1 = groundTruthBound.getY();
int gx2 = groundTruthBound.getX() + groundTruthBound.getWidth();
int gy2 = groundTruthBound.getY() + groundTruthBound.getHeight();
double carea = (cx2 - cx1) * (cy2 - cy1); //C的面积
double garea = (gx2 - gx1) * (gy2 - gy1);//G的面积
int x1 = max(cx1, gx1);
int y1 = max(cy1, gy1);
int x2 = min(cx2, gx2);
int y2 = min(cy2, gy2);
int w = max(0, x2 - x1);
int h = max(0, y2 - y1);
int area = w * h;//C∩G的面积
double iou = area / (carea + garea - area);
return iou;
}