MMDetection 3.x 自定义数据集

本文介绍了如何在MMDetection3.x版本中使用自定义数据集,以CelebA数据集为例,包括数据下载、解压、简化、转换为COCO格式,以及MMDetection的安装、测试和配置文件的编写。此外,还解决了训练过程中遇到的问题。

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

最近在调研目标检测方面的技术实现,发现关于 MMDetection 自定义数据集的文章,多是就 2.x 版本进行描述的,而关于 3.x 版本的则比较少。有些文章在制作COCO数据集的时候,需要修改多处源代码,而这是没有必要的。本文主要参考了MMDetection 使用示例:从入门到出门,并根据官方文档,对3.x自定义数据集进行了描述。

一、CelebA 数据集下载

CelebA 是 CelebFaces Attribute 的缩写,意即名人人脸属性数据集,其包含 10177 个名人身份的 202599 张人脸图片,每张图片都做好了特征标记,包含人脸 bbox 标注框、 5 个人脸特征点坐标以及 40 个属性标记, CelebA 由香港中文大学开放提供,广泛用于人脸相关的计算机视觉训练任务,可用于人脸属性标识训练、人脸检测训练以及 landmark 标记等。

1.1 下载

Large-scale CelebFaces Attributes (CelebA) Dataset找到百度云盘下载链接(密码: rp0s),进行下载。
在这里插入图片描述

  • Img 中的 img_align_celeba.zip :经过人脸对齐和裁剪了的图像
  • Img 中的 img_celeba.7z :原始人脸图像,从网络爬取未有做任何裁剪缩放操作的人脸图像
  • Anno: 标签文件
    – identity_CelebA.txt :每张图片对应的身份编号信息
    – list_attr_celeba.txt :40 个属性标签文件,第一行为图像张数,第二行为属性名,有该属性则标记为1,否则标记为-1
    – list_bbox_celeba.txt :人脸标注框坐标注释文件,包含每一张图片对应的 bbox 起点坐标及其宽高
    – list_eval_partition.txt :用于划分为 training , validation 及 testing 等数据集的标签文件,标签0对应 training ,标签1对应 validation ,标签2对应 testing
    – list_landmarks_align_celeba.txt :人脸对齐后的5个特征点landmark坐标注释文件

1.2 解压缩

sudo apt install p7zip-full
cd CelebA/Img
7za x img_celeba.7z

1.3 提取前100张图片

CelebA 包含大量数据,这里只想测试 MMDetection 自定义数据集的训练方法而非真的要训练出一个效果极好的图像分类识别模型,因此需要对数据集进行简化,大致流程如下:

  • 创建训练数据文件夹 celeba100
  • 将 CelebA/img_celeba 中前100张图片复制到 celeba100/images 目录下
  • 将 CelebA/Anno/list_bbox_celeba.txt 复制到 celeba100/list_bbox_celeba.txt
  • 创建 celeba100/classes.txt 文件并写入一行数据 face

此时训练集目录如下:

在这里插入图片描述

1.4 转换

用 txt2json.py 代码将 celeba100/list_bbox_celeba.txt 中前100行标签格式转为 COCO 格式,并存放于 celeba100/annotations/label.json。
txt2json.py 代码如下:

import os
from PIL import Image
import json
basepath = "/home/xy/Downloads/CelebA/celeba100"
imagepath = os.path.join(basepath, "images")
annpath = os.path.join(basepath, "annotations")
annfile = os.path.join(annpath, "label.json")
labeltxt = os.path.join(basepath, "list_bbox_celeba.txt")
calssestxt = os.path.join(basepath, "classes.txt")
def get_image_size(infile):
    im = Image.open(infile)
    return im.size

label = {}
with open(calssestxt, 'r+') as f:
    classes = []
    lines = f.readlines()
    for i, line in enumerate(lines):
        c = {}
        c['id'] = i
        c['name'] = line.strip() # 去掉换行符
        c['supercategory'] = "mark"
        classes.append(c)
label['categories'] = classes

images = []
annotations = []
with open(labeltxt, 'r+') as f:
    # 去除前两行
    lines = f.readlines()[2:102]
    for i, line in enumerate(lines):
        d = line.split()
        imgpath = os.path.join(imagepath, d[0])
        img = {}
        img_size = get_image_size(imgpath)
        img['id'] = i
        img['file_name'] = d[0]
        img['width'] = img_size[0]
        img['height'] = img_size[1]
        images.append(img)
        ann = {}
        ann['id'] = i
        ann['image_id'] = i
        ann['category_id'] = 0
        ann['iscrowd'] = 0
        ann['bbox'] = [int(t) for t in d[1:]]
        ann['area'] = (ann['bbox'][2] - ann['bbox'][0]) * (ann['bbox'][3] - ann['bbox'][1])
        annotations.append(ann)
        
label['images'] = images
label['annotations'] = annotations

with open(annfile, "w+") as f:
    json.dump(label, f)

二、MMDetection 安装

2.1 安装

安装PyTorch

conda create -n label python=3.10 pip numpy
conda activate label 
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

安装MMCV

pip install -U openmim
mim install mmengine
mim install "mmcv>=2.0.0" 

安装 MMDetection

