title : 目标检测①创建数据集
目标检测实验报告
检测所用软硬件+云服务器:
硬件:macOS或者windows电脑
软件:pycharm+生成的测试集
云服务器:滴滴云(https://www.didiyun.com/activity.html)输入博主的大师码:8996 ,可以和博主一样9折享受服务
一、研究问题
目标检测,也叫目标提取,是一种基于目标几何和统计特征的图像分割,它将目标的分割和识别合二为一,其准确性和实时性是整个系统的一项重要能力。尤其是在复杂场景中,需要对多个目标进行实时处理时,目标自动提取和识别就显得特别重要。
目标检测的任务是找出图像中所有感兴趣的目标,确定它们的位置和类别。
图像识别有四大类任务:
分类(Classification): 解决"what"。
定位(Location):解决”where“。
检测(Detection):解决”what & where“。
分割(Segmentation):分为 实例分割(Instance-level)和 语义分割(semantic segmentation)。解决“每一个像素属于哪个实例或哪一类”。
1.2 问题特性
由于各类物体有不同的外观、形状、姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战的问题。
除了图像分类以外,目标检测要解决的核心问题是:
1、目标可能出现在图像的任何位置。
2、目标有各种不同的大小。
3、目标有各种不同的形状。
则如果用矩形框来定义目标,则矩形框需要有不同的宽高比。由于目标的宽高比不同,因此采用传统的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。
二、算法分析
2.1 目标检测数据集
Pascal Voc和COCO是目标检测任务最常用的数据集
2.1.1 PASCAL VOC
Pascal 的全程是 Pattern Analysis, Statical Modeling and Computational Learning。
PASCAL VOC 挑战赛是视觉对象的分类识别和检测的一个基准测试,提供了检测算法和学习性能的标准图像注释数据集和标准的评估系统。
https://pjreddie.com/media/files/VOC2012_doc.pdf
2.1.1.1Pascal Voc数据集格式分析
1)文件结构
数据集下载后解压得到一个名为VOCdevkit的文件夹,该文件夹结构如下:
Annotations //xml文件,该文件是对图片的解释,每张图片都对应一个同名的xml文件。
ImageSets //txt文件,txt文件中每行都包含图片的名称,末尾会加上±1表示正负样本
针对目标检测主要看Main
——Action
——Layout
——Main
——Segmentation
JPEGImages //数据集的原图片
SegmentationClass //图片,语义分割相关
SegmentationObject //图片,实例分割相关
2.1.1.2 创建自己的pascal voc数据集
下载图像标记软件
git clone https://github.com/tzutalin/labelimg
步骤:
anaconda+pip install labelImg
注:在这里我要说一句:python是Python,anaconda是anaconda,你选择环境时候可以二选一,个人建议anaconda,确实省力。
如下截图:
修改标注类别信息—>设置图像文件所在目录以及标注文件保存目录->标注图像并保存->打开labelImg
利用create/nRectBox截取并生成xml
具体代码:
1)
# -*- coding:utf8 -*-
import os
class BatchRename():
'''
批量重命名文件夹中的图片文件
'''
def __init__(self):
# 我的图片文件夹路径
self.path = 'xxxx'
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist)
i = 1 # 设置第一个文件名
n = 6 # 设置文件名长度,如000001,长度为6
for item in filelist:
# 这里修改的是jpg文件,如果要修改其他类型的文件,请手动将下面两个'.jpg'修改为对应的文件后缀
if item.endswith('.jpg'):
n = 6 - len(str(i))
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), str(0) * n + str(i) + '.jpg')
try:
os.rename(src, dst)
print('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
print('total %d to rename & converted %d jpgs' % (total_num, i))
if __name__ == '__main__':
demo = BatchRename()
demo.rename()
若之后想加图片,只需要把i改了
2)
labelImg打标签,把图片保存到Annotations文件夹
3)
生成Main文件夹下面的txt文件
代码如下:
import os
import random
trainval_percent = 0.7 # 训练集和验证集 占 数据集 的比例
train_percent = 0.6 # 训练集 占 训练集和验证集 的比例
# 把xml路径修改为自己的Annotations文件夹路径
xmlfilepath = 'E:/xxx/VOC/Annotations'
# 把保存路径修改为自己的Main文件夹路径
savepath = 'E:/xxx/VOC/ImageSets/Main'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open(savepath + '/trainval.txt', 'w')
ftest = open(savepath + '/test.txt', 'w')
ftrain = open(savepath + '/train.txt', 'w')
fval = open(savepath + '/val.txt', 'w')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
至此,我们理解了Pascal voc的格式,并且可以创造属于自己的数据集进行对图片进行目标检测任务的实现。
2.1.2 COCO
这里简单说一下coco
MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。
COCO数据集是一个大型的、丰富的物体检测,分割和字幕数据集。这个数据集以scene understanding为目标,主要从复杂的日常场景中截取,图像中的目标通过精确的segmentation进行位置的标定。图像包括91类目标,328,000影像和2,500,000个label。目前为止有语义分割的最大数据集,提供的类别有80 类,有超过33 万张图片,其中20 万张有标注,整个数据集中个体的数目超过150 万个。
总的来说,无论数据集以什么格式存储在txt,xml甚至是工作表中。我们需要在算法的实现代码中实现能定位并使用这些各类数据的表达式。