赞
踩
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'
报错如上,问题发生于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))
这里的
num_classes = len(self.dataset_meta['classes'])
也就是读不到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
对照教程,发现在classes处和教程有差别,修改为:
METAINFO = {
'classes':('background','normal','stenosis'),
'palette':[[0, 0, 128], [128, 0, 0], [0, 128, 0]]
}
错误解决
文章写于2024.03.28
TorchVision: 0.17.2+cu118
OpenCV: 4.9.0
MMEngine: 0.10.3
mmsegmentation 1.2.2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。