当前位置:   article > 正文

mmsegmentation 自定义数据集 报错 numclass = len(self.dataset_meta[‘classes‘]) KeyError: ‘classes‘ 解决方案

mmsegmentation 自定义数据集 报错 numclass = len(self.dataset_meta[‘classes‘]) KeyError: ‘classes‘ 解决方案
Traceback (most recent call last):
  File ".\tools\train.py", line 104, in <module>
    main()
  File ".\tools\train.py", line 100, in main
    runner.train()
  File "C:\Users\***\anaconda3\envs\openmmlab1\lib\site-packages\mmengine\runner\runner.py", line 1777, in train
    model = self.train_loop.run()  # type: ignore
  File "C:\Users\***\anaconda3\envs\openmmlab1\lib\site-packages\mmengine\runner\loops.py", line 292, in run
    self.runner.val_loop.run()
  File "C:\Users\***\anaconda3\envs\openmmlab1\lib\site-packages\mmengine\runner\loops.py", line 371, in run
    self.run_iter(idx, data_batch)
  File "C:\Users\***\anaconda3\envs\openmmlab1\lib\site-packages\torch\utils\_contextlib.py", line 115, in decorate_context
    return func(*args, **kwargs)
  File "C:\Users\***\anaconda3\envs\openmmlab1\lib\site-packages\mmengine\runner\loops.py", line 392, in run_iter
    self.evaluator.process(data_samples=outputs, data_batch=data_batch)
  File "C:\Users\***\anaconda3\envs\openmmlab1\lib\site-packages\mmengine\evaluator\evaluator.py", line 60, in process
    metric.process(data_batch, _data_samples)
  File "d:\mmsegmentation-1.2.2\mmseg\evaluation\metrics\iou_metric.py", line 77, in process
    num_classes = len(self.dataset_meta['classes'])
KeyError: 'classes'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

报错如上,问题发生于500/40000处,也就是没到600/40000就报错了,报错地点是IoU的代码中,在

    def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None:
        """Process one batch of data and data_samples.

        The processed results should be stored in ``self.results``, which will
        be used to compute the metrics when all batches have been processed.

        Args:
            data_batch (dict): A batch of data from the dataloader.
            data_samples (Sequence[dict]): A batch of outputs from the model.
        """

        # with open('D:\\classes.txt', 'w') as file:
        #     file.write(str(self.dataset_meta))

        num_classes = len(self.dataset_meta['classes'])
        for data_sample in data_samples:
            pred_label = data_sample['pred_sem_seg']['data'].squeeze()
            # format_only always for test dataset without ground truth
            if not self.format_only:
                label = data_sample['gt_sem_seg']['data'].squeeze().to(
                    pred_label)
                self.results.append(
                    self.intersect_and_union(pred_label, label, num_classes,
                                             self.ignore_index))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

这里的

num_classes = len(self.dataset_meta['classes'])
  • 1

也就是读不到classes的值,这里的self从最开始的train.py就开始继承
本来到这里应该有意识的怀疑自己的数据集文件写的有问题,但忘记进行对照所以没查出来

通过挨个看Traceback(其实只要看train.py的),可以看到这里的classes实际上在最开始的train.py中就已经被读取了,然后阅读代码看到classes来源于cfg文件也就是配置文件。

检查拼写发现没问题,于是想到数据集定义文件mmseg/datasets/文件名.py

from mmseg.registry import DATASETS
from .basesegdataset import BaseSegDataset
import os.path as osp

@DATASETS.register_module()
class StenosisDataset(BaseSegDataset):

    classes=('background','normal', 'stenosis'),
    palette=[[0, 0, 128], [128, 0, 0], [0, 128, 0]]

    def __init__(self, 
                split,
                seg_map_suffix='.png',
                reduce_zero_label=False,
                **kwargs,) -> None:
        super().__init__(
            seg_map_suffix=seg_map_suffix,
            img_suffix='.png',
            # split = split,
            reduce_zero_label=reduce_zero_label,
            **kwargs)
        
        # assert osp.exist(self.img_dir) and self.split is not None
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

对照教程,发现在classes处和教程有差别,修改为:

    METAINFO = {
        'classes':('background','normal','stenosis'),
        'palette':[[0, 0, 128], [128, 0, 0], [0, 128, 0]]
    }
  • 1
  • 2
  • 3
  • 4

错误解决

在这里插入图片描述


文章写于2024.03.28
TorchVision: 0.17.2+cu118
OpenCV: 4.9.0
MMEngine: 0.10.3
mmsegmentation 1.2.2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/347442
推荐阅读
相关标签
  

闽ICP备14008679号