目标检测入门——01目标检测概念及数据集
1. 目标检测
1.1目标检测是什么
在入门阶段,大家经常会混淆分类任务和检测任务。分类任务是要明确图中是什么(属于哪一类,比如是猫还是狗),检测任务是要明确图中有什么,在什么位置,需要用目标框框出来,是在分类任务上进一步的任务。
如下图,检测出图片中是一只猫不是一只狗,就是分类任务。
下面这张图,检测出图片中是一只猫并框出猫的位置,就属于检测任务。
2.目标检测的原理
2.1目标检测的基本原理
对于给出的图片,采用滑动窗口的方式,按照一定的顺序遍历图片中的各个区域,分别送入到分类网络进行分类得到其类别,同时我们会对当前的边界框进行微调,这样对于图像中每个区域都能得到(class,x1,y1,x2,y2)五个属性,汇总后最终就得到了图中物体的类别和坐标信息。
目标检测的基本原理如下图所示:
上述检测过程中的边界框微调过程如下图所示:
在待识别图上预设一个框,然后逐像素遍历,就能得到大量候选框(这里仅为示意图,图上只展示了3个框用于说明问题,具体数量由图像大小和预设框大小决定),每个框送入到分类网络分类都有一个得分(代表当前框中有一个船的置信度),那么得分最高的就代表识别的最准确的框,其位置就是最终要检测的目标的位置。
2.2目标框信息
目标框,也称作bounding box,属于训练集中的Ground Truth。在目标检测任务中,Ground Truth 包括类别和位置信息。
通常用以下2种格式表示 bounding box 的信息。
之所以使用两种不同的目标框信息表达格式,是因为两种格式会分别在后续不同场景下更加便于计算。
两种格式的转换代码如下所示:
def xy_to_cxcy(xy):
"""
Convert bounding boxes from boundary coordinates (x_min, y_min, x_max, y_max) to center-size coordinates (c_x, c_y, w, h).
:param xy: bounding boxes in boundary coordinates, a tensor of size (n_boxes, 4)
:return: bounding boxes in center-size coordinates, a tensor of size (n_boxes, 4)
"""
return torch.cat([(xy[:, 2:] + xy[:, :2]) / 2, # c_x, c_y
xy[:, 2:] - xy[:, :2]], 1) # w, h
def cxcy_to_xy(cxcy):
"""
Convert bounding boxes from center-size coordinates (c_x, c_y, w, h) to boundary coordinates (x_min, y_min, x_max, y_max).
:param cxcy: bounding boxes in center-size coordinates, a tensor of size (n_boxes, 4)
:return: bounding boxes in boundary coordinates, a tensor of size (n_boxes, 4)
"""
return torch.cat([cxcy[:, :2] - (cxcy[:, 2:] / 2), # x_min, y_min
cxcy[:, :2] + (cxcy[:, 2:] / 2)], 1) # x_max, y_max
3.数据集
VOC数据集是目标检测领域最常用的标准数据集之一,其中比较常用的是VOC2007和VOC2012。
3.1数据集类别
VOC数据集在类别上可以分为4大类,20小类。
3.2数据集下载
下载链接: http://host.robots.ox.ac.uk/pascal/VOC/.
3.3数据集文件信息简介
数据集中包含一下5个文件夹:
Annotation:
存放着每张图片相关的标注信息,以xml格式的文件存储,可以通过记事本或者浏览器打开。
ImageSets:
包含三个子文件夹:
Layout:存放train,valid,test和train+valid数据集的文件名
Segmentation:存放分割所用train,valid,test和train+valid数据集的文件名
Main:存放各个类别所在图片的文件名,比如cow_val,表示valid数据集中,包含有cow类别目标的图片名称。
JPEGImages:
存放所有的图片,包括训练验证测试用到的所有图片。
SegmentationClass:用于分割任务
SegmentationObject:用于分割任务
3.1.1 Annotation
Annotation文件夹中的信息如下所示:
我们需要的信息只有 filename(图片名称)、size(图片宽高)、depth(图片通道数)、object(目标)以及一张图片中有多少需要识别的目标。
object(目标)这部分包括:
目标类别name为dog,pose表示目标姿势为left,truncated表示是否是一个被截断的目标,1表示是,0表示不是,在这个例子中,只露出狗头部分,所以truncated为1。difficult为0表示此目标不是一个难以识别的目标。
目标的bbox信息,可以看到,这里是以[xmin,ymin,xmax,ymax]格式进行标注的,分别表示dog目标的左上角和右下角坐标。
3.4 dataloader的构建
VOC数据集的存储格式比较复杂,为了后面训练中的读取代码更加简洁,这里我们准备了一个预处理脚本提前将记录标注信息的xml文件(Annotations)进行解析,并将信息整理到json文件之中,这样在运行训练脚本时,只需简单的从json文件中读取已经按想要的格式存储好的标签信息即可。
将VOC数据转换成了dataset,创建dataloader 。