detectron2 DiffusionDet 训练自己的数据集

本文详细介绍了如何在Python环境中配置DiffusionDet项目,包括创建新环境、安装必要的库、克隆GitHub项目、以及如何在Detectron2中注册自定义COCO数据集,以便进行模型训练。

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

配环境
git clone https://github.com/ShoufaChen/DiffusionDet

# 创建环境
conda create -n diffusion python=3.9
conda activate diffusion
conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch
pip install opencv-python

# 安装detectron2
cd /data2/zy/DiffusionDet/
git clone https://github.com/facebookresearch/detectron2.git
python -m pip install -e detectron2

pip install timm # 不装就会报错 No module named 'timm' (diffusion) 
prepare datasets
mkdir -p datasets/coco
mkdir -p datasets/lvis

ln -s /path_to_coco_dataset/annotations datasets/coco/annotations
ln -s /path_to_coco_dataset/train2017 datasets/coco/train2017
ln -s /path_to_coco_dataset/val2017 datasets/coco/val2017
修改配置文件等

复制一份train_net.py,命名为train.py,在其中添加下列代码注册数据集

#引入以下注释
from detectron2.data import DatasetCatalog, MetadataCatalog
from detectron2.data.datasets.coco import load_coco_json
import pycocotools
#声明类别,尽量保持
CLASS_NAMES =["__background__","Inlet","Slightshort","Generalshort","Severeshort","Outlet"]
# 数据集路径
DATASET_ROOT = '/data2/zy/DiffusionDet/datasets/coco/'
ANN_ROOT = os.path.join(DATASET_ROOT, 'annotations')

TRAIN_PATH = os.path.join(DATASET_ROOT, 'train2017')
VAL_PATH = os.path.join(DATASET_ROOT, 'val2017')
TEST_PATH = os.path.join(DATASET_ROOT, 'test2017')

TRAIN_JSON = os.path.join(ANN_ROOT, 'instances_train2017.json')
VAL_JSON = os.path.join(ANN_ROOT, 'instances_val2017.json')
TEST_JSON = os.path.join(ANN_ROOT, 'instances_test2017.json')

# 声明数据集的子集
PREDEFINED_SPLITS_DATASET = {
    "coco_my_train": (TRAIN_PATH, TRAIN_JSON),
    "coco_my_val": (VAL_PATH, VAL_JSON),
}
#===========以下有两种注册数据集的方法,本人直接用的第二个plain_register_dataset的方式 也可以用register_dataset的形式==================
#注册数据集(这一步就是将自定义数据集注册进Detectron2)
def register_dataset():
    """
    purpose: register all splits of dataset with PREDEFINED_SPLITS_DATASET
    """
    for key, (image_root, json_file) in PREDEFINED_SPLITS_DATASET.items():
        register_dataset_instances(name=key,
                                   json_file=json_file,
                                   image_root=image_root)


#注册数据集实例,加载数据集中的对象实例
def register_dataset_instances(name, json_file, image_root):
    """
    purpose: register dataset to DatasetCatalog,
             register metadata to MetadataCatalog and set attribute
    """
    DatasetCatalog.register(name, lambda: load_coco_json(json_file, image_root, name))
    MetadataCatalog.get(name).set(json_file=json_file,
                                  image_root=image_root,
                                  evaluator_type="coco")

#=============================
# 注册数据集和元数据
def plain_register_dataset():
    #训练集
    DatasetCatalog.register("coco_my_train", lambda: load_coco_json(TRAIN_JSON, TRAIN_PATH))
    MetadataCatalog.get("coco_my_train").set(thing_classes=CLASS_NAMES,  # 可以选择开启,但是不能显示中文,这里需要注意,中文的话最好关闭
                                                    evaluator_type='coco', # 指定评估方式
                                                    json_file=TRAIN_JSON,
                                                    image_root=TRAIN_PATH)

    #DatasetCatalog.register("coco_my_val", lambda: load_coco_json(VAL_JSON, VAL_PATH, "coco_2017_val"))
    #验证/测试集
    DatasetCatalog.register("coco_my_val", lambda: load_coco_json(VAL_JSON, VAL_PATH))
    MetadataCatalog.get("coco_my_val").set(thing_classes=CLASS_NAMES, # 可以选择开启,但是不能显示中文,这里需要注意,中文的话最好关闭
                                                evaluator_type='coco', # 指定评估方式
                                                json_file=VAL_JSON,
                                                image_root=VAL_PATH)
