【MMDetection3.0】训练自己的数据集

这篇具有很好参考价值的文章主要介绍了【MMDetection3.0】训练自己的数据集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文记录下MMDetection3.0版本,即截至目前最新的版本,训练自定义数据集的过程。当前MMDetection已经封装的很好了,虽然易于使用,但其API也愈发复杂,对于新手不太友好,这里记录下自己的踩坑经历。
数据部分

由于是自定义的数据集,则需要重新更改网络中的参数,以满足训练所需。在MMDetection中,数据相关的内容,主要存在于源码文件夹中的 mmdet 文件夹,下面的 datasets 和 evalution 文件夹。

【MMDetection3.0】训练自己的数据集
【MMDetection3.0】训练自己的数据集
需要修改的代码如下:

1 datasets/coco.py

将代码首位置的 METAINFO 改为下面内容:

METAINFO = {
'classes':("class1","class2",...),
'palette':[(220, 20, 60), (119, 11, 32),‘’‘,]
}

2 evaluation\functional\class_names.py
def coco_classes() -> list:
   return ['class1','class2',...]

【ps:在修改之后,需要重新编译mmdet,在根目录使用 python setup.py install ,否则会报错,大概是那个 ValueError: need at least one array to concatenate的异常】
【MMDetection3.0】训练自己的数据集

3 configs/base/datasets/coco_detection.py

这部分代码主要是和数据所在文件夹相关,数据文件结构需要按照下面的形式:
data/coco/
train2017
1.jpg
2.jpg

val2017
1.jpg
2.jpg

annotations
instances_train2017.json
instances_val2017.json
【注意:json中类别的id最好为 int类型,这个官网教程也有说明,且索引从0开始。】
修改代码

# dataset settings
dataset_type = 'CocoDataset'
data_root = 'data/coco/'

# 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/coco/'

# 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/detection/',
#         'data/': 's3://openmmlab/datasets/detection/'
#     }))
backend_args = None

train_pipeline = [
    dict(type='LoadImageFromFile', backend_args=backend_args),
    dict(type='LoadAnnotations', with_bbox=True),
    dict(type='Resize', scale=(1333, 800), 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=(1333, 800), keep_ratio=True),
    # If you don't have a gt annotation, delete the pipeline
    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=dataset_type,
        data_root=data_root,
        ann_file='annotations/instances_train2017.json',
        data_prefix=dict(img='train2017/'),
        filter_cfg=dict(filter_empty_gt=True, 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='annotations/instances_val2017.json',
        data_prefix=dict(img='val2017/'),
        test_mode=True,
        pipeline=test_pipeline,
        backend_args=backend_args))
test_dataloader = val_dataloader

val_evaluator = dict(
    type='CocoMetric',
    ann_file=data_root + 'annotations/instances_val2017.json',
    metric='bbox',
    format_only=False,
    backend_args=backend_args)
test_evaluator = val_evaluator
模型部分

MMDetection中主要通过配置文件实现模型训练,如果想训练自己的数据集,则需要更改一些配置。这里以retinanet_r18_fpn_1x_coco.py 为例。

原代码:

_base_ = [
    '../_base_/models/retinanet_r50_fpn.py',
    '../_base_/datasets/coco_detection.py',
    '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'
]

# model
model = dict(
    backbone=dict(
        depth=18,
        init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet18')),
    neck=dict(in_channels=[64, 128, 256, 512]))
optim_wrapper = dict(
    optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001))

修改后的代码:
其中 prefix 主要是将预训练模型进行过滤,过滤掉含backbone的映射,不然会发现,加载的预训练模型中所有参数名均加了 backbone.conv1.weights 而您本身加载的模型,其参数名为 conv1.weight,所以通过prefix 定义即可实现预训练模型和加载模型的参数映射。此外,也可以微调下学习率,避免学习率太大导致训练不稳定。

_base_ = [
    '../_base_/models/retinanet_r50_fpn.py',
    '../_base_/datasets/coco_detection.py',
    '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'
]

# model
model = dict(
    backbone=dict(
        depth=18,
        #init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet18')
        init_cfg=dict(type='Pretrained', checkpoint="./pre_train/retinanet_r18_fpn_1x_coco_20220407_171055-614fd399.pth",prefix='backbone',)),
    neck=dict(in_channels=[64, 128, 256, 512]))
optim_wrapper = dict(
    optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001))
训练命令

其官方文档中分别给出了单GPU和多GPU进行训练的命令,其多GPU主要通过 dist_train.sh 实现训练。其训练命令,使用了占位符,不太容易理解,具体如下:

#!/usr/bin/env bash
CONFIG=$1
GPUS=$2
NNODES=${NNODES:-1}
NODE_RANK=${NODE_RANK:-0}
PORT=${PORT:-29500}
MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}

PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
python -m torch.distributed.launch \
    --nnodes=$NNODES \
    --node_rank=$NODE_RANK \
    --master_addr=$MASTER_ADDR \
    --nproc_per_node=$GPUS \
    --master_port=$PORT \
    $(dirname "$0")/train.py \
    $CONFIG \
    --launcher pytorch ${@:3}

