目标检测入门——01目标检测概念及数据集

1. 目标检测

1.1目标检测是什么

在入门阶段,大家经常会混淆分类任务和检测任务。分类任务是要明确图中是什么(属于哪一类,比如是猫还是狗),检测任务是要明确图中有什么,在什么位置,需要用目标框框出来,是在分类任务上进一步的任务。

如下图,检测出图片中是一只猫不是一只狗,就是分类任务。

目标检测凹凸_python


下面这张图,检测出图片中是一只猫并框出猫的位置,就属于检测任务。

目标检测凹凸_目标检测凹凸_02

2.目标检测的原理

2.1目标检测的基本原理

对于给出的图片,采用滑动窗口的方式,按照一定的顺序遍历图片中的各个区域,分别送入到分类网络进行分类得到其类别,同时我们会对当前的边界框进行微调,这样对于图像中每个区域都能得到(class,x1,y1,x2,y2)五个属性,汇总后最终就得到了图中物体的类别和坐标信息。

目标检测的基本原理如下图所示:

目标检测凹凸_数据集_03


上述检测过程中的边界框微调过程如下图所示:

在待识别图上预设一个框,然后逐像素遍历,就能得到大量候选框(这里仅为示意图,图上只展示了3个框用于说明问题,具体数量由图像大小和预设框大小决定),每个框送入到分类网络分类都有一个得分(代表当前框中有一个船的置信度),那么得分最高的就代表识别的最准确的框,其位置就是最终要检测的目标的位置。

目标检测凹凸_计算机视觉_04

2.2目标框信息

目标框,也称作bounding box,属于训练集中的Ground Truth。在目标检测任务中,Ground Truth 包括类别和位置信息。

通常用以下2种格式表示 bounding box 的信息。

目标检测凹凸_目标检测凹凸_05


之所以使用两种不同的目标框信息表达格式,是因为两种格式会分别在后续不同场景下更加便于计算。

两种格式的转换代码如下所示:

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小类。

目标检测凹凸_数据集_06

3.2数据集下载

下载链接: http://host.robots.ox.ac.uk/pascal/VOC/.

3.3数据集文件信息简介

数据集中包含一下5个文件夹:

目标检测凹凸_计算机视觉_07


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文件夹中的信息如下所示:

目标检测凹凸_数据集_08


我们需要的信息只有 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 。