文章目录
- 1. 任务定义
- 2. 基本概念
- 2.1 边界框(bounding box)
- 2.2 真实框、预测框和锚框
- 2.3 交并比 (IoU)
- 2.4 代码实现
 
 
1. 任务定义
目标检测的主要目的是让计算机可以自动识别图片或者视频帧中所有目标的类别,并在该目标周围绘制边界框,标示出每个目标的位置,如图所示。
 
2. 基本概念
2.1 边界框(bounding box)
检测任务需要同时预测物体的类别和位置,因此需要引入一些跟位置相关的概念。通常使用边界框(bounding box,bbox)来表示物体的位置,边界框是正好能包含物体的矩形框,如下图所示,图中3个人分别对应3个边界框。
 
 一般有两种表示边界框位置的格式:
(1) x y x y xyxy xyxy,即 ( x 1 , y 1 , x 2 , y 2 ) (x1, y1, x2, y2) (x1,y1,x2,y2),其中 ( x 1 , y 1 ) (x1, y1) (x1,y1) 是矩形框左上角的坐标, ( x 2 , y 2 ) (x2, y2) (x2,y2) 是矩形框右下角的坐标。
(2) x y w h xywh xywh,即 ( x , y , w , h ) (x, y, w, h) (x,y,w,h), 其中 ( x , y ) (x, y) (x,y) 是矩形框的中心坐标, w w w 是 矩形框的宽度, h h h 是矩形框的高度。
因此,在阅读代码的时候,要注意使用的是哪一种格式的表示方式。
2.2 真实框、预测框和锚框
从训练数据集的标签里给出目标物体边界框所对应的位置叫真实框
由模型预测出目标物体边界框所对应的位置叫预测框
不同于真实框和预测框,锚框是人为预先设定好的矩形框,模型在这种锚框的基础上预测偏移量才能得到预测框
2.3 交并比 (IoU)
如何衡量预测框和真实框之间的关系呢?在检测任务中是使用交并比(Intersection of Union,IoU)作为衡量指标。这一概念来源于数学中的集合,用来描述两个集合A和B之间的关系,它等于两个集合的交集里面所包含的元素个数,除以它们的并集里面所包含的元素个数,具体计算公式如下:
  
      
       
        
        
          I 
         
        
          O 
         
        
          U 
         
        
          = 
         
         
          
          
            A 
           
          
            ∩ 
           
          
            B 
           
          
          
          
            A 
           
          
            ∪ 
           
          
            B 
           
          
         
        
       
         IOU = \frac{A \cap B}{A \cup B} 
        
       
     IOU=A∪BA∩B我们将用这个概念来描述两个框之间的重合度。两个框可以看成是两个像素的集合,它们的交并比等于两个框重合部分的面积除以它们合并起来的面积。下图“交集”中青色区域是两个框的重合面积,图“并集”中蓝色区域是两个框的相并面积。用这两个面积相除即可得到它们之间的交并比。
 
 假设两个矩形框A和B的位置分别为:
  
      
       
        
        
          A 
         
        
          : 
         
        
          [ 
         
         
         
           x 
          
          
          
            a 
           
          
            1 
           
          
         
        
          , 
         
         
         
           y 
          
          
          
            a 
           
          
            1 
           
          
         
        
          , 
         
         
         
           x 
          
          
          
            a 
           
          
            2 
           
          
         
        
          , 
         
         
         
           y 
          
          
          
            a 
           
          
            2 
           
          
         
        
          ] 
         
         
        
          A 
         
        
          : 
         
        
          [ 
         
         
         
           x 
          
          
          
            b 
           
          
            1 
           
          
         
        
          , 
         
         
         
           y 
          
          
          
            b 
           
          
            1 
           
          
         
        
          , 
         
         
         
           x 
          
          
          
            b 
           
          
            2 
           
          
         
        
          , 
         
         
         
           y 
          
          
          
            b 
           
          
            2 
           
          
         
        
          ] 
         
        
       
         A: [x_{a1}, y_{a1}, x_{a2}, y_{a2}] \\ A: [x_{b1}, y_{b1}, x_{b2}, y_{b2}] 
        
       
     A:[xa1,ya1,xa2,ya2]A:[xb1,yb1,xb2,yb2]它们之间的位置关系如图所示:
 
 A和B相交部分左上角坐标为:
  
      
       
        
        
          x 
         
        
          1 
         
        
          = 
         
        
          m 
         
        
          a 
         
        
          x 
         
        
          ( 
         
         
         
           x 
          
          
          
            a 
           
          
            1 
           
          
         
        
          , 
         
         
         
           x 
          
          
          
            b 
           
          
            1 
           
          
         
        
          ) 
         
         
        
          y 
         
        
          1 
         
        
          = 
         
        
          m 
         
        
          a 
         
        
          x 
         
        
          ( 
         
         
         
           y 
          
          
          
            a 
           
          
            1 
           
          
         
        
          , 
         
         
         
           y 
          
          
          
            b 
           
          
            1 
           
          
         
        
          ) 
         
        
       
         x1 = max(x_{a1}, x_{b1})\\ y1 = max(y_{a1}, y_{b1}) 
        
       
     x1=max(xa1,xb1)y1=max(ya1,yb1) 相交部分右下角坐标为:
  
      
       
        
        
          x 
         
        
          2 
         
        
          = 
         
        
          m 
         
        
          i 
         
        
          n 
         
        
          ( 
         
         
         
           x 
          
          
          
            a 
           
          
            2 
           
          
         
        
          , 
         
         
         
           x 
          
          
          
            b 
           
          
            2 
           
          
         
        
          ) 
         
         
        
          y 
         
        
          2 
         
        
          = 
         
        
          m 
         
        
          i 
         
        
          n 
         
        
          ( 
         
         
         
           y 
          
          
          
            a 
           
          
            2 
           
          
         
        
          , 
         
         
         
           y 
          
          
          
            b 
           
          
            2 
           
          
         
        
          ) 
         
        
       
         x2 = min(x_{a2}, x_{b2})\\ y2 = min(y_{a2}, y_{b2}) 
        
       
     x2=min(xa2,xb2)y2=min(ya2,yb2)相交部分面积为:
  
      
       
        
        
          i 
         
        
          n 
         
        
          t 
         
        
          e 
         
        
          r 
         
        
          s 
         
        
          e 
         
        
          c 
         
        
          t 
         
        
          i 
         
        
          o 
         
        
          n 
         
        
          = 
         
        
          m 
         
        
          a 
         
        
          x 
         
        
          ( 
         
         
         
           x 
          
         
           2 
          
         
        
          − 
         
         
         
           x 
          
         
           1 
          
         
        
          + 
         
        
          1.0 
         
        
          , 
         
        
          0 
         
        
          ) 
         
        
          ⋅ 
         
        
          m 
         
        
          a 
         
        
          x 
         
        
          ( 
         
         
         
           y 
          
         
           2 
          
         
        
          − 
         
         
         
           y 
          
         
           1 
          
         
        
          + 
         
        
          1.0 
         
        
          , 
         
        
          0 
         
        
          ) 
         
        
       
         intersection = max(x_2 - x_1 + 1.0, 0) \cdot max(y_2 - y_1 + 1.0, 0) 
        
       
     intersection=max(x2−x1+1.0,0)⋅max(y2−y1+1.0,0)分别计算A和B的面积:
  
      
       
        
         
         
           S 
          
         
           A 
          
         
        
          = 
         
        
          ( 
         
         
         
           x 
          
          
          
            a 
           
          
            2 
           
          
         
        
          − 
         
         
         
           x 
          
          
          
            a 
           
          
            1 
           
          
         
        
          + 
         
        
          1.0 
         
        
          ) 
         
        
          ⋅ 
         
        
          ( 
         
         
         
           y 
          
          
          
            a 
           
          
            2 
           
          
         
        
          − 
         
         
         
           y 
          
          
          
            a 
           
          
            1 
           
          
         
        
          + 
         
        
          1.0 
         
        
          ) 
         
         
         
         
           S 
          
         
           B 
          
         
        
          = 
         
        
          ( 
         
         
         
           x 
          
          
          
            b 
           
          
            2 
           
          
         
        
          − 
         
         
         
           x 
          
          
          
            b 
           
          
            1 
           
          
         
        
          + 
         
        
          1.0 
         
        
          ) 
         
        
          ⋅ 
         
        
          ( 
         
         
         
           y 
          
          
          
            b 
           
          
            2 
           
          
         
        
          − 
         
         
         
           y 
          
          
          
            b 
           
          
            1 
           
          
         
        
          + 
         
        
          1.0 
         
        
          ) 
         
        
       
         S_A = (x_{a2} - x_{a1} + 1.0) \cdot (y_{a2} - y_{a1} + 1.0) \\ S_B = (x_{b2} - x_{b1} + 1.0) \cdot (y_{b2} - y_{b1} + 1.0) 
        
       
     SA=(xa2−xa1+1.0)⋅(ya2−ya1+1.0)SB=(xb2−xb1+1.0)⋅(yb2−yb1+1.0)计算相并部分:
  
      
       
        
        
          u 
         
        
          n 
         
        
          i 
         
        
          o 
         
        
          n 
         
        
          = 
         
         
         
           S 
          
         
           A 
          
         
        
          + 
         
         
         
           S 
          
         
           B 
          
         
        
          − 
         
        
          i 
         
        
          n 
         
        
          t 
         
        
          e 
         
        
          r 
         
        
          s 
         
        
          e 
         
        
          c 
         
        
          t 
         
        
          i 
         
        
          o 
         
        
          n 
         
        
       
         union = S_A + S_B - intersection 
        
       
     union=SA+SB−intersection 计算交并比:
  
      
       
        
        
          I 
         
        
          o 
         
        
          U 
         
        
          = 
         
         
          
          
            i 
           
          
            n 
           
          
            t 
           
          
            e 
           
          
            r 
           
          
            s 
           
          
            e 
           
          
            c 
           
          
            t 
           
          
            i 
           
          
            o 
           
          
            n 
           
          
          
          
            u 
           
          
            n 
           
          
            i 
           
          
            o 
           
          
            n 
           
          
         
        
       
         IoU = \frac{intersection}{union} 
        
       
     IoU=unionintersection
