VOC数据集制作

article/2025/10/29 18:42:18

VOC数据集制作

  • 1 获取数据
    • 1.1 获取图片
    • 1.2 图片大小重置
    • 1.3 图片重命名
  • 2 标记图片
  • 3 按照PascalVOC数据集的格式整理自己的数据
  • 4 划分训练集和测试集

1 获取数据

1.1 获取图片

对于数据的获取,可以是图片形式,也可以是视频形式,但最终将转化成图片的形式进行数据集的制作。如果是图片的话,可以直接略去这一步,如果是视频文件,我们利用下列代码将数据转化成图片。

import cv2
import os
import sys
#参数1包含视频片段的路径
input_path = "./video"
#参数2设定每隔多少帧截取一帧
fram_interval = 7
#列出文件夹下所有的视频文件
filenames = os.listdir(input_path)
#获取文件夹名称
video_prefix = input_path.split(os.sep)[-1]
#建立一个新文件夹,名称为原文件夹名称后加上_frames
frame_path = '{}_frame'.format(input_path)
if not os.path.exists(frame_path):os.mkdir(frame_path)
#初始化一个VideoCapture对象
cap = cv2.VideoCapture()
#遍历所有文件
for filename in filenames:filepath = os.sep.join([input_path,filename])    #VideoCapture::open函数可以从文件获取视频cap.open(filepath)    #获取视频帧数n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))        # 对于一些低画质的摄像头,前面的帧可能不稳定,略过for i in range(42):cap.read()        for i in range(n_frames):ret, frame = cap.read()        #每隔frame_interval帧进行一次截屏操作if i % fram_interval == 0:imagename = '{}_{:0>6d}.jpg'.format(filename.split('.')[0],i)imagepath = os.sep.join([frame_path,imagename])print('exported {}!'.format(imagepath))cv2.imwrite(imagepath,frame)           
#执行结束释放资源
cap.release()

1.2 图片大小重置

对于我们获取到的图片,有可能大小不一,我们需要先将图片的大小统一,使用下面的代码:

import cv2
import glob
import osimage_path = "./pictures/old/*.jpg"  # 原始图片路径
output_path = "./pictures/new/"   # 修改后的保存路径
count = 0
for jpgfile in glob.glob(image_path):count += 1#img = Image.open(jpgfile)image = cv2.imread(jpgfile  )image = cv2.resize(image,(1280,720),interpolation=cv2.INTER_CUBIC)cv2.imwrite(os.path.join(output_path,os.path.basename(jpgfile)), image)print("save%d"%count)
print("resize finished!")

1.3 图片重命名

对于获取到的图片,最好按照一个统一的格式编号进行命名,以便后续增加新的图片进来,使用如下代码进行图片的重命名:

import os
path=input('请输入文件路径(结尾加上/):')       #获取该目录下所有文件,存入列表中
fileList=os.listdir(path)
n=0
m=0   # 图片编号从m+1开始
for i in fileList:    #设置旧文件名(就是路径+文件名)oldname=path+ os.sep + fileList[n]   # os.sep添加系统分隔符    #设置新文件名newname=path+os.sep +"train"+str(m+1)+".jpg"   os.rename(oldname,newname)   #用os模块中的rename方法对文件改名print(oldname,'======>',newname)n+=1m+=1

2 标记图片

根据PascalVOC数据集的需要,使用Labelimg工具对图片进行标注,标注后会生成XML文件,如下图所示:
在这里插入图片描述
第一步:安装Labelimg,打开命令提示符,在其中输入如下命令:(如果是安装在anaconda的某个虚拟环境中,则需要先启动虚拟环境,再输入下面的命令)

pip install labelimg

第二步:打开labelimg,只需在命令提示符中输入命令:

labelimg

在这里插入图片描述
第三步:设置xml文件保存的位置和需要标记的图片位置
在这里插入图片描述
第四步:设置软件。点击左上角的“Edit”,取消选中“Draw Squares”,这样我们在对图片进行标注的时候,标注框的长宽比才是可变的,不然只能标记正方形的框。
在这里插入图片描述

