mmdetection训练(1)voc格式的数据集(自制)


提前准备

voc数据集,mmdetection代码库

一、voc数据集

需要有以下三个文件夹的格式数据
(这里不需要完全按照vocdevkit/voc2007这种进行构建,下面教大家如何修改)
在这里插入图片描述
存放xml标签文件
在这里插入图片描述
放的train.txt,test.txt,和val.txt
在这里插入图片描述
存放原始的图片数据

二、修改配置代码进行训练(敲黑板!!!!!)

强调:这里包括以下的内容,均在自己创建模板文件下进行修改,原则上不对原始代码进行修改,修改原始代码繁琐且容易搞混破坏代码整体结构,以下均为自己创建配置文件,请自己按需改写(个人喜欢这样的配置方式)。

1.数据集相关内容修改

(1)configs/base/datasets/voc0712.py中
修改相关的路径与voc数据集保持一致(这个文件夹中只要修改路径不要修改别的东西)

# dataset settings
dataset_type = 'VOCDataset'
# data_root = 'data/VOCdevkit/'
data_root = '/home/ubuntu/data/Official-SSDD-OPEN/BBox_SSDD/'

# Example to use different file client
# Method 1: simply set the data root and let the file I/O module
# automatically Infer from prefix (not support LMDB and Memcache yet)

# data_root = 's3://openmmlab/datasets/detection/segmentation/VOCdevkit/'

# Method 2: Use `backend_args`, `file_client_args` in versions before 3.0.0rc6
# backend_args = dict(
#     backend='petrel',
#     path_mapping=dict({
#         './data/': 's3://openmmlab/datasets/segmentation/',
#         'data/': 's3://openmmlab/datasets/segmentation/'
#     }))
backend_args = None

###数据增强的方法
train_pipeline = [
    dict(type='LoadImageFromFile', backend_args=backend_args),
    dict(type='LoadAnnotations', with_bbox=True),
    dict(type='Resize', scale=(1000, 600), keep_ratio=True),
    dict(type='RandomFlip', prob=0.5),
    dict(type='PackDetInputs')
]
test_pipeline = [
    dict(type='LoadImageFromFile', backend_args=backend_args),
    dict(type='Resize', scale=(1000, 600), keep_ratio=True),
    # avoid bboxes being resized
    dict(type='LoadAnnotations', with_bbox=True),
    dict(
        type='PackDetInputs',
        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
                   'scale_factor'))
]

###数据加载
train_dataloader = dict(
    batch_size=2,
    num_workers=2,
    persistent_workers=True,
    sampler=dict(type='DefaultSampler', shuffle=True),
    batch_sampler=dict(type='AspectRatioBatchSampler'),
    dataset=dict(
        type='RepeatDataset',
        times=3,
        dataset=dict(
            type='ConcatDataset',
            # VOCDataset will add different `dataset_type` in dataset.metainfo,
            # which will get error if using ConcatDataset. Adding
            # `ignore_keys` can avoid this error.
            ignore_keys=['dataset_type'],
            datasets=[
                dict(
                    type=dataset_type,
                    data_root=data_root,
                    # ann_file='VOC2007/ImageSets/Main/trainval.txt',
                    ann_file='voc_style/ImageSets/Main/train.txt',
                    data_prefix=dict(sub_data_root='voc_style/'),
                    filter_cfg=dict(
                        filter_empty_gt=True, min_size=32, bbox_min_size=32
                        ),
                    pipeline=train_pipeline,
                    backend_args=backend_args),
                # dict(
                #     type=dataset_type,
                #     data_root=data_root,
                #     ann_file='VOC2012/ImageSets/Main/trainval.txt',
                #     data_prefix=dict(sub_data_root='VOC2012/'),
                #     filter_cfg=dict(
                #         filter_empty_gt=True, min_size=32, bbox_min_size=32),
                #     pipeline=train_pipeline,
                #     backend_args=backend_args)
            ])))

val_dataloader = dict(
    batch_size=1,
    num_workers=2,
    persistent_workers=True,
    drop_last=False,
    sampler=dict(type='DefaultSampler', shuffle=False),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        ann_file='voc_style/ImageSets/Main/test.txt',
        data_prefix=dict(sub_data_root='voc_style/'),
        test_mode=True,
        pipeline=test_pipeline,
        backend_args=backend_args))
test_dataloader = val_dataloader

# Pascal VOC2007 uses `11points` as default evaluate mode, while PASCAL
# VOC2012 defaults to use 'area'.
val_evaluator = dict(type='VOCMetric', metric='mAP', eval_mode='11points')
test_evaluator = val_evaluator

(2)修改 mmdet/datasets/voc.py文件
修改自己数据集的类别信息与框的颜色,并且一定注释取消voc2007和2012版本判断的要求,方便后面使用自己的数据集路径。

# Copyright (c) OpenMMLab. All rights reserved.
from mmdet.registry import DATASETS
from .xml_style import XMLDataset


@DATASETS.register_module()
class VOCDataset(XMLDataset):
    """Dataset for PASCAL VOC."""


    # 标准的voc格式类别信息
    # METAINFO = {
    #     'classes':
    #     ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat',
    #      'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person',
    #      'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'),
    #     # palette is a list of color tuples, which is used for visualization.
    #     'palette': [(106, 0, 228), (119, 11, 32), (165, 42, 42), (0, 0, 192),
    #                 (197, 226, 255), (0, 60, 100), (0, 0, 142), (255, 77, 255),
    #                 (153, 69, 1), (120, 166, 157), (0, 182, 199),
    #                 (0, 226, 252), (182, 182, 255), (0, 0, 230), (220, 20, 60),
    #                 (163, 255, 0), (0, 82, 0), (3, 95, 161), (0, 80, 100),
    #                 (183, 130, 88)]
    # }


    ### 修改的数据类别信息
    METAINFO = {
        'classes':
        ('ship', ),
        # palette is a list of color tuples, which is used for visualization.
        'palette': [(106, 0, 228)]
    }


    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # if 'VOC2007' in self.sub_data_root:
        #     self._metainfo['dataset_type'] = 'VOC2007'
        # elif 'VOC2012' in self.sub_data_root:
        #     self._metainfo['dataset_type'] = 'VOC2012'
        # else:
        #     self._metainfo['dataset_type'] = None

(3)修改网络配置文件中的输出类别(非必须操作)
configs/base/models/faster-rcnn_r50_fpn.py

2.自定义配置文件构建

(1)在代码根目录新建myconfig.py的文件,
(2)复制以下内容到其中:
新的配置文件主要是分为三个部分
1、倒入相应的库文件(base
2、模型加载文件:一定要家在修改num_classses=‘你的类别’
3、数据集配置:直接复制configs/base/datasets/voc0712.py即可

# 新配置继承了基本配置,并做了必要的修改
# _base_ = './configs/faster_rcnn/mask-rcnn_r50-caffe_fpn_ms-poly-1x_coco.py'
_base_ = './configs/faster_rcnn/faster-rcnn_r50_fpn_1x_voc.py'
# 我们还需要更改 head 中的 num_classes 以匹配数据集中的类别数
########------模型相关配置--------#########
model = dict(
    roi_head=dict(
        bbox_head=dict(num_classes=1)))
 
########------修改数据集相关配置--------#########
backend_args = None

# dataset settings

dataset_type = 'VOCDataset'
# data_root = 'data/VOCdevkit/'
data_root = '/home/ubuntu/data/Official-SSDD-OPEN/BBox_SSDD/'

###数据增强的方法
train_pipeline = [
    dict(type='LoadImageFromFile', backend_args=backend_args),
    dict(type='LoadAnnotations', with_bbox=True),
    dict(type='Resize', scale=(1000, 600), keep_ratio=True),
    dict(type='RandomFlip', prob=0.5),
    dict(type='PackDetInputs')
]
test_pipeline = [
    dict(type='LoadImageFromFile', backend_args=backend_args),
    dict(type='Resize', scale=(1000, 600), keep_ratio=True),
    # avoid bboxes being resized
    dict(type='LoadAnnotations', with_bbox=True),
    dict(
        type='PackDetInputs',
        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
                   'scale_factor'))
]

###数据加载
train_dataloader = dict(
    batch_size=2,
    num_workers=2,
    persistent_workers=True,
    sampler=dict(type='DefaultSampler', shuffle=True),
    batch_sampler=dict(type='AspectRatioBatchSampler'),
    dataset=dict(
        type='RepeatDataset',
        times=3,
        dataset=dict(
            type='ConcatDataset',
            # VOCDataset will add different `dataset_type` in dataset.metainfo,
            # which will get error if using ConcatDataset. Adding
            # `ignore_keys` can avoid this error.
            ignore_keys=['dataset_type'],
            datasets=[
                dict(
                    type=dataset_type,
                    data_root=data_root,
                    # ann_file='VOC2007/ImageSets/Main/trainval.txt',
                    ann_file='voc_style/ImageSets/Main/train.txt',
                    data_prefix=dict(sub_data_root='voc_style/'),
                    filter_cfg=dict(
                        filter_empty_gt=True, min_size=32, bbox_min_size=32
                        ),
                    pipeline=train_pipeline,
                    backend_args=backend_args),
                # dict(
                #     type=dataset_type,
                #     data_root=data_root,
                #     ann_file='VOC2012/ImageSets/Main/trainval.txt',
                #     data_prefix=dict(sub_data_root='VOC2012/'),
                #     filter_cfg=dict(
                #         filter_empty_gt=True, min_size=32, bbox_min_size=32),
                #     pipeline=train_pipeline,
                #     backend_args=backend_args)
            ])))

val_dataloader = dict(
    batch_size=1,
    num_workers=2,
    persistent_workers=True,
    drop_last=False,
    sampler=dict(type='DefaultSampler', shuffle=False),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        ann_file='voc_style/ImageSets/Main/test.txt',
        data_prefix=dict(sub_data_root='voc_style/'),
        test_mode=True,
        pipeline=test_pipeline,
        backend_args=backend_args))
test_dataloader = val_dataloader
###数据加载
train_dataloader = dict(
    batch_size=2,
    num_workers=2,
    persistent_workers=True,
    sampler=dict(type='DefaultSampler', shuffle=True),
    batch_sampler=dict(type='AspectRatioBatchSampler'),
    dataset=dict(
        type='RepeatDataset',
        times=3,
        dataset=dict(
            type='ConcatDataset',
            # VOCDataset will add different `dataset_type` in dataset.metainfo,
            # which will get error if using ConcatDataset. Adding
            # `ignore_keys` can avoid this error.
            ignore_keys=['dataset_type'],
            datasets=[
                dict(
                    type=dataset_type,
                    data_root=data_root,
                    # ann_file='VOC2007/ImageSets/Main/trainval.txt',
                    ann_file='voc_style/ImageSets/Main/train.txt',
                    data_prefix=dict(sub_data_root='voc_style/'),
                    filter_cfg=dict(
                        filter_empty_gt=True, min_size=32, bbox_min_size=32
                        ),
                    pipeline=train_pipeline,
                    backend_args=backend_args),
                # dict(
                #     type=dataset_type,
                #     data_root=data_root,
                #     ann_file='VOC2012/ImageSets/Main/trainval.txt',
                #     data_prefix=dict(sub_data_root='VOC2012/'),
                #     filter_cfg=dict(
                #         filter_empty_gt=True, min_size=32, bbox_min_size=32),
                #     pipeline=train_pipeline,
                #     backend_args=backend_args)
            ])))

val_dataloader = dict(
    batch_size=1,
    num_workers=2,
    persistent_workers=True,
    drop_last=False,
    sampler=dict(type='DefaultSampler', shuffle=False),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        ann_file='voc_style/ImageSets/Main/test.txt',
        data_prefix=dict(sub_data_root='voc_style/'),
        test_mode=True,
        pipeline=test_pipeline,
        backend_args=backend_args))
test_dataloader = val_dataloader




 
# 使用预训练的 Mask R-CNN 模型权重来做初始化,可以提高模型性能
# load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'

三、训练及其评估测试

模型训练的命令:

python tools/train.py myconfig_voc.py```
模型测试的命令

```bash
在这里插入代码片

总结

训练遇到的问题
记录下遇到的问题。训练SSDD数据集的时候,发现coco格式训练正常,但voc格式训练出现map值很低,一直升不上去。试了下2.x版本的mmdetection训练voc格式没问题,解决方案是在configs/base/datasets/voc0712.py中删掉bbox_min_size=32即可,原文链接:https://blog.csdn.net/Pliter/article/details/134389961

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
### 回答1: 我可以尝试帮你解决这个问题。首先,你需要下载VOC数据集,然后将其转换为MMDetection可以识别的格式。接着,您可以使用预训练的模型进行训练,或者按照MMDetection框架中的步骤手动训练模型。 ### 回答2: mmdetection是一个开源的基于PyTorch的目标检测工具箱,用于训练和推理各种目标检测模型。它支持多种数据格式,包括Pascal VOC数据集。 要使用mmdetection训练VOC数据集,首先需要准备VOC数据集的标注文件和图像。VOC数据集通常包含JPEG格式的图像文件和对应的XML格式的标注文件,其中包含目标类别、边界框坐标等信息。 接下来,需要在mmdetection的配置文件中对训练参数进行设置。配置文件是一个Python格式的脚本,包含了模型结构、数据增强、训练参数等信息。可以根据需求选择合适的模型结构,例如Faster R-CNN、SSD等。还可以设置训练时的超参数,如学习率、优化器类型等。 在配置文件中,需要设置数据集的相关参数。mmdetection提供了相应的数据集类,可以根据VOC数据集的特点进行配置。需要指定数据集的路径、类别列表、图像和标注文件的文件名等。 完成配置文件的设置后,可以使用mmdetection提供的命令行工具进行训练。通过运行相应的命令,mmdetection会根据配置文件中的设置加载数据集并进行训练训练过程中,mmdetection会逐渐优化模型参数,使其能够更好地检测目标。 训练完成后,可以使用训练得到的模型进行目标检测。可以通过加载模型和输入图像,调用mmdetection提供的API进行目标检测操作。这样就可以利用训练好的模型对VOC数据集中的图像进行目标检测了。 总之,使用mmdetection训练VOC数据集需要准备数据集和标注文件,设置好模型和训练参数的配置文件,然后使用mmdetection提供的命令行工具进行训练训练完成后,可以使用训练好的模型进行目标检测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值