2.4 代码实现
(1)矩形框坐标形式为 x y x y xyxy xyxy 形式时:
def box_iou_xyxy(box1, box2):
    # 获取box1左上角和右下角的坐标
    x1min, y1min, x1max, y1max = box1[0], box1[1], box1[2], box1[3]
    # 计算box1的面积
    s1 = (y1max - y1min + 1.) * (x1max - x1min + 1.)
    # 获取box2左上角和右下角的坐标
    x2min, y2min, x2max, y2max = box2[0], box2[1], box2[2], box2[3]
    # 计算box2的面积
    s2 = (y2max - y2min + 1.) * (x2max - x2min + 1.)
    
    # 计算相交矩形框的坐标
    xmin = np.maximum(x1min, x2min)
    ymin = np.maximum(y1min, y2min)
    xmax = np.minimum(x1max, x2max)
    ymax = np.minimum(y1max, y2max)
    # 计算相交矩形行的高度、宽度、面积
    inter_h = np.maximum(ymax - ymin + 1., 0.)
    inter_w = np.maximum(xmax - xmin + 1., 0.)
    intersection = inter_h * inter_w
    # 计算相并面积
    union = s1 + s2 - intersection
    # 计算交并比
    iou = intersection / union
    return iou
1)矩形框坐标形式为 x y w h xywh xywh 形式时:
def box_iou_xywh(box1, box2):
     # 获取box1左上角和右下角的坐标
    x1min, y1min = box1[0] - box1[2]/2.0, box1[1] - box1[3]/2.0
    x1max, y1max = box1[0] + box1[2]/2.0, box1[1] + box1[3]/2.0
 	# 计算box1的面积
    s1 = box1[2] * box1[3]
	 # 获取box2左上角和右下角的坐标
    x2min, y2min = box2[0] - box2[2]/2.0, box2[1] - box2[3]/2.0
    x2max, y2max = box2[0] + box2[2]/2.0, box2[1] + box2[3]/2.0
     # 计算box2的面积
    s2 = box2[2] * box2[3]
    xmin = np.maximum(x1min, x2min)
    ymin = np.maximum(y1min, y2min)
    xmax = np.minimum(x1max, x2max)
    ymax = np.minimum(y1max, y2max)
    inter_h = np.maximum(ymax - ymin, 0.)
    inter_w = np.maximum(xmax - xmin, 0.)
    intersection = inter_h * inter_w
    union = s1 + s2 - intersection
    iou = intersection / union
    return iou



