第五步:开始标注。按一下键盘上的“W”键,鼠标所在的地方会出现十字形,然后按住鼠标左键,拖动鼠标即可画出一个矩形框,松开鼠标左键后,会弹出来一个对话框,在里面输入所标记物体的类别名(只需给类别名第一次出现时进行输入,后续标记该类物体时,可以直接在下面进行双击选择)。重复该操作标记图片中所有的物体。
在这里插入图片描述
第六步:图片的保存和切换。一种方法是:当标记完图片中所有物体时,先保存,再切换下一张图片,当然也可以切换上一张图片,通过左边的功能区按钮进行操作。
在这里插入图片描述
这样的方法显然很麻烦,因此可以设置自动保存图片,就不用每标记一张图片按一次保存按钮了。具体方法是,点击左上方的“View”,再选中“Auto Save mode”。
在这里插入图片描述
另外,还有三个常用的快捷键:
Ctrl+S:保存
D:下一张图片
A:上一张图片

3 按照PascalVOC数据集的格式整理自己的数据

我分别建立了VOCTrainval和VOCTest两个数据文件,分别用于训练和测试,大家也可以不分开,后面进行训练和测试数据划分就行了,两个文件夹都按照PascalVOC的格式建立。PascalVOC数据集包含了5个部分,在实验中我们只需要用到一下三个文件夹:
1) Annatations文件夹
文件夹存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片。
2)JPEGImages文件夹
文件夹里包含了训练图片或测试图片。
3)ImageSets文件夹
该文件夹里原有三个子文件夹,但实验中我们仅需要使用Main文件夹里面的信息,存放的是图像物体识别的数据,有train.txt, val.txt ,trainval.txt.这三个文件(VOCTrainval文件夹下)或者test.txt 文件(VOCTest)。这几个文件我们后面会生成。
按照要求,将自己的图片放入JPEGImages文件夹,将标注信息xml文件放入Annatations文件夹:
在这里插入图片描述
在这里插入图片描述

4 划分训练集和测试集

训练时要有测试集和训练集,如果在制作数据集的时候没有像我一样进行区分,那么在这里就需要使用代码将数据进行划分,放在ImageSets\Main文件夹下。代码如下,至于训练验证集和测试集的划分比例,以及训练集和验证集的划分比例,根据自己的数据情况决定。使用下面的代码进行划分:

