mmdetection3.2.0 半监督自定义数据集配置

文章讲述了在使用mmdetection时遇到的四个问题:1.在构建数据加载器时关于metainfo的错误处理;2.ConcatDataset中metainfo一致性要求;3.数据加载时类别ID索引超出范围的错误及其解决;4.如何计算CocoMetric的类别的mAP和精度/召回率。

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

问题1:

TypeError: __init__() got an unexpected keyword argument 'metainfo'

一开始把metainfo放在train_dataloader里,

train_dataloader = dict(
    dataset=dict(
        datasets=[labeled_dataset, unlabeled_dataset],

        metainfo=metainfo
    )
)

导致报错

TypeError: __init__() got an unexpected keyword argument 'metainfo'

解决:

查看github上的问题:

ConcatDataset does not seem to support customize dataset settings "metainfo" yet · Issue #10499 · open-mmlab/mmdetection · GitHub

如果data的type是ConcatDataset,则要保持两个数据集的metainfo一样。

github上mmdetection/configs/_base_/datasets /semi_coco_detection.py里的train_dataloader的type是ConcatDataset,

train_dataloader = dict(
    batch_size=batch_size,
    num_workers=num_workers,
    persistent_workers=True,
    sampler=dict(
        type='GroupMultiSourceSampler',
        batch_size=batch_size,
        source_ratio=[1, 4]),
    dataset=dict(
        type='ConcatDataset', datasets=[labeled_dataset, unlabeled_dataset]))

把metainfo放在两个数据集中,

labeled_dataset = _base_.labeled_dataset
unlabeled_dataset = _base_.unlabeled_dataset
labeled_dataset.data_prefix=dict(img='train2017/')
labeled_dataset.ann_file='semi_annotations/train2017.json'
labeled_dataset.data_root=data_root
labeled_dataset.metainfo=metainfo
unlabeled_dataset.data_prefix=dict(img='train2017/')
unlabeled_dataset.ann_file='semi_annotations/unlabeledtrain2017.json'
unlabeled_dataset.data_root=data_root
unlabeled_dataset.metainfo=metainfo

问题2:

报错:

data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

Traceback (most recent call last):
  File "tools/train.py", line 121, in <module>
    main()
  File "tools/train.py", line 117, in main
    runner.train()
  File "......./mmdetection/lib/python3.8/site-packages/mmengine/runner/runner.py", line 1777, in train
    model = self.train_loop.run()  # type: ignore
  File "......./mmdetection/lib/python3.8/site-packages/mmengine/runner/loops.py", line 284, in run
    self.runner.val_loop.run()
  File "......./mmdetection/lib/python3.8/site-packages/mmdet/engine/runner/loops.py", line 31, in run
    metrics = self.evaluator.evaluate(len(self.dataloader.dataset))
  File "......./mmdetection/lib/python3.8/site-packages/mmengine/evaluator/evaluator.py", line 79, in evaluate
    _results = metric.evaluate(size)
  File "......./mmdetection/lib/python3.8/site-packages/mmengine/evaluator/metric.py", line 133, in evaluate
    _metrics = self.compute_metrics(results)  # type: ignore
  File "......./mmdetection/lib/python3.8/site-packages/mmdet/evaluation/metrics/coco_metric.py", line 423, in compute_metrics
    result_files = self.results2json(preds, outfile_prefix)
  File "......./mmdetection/lib/python3.8/site-packages/mmdet/evaluation/metrics/coco_metric.py", line 243, in results2json
    data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

原因:没添加metainfo

val_dataloader = dict(
    dataset=dict(
        data_root=data_root,
        ann_file='annotations/instances_val2017.json',
        data_prefix=dict(img='val2017/')))
# test_dataloader = val_dataloader
test_dataloader = dict(
    dataset=dict(
        data_root=data_root,
        ann_file='annotations/instances_test2017.json',
        data_prefix=dict(img='test2017/')))
val_dataloader = dict(
    dataset=dict(
        data_root=data_root,
        metainfo=metainfo,
        ann_file='annotations/instances_val2017.json',
        data_prefix=dict(img='val2017/')))
# test_dataloader = val_dataloader
test_dataloader = dict(
    dataset=dict(
        data_root=data_root,
        metainfo=metainfo,
        ann_file='annotations/instances_test2017.json',
        data_prefix=dict(img='test2017/')))

问题3:

ValueError: need at least one array to concatenate
....................  
File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmengine/registry/build_functions.py", line 121, in build_from_cfg
    obj = obj_cls(**args)  # type: ignore
  File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmdet/datasets/base_det_dataset.py", line 44, in __init__
    super().__init__(*args, **kwargs)
  File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmengine/dataset/base_dataset.py", line 247, in __init__
    self.full_init()
  File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmdet/datasets/base_det_dataset.py", line 82, in full_init
    self.data_bytes, self.data_address = self._serialize_data()
  File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmengine/dataset/base_dataset.py", line 768, in _serialize_data
    data_bytes = np.concatenate(data_list)
  File "<__array_function__ internals>", line 200, in concatenate

原因:metainfo的类别名称和json里categories的类别名称不一致

metainfo = {

    'classes': (。。。。)

}

问题4:

想计算mmdet每一类的map以及precision,recall

方法:

(1) 计算每一类map:

/mmdet/evaluation/metrics/coco_metric.py

class CocoMetric(BaseMetric):
    """COCO evaluation metric.

    Evaluate AR, AP, and mAP for detection tasks including proposal/box
    detection and instance segmentation. Please refer to
    https://cocodataset.org/#detection-eval for more details.

    Args:
        metric (str | List[str]): Metrics to be evaluated. Valid metrics
            include 'bbox', 'segm', 'proposal', and 'proposal_fast'.
            Defaults to 'bbox'.
        classwise (bool): Whether to evaluate the metric class-wise.
            Defaults to False.

    """
    default_prefix: Optional[str] = 'coco'

    def __init__(self,
                 ann_file: Optional[str] = None,
                 metric: Union[str, List[str]] = 'bbox',
                 classwise: bool = False,
                ...................

CocoMetric有个属性classwise,默认值是False,因此不会计算每一类的map,在配置文件中指定为True即可,

# 修改评价指标相关配置
val_evaluator = dict(ann_file=data_root + 'val/val.json')
# test_evaluator = val_evaluator
test_evaluator = dict(ann_file=data_root + 'test/test.json', classwise=True)

(2) 计算precison,recall

参考:mmdetection如何计算准确率、召回率、F1值_mmdetection怎么打印整体的准确率和召回率-优快云博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值