目标检测学习(一)
目标检测学习(一)
1.边界框(bounding box)
在目标检测中,边界框用来描述目标位置。边界框是一个矩形框,是由矩形左上角x和y轴坐标与右下角的x与y轴坐标确定。
1_box , 2_box = [60,45,378,516],[400,112,655,493]
import matplotlib.pyplot as plt
def bbox_to_rect(bbox,color):
return plt.Rectangle(
xy = (bbox[0],bbox[1]),width = bbox[2] - bbox[0],height = bbox[3] -
bbox[1],fill = False,edgecolor = color,linewidth=2
)
#将边界框(左上x,左下y,右下x,右下y)格式转换成matplotlib格式:
#((左上x,左上y),宽,高)
fig = plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(1_bbox,'blue'))
fig.axes.add_patch(bbox_to_rect(2_bbox,'red'))
#根据边界框的xy轴坐标以及宽高,给两张图片分别红蓝的框框
def xy_to_cxcy(xy):
return torch.cat([(xy[:,2:] + xy[:,:2]) /2, #将xy轴的坐标换算成图像的中心点
xy[:,2:] - xy[:,:2]] , 1) #计算图像的宽高
2.交并比(IOU)
目标检测中使用的一个概念是产生的候选框与原标记框的交叠率,即是他们的交集与并集的比值。最理想的情况是完全重叠,即比值为1。
example:
(交集)
A={1,2,3} B={2,3,4}
A n B = {2,3}
(并集)
A={1,2,3} B={2,3,4}
A U B = {1,2,3,4}
IOU:
变换一下,父母可以用面积减去相交的面积表示为:
python代码实现:
import torch
def iou(rect1,rect2):
xmin1, ymin1, xmax1, ymax1 = rect1
xmin2, ymin2, xmax2, ymax2 = rect2
s1 = (xmax1 - xmin1) * (ymax1 - ymin1)
s2 = (xmax2 - xmin2) * (ymax2 - ymin2)
sum_area = s1 + s2
left = max(xmin2,xmin1)
right = min(xmax2,xmax1)
top = max(ymin1,ymin2)
bottom = min(ymax1,ymax2)
if left >= right or top >= bottom:
return 0
intersection = (right - left) * (bottom - top) #计算两个矩阵交集的面积
i = intersection / (sum_area - intersection) * 1.0 #计算iou
print(i)
if __name__ == '__main__':
rect1 = torch.tensor([1,2,3,4])
rect2 = torch.tensor([2,2,3,4])
iou(rect1,rect2)
Out[3]:tensor(0.5000)
即矩阵[1,2,3,4]与矩阵[2,2,3,4]的交并集(IOU)的值为0.5
3.VOC数据集
VOC数据集是目标检测领域最常用的标准数据集之一,几乎所有检测方向的论文,如faster_rcnn、yolo、SSD等都会给出其在VOC数据集上训练并评测的效果。因此我们我们的教程也基于VOC来开展实验,具体地,我们使用VOC2007和VOC2012这两个最流行的版本作为训练和测试的数据。
数据集类别:
VOC数据集在类别上可以分为4大类,20小类
数据集量级
其中,Images表示图片数量,Objects表示目标数量(上面两组照片是GitHub里的,所以----- 你懂的!)