import os  
import random   xmlfilepath=r'./VOCData/VOCTrainVal/Annotations/'  #xml文件的路径
saveBasePath=r'./VOCData/VOCTrainVal/ImageSets/' #生成的txt文件的保存路径trainval_percent=0.9   # 训练验证集占整个数据集的比重(划分训练集和测试验证集)
train_percent=0.8     # 训练集占整个训练验证集的比重(划分训练集和验证集)
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)    print("train and val size",tv)  
print("traub suze",tr)  
ftrainval = open(os.path.join(saveBasePath,'Main/trainval.txt'), 'w')    
ftest = open(os.path.join(saveBasePath,'Main/test.txt'), 'w')    
ftrain = open(os.path.join(saveBasePath,'Main/train.txt'), 'w')    
fval = open(os.path.join(saveBasePath,'Main/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() 

运行后,得到ImageSets\Main\文件下的几个.txt文件。
在这里插入图片描述
到此数据集制作完成!


http://chatgpt.dhexx.cn/article/XbCmDpSp.shtml

相关文章

VOC数据集介绍

1、VOC数据集下载 ubuntu系统下打开终端输入命令即可下载 wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar wget http://host.robots.ox.ac.uk/pascal/VOC/…

Voc数据集简述

文章目录 一、了解VOC1.1 voc数据集下载 二、VOC文件结构2.1 Annotations2.2 ImageSets2.3 JPEGImages2.4 SegmentationClass2.5 SegmentationObject 三、目标检测任务四、语义分割任务五、实例分割任务六、类别索引与名称对应关系 一、了解VOC 是一种数据集的格式——VOC格式…

【DataWhale Obj Dec Task01】目标检测基础

目标检测的基本概念 报名参加datawhale的目标检测组队学习,虽然做objdec有一段时间了,但是还没有系统的记录过自己的学习历程,就借此机会记录一下自己的感想和经历吧,就当是记笔记了。 理解 目标检测实际上也是一种分类算法&am…

【目标检测】VOC数据集介绍

数据集介绍 VOC数据集是目标检测领域最常用的标准数据集之一,在类别上可以分为4大类,20小类 Annotations 进行 detection 任务时的标签文件,xml 形式,文件名与图片名一一对应ImageSets 包含三个子文件夹 Layout、Main、Segmentat…

VOC数据集简介与制作

一、VOC数据集简介 1.1 VOC的任务 PASCAL VOC 挑战赛主要有 Object Classification (分类)、Object Detection(检测)、Object Segmentation(分割)、Human Layout、Action Classification 这几类子任务。 …

详解 VOC 数据集

本视频配套视频链接:https://www.bilibili.com/video/BV1ZL4y1p7Cz/ 我们先来介绍一个经典的数据集:VOC 数据集。Visual Object Class 的首字母缩写,它的官方地址为 http://host.robots.ox.ac.uk/pascal/VOC/。 虽然现在大家更倾向于使用我…

测试报告编写,测试结果编写

测试报告,就是向整个团队告诉你的测试情况,以及发现一些问题说明。 所以: 第一步,先告诉别人,你的测试结果,测试结果只有两种,测试通过/测试未通过。 第二步,写出这个需求的提测的…

软件测试项目测试报告总结

测试计划概念:就在软件测试工作实施之前明确测试对象,并且通过资源、时间、风险、测试范围和预算等方面的综合分析和规划,保证有效的实施软件测试。 需求挖掘的6个方面: 1、输入方面 2、处理方面 3、结果输出方面 4、性能需求…

稳定性测试-几点总结

混合场景业务比例: 稳定性测试一般基于混合场景进行压测,业务比例由项目组人员给出。(最好基于线上业务调用量情况进行统计,但大部分系统没有该数据,那就由他们自己拍脑袋吧) PS: JMeter控制业务比例用 th…

测试总结报告模板

1. 编写目的 [简述本报告的目的。例如:本测试报告为XX项目的测试总结报告,目的在于总结测试阶段的测试及分析测试结果,描述系统是否符合需求(或达到XX功能目标),同时对软件质量进行相关的评估,…

性能测试结果分析结果

在做性能测试的时候,在使用LR或者jmeter等一些性能测试工具测试执行结束后,首先要做的是判断采集到的结果数据是否真实有效。多数的性能测试场景都要迭代的进行测试,因此很多测试结果本身就不能反应问题,深入分析这样的结果没啥意…

主观评价测试

一、静物测试 1.测试目的:测试IPC在室内正常照度场景下的效果 2.测试设备:色温照度计,激光红外测距仪 3.测试环境:在不同色温环境下A,TL84 CWF D65对静物场景测试图卡和人物进行拍摄,观察图像和人物效果&#xff08…

测试总结的重要性

测试总结很重要,包括项目整理的总结、个人的总结、小组的总结;做项目总结,是为了梳理整个过程,明确问题和找到原因,改进整个流程和推进项目状态越来越好。 自己目前所做的是项目的总结,会针对三方做一个总结&#xff0…

测试总结该怎么写...

最近参与了几次面试,面试者的简历中都会提及:需求或者版本测试结束后会进行版本总结,而不仅仅是提供一份测试报告。 于是特意追问了一下,总结中都包含什么内容,答复上基本都是围绕此次测试过程中发现的BUG数量以及修复…

如何分析测试结果和评估测试工作的质量

软件测试中每一项测试活动都会产生测试结果,通过测试结果来评估产品的质量体现了测试的目的和价值。而通过测试结果评估测试工作本身的质量也非常重要,能让我们及时发现测试中存在的问题,并及时改正,是测试工作进行持续改进的基础…

测试报告怎么写?

测试报告是一份描述软件的测试过程、测试环境、测试范围、测试结果的文档,用来分析总结系统存在的风险以及测试结论。 (1)测试过程测试过程需要对测试人员、测试时间、测试地点、测试版本等信息进行描述。其他测试过程中发生的关键信息均可在…

评测报告的结论如何写?

背景 最近组内同学开始编写评测报告,报告中的结论中存在以下几种情况: 1.结论是一大段文字,像散文一样 2.评测数据结果中存在多个数据维度,将所有的数据结果都罗列到结论中,主要信息不突出 3.只是将评测数据罗列到…

【Linux】syscall系统调用原理及实现

一、什么是系统调用 系统调用 跟用户自定义函数一样也是一个函数,不同的是 系统调用 运行在内核态,而用户自定义函数运行在用户态。由于某些指令(如设置时钟、关闭/打开中断和I/O操作等)只能运行在内核态,所以操作系统…

Syscall的实现

1. How does syscall works 2. Kernel定义一个系统调用的表sys_call_table,这个表定义了每个系统调用的: 系统调用号NR_xxx 及其对应的系统调用的处理函数, 系统调用号对应sys_call_table[]数组的下标, 数组项的值保存系统调用的处理函数, 如下: 3. 如下,…