将其命令可以修改为:文章来源地址https://www.toymoban.com/news/detail-496516.html

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node 2 --master_port 12355 ./tools/train.py ./configs/retinanet/retinanet_r18_fpn_1x_coco.py 

到了这里,关于【MMDetection3.0】训练自己的数据集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用MMDetection训练自己的数据集

    本文主要阐述如何使用 mmdetection 训练自己的数据,包括配置文件的修改,训练时的数据增强,加载预训练权重以及绘制损失函数图等。这里承接上一篇文章,默认已经准备好了 COCO 格式数据集且已安装 mmdetection ,环境也已经配置完成。 这里说明一下,因为 mmdetection 更新至

    2024年02月06日
    浏览(60)
  • mmdetection训练自己的COCO数据集及常见问题

    训练自己的VOC数据集及常见问题见下文: mmdetection训练自己的VOC数据集及常见问题_不瘦8斤的妥球球饼的博客-CSDN博客_mmdetection训练voc 目录 一、环境安装 二、训练测试步骤 三、常见问题 batch size设置 学习率和epoch的修改 训练过程loss为nan的问题 GPU out of memory 保存最佳权重文件

    2024年02月06日
    浏览(65)
  • 零基础熟悉mmdetection3d数据提取、模型搭建过程

    本图文从介绍配置文件开始,逐步构建一个新的配置文件,并依次构建相关模型,最终使用一条点云数据简单走了一下处理流程 关于mmdetection3d的安装,参考官方文档安装 — MMDetection3D 1.0.0rc4 文档 1.1 mmdetection3d配置文件的组成 官方文档:教程 1: 学习配置文件 — MMDetection3D 1.

    2024年02月05日
    浏览(67)
  • 熟悉mmdetection3d数据在模型中的处理流程

    本图文数据集采取KITTI数据集 配置文件的介绍可以参考博主上一篇图文 本图文旨在利用一条数据,走完整个多模态数据处理分支,获得bbox,并可视化在图像上 本次教程选用的模型为MVXNet,是一个多模态融合的3D目标检测模型 配置文件: mmdetection3d/configs/mvxnet/dv_mvx-fpn_second_

    2024年02月12日
    浏览(43)
  • mmdetection3d SUN RGB-D数据集预处理

    本文为博主原创文章,未经博主允许不得转载。 本文为专栏《python三维点云从基础到深度学习》系列文章,地址为“https://blog.csdn.net/suiyingy/article/details/124017716”。         SUN RGB-D是普林斯顿大学发布的一种关于室内场景理解的数据集,共包含了10335个样本,其中训练样本

    2023年04月15日
    浏览(48)
  • 【mmdetection】用自己的coco数据集训练mask r-cnn并进行验证、测试,推理可视化,更改backbone,只针对某一标签进行训练

    本人呕心沥血从无到有的摸索,自己边尝试边整理的,其实耐心多看官方文档确实能找到很多东西(下面有官方文档的链接这里就不重复粘贴了),也为了方便我自己copy语句嘻嘻~ 为什么不是用Windows,作为一个小白我一开始真的想用windows,因为我懒得配双系统,但是没办法

    2024年02月04日
    浏览(45)
  • 【colab】谷歌colab免费服务器训练自己的模型,本文以yolov5为例介绍流程

    目录 一.前言 二.准备工作 1.注册Google drive(谷歌云盘) Google Driver官网:https://drive.google.com/drive/ Colab官网:https://colab.research.google.com/ 2.上传项目文件 3.安装Colaboratory 4.colab相关操作和命令 5.项目相关操作  三.异常处理         本文介绍了在谷歌开放平台Google colab上租用免

    2023年04月08日
    浏览(53)
  • MMDetection3D简单学习

    我们通常把模型的各个组成成分分成 6 种类型: 编码器(encoder):包括 voxel encoder 和 middle encoder 等进入 backbone 前所使用的基于体素的方法,如  HardVFE  和  PointPillarsScatter 。 骨干网络(backbone):通常采用 FCN 网络来提取特征图,如  ResNet  和  SECOND 。 颈部网络(neck):

    2024年02月13日
    浏览(44)
  • MMDetection3D框架环境配置

    MMDetection3D是一个基于PyTorch的开源3D目标检测框架。下面是MMDetection3D的环境配置步骤: 安装Anaconda,教程很多不在说明。 1.创建Python环境 使用以下命令创建一个Python 3.8环境: 使用以下命令激活Python环境:  2.安装gpu版本的torch、torchvision 2.1 下载对应的torch、torchvision安装包:

    2024年02月09日
    浏览(49)
  • mmdetection3.1.0 bug(已解决)

    mmdetection版本3.1.0 想这训练rpn网络,但是训练后val的时候出现了问题,根据Traceback,找到bug。 报错信息 :ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (102,) + inhomogeneous part. 解决方法 :np.array(all_ious)改为np.array

    2024年04月29日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包