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
关键修改说明
- 处理无效文件:跳过
dir返回的.和..目录,避免读取无效路径 - 维度匹配:将单个文件名扩展为与检测结果行数一致的字符串数组,解决维度不匹配问题
- 类型转换:把分类类型的
labels转为数值类型(匹配你期望的输出格式),若需要类别名称可替换为string(labels) - 格式对齐:拆分
bboxes为单独列,指定逗号分隔符,确保输出格式与预期一致 - 空结果处理:无检测目标时跳过,避免空表格写入报错
内容的提问来源于stack exchange,提问作者EMC
相关产品推荐
相关产品推荐

