detectron2 DiffusionDet 训练自己的数据集

配环境
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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 要使用Detectron2训练自己的数据集,需要进行以下步骤: 1. 准备数据集:将自己的数据集转换为COCO格式,并将其分为训练集、验证集和测试集。 2. 安装Detectron2:在本地或云服务器上安装Detectron2。 3. 配置训练参数:根据自己的数据集和需求,配置训练参数,如学习率、迭代次数等。 4. 训练模型:使用命令行启动训练程序,开始训练模型。 5. 评估模型:使用命令行启动评估程序,评估训练好的模型在验证集和测试集上的表现。 6. 使用模型:将训练好的模型应用于自己的应用场景中,如目标检测、实例分割等。 以上是使用Detectron2训练自己的数据集的基本步骤,具体实现过程可以参考Detectron2官方文档。 ### 回答2: Detectron2是一个流行的目标检测平台,它使用Python编写,基于PyTorch实现,是Facebook AI Research的研究项目。使用Detectron2,我们可以轻松地训练自己的数据集,实现目标检测任务。本文将介绍如何使用Detectron2训练自己的数据集。 第一步是准备训练数据集。我们需要将数据集按照一定的格式组织起来。Detectron2使用COCO标准格式来描述训练数据集。标注文件应该是JSON格式的,其中包含了每张图像的标注信息。一个标注文件中应该包含以下信息:图像的文件名、宽度和高度、所有物体的类别、位置、大小和关键点信息。为了使用Detectron2训练模型,我们需要将数据集中的图像和对应的标注文件存放在同一个文件夹中。 第二步是创建配置文件。Detectron2使用YAML文件来配置训练过程的参数。在YAML文件中,我们需要指定模型的参数、数据集路径、训练和测试的批次大小、优化器等参数。可以从Detectron2官方提供的配置文件模板中选择一个来进行修改。在配置文件中,需要指定数据集的路径、类别数量、图像大小、训练和测试批次大小、学习率、迭代次数等参数。 第三步是训练模型。在完成数据集的准备和配置文件的修改后,我们可以开始训练模型。使用Detectron2提供的命令行工具,我们可以轻松地启动训练过程。在训练过程中,我们可以监测模型的损失值和准确率等指标,从而了解模型的训练情况。通常情况下,我们需要在不同的迭代次数时保存模型并生成评估结果,从而了解模型的性能。 第四步是测试模型。在完成模型训练后,我们需要测试模型的性能。使用测试数据集,我们可以计算模型的平均精度(AP)指标。为了测试模型,我们需要使用Detectron2提供的evaluator命令,将测试结果保存为JSON格式的文件。可以使用COCO API来计算AP指标。在测试模型时,我们需要确保模型能够正确识别测试数据集中的目标。 以上就是用Detectron2训练自己的数据集的基本流程。在实际操作中,我们还需要对数据集进行预处理、数据增强等操作,以提高模型的性能。同时,在选择模型时,我们需要考虑不同的架构、参数数量、训练时间和精度指标。Detectron2提供了许多预训练模型,我们可以根据自己的需求选择合适的模型进行训练。通过不断尝试和调整参数,我们可以训练出高准确率的目标检测模型。 ### 回答3: Detectron2是由Facebook AI Research开发的最新版本的目标检测框架,它使用现代深度学习算法来训练高质量的对象检测模型。为了训练自己的数据集,我们需要完成以下几个步骤: 步骤 1:安装Detectron2 首先,我们需要安装Detectron2。我们可以通过Github上的源代码来访问它。请先安装依赖库(如Cython, protobuf, opencv-python等),然后下载安装Detectron2的源代码。使用命令pip install detectron2安装Detectron2 其中包括COCOAPI。安装完毕后,我们需要将代码克隆到本地并设置环境变量。运行以下命令: git clone https://github.com/facebookresearch/detectron2.git cd detectron2 python setup.py build develop 步骤 2:准备数据 第二步是准备数据。我们需要先将数据标注,以便可以在训练中使用。标注数据可以采用Labelme等工具完成。标注数据通常是一个JSON文件,其中包含了标注矩形框的坐标以及相应的类别信息。 数据的存放格式需要转换为标准数据集格式。通常的数据集的格式是COCO格式。Detectron2支持多种数据集格式,包括Pascal VOC、MS COCO、Cityscapes等,其中COCO格式是最为通用、使用最为广泛的。 步骤 3:配置模型参数 第三步是配置模型参数,我们需要定义模型的架构以及相应的训练参数。Detectron2提供了许多标准的模型,包括Faster R-CNN和RetinaNet等。我们可以选择其中一个模型,或者使用自己的模型。在配置文件cfg文件中进行定义,例如projects/USER/CONFIG.yaml。 其中需要定义数据集路径等基本参数,具体参数参考detectron2/config目录中的default_config.yaml。为了训练自己的数据集,需要动态调整很多参数,以获得最好的结果。 步骤 4:训练模型 第四步是训练模型。我们需要在命令行中运行train_net.py命令,并提供各种参数,例如定义的模型配置文件、批大小、迭代次数等等。例如下面的命令: python tools/train_net.py --config-file projects/USER/CONFIG.yaml 此外,我们还可以使用检查点来继续之前的训练,例如: python tools/train_net.py --config-file projects/USER/CONFIG.yaml --resume 步骤 5:评估模型 第五步是评估模型。我们需要在命令行中运行test_net.py命令,并提供各种参数,例如定义的模型配置文件、检查点等。例如以下命令: python tools/test_net.py --config-file projects/USER/CONFIG.yaml \ MODEL.WEIGHTS /path/to/checkpoint_file 步骤 6:使用模型进行推断 最后一步是使用模型进行推断。我们需要在命令行中运行infer.py命令,并提供各种参数,例如定义的模型配置文件、检查点等。例如以下命令: python tools/infer.py --config-file projects/USER/CONFIG.yaml \ MODEL.WEIGHTS /path/to/checkpoint_file \ INPUT /path/to/input/image \ OUTPUT /path/to/output/image 这里INPUT指定输入图像的位置,OUTPUT指定输出图像的位置。 以上就是使用Detectron2训练自己的数据集的完整过程,需要不断调整参数以达到最优效果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值