# 查看数据集标注,可视化检查数据集标注是否正确,
#这个也可以自己写脚本判断,其实就是判断标注框是否超越图像边界
#可选择使用此方法
def checkout_dataset_annotation(name="coco_my_val"):
    #dataset_dicts = load_coco_json(TRAIN_JSON, TRAIN_PATH, name)
    dataset_dicts = load_coco_json(TRAIN_JSON, TRAIN_PATH)
    print(len(dataset_dicts))
    for i, d in enumerate(dataset_dicts,0):
        #print(d)
        img = cv2.imread(d["file_name"])
        visualizer = Visualizer(img[:, :, ::-1], metadata=MetadataCatalog.get(name), scale=1.5)
        vis = visualizer.draw_dataset_dict(d)
        #cv2.imshow('show', vis.get_image()[:, :, ::-1])
        cv2.imwrite('out/'+str(i) + '.jpg',vis.get_image()[:, :, ::-1])
        #cv2.waitKey(0)
        if i == 200:
            break

main中调用注册函数

def main(args):
    cfg = setup(args)
    register_dataset() # here to register
    if args.eval_only:
        model = Trainer.build_model(cfg)
        kwargs = may_get_ema_checkpointer(cfg, model)
        if cfg.MODEL_EMA.ENABLED:
            EMADetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR, **kwargs).resume_or_load(cfg.MODEL.WEIGHTS,
                                                                                              resume=args.resume)
        else:
            DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR, **kwargs).resume_or_load(cfg.MODEL.WEIGHTS,
                                                                                           resume=args.resume)
        res = Trainer.ema_test(cfg, model)
        if cfg.TEST.AUG.ENABLED:
            res.update(Trainer.test_with_TTA(cfg, model))
        if comm.is_main_process():
            verify_results(cfg, res)
        return res

    trainer = Trainer(cfg)
    trainer.resume_or_load(resume=args.resume)
    return trainer.train()

在 DiffisionDet/configs 下新建demo.yaml,主要是修改batchsize和max_iter

_BASE_: "Base-DiffusionDet.yaml"
MODEL:
  WEIGHTS: "detectron2://ImageNetPretrained/torchvision/R-50.pkl"
  RESNETS:
    DEPTH: 50
    STRIDE_IN_1X1: False
  DiffusionDet:
    NUM_PROPOSALS: 100
    NUM_CLASSES: 5
DATASETS:
  TRAIN: ("coco_my_train",)
  TEST:  ("coco_my_val",)
SOLVER:
  IMS_PER_BATCH: 16
  BASE_LR: 0.000025
  STEPS: (5850, 7000)
  MAX_ITER: 7500
  # TOTAL_NUM_IMAGES / (IMS_PER_BATCH * NUM_GPUS) * num_epochs = MAX_ITER
  # 2000/(16*1)*60=7500 
INPUT:
  MIN_SIZE_TRAIN: (800,)
  CROP:
    ENABLED: False
  FORMAT: "RGB"
OUTPUT_DIR: ./OUTPUT/bs16
训练
 python train.py --num-gpus 1     --config-file configs/diffdet.coco.res50.yaml

### DiffusionDet简介 DiffusionDet是一种创新的物体检测框架,该框架利用扩散模型来改进目标检测的效果[^1]。传统的目标检测算法通常依赖于卷积神经网络(CNNs),而DiffusionDet引入了一种新的视角——通过迭代地细化预测框的位置和类别置信度,从而获得更精确的结果。 #### 原理概述 在DiffusionDet中,初始阶段会生成一组随机分布的对象候选框。随着训练过程的发展,这些候选框逐渐被调整得更加接近真实标签位置。这种机制类似于图像去噪过程中逐步去除噪声的过程,因此被称为“扩散”。具体来说,模型学习了一个条件概率分布P(x_t|x_{t−1}),其中x表示对象状态向量(包括边界框坐标以及分类得分),t代表时间步数。随着时间推移(t→0),这个分布趋向于真实的标注数据分布Q(y)。 ```python import torch.nn as nn class DiffusionBlock(nn.Module): def __init__(self, input_channels, output_channels): super(DiffusionBlock, self).__init__() self.conv = nn.Conv2d(input_channels, output_channels, kernel_size=3, padding=1) def forward(self, x): return self.conv(x) ``` 此代码片段展示了如何定义一个简单的扩散模块类`DiffusionBlock`,它继承自PyTorch中的`nn.Module`基类,并实现了前馈传播逻辑。 #### 实现细节 为了有效地实现上述理论概念,研究者们设计了一系列技术手段: - **多尺度特征融合**:结合来自不同层次的感受野信息,增强对各种尺寸目标的理解能力; - **动态锚点分配策略**:根据当前估计的质量自动更新正负样本配对关系,促进更快收敛速度; - **渐进式难度控制方案**:按照一定规律增加任务复杂程度,使得模型能够平稳过渡到更高精度的要求下工作; 以上特性共同作用,使DiffusionDet能够在保持较低计算成本的前提下达到甚至超越现有先进水平的表现。 #### 应用场景 由于其出色的性能表现,特别是在处理具有挑战性的视觉识别问题上,DiffusionDet可以广泛应用于自动驾驶汽车感知系统、无人机监控平台等领域。此外,在医学影像分析方面也展现出巨大潜力,比如辅助医生快速准确地标记病变区域等。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值