git clone https://github.com/open-mmlab/mmdetection
cd mmdetection
# v 表示输出详细信息,e 表示可编辑
pip install -v -e .

2.2 测试

创建目录

mkdir checkpoints && cd checkpoints

rtmdet 模型下载

https://download.openmmlab.com/mmdetection/v3.0/rtmdet/rtmdet_m_8xb32-300e_coco/rtmdet_m_8xb32-300e_coco_20220719_112220-229f527c.pth

rtmdet 测试

python demo/image_demo.py demo/demo.jpg configs/rtmdet/rtmdet_m_8xb32-300e_coco.py --weights checkpoints/rtmdet_m_8xb32-300e_coco_20220719_112220-229f527c.pth

faster_rcnn 模型下载

https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth

faster_rcnn 模型测试

python demo/image_demo.py demo/demo.jpg configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py --weights checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth 

2.3 相关问题解决

Could not load library libcudnn_con_infer.so.8. Error: libnvrtc.so: cannot open shared object file: No such file or directory

找到~/miniconda3/envs/label/libnvrtc.so.11.8.89,复制一份,将其重命名为libnvrtc.so即可。
在这里插入图片描述

三、自定义配置文件

上面已整理出 MMDetection 能直接使用的小数据集,现在需要编写我们训练所使用的模型配置文件。在 mmdetection 根目录下创建一个 celeba 文件夹,并在其下创建模型配置文件 celeba.py ,写入内容如下

_base_ = '../configs/fcos/fcos_r101-caffe_fpn_gn-head_ms-640-800-2x_coco.py'

import os

dataset_type = 'CocoDataset'
classes = ('face')
# 注意后面需要带 /
data_root = "/home/xy/Downloads/CelebA/celeba100/"

train_dataloader = dict(
    batch_size=2,
    num_workers=2,
    dataset=dict(
        type=dataset_type,
        # explicitly add your class names to the field `metainfo`
        metainfo=dict(classes=classes),
        data_root=data_root,
        ann_file='annotations/label.json',
        data_prefix=dict(img='images/')
        )
    )

val_dataloader = dict(
    batch_size=1,
    num_workers=2,
    dataset=dict(
        type=dataset_type,
        test_mode=True,
        # explicitly add your class names to the field `metainfo`
        metainfo=dict(classes=classes),
        data_root=data_root,
        ann_file='annotations/label.json',
        data_prefix=dict(img='images/')
        )
    )

test_dataloader = dict(
    batch_size=1,
    num_workers=2,
    dataset=dict(
        type=dataset_type,
        test_mode=True,
        # explicitly add your class names to the field `metainfo`
        metainfo=dict(classes=classes),
        data_root=data_root,
        ann_file='annotations/label.json',
        data_prefix=dict(img='images/')
        )
    )

val_evaluator = dict(
    ann_file=data_root + 'annotations/label.json')
model = dict(bbox_head=dict(num_classes=1))

work_dir = os.path.join(data_root, 'work_dir')
runner = dict(type='EpochBasedRunner', max_epochs=100)
checkpoint_config = dict(interval=5)
load_from = './checkpoints/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco-511424d6.pth'

四、训练

4.1 训练

python tools/train.py celeba/celeba.py  

训练完成后,如下所示:
在这里插入图片描述

4.2 相关问题解决

class RandomChoiceResize in mmcv/transforms/processing.py: init() missing 1 required positional argument: ‘scales’

文件 configs/fcos/fcos_r101-caffe_fpn_gn-head_ms-640-800-2x_coco.py 中将 scale 修改为 scales。
在这里插入图片描述

参考链接

Customize Datasets

MMDetection3D支持自定义数据集,下面是自定义数据集的步骤: 1. 数据集准备 在准备数据集时,需要将数据集保存为.pkl文件或者.json文件,并且包含点云数据和对应的标注信息。标注信息包括每个物体的类别、中心点坐标、大小以及朝向等。 2. 数据集类的定义 在MMDetection3D中,需要定义一个数据集类,继承自`mmdet3d.datasets.CustomDataset`。在数据集类中,需要实现`load_annotations`方法和`get_data_info`方法,其中`load_annotations`方法用于加载标注信息,`get_data_info`方法用于获取数据集大小。 可以参考`mmdet3d/datasets/kitti_mono.py`中的实现方式,对于自己的数据集进行定义。 3. 配置文件修改 修改MMDetection3D的配置文件,根据自己的数据集进行修改。配置文件包括数据集路径、数据集大小、训练参数等,可以参考`configs/kitti/cbgs_mghead_3x2x_kitti_mono.py`中的实现。 4. 模型训练 使用命令行运行训练脚本,开始训练模型: ``` python tools/train.py ${CONFIG_FILE} [optional arguments] ``` 其中,`${CONFIG_FILE}`是你修改后的配置文件路径。 5. 模型测试 使用命令行运行测试脚本,测试模型的性能: ``` python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --out ${RESULT_FILE} ``` 其中,`${CHECKPOINT_FILE}`是你训练得到的模型权重文件路径,`${RESULT_FILE}`是测试结果保存的路径。 以上就是自定义数据集的步骤,需要注意的是,自定义数据集的训练和测试需要一定的数据处理和计算资源,对于初学者来说可能会有一定的难度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值