目标检测ObjectDetection
概述
目标检测的目的主要是通过模型检测出目标+类别
主流的目标检测以矩阵框形式输出,更高精度的是语义分割任务(对网络模型的要求更高)
数据集
数据集的标注与网络的输出强相关,下面介绍两种常用的数据集。
voc数据集
官方网站:The PASCAL Visual Object Classes Homepage (ox.ac.uk)
数据集原图片见下
(常用的是2007、2012数据集)
下面是2007数据集的文件目录:
依次为:
- Annotations数据集标注,包含XML文件,描述图片的各种信息(目标的位置坐标等)
- ImageSets图片集合,主要关注main文件夹,里面的文件包含不同类别目标的训练数据集图片名称
- JPEGImages原图片
- SegmentationClass标注(同类别)
- SegmentationObject标注(单个物体)
举例:000019.jpg
原图像见下:
标注内容:
<annotation>
<folder>VOC2007</folder>
<filename>000019.jpg</filename>
<source>
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid>330638158</flickrid>
</source>
<owner>
<flickrid>Rosenberg1/ Simmo</flickrid>
<name>?</name>
</owner>
<size>
<width>500</width>
<height>375</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>cat</name>
<pose>Right</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>231</xmin>
<ymin>88</ymin>
<xmax>483</xmax>
<ymax>256</ymax>
</bndbox>
</object>
<object>
<name>cat</name>
<pose>Right</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>11</xmin>
<ymin>113</ymin>
<xmax>266</xmax>
<ymax>259</ymax>
</bndbox>
</object>
</annotation>
描述的是图片的属性信息,例如文件夹在VOC2007下,名称、id、大小
其中有object为cat,位置在right,识别困难值为0、对应的矩形框位置分别在(231,88)-(483,256)
- caption 用文字描述图片
- instance 用于语义分割
- person_keypoints 人体结构
CoCo数据集
- info 文件的基本信息
- version 版本
- licenses 许可证
- images 图片
- id 与标注信息的id对应
- width
- height
- category_id 2 表示对应的类别是2
- iscrowd 是否为群体
- segmentation 标记区域的点坐标(两个数字一对)
- area 标注区域的面积
- bbox 左上角坐标、宽度、高度
在线标注数据集
一种在线标注数据集的方式,比较推荐
标记过程见下:
创建项目
添加图片
可以加载标签文件,也可以直接创建项目
添加标签值
标记为flower标签
导出标签文件
这里选择导出VOC XML标签文件,见下图。(其他的标签类型也可参考)
VOC数据集加载
import torch
import torchvision
dataset = torchvision.datasets.VOCDetection(root = "D:\\1deeplearning\\vocdataset\\VOCtrainval_06-Nov-2007",
year='2007',
download=False,
)
image, info = dataset[0]
一定注意!!路径问题!!
加载数据集后为了拿到标签数据,可以通过使用“断点调试”的方式查看info对象中的标签数据结构,见下图。
我们可以看到关心的图片标注在info(dict类型)下的annotation(dict类型),下面的object(list类型),通过遍历拿到object下的数据,再拿到bndbox下的标记位置信息。(层次结构有点复杂,主要是要分清字典、列表数据类型元素的取出)
同时使用PIL库中的ImageDraw模块。使用rectangle函数标记。
import torch
import torchvision
from PIL import ImageDraw
dataset = torchvision.datasets.VOCDetection(root = "D:\\1deeplearning\\vocdataset\\VOCtrainval_06-Nov-2007",
year='2007',
download=False,
)
image,info = dataset[2]
# image.show()
# x_width,x_height,x_depth = info['annotation']['size']
# print(x_width)
# for annotation in info:
# x_width, x_height, x_depth = annotation['size']
img_handler = ImageDraw.ImageDraw(image)
for i in info['annotation']['object']:
x_min = int(i['bndbox']['xmin'])
y_min = int(i['bndbox']['ymin'])
x_max = int(i['bndbox']['xmax'])
y_max = int(i['bndbox']['ymax'])
# print(x_min,y_min,x_max,y_max)
shape = [(x_min,y_min),(x_max,y_max)]
print(shape)
img_handler.rectangle(shape)
image.show()
得到的标记信息见下
使用Coco数据集类似的方法,在该函数中选择Coco加载即可。
torchvision.datasets