将数据集做成VOC2007格式用于Faster-RCNN训练

该博客详细介绍了如何将数据集转化为VOC2007格式,以便用于Faster R-CNN的目标检测训练。步骤包括设定文件夹名,规范图片命名,绘制目标边界框,创建XML文件,将XML保存到Annotations目录,以及整理训练图片到JPEGImages文件夹,并更新ImageSetsMain的txt文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


0.文件夹名

首先,确定你的数据集所放的文件夹名字,例如我的叫logos。

(或者和voc2007一样的名字:VOC2007)

1.图片命名

虽然说图片名对训练没什么影响,但建议还是按VOC2007那样,如“000005.jpg”这种形式。至于图片格式,代码里是写的jpg。
批量修改图片名字为VOC2007格式可以参考以下Matlab代码:
%%
%图片保存路径为:
%E:\image\car
%E:\image\person
%car和person是保存车和行人的文件夹
%这些文件夹还可以有多个,
%放在image文件夹里就行
%该代码的作用是将图片名字改成000123.jpg这种形式
%%
clc;
clear;

maindir='E:\image\';
name_long=5; %图片名字的长度,如000123.jpg为6,最多9位,可修改
num_begin=1; %图像命名开始的数字如000123.jpg开始的话就是123

subdir = dir(maindir);
n=1;

for i = 1:length(subdir)
  if ~strcmp(subdir(i).name ,'.') && ~strcmp(subdir(i).name,'..')
     subsubdir = dir(strcat(maindir,subdir(i).name));
    for j=1:length(subsubdir)
         if ~strcmp(subsubdir(j).name ,'.') && ~strcmp(subsubdir(j).name,'..')
            img=imread([maindir,subdir(i).name,'\',subsubdir(j).name]);
            imshow(img);
            str=num2str(num_begin,'%09d');
            newname=strcat(str,'.jpg');
            newname=newname(end-(name_long+3):end);
            system(['rename ' [maindir,subdir(i).name,'\',subsubdir(j).name] ' ' newname]);
            num_begin=num_begin+1;
            fprintf('当前处理文件夹%s',subdir(i).name);
            fprintf('已经处理%d张图片\n',n);
            n=n+1;
           pause(0.1);%可以将暂停去掉
         end
    end
  end
end
图片名如果比较特殊或者像1(1).jpg等这类可能无法重命名,可以使用imwrite,如:

imwrite(img,strcat(save_path,newname));%改名后保存到另一文件夹,原图片不变
也可以使用Total Commander来批量重命名,非常方便,推荐使用这个工具。
下载地址:
### 使用Faster R-CNN训练自定义数据集 #### 准备工作 为了使用Faster R-CNN模型训练自定义数据集,需先准备好数据集并将其转换成适合该模型处理的格式。通常情况下,这涉及到创建类似于PASCAL VOC标准结构的数据集目录[^3]。 对于`.txt`格式标注文件而言,每一行代表一个对象实例,其中包含了类别标签以及边界框坐标(xmin, ymin, xmax, ymax),这些信息应当被解析出来用于后续操作。 #### 数据预处理 构建符合要求的数据集结构之后,下一步是对图像及其对应的标注信息做进一步整理: - **读取图片路径**:遍历`JPEGImages`文件夹获取所有待处理样本; - **加载标注详情**:依据相应规则解析位于`Annotations`下的XML文档或是直接从指定位置读入简单的文本记录; 确保每张输入图片都有唯一ID关联至具体的矩形框描述列表,以便于后续步骤中的匹配查找过程顺利开展。 #### 实现细节 下面给出一段基于PyTorch框架实现上述逻辑的关键代码片段作为参考: ```python import os from xml.etree import ElementTree as ET import torch.utils.data as data class CustomDataset(data.Dataset): def __init__(self, root_dir='path/to/VOC2007', set_type='train'): self.root = root_dir image_set_file = os.path.join(self.root, 'ImageSets/Main/{}.txt'.format(set_type)) with open(image_set_file) as f: ids = [line.strip() for line in f.readlines()] self.ids = ids def _parse_voc_xml(self, node): voc_dict = {} children = list(node) if not children: return node.text for child in children: item_list = [] class_name = child.tag.replace('-', '_') value = self._parse_voc_xml(child) if isinstance(value, dict): item = {class_name: value} elif type(value) is str and len(value.split())>1 : item={class_name:value.split()} else: item = {class_name: value} item_list.append(item) if class_name in voc_dict.keys(): if type(voc_dict[class_name]) is list: voc_dict[class_name].extend(item_list) else: voc_dict[class_name] = [voc_dict[class_name]] voc_dict[class_name].extend(item_list) else: voc_dict.update({class_name:item}) return voc_dict def parse_annotation(self,id_): anno_path=os.path.join(self.root,'Annotations','{}.xml'.format(id_)) tree=ET.parse(anno_path) objs=self._parse_voc_xml(tree.getroot()) boxes=[] labels=[] for obj in objs['object']: bbox=obj['bndbox'] box=[float(bbox[tag])for tag in ['xmin','ymin','xmax','ymax']] label=int(obj['name']) # 假设名称已经被映射成了整数索引 boxes.append(box) labels.append(label) return {'boxes':torch.tensor(boxes,dtype=torch.float32), 'labels':torch.tensor(labels)} ``` 此部分展示了如何继承`data.Dataset`类来定制化自己的数据源接口,并实现了基本的功能函数用以完成对单个样本的信息抽取任务。注意这里假设已经完成了类别名到数值型编码之间的映射关系建立,在实际应用当中还需要额外考虑这一点。 #### 模型配置与训练 当一切准备就绪后,则可参照官方教程或者其他开源项目资源来进行具体建模环节的操作了。比如设置超参数、初始化权重、定义损失计算方式等等。由于这部分内容较为复杂且依赖特定环境搭建情况,因此建议参阅相关资料深入学习[^4]。
评论 147
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值