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

MATLAB R2022b中YOLOv4批量检测存文本时文件名报错问题

解决MATLAB YOLOv4检测结果追加写入文本时的类型错误问题

错误原因

原代码中baseFileName是单个字符向量(char类型),而YOLOv4返回的labels、bboxes、scores是对应图像中多个检测目标的数组,两者维度不匹配;同时MATLAB的table要求文本数据使用字符串数组或单元格数组存储,直接传入char向量会触发类型错误。

修改后的完整代码

filesDir = dir("/home/ADL-Rundle-1/img1/");
outputFile = '/home/tableDataPreTrained.txt';

for k = 1:length(filesDir)
    baseFileName = filesDir(k).name;
    % 跳过系统默认的.和..目录
    if strcmp(baseFileName, '.') || strcmp(baseFileName, '..')
        continue;
    end
    fullFileName = fullfile(filesDir(k).folder, baseFileName);
    if isfile(fullFileName)
        img = imread(fullFileName);
        [bboxes, scores, labels] = detect(detector, img);
        rows = size(bboxes, 1);
        % 无检测结果时跳过,避免空表报错
        if rows == 0
            continue;
        end
        
        % 生成与检测结果行数匹配的文件名字符串数组
        fileNameCol = strings(rows, 1);
        fileNameCol(:) = baseFileName;
        % 将分类数组labels转为数值(需类别名称则改用string(labels))
        labelsCol = double(labels);
        
        % 构造符合输出格式的表格
        T = table(fileNameCol, labelsCol, ...
                  bboxes(:,1), bboxes(:,2), bboxes(:,3), bboxes(:,4), scores);
        % 追加写入文本,指定逗号分隔符,不输出变量名
        writetable(T, outputFile, 'WriteMode', 'Append', ...
                   'WriteVariableNames', false, 'Delimiter', ',');
    end
end

关键修改说明

  1. 处理无效文件:跳过dir返回的.和..目录,避免读取无效路径
  2. 维度匹配:将单个文件名扩展为与检测结果行数一致的字符串数组,解决维度不匹配问题
  3. 类型转换:把分类类型的labels转为数值类型(匹配你期望的输出格式),若需要类别名称可替换为string(labels)
  4. 格式对齐:拆分bboxes为单独列,指定逗号分隔符,确保输出格式与预期一致
  5. 空结果处理:无检测目标时跳过,避免空表格写入报错

内容的提问来源于stack exchange,提问作者EMC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:20:47