mmdetection3.0训练自己的数据集
时间: 2025-05-17 08:07:45 浏览: 23
### 使用 MMDetection 3.0 训练自定义数据集的配置方法
#### 数据准备
在使用 MMDetection 进行自定义数据集训练之前,需要准备好数据并按照指定格式组织。通常情况下,COCO 格式的标注文件是最常用的输入形式之一[^2]。如果数据不是 COCO 格式,则需将其转换为 COCO 格式。
以下是数据目录结构的一个典型例子:
```
custom_dataset/
├── annotations/
│ ├── train.json
│ └── val.json
├── images/
│ ├── train/
│ │ ├── img1.jpg
│ │ ├── img2.jpg
│ └── val/
│ ├── img3.jpg
│ └── img4.jpg
```
#### 创建自定义数据集类
对于未内置的数据集类型,可能需要创建一个新的数据集类来继承 `CustomDataset` 并实现必要的功能。例如:
```python
from mmengine.dataset import BaseDataset
from mmdet.registry import DATASETS
@DATASETS.register_module()
class CustomDataset(BaseDataset):
METAINFO = {
'classes': ('your_class_1', 'your_class_2') # 替换为你自己的类别名称
}
def load_data_list(self, ann_file):
with open(ann_file, 'r') as f:
data = json.load(f)
data_list = []
for image_info in data['images']:
image_id = image_info['id']
file_name = image_info['file_name']
annotations = [
annotation for annotation in data['annotations'] if annotation['image_id'] == image_id
]
info = {
'img_path': self.data_prefix['img_path'] + '/' + file_name,
'img_id': image_id,
'height': image_info['height'],
'width': image_info['width'],
'instances': []
}
for anno in annotations:
bbox = anno['bbox']
category_id = anno['category_id']
instance = {
'bbox_label': category_id,
'bbox': bbox,
'ignore_flag': 0
}
info['instances'].append(instance)
data_list.append(info)
return data_list
```
上述代码展示了如何通过重写 `load_data_list` 方法加载自定义数据集中的标注信息[^4]。
#### 修改配置文件
接下来,在配置文件中注册新创建的数据集类,并设置路径和其他参数。假设我们正在修改一个基于 Faster R-CNN 的实验配置文件,可以按如下方式调整:
```python
# dataset settings
dataset_type = 'CustomDataset'
data_root = 'path/to/custom_dataset/'
train_pipeline = [...]
test_pipeline = [...]
train_dataloader = dict(
batch_size=2,
num_workers=2,
persistent_workers=True,
sampler=dict(type='DefaultSampler', shuffle=True),
dataset=dict(
type=dataset_type,
metainfo=dict(classes=('your_class_1', 'your_class_2')),
data_root=data_root,
ann_file='annotations/train.json',
data_prefix=dict(img='images/train/'),
pipeline=train_pipeline))
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,
metainfo=dict(classes=('your_class_1', 'your_class_2')),
data_root=data_root,
ann_file='annotations/val.json',
data_prefix=dict(img='images/val/'),
pipeline=test_pipeline))
```
以上配置指定了训练和验证阶段使用的数据集及其相关属性[^1]。
#### 常见问题排查
当遇到类似于 `'NwpuDataset is not in the mmdet::dataset registry'` 的错误时,可能是由于自定义模块未被正确导入引起的。解决办法是在脚本开头显式引入自定义数据集类所在的 Python 文件。
---
阅读全文
相关推荐












