You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:55:21