上一章:深度篇——图像处理的一些方法(一) 关于 图像处理的三个层次 与 selective search
下一章:深度篇——图像处理的一些方法(三) 细说 HOG 特征 与 bag-of-word
本小节,细说 性能评估 IOU 和 GIOU,下一小节细说 HOG 特征 与 bag-of-word
GIOU 论文地址:Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression
性能评估
自然地,通过计算得到的包含物体的 bounding boxes 与 ground true (真实情况) 的窗口重叠越多,那么性能就越好。
三. IOU (Instersectiou Over Union, IOU)
1. IOU 是一种测量在特定数据集中检测相应物体准确度的一个标准。
2. IOU 的计算公式:
:为对于每个固定的类别 C,每个 ground true (真实情况) 表示为 ,其中
:为每个 bounding box,其中
其实, 的面积比。
IOU 的 loss为:
3. IOU 的 python 代码
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# ============================================
# @Time : 2020/02/01 16:04
# @Author : WanDaoYi
# @FileName : bbox_iou.py
# ============================================
import numpy as np
# IOU
def bboxes_iou(boxes1, boxes2):
boxes1 = np.array(boxes1)
boxes2 = np.array(boxes2)
# 计算 面积
boxes1_area = (boxes1[..., 2] - boxes1[..., 0]) * (boxes1[..., 3] - boxes1[..., 1])
boxes2_area = (boxes2[..., 2] - boxes2[..., 0]) * (boxes2[..., 3] - boxes2[..., 1])
# 交集的 左上角坐标
left_up = np.maximum(boxes1[..., :2], boxes2[..., :2])
# 交集的 右下角坐标
right_down = np.minimum(boxes1[..., 2:], boxes2[..., 2:])
# 计算交集矩形框的 high 和 width
inter_section = np.maximum(right_down - left_up, 0.0)
# 两个矩形框的 交集 面积
inter_area = inter_section[..., 0] * inter_section[..., 1]
# 两个矩形框的并集面积
union_area = boxes1_area + boxes2_area - inter_area
# 计算 iou
ious = np.maximum(1.0 * inter_area / union_area, np.finfo(np.float32).eps)
return ious
4. MABO (Mean Average Best Overlap, MABO) 平均最高重叠率
在做性能评估的时候,有时也会用 MABO来评估,其公式如下:
对于所有的类别下的性能评估,很自然就使用所有类别下的性能评估,很自然就使用所有类别的 ABO 的平均值 MABO 来评估。
5. 单一策略评估
可以通过改变多样性策略中的任何一种,评估选择性搜索的 MABO 性能指标。论文中采取的策略如下:
(1). 使用 RGB 色彩空间(基于图的图像分割会利用不同的色彩进行图像区域分割)
(2). 采用四种相似度计算的组合方式
(3). 设置图像分割的阈值 k = 50
然后,通过改变其中一个策略参数,获取 MABO 性能指标。
6. 多样性策略组合
使用贪婪的搜索算法,把单一策略进行组合,会获得较高的 MABO,但是,也会造成计算成本的增加。
四. GIOU (Generalized IOU, GIOU) 广义 IOU
1. 对于 IOU 有如下两个缺点:
(1). 当 时,即 bounding box 与 ground true 无交集时,无法得知 bounding box 与 ground true 是相互临近,还是相距很远。
:为 predicted box,即为 bounding box,对应的坐标为
:为 ground true,对应的坐标为
(2). IOU 无法辨别不同方式的对齐,比如方向不一致等,如下:
2. GIOU 是对 IOU 进行了优化,计算如下:
:为 predicted box,即为 bounding box,对应的坐标为
:为 ground true,对应的坐标为
(1). 计算 的面积
(2). 计算 的面积 (同理)
(3). 计算 的面积
(4). 计算包含 和 的最小密封面积 box :
GIOU 的 loss 为:
3. GIOU 优化的理解
通过计算得:
(1). 当 IOU = 0 时,IOU 无法进行优化。而 的行为:
当 与 不相交时,即 ,此时 简化为:
最小化 GIOU 损失则需要最大化 ,这一项已经是归一化的,即 ,并且最大化这一项则需要最小化 ,同时最大化 ,因为 ,故 ,由于 已知,且固定,所以需要最大化 ,也就是说,最小化 且同时最大化 ,显然,这就使得 趋于与 重合。
(2). 因为当 时, GIOU 依然可以进行优化,这样,GIOU 既保留了 IOU 的原始性质,同时又弱化了它的弱点,于是论文认为可以将 GIOU 作为 IOU 的替换。
4. GIOU 的 python 代码:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# ============================================
# @Time : 2020/02/01 16:04
# @Author : WanDaoYi
# @FileName : bbox_giou.py
# ============================================
import tensorflow as tf
def bbox_giou(boxes1, boxes2):
# 将 中心点 与 high 和 width 转为 左上 和 右下 坐标点
boxes1 = tf.concat([boxes1[..., :2] - boxes1[..., 2:] * 0.5,
boxes1[..., :2] + boxes1[..., 2:] * 0.5], axis=-1)
boxes2 = tf.concat([boxes2[..., :2] - boxes2[..., 2:] * 0.5,
boxes2[..., :2] + boxes2[..., 2:] * 0.5], axis=-1)
# 获取 框 的 左上角 和 右下角 的坐标值
boxes1 = tf.concat([tf.minimum(boxes1[..., :2], boxes1[..., 2:]),
tf.maximum(boxes1[..., :2], boxes1[..., 2:])], axis=-1)
boxes2 = tf.concat([tf.minimum(boxes2[..., :2], boxes2[..., 2:]),
tf.maximum(boxes2[..., :2], boxes2[..., 2:])], axis=-1)
# 计算 面积
boxes1_area = (boxes1[..., 2] - boxes1[..., 0]) * (boxes1[..., 3] - boxes1[..., 1])
boxes2_area = (boxes2[..., 2] - boxes2[..., 0]) * (boxes2[..., 3] - boxes2[..., 1])
# 计算交集的 左上角 和 右下角 坐标
left_up = tf.maximum(boxes1[..., :2], boxes2[..., :2])
right_down = tf.minimum(boxes1[..., 2:], boxes2[..., 2:])
# 计算 交集 的 high 和 width
inter_section = tf.maximum(right_down - left_up, 0.0)
# 计算 交集 的面积
inter_area = inter_section[..., 0] * inter_section[..., 1]
# 计算 并集 的面积
union_area = boxes1_area + boxes2_area - inter_area
# 计算 IOU
iou = inter_area / union_area
# 计算最小密封框 的 左上角 坐标
enclose_left_up = tf.minimum(boxes1[..., :2], boxes2[..., :2])
# 计算最小密封框 的 右下角 坐标
enclose_right_down = tf.maximum(boxes1[..., 2:], boxes2[..., 2:])
# 计算最小密封框 的 high 和 width
enclose = tf.maximum(enclose_right_down - enclose_left_up, 0.0)
# 计算最小密封框 的 面积
enclose_area = enclose[..., 0] * enclose[..., 1]
# 计算 GIOU
giou = iou - 1.0 * (enclose_area - union_area) / enclose_area
return giou
上一章:深度篇——图像处理的一些方法(一) 关于 图像处理的三个层次 与 selective search
下一章:深度篇——图像处理的一些方法(三) 细说 HOG 特征 与 bag-of-word