如何计算两个矩形框的IoU

由于最近跟别人说我搞过目标检测,然后被问到一个问题,如何计算两个矩形框的IoU?  

一开始我回答说可以采用OpenCV的&运算和|运算来计算IoU,但他要我不采用OpenCV 的接口,自己写。

当时我回答的比较乱,分4种情况进行讨论2个矩形框之间的位置关系,最后他告诉我说,根本不需要讨论,采用max(),min()就可以实现。囧。

大致做法是先求出2个矩形框的交集,交集也是矩形框或空,计算相交部分面积再除以并集的面积即可。

关键在于怎么不分情况讨论就计算出交集部分的面积。

摘取SSD中bbox_util.cpp一部分代码如下:

void IntersectBBox(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2,
                   NormalizedBBox* intersect_bbox) {
  if (bbox2.xmin() > bbox1.xmax() || bbox2.xmax() < bbox1.xmin() ||
      bbox2.ymin() > bbox1.ymax() || bbox2.ymax() < bbox1.ymin()) {
    // Return [0, 0, 0, 0] if there is no intersection.
    intersect_bbox->set_xmin(0);
    intersect_bbox->set_ymin(0);
    intersect_bbox->set_xmax(0);
    intersect_bbox->set_ymax(0);
  } else {
    intersect_bbox->set_xmin(std::max(bbox1.xmin(), bbox2.xmin()));
    intersect_bbox->set_ymin(std::max(bbox1.ymin(), bbox2.ymin()));
    intersect_bbox->set_xmax(std::min(bbox1.xmax(), bbox2.xmax()));
    intersect_bbox->set_ymax(std::min(bbox1.ymax(), bbox2.ymax()));
  }
}
float JaccardOverlap(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2,
                     const bool normalized) {
  NormalizedBBox intersect_bbox;
  IntersectBBox(bbox1, bbox2, &intersect_bbox);
  float intersect_width, intersect_height;
  if (normalized) {
    intersect_width = intersect_bbox.xmax() - intersect_bbox.xmin();
    intersect_height = intersect_bbox.ymax() - intersect_bbox.ymin();
  } else {
    intersect_width = intersect_bbox.xmax() - intersect_bbox.xmin() + 1;
    intersect_height = intersect_bbox.ymax() - intersect_bbox.ymin() + 1;
  }
  if (intersect_width > 0 && intersect_height > 0) {
    float intersect_size = intersect_width * intersect_height;
    float bbox1_size = BBoxSize(bbox1);
    float bbox2_size = BBoxSize(bbox2);
    return intersect_size / (bbox1_size + bbox2_size - intersect_size);
  } else {
    return 0.;
  }
}

这个交集的计算采用max,min就计算出来了,真是巧妙啊。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
计算两个框的交并比通常用于目标检测或图像识别任务中,以下是用Python实现计算交并比的基本步骤: 1. 首先,确定两个框的坐标表示方法。常用的坐标表示方法为左上角坐标和宽高表示方法,可以使用四个浮点数(x1, y1, w1, h1)和(x2, y2, w2, h2)来表示两个框,其中(x1, y1)和(x2, y2)为左上角坐标,(w1, h1)和(w2, h2)为宽和高。 2. 然后,计算两个框的相交矩形的左上角坐标和右下角坐标,分别记为(x3, y3)和(x4, y4)。具体计算方法为: x3 = max(x1, x2) y3 = max(y1, y2) x4 = min(x1 + w1, x2 + w2) y4 = min(y1 + h1, y2 + h2) 3. 接下来,判断相交矩形是否存在。如果相交矩形的宽或高小于等于0,则说明两个框没有相交,交并比为0。否则,继续下一步计算。 4. 计算相交矩形的面积,记为intersect_area。计算方法为intersect_area = (x4 - x3) * (y4 - y3)。 5. 计算两个框的面积,分别记为area1和area2。计算方法为area1 = w1 * h1,area2 = w2 * h2。 6. 计算交并比,记为iou计算方法为iou = intersect_area / (area1 + area2 - intersect_area)。 在实际使用时,可以将上述步骤封装成一个函数,输入两个框的坐标信息,输出交并比。使用Python编写相对简单,以下是一个示例函数的简单实现: ```python def calculate_iou(box1, box2): x1, y1, w1, h1 = box1 x2, y2, w2, h2 = box2 x3, y3 = max(x1, x2), max(y1, y2) x4, y4 = min(x1 + w1, x2 + w2), min(y1 + h1, y2 + h2) if x4 <= x3 or y4 <= y3: return 0.0 intersect_area = (x4 - x3) * (y4 - y3) area1 = w1 * h1 area2 = w2 * h2 iou = intersect_area / (area1 + area2 - intersect_area) return iou ``` 通过调用该函数,可以计算得到两个框的交并比。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值