detectron2训练自己的数据集(只包含一类数据)

detectron2训练自己的coco格式数据集(只包含一类数据)

detectron2的安装

Linux 或 macOS 或者windows与 Python ≥ 3.6
PyTorch ≥ 1.8 和与PyTorch安装相匹配的 torchvision。在pytorch.org 上将它们一起安装以确保这一点
OpenCV 是可选的,但演示和可视化需要
下面以win系统介绍安装

#虚拟环境的创建
conda create -n detectron2 python=3.7 -y 
conda activate detectron2
#这里选择自己系统对应版本的pytorch 
conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch
pip install ninja yacs cython matplotlib tqdm
pip install opencv-python==4.4.0.40
# Boundary dependency
pip install scikit-image
pip install shapely
#创建一个项目文件夹例如detectron
mkdir detectron
cd detectron
# install pycocotools. Please make sure you have installed cython.
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI
# install detectron2
git clone https://github.com/facebookresearch/detectron2.git
python -m pip install -e detectron2

如果pycocotools安装不成功可以去这个地址下载到本地,然后pip install
官方detectron2的文档上说明gcc & g++ ≥ 5.4 是必需的
所以最好安装一下gcc
可以去这个网址下载 下载地址
在这里插入图片描述

一键安装即可
最后打开命令行输入gcc -v 如果有版本号则安装成功

detectron2的训练、评估自己的数据集

你如果需要利用detectron2用到自己的数据集,可以在此detectron2文件内外层先建一个文件夹,例如detectron2/mydatasets,然后放置格式可如下:
在这里插入图片描述
接下来有两种方法训练和评估自己的数据集

方法一:创建一个train_net.py文件跑通

在detectron2目录下创建一个train_net.py文件

首先将detectron2/tools/train_net.py的原文件复制粘贴到新建的train_net.py,更改main函数

def main(args):
    cfg = setup(args)
    #coco_my_train是你的数据集自定义的名字,没有要求
    #后面就是你数据集json文件放置和图片放置路径
    #这是训练集
    register_coco_instances("coco_my_train", {}, "mydatasets/coco/annotations/instance_train2017.json",
                            "mydatasets/coco/train2017image")
     #验证集
    register_coco_instances("coco_my_val", {}, "mydatasets/coco/annotations/instances_val2017.json",
                            "mydatasets/coco/val2017image")
"""
这部分代码可以利用注册数据集的元数据得到你的数据字典格式和内容,可以打印和加载注释图片
    custom_metadata = MetadataCatalog.get("coco_my_train")
    dataset_dicts = DatasetCatalog.get("coco_my_train")
    print(dataset_dicts)
    for d in random.sample(dataset_dicts, 1):
        img = cv2.imread(d["file_name"])
        #print(img)
        visualizer = Visualizer(img[:, :, ::-1], metadata=custom_metadata, scale=1)
        vis = visualizer.draw_dataset_dict(d)
        cv2.imshow('Sample',vis.get_image()[:, :, ::-1])
        cv2.waitKey(1500)
"""
    if args.eval_only:
        model = Trainer.build_model(cfg)
        DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load(
            cfg.MODEL.WEIGHTS, resume=args.resume
        )
        res = Trainer.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

    """
    If you'd like to do anything fancier than the standard training logic,
    consider writing your own training loop (see plain_train_net.py) or
    subclassing the trainer.
    """
    trainer = Trainer(cfg)
    trainer.resume_or_load(resume=args.resume)
    if cfg.TEST.AUG.ENABLED:
        trainer.register_hooks(
            [hooks.EvalHook(0, lambda: trainer.test_with_TTA(cfg, trainer.model))]
        )
    return trainer.train()

然后更改setup方法
设置训练的模型参数和超参数

