MMDetection SSD训练报错ValueError:无数组可拼接求解决方案
问题:MMDetection训练SSD模型触发ValueError: need at least one array to concatenate
在使用MMDetection训练SSD模型时,出现ValueError: need at least one array to concatenate错误。该数据集可正常用于Faster R-CNN训练,且已确认文件路径无误。以下是报错栈信息及自定义SSD配置文件,寻求解决建议:
报错栈信息
Traceback (most recent call last): File "tools/train.py", line 244, in <module> main() File "tools/train.py", line 233, in main train_detector( File "/home/christ/dev/repos/railsight/mmdetection-2.25.3/mmdet/apis/train.py", line 244, in train_detector runner.run(data_loaders, cfg.workflow) File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 130, in run epoch_runner(data_loaders[i], **kwargs) File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 47, in train for i, data_batch in enumerate(self.data_loader): File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 368, in __iter__ return self._get_iterator() File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 314, in _get_iterator return _MultiProcessingDataLoaderIter(self) File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 965, in __init__ self._reset(loader, first_iter=True) File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 996, in _reset self._try_put_index() File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 1230, in _try_put_index index = self._next_index() File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 521, in _next_index return next(self._sampler_iter) # may raise StopIteration File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/torch/utils/data/sampler.py", line 226, in __iter__ for idx in self.sampler: File "/home/christ/dev/repos/railsight/mmdetection-2.25.3/mmdet/datasets/samplers/group_sampler.py", line 36, in __iter__ indices = np.concatenate(indices) File "<__array_function__ internals>", line 180, in concatenate ValueError: need at least one array to concatenate Error in atexit._run_exitfuncs: Traceback (most recent call last): File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/multiprocessing/popen_fork.py", line 27, in poll pid, sts = os.waitpid(self.pid, flag) File "/home/christ/miniconda3/envs/mmdetection/lib/python3.8/site-packages/torch/utils/data/_utils/signal_handling.py", line 66, in handler _error_if_any_worker_fails() RuntimeError: DataLoader worker (pid 35413) is killed by signal: Terminated.
自定义SSD配置文件
_base_ = '../ssd/ssd300_coco.py' dataset_type = 'CocoDataset' classes = ('pantograph',) data = dict( train=dict( img_prefix='configs/pantograph/train/', classes=classes, ann_file='configs/pantograph/train/SSDTrain.json', dataset=dict( ann_file='configs/pantograph/train/SSDTrain.json', img_prefix='configs/pantograph/train/')), val=dict( img_prefix='configs/pantograph/val/', classes=classes, ann_file='configs/pantograph/val/SSDVal.json'), test=dict( img_prefix='configs/pantograph/test/', classes=classes, ann_file='configs/pantograph/test/SSDTest.json'))
解决建议
修复配置文件的冗余嵌套:你在
train字段下额外嵌套了一层dataset,这会导致数据集加载逻辑混乱,无法生成有效的索引列表。删除这层嵌套,修正后的train配置如下:train=dict( img_prefix='configs/pantograph/train/', classes=classes, ann_file='configs/pantograph/train/SSDTrain.json'),因为
_base_中的配置已经定义了数据集的基础结构,只需在train下直接覆盖参数即可,无需重复嵌套dataset。调整分组采样器设置:SSD默认使用
GroupSampler按图片长宽比分组采样,如果你的数据集所有图片的分组信息为空(比如所有图片长宽比完全一致,或者标注加载异常导致分组生成失败),就会触发空数组拼接错误。可以尝试替换为默认采样器:train=dict( img_prefix='configs/pantograph/train/', classes=classes, ann_file='configs/pantograph/train/SSDTrain.json', sampler=dict(type='DefaultSampler', shuffle=True)),解决DataLoader Worker终止问题:报错中存在
DataLoader worker被终止的信息,大概率是多进程加载数据时内存不足。尝试减少worker数量,甚至用单进程加载:data=dict( train=dict( img_prefix='configs/pantograph/train/', classes=classes, ann_file='configs/pantograph/train/SSDTrain.json', dataloader=dict(num_workers=0)), # val和test可按需调整 val=dict( img_prefix='configs/pantograph/val/', classes=classes, ann_file='configs/pantograph/val/SSDVal.json', dataloader=dict(num_workers=0)), )
内容的提问来源于stack exchange,提问作者Isaac_E
相关产品推荐
相关产品推荐

