detectron2——dataloader

本文介绍了Detectron2框架中dataloader的工作原理,包括默认的data loader如何从dataset中处理数据并转换为模型所需的格式。同时,详细阐述了如何自定义mapper函数以满足特定需求,例如将所有图片resize为固定大小。通过示例展示了如何重写mapper以实现这一功能,并提供了自定义dataloader的参考方法。

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

dataloader为模型提供数据,通常是从dataset中处理少量模型需要的信息,然后将它们传入模型。dataloader就是简单的Python迭代器,用于产生model能够接收的数据格式。

1、detectron2中现有的dataloader如何工作

两个函数:build_detection_{train,test}loader
函数作用:从给定的配置文件里面创建默认的data loader
函数工作流程:
1、从注册的数据集中load list[dict]数据,数据用轻量的格式表示。但是现在数据不是被输入内存,不是输入模型中。
2、list中的每一个dict都由mapper函数处理:
(1)mapper函数可以通过具体化build_detection
{train,test}_loader中的mapper来自定义这个函数,默认的mapper函数是DatasetMapper
(2)loader的输出格式随意,只要模型接受即可。loader对数据批处理以后,默认输出使用model中记录的默认模型输入格式
(3)loader的作用就是将从数据集中获取的轻量级格式变换为model需要的数据格式。
3、mapper输出以后直接成为一个batch(简单存在list)
4、成为batch以后的数据直接输入到model.forward

2、自定义dataloader

build_detection_{train,test}_loader(mapper=)重写mapper函数
比如重写mapper中把所有图片都rezise成固定大小:

import detectron2.data.transforms as T
from detectron2.data import DatasetMapper   # the default mapper
dataloader = build_detection_train_loader(cfg,
   mapper=DatasetMapper(cfg, is_train=True, augmentations=[
      T.Resize((800, 800))
   ]))
# use this dataloader instead of the default

如果默认mapper函数里面没有需要的功能,可以参考一下函数来写:

from detectron2.data import detection_utils as utils
 # Show how to implement a minimal mapper, similar to the default DatasetMapper
def mapper(dataset_dict):
    dataset_dict = copy.deepcopy(dataset_dict)  # it will be modified by code below
    # can use other ways to read image
    image = utils.read_image(dataset_dict["file_name"], format="BGR")
    # See "Data Augmentation" tutorial for details usage
    auginput = T.AugInput(image)
    transform = T.Resize((800, 800))(auginput)
    image = torch.from_numpy(auginput.image.transpose(2, 0, 1))
    annos = [
        utils.transform_instance_annotations(annotation, [transform], image.shape[1:])
        for annotation in dataset_dict.pop("annotations")
    ]
    return {
       # create the format that the model expects
       "image": image,
       "instances": utils.annotations_to_instances(annos, image.shape[1:])
    }
dataloader = build_detection_train_loader(cfg, mapper=mapper)

如果不止想要改mapper,只用build_detection_train_loader来改是不够的,那就需要重写dataloader。可以参见API documentation of detectron2.data
参考链接:detectron2——dataloader

### 如何对Detectron2模型进行微调训练 #### 准备环境和依赖项 为了成功地对Detectron2模型进行微调,需先设置好开发环境并安装必要的软件包。确保已按照官方指南完成Detectron2及其依赖库的安装[^3]。 #### 加载预训练模型 通常会基于COCO数据集上已经过良好训练的基础模型来进行进一步调整。这些预训练权重可以从Detectron2模型库获取,并作为初始化参数加载到新的网络结构中[^1]。 ```python from detectron2.config import get_cfg from detectron2.engine import DefaultTrainer, default_argument_parser, launch from detectron2.data.datasets import register_coco_instances cfg = get_cfg() # Load pre-trained model configuration and weights from Detectron2's Model Zoo. cfg.merge_from_file(model_zoo.get_config_file("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml")) cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml") ``` #### 配置新数据集 对于特定应用领域内的对象检测任务来说,往往需要针对该场景下的标注图片构建自己的数据集。这里以车牌为例说明如何注册自定义的数据集: ```python register_coco_instances("my_dataset_train", {}, "json_annotation_train.json", "path/to/image_dir") register_coco_instances("my_dataset_val", {}, "json_annotation_val.json", "path/to/image_dir") # Update the config to use your dataset instead of COCO cfg.DATASETS.TRAIN = ("my_dataset_train", ) cfg.DATASETS.TEST = () # no metrics implemented for this dataset cfg.DATALOADER.NUM_WORKERS = 2 ``` #### 修改超参数配置 根据实际需求修改一些重要的超参设定,比如批量大小、迭代次数以及学习率等。适当调整这些值有助于提升最终效果[^4]: ```python cfg.SOLVER.IMS_PER_BATCH = 2 cfg.SOLVER.BASE_LR = 0.00025 cfg.SOLVER.MAX_ITER = (300) cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128 cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1 # only has one class (license plate). (see https://detectron2.readthedocs.io/tutorials/datasets.html#update-the-config-for-new-datasets) ``` #### 开始训练过程 最后一步就是启动训练流程,默认情况下`DefaultTrainer`类提供了完整的实现逻辑,只需简单实例化即可开始工作[^2]。 ```python os.makedirs(cfg.OUTPUT_DIR, exist_ok=True) trainer = DefaultTrainer(cfg) trainer.resume_or_load(resume=False) trainer.train() ``` 通过上述步骤可以有效地利用迁移学习方法快速适配不同应用场景中的目标检测问题,同时保持较高的精度水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值