def setup(args):
    """
    Create configs and perform basic setups.
    """
    cfg = get_cfg()
    args.config_file = "configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml"
    cfg.merge_from_file(args.config_file)
    cfg.merge_from_list(args.opts)
    # 更改配置参数
    cfg.DATASETS.TRAIN = ("coco_my_train",) # 训练数据集名称
    cfg.DATASETS.TEST = ("coco_my_val",)
    cfg.DATALOADER.NUM_WORKERS = 4  # 单线程

    cfg.INPUT.CROP.ENABLED = True
    #cfg.INPUT.MAX_SIZE_TRAIN = 640 # 训练图片输入的最大尺寸
    #cfg.INPUT.MAX_SIZE_TEST = 640 # 测试数据输入的最大尺寸
    #cfg.INPUT.MIN_SIZE_TRAIN = (512, 768) # 训练图片输入的最小尺寸,可以设定为多尺度训练
    #cfg.INPUT.MIN_SIZE_TEST = 640
    #cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING,其存在两种配置,分别为 choice 与 range :
    # range 让图像的短边从 512-768随机选择
    #choice : 把输入图像转化为指定的,有限的几种图片大小进行训练,即短边只能为 512或者768
    #cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING = 'range'
#  本句一定要看下注释!!!!!!!!
    cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1
    cfg.MODEL.RETINANET.NUM_CLASSES = 1 # 类别数+1(因为有background,也就是你的 cate id 从 1 开始,如果您的数据集Json下标从 0 开始,这个改为您对应的类别就行,不用再加背景类!!!!!)
    #cfg.MODEL.WEIGHTS="/home/yourstorePath/.pth"
    cfg.MODEL.WEIGHTS = "detectron2://ImageNetPretrained/MSRA/R-50.pkl"    # 预训练模型权重
    cfg.SOLVER.IMS_PER_BATCH = 2  # batch_size=2; iters_in_one_epoch = dataset_imgs/batch_size

    # 根据训练数据总数目以及batch_size,计算出每个epoch需要的迭代次数
    #9000为你的训练数据的总数目,可自定义
    ITERS_IN_ONE_EPOCH = int(50/ cfg.SOLVER.IMS_PER_BATCH)

    # 指定最大迭代次数
    cfg.SOLVER.MAX_ITER = 1500# 初始学习率
    cfg.SOLVER.BASE_LR = 0.002
    # 优化器动能
    cfg.SOLVER.MOMENTUM = 0.9
    #权重衰减
    cfg.SOLVER.WEIGHT_DECAY = 0.0001
    cfg.SOLVER.WEIGHT_DECAY_NORM = 0.0
    # 学习率衰减倍数
    cfg.SOLVER.GAMMA = 0.1
    # 迭代到指定次数,学习率进行衰减
    cfg.SOLVER.STEPS = (900,)
    # 在训练之前,学习率慢慢增加初始学习率
    cfg.SOLVER.WARMUP_FACTOR = 1.0 / 1000
    # 热身迭代次数
    cfg.SOLVER.WARMUP_ITERS = 500
    #cfg.MODEL.DEVICE = 'gpu'
    cfg.SOLVER.WARMUP_METHOD = "linear"
    # 保存模型文件的命名数据减1
    #cfg.SOLVER.CHECKPOINT_PERIOD = ITERS_IN_ONE_EPOCH - 1

    # 迭代到指定次数,进行一次评估
    cfg.TEST.EVAL_PERIOD = ITERS_IN_ONE_EPOCH
    cfg.TEST.EVAL_PERIOD = 100
    cfg.freeze()
    default_setup(cfg, args)
    return cfg
#训练并评估数据集
python train_net.py

这是评估训练以及评估结果
在这里插入图片描述
在这里插入图片描述

方法二更改detecron的配置文件训练评估

一. 修改detectron2\data\datasets\builtin.py的文件配置
在这里插入图片描述
coco_self_train和coco_self_val就是自己训练数据集的名称,然后是mydataset下的文件路径

并且将builtin.py文件主函数下面的数据集路径换成自己的路径
在这里插入图片描述
二. 修改detectron2\data\datasets\builtin_meta.py的文件配置
1.在COCO_CATEGORIES列表下面新建一个自己的类别例如下面我只有一个类

COCO_my_CATEGORIES=[{"color": [220, 20, 60], "isthing": 1, "id": 1, "name": "person"},]

2.新增一个_get_mycoco_instances_meta方法,该方法是用来返还元数据的类实例 类id等

def _get_mycoco_instances_meta():
    thing_ids = [k["id"] for k in COCO_my_CATEGORIES if k["isthing"] == 1]
    thing_colors = [k["color"] for k in COCO_my_CATEGORIES if k["isthing"] == 1]
    assert len(thing_ids) == 1, len(thing_ids)#你有2个类这个数字1就改成2
    # Mapping from the incontiguous COCO category id to an id in [0, 79]
    thing_dataset_id_to_contiguous_id = {k: i for i, k in enumerate(thing_ids)}
    thing_classes = [k["name"] for k in COCO_my_CATEGORIES if k["isthing"] == 1]
    ret = {
        "thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id,
        "thing_classes": thing_classes,
        "thing_colors": thing_colors,
    }
    return ret

3.更改 _get_builtin_metadata函数将 return返回改成自己新增的那个方法。在这里插入图片描述
三.使用官方训练命令

cd tools
python train_net.py \--config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \
  --num-gpus 1 SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025

要仅仅评估模型的性能,请使用

python train_net.py \
  --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \
  --eval-only MODEL.WEIGHTS ../output/model_final.pth

添加–resume参数还可以在上次训练终止的地方继续训练,使用上一次的学习率,迭代次数等参数

测试自己的模型的预测效果

cd demo
python demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \
  --input input1.jpg  \
  [--other-options]
  --opts MODEL.WEIGHTS ../output/model_fina.pth

其中input.jpg放置于tools目录下即可,也可以创建文件夹例如testimage/input.jpg
[–other-options]参数配置可以参考官方文档。
例如将其可以改成–output result 意思就是测试结果的图片放置在result文件夹下,如果不填任何参数,测试图片会按照yaml原来的参数配置直接显示在opencv窗口

结果

由于计算机资源有限,我只是随便训练了一个10张图片的coco人物数据集,利用生成的模型测试图片,只是做个参考
在这里插入图片描述
小伙伴们快去试试吧!

  • 12
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要使用Detectron2训练自己的数据,您需要完成以下步骤: 1. 准备数据集:将您的数据集组织成COCO格式或Pascal VOC格式。COCO格式包括图像、标注文件和类别定义文件。Pascal VOC格式包括图像、标注文件和类别定义文件。 2. 安装Detectron2:按照Detectron2的安装指南安装Detectron2。 3. 编写配置文件:使用Detectron2提供的配置文件模板创建一个新的配置文件,并将其适应于您的数据集。 4. 下载预训练模型:从Detectron2的Model Zoo下载一个预训练的模型,这将成为您的起点。 5. 训练模型:使用训练脚本在您的数据集训练模型,如下所示: ``` python train_net.py --config-file /path/to/config/file.yaml ``` 6. 保存训练模型:在训练过程中,您可以使用checkpoint文件保存训练模型,如下所示: ``` python train_net.py --config-file /path/to/config/file.yaml --resume ``` 7. 评估模型:使用评估脚本在测试集上评估训练模型,如下所示: ``` python train_net.py --config-file /path/to/config/file.yaml --eval-only ``` 8. 使用模型进行推理:使用推理脚本对新图像进行推理,如下所示: ``` python demo.py --config-file /path/to/config/file.yaml --input /path/to/image.jpg ``` 这些是使用Detectron2训练自己的数据的基本步骤。但是,请注意,这是一个复杂的任务,需要一定的技术知识和实践经验。如果您是初学者,建议您先熟悉Detectron2的基本知识,并尝试使用Detectron2提供的示例数据进行训练和推理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值