ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Matlab实现YOLO交通目标检测毕设全流程实战指南

Matlab实现YOLO交通目标检测毕设全流程实战指南 简介这份毕业设计资料包提供基于Matlab的YOLO交通目标检测完整实现面向计算机、电子信息工程、数学等相关专业学生可作为课程设计、期末大作业或毕业设计的参考资料也适合需要快速上手目标检测项目的初学者参考。压缩包内共348个文件以338张交通场景图像、4个算法源码、4个数据文件、1个说明文档和1个演示视频为主整体大小约211.96MB目录结构清晰便于按图像数据集、核心代码、训练数据与演示视频分类查阅。目前已有707人浏览学习适合具备一定编程基础、能够自行调试代码并解决运行报错的读者。借助源码、说明文档和可视化素材可以系统理解YOLO检测流程、交通场景目标识别与结果可视化思路并进一步修改参数、扩展检测类别或接入自己的数据集用于论文实验和毕业设计成果展示。1. 用Matlab做YOLO交通目标检测毕设这条路为什么值得走毕业设计题目挂上“基于Matlab实现YOLO算法交通目标检测应用”意味着你选择了一条“算法要落地、代码要能跑、论文要有图”的路。先说一个反直觉的结论在Matlab里做YOLO交通目标检测最难的从来不是YOLO网络本身——Matlab官方工具箱已经把主干网络、锚框预测和损失函数封装好了——真正的门槛是版本匹配、数据标注格式和训练参数这三件事。这个方案能解决的核心诉求是不写一行底层卷积代码用官方检测器搭配预训练权重在350张街景图上完成车辆、行人、公交车的检测训练最后输出检测框可视化图、混淆矩阵和mAP指标。它适合三类人用Matlab做毕设的工科生、答辩需要演示视频和结果截图的研究生、以及想快速验证YOLO在交通场景效果的初学者。2. 让YOLO在Matlab里跑通的三条路线选错一条毕设直接翻车2.1 官方工具箱路线yolov4ObjectDetector 的前世今生Matlab从R2019a开始引入YOLO v2检测器从R2021a开始提供yolov4ObjectDetector底层主干是CSP-Darknet53预训练权重在COCO数据集上完成。对交通目标检测来说COCO预训练已经覆盖car、truck、bus、bicycle、motorcycle、person这些类别正是毕设要用的对象。官方路线的最大价值是“黑匣子可控”训练、评估、可视化三条链路全是同一套API不会出现Python写的权重在Matlab里加载失败的情况。创建检测器的最小命令如下% 创建YOLO v4检测器输入尺寸416x416类别按交通场景自定义 inputSize [416 416 3]; classNames {car, truck, bus, pedestrian, bicycle}; detector yolov4ObjectDetector(csp-darknet53-coco, classNames, ... InputSize inputSize);这段代码有三个需要解释的点。第一csp-darknet53-coco是预训练模型名称函数会返回一个配置好的检测器但此时锚框还是COCO默认值训练时会根据你的标注数据重新计算下面第四章会讲锚框调整方法。第二InputSize决定了网络把输入图像缩放到多大416x416是速度和精度的平衡点交通场景里小目标多如果想提高远处行人的召回率可以改成[608 608 3]代价是显存占用和训练时间翻倍。第三classNames里类别的顺序必须和后续标注的标签顺序完全一致这是新手最常踩的坑——顺序不一致时检测结果显示的标签和实际类别对不上且训练过程中损失函数正常下降不容易察觉。官方工具箱路线的优势是训练闭环完整。trainYOLOv4ObjectDetector可以直接吃groundTruth对象和imageDatastore不需要手工做一个中间格式。评估阶段有evaluateDetectionPrecision和evaluateDetectionMissRate能直接产出论文需要的PR曲线、召回率和平均精确率。这套链路下来毕设的“算法实现”部分几乎全被官方函数承接你需要做的核心工作是数据整理和参数调优。2.2 Python互调路线让Matlab借用Torch的推理能力如果你在选题时发现身边的参考代码全是PyTorch写的YOLOv5、YOLOv8权重满天飞但学校要求最终交付Matlab版本那么Python互调路线是保住阵容的选择。Matlab从R2018a开始内置Python接口可以在Matlab脚本里直接创建Python对象、传递数据、调用Python函数。一个可行的做法是把Python当成推理引擎Matlab负责图像读取、检测结果可视化和指标统计。% 配置Python环境torch和yolov5仓库需要提前装好 pyenv(Version, D:\Python39\python.exe); py.importlib.import_module(torch); py.importlib.import_module(yolov5); % 加载YOLOv5s模型 model py.torch.hub.load(ultralytics/yolov5, yolov5s, pretrainedtrue); % 读取一张交通图像交给Python模型推理 frame imread(highway_day.jpg); framePy py.numpy.array(frame); results model(framePy); % 把检测结果转回Matlab结构 boxes double(py.array.array(d, results.xyxy{1}(:, 1:4))); scores double(py.array.array(d, results.xyxy{1}(:, 5)));这条路线能让你直接用上YOLOv5s甚至YOLOv8的预训练权重检测精度通常比Matlab自带的YOLO v4更稳小目标召回率更高。但代价是环境耦合风险大Python版本、PyTorch版本、CUDA版本三者不匹配时pyenv加载报错是常态。另一个实际问题是很多学校的毕设查重和代码审查要求“核心算法自行实现”或“代码在纯Matlab环境可运行”一旦答辩现场没有Python环境整个演示就卡在模型加载这一步。我的建议是如果时间充足优先用2.1的官方路线做完训练和检测把Python互调作为进阶章节写入论文“方法对比”部分体现工作量且不承担环境风险。如果非要走互调路线务必在答辩准备机上提前做一次完整环境恢复测试。2.3 三条路线对比与选型建议除上述两条之外还有一条第三方路线——从Darknet加载权重到Matlab自建网络但这条路本质上是手工复刻YOLO层结构框的尺寸、归一化方式、batch norm参数任何一个对不上检测结果全是乱框调试成本极高不建议毕设碰。把三条路线放在一起对比选型逻辑就清晰了。路线算法版本预训练支持环境依赖适合场景官方yolov4ObjectDetectorYOLO v4COCO内置仅Matlab R2021a纯Matlab交付、稳定优先Python互调YOLOv5/v8任意PyTorch权重MATLABPythonPyTorch追求精度、演示环境可控Darknet权重手动加载YOLO v3/v4需自行转换无额外依赖学习层结构、不建议交付用一句话总结选型经验毕设答辩看重“系统能跑、指标能看、代码能解释”官方工具箱路线是性价比最高的选择。我现在做类似交通检测项目时也默认先走官方路线只有在客户明确要求用最新YOLO版本时才切到Python互调。3. 把350张图像做成可训练数据集标注、转格式与亮度平衡3.1 用imageLabeler做标注别自己写标注代码很多人拿到350张交通图像后第一反应是写脚本读图、画框、存坐标。这个思路在毕设时间表里是灾难——人工画几百个框本身就耗时手工写的标注界面还容易出坐标偏移、类别名拼写错误。Matlab自带图像标注器imageLabeler直接支持交互式画框并导出groundTruth对象这是最快路径。操作步骤很简单命令行输入imageLabeler加载全部图像点击“ROI Label”定义要标注的类别然后逐张框选目标。导出时选择“Export to Workspace”得到一个groundTruth对象。% 从工作区导出后确认标注数据的基本结构 disp(gTruth.LabelDefinitions); % 查看类别定义 disp(gTruth.LabelData.Properties.VariableNames); % 查看每个图像对应的标注变量这里要特别说明导出数据的组织方式gTruth.LabelData是一个表格行对应每一张图像列对应类别单元格里存放的是Mx4的边界框矩阵每行是[x y width height]。这个结构是后面训练函数的直接输入所以千万不要在导出后手动改成别的格式。另外350张图中如果存在完全没有目标的负样本LabelData对应单元格会是空数组{}训练函数能自动处理但评估阶段的混淆矩阵计算要留意空样本带来的分母问题第五章会展开讲。还有一个我自己踩过的坑标注时用了中文类别名比如“汽车”“行人”训练虽然能跑但导出检测结果时insertObjectAnnotation渲染的文字变成乱码方块在论文截图里非常掉价。建议直接用英文类别名或者标注完成后在gTruth.LabelDefinitions里统一改成英文。3.2 格式转换VOC XML与Matlab groundTruth的互转脚本如果你的图像来源是公开数据集比如UA-DETRAC或者BDD100K的切片原始标注可能是VOC格式的XML文件。这部分数据没法直接让trainYOLOv4ObjectDetector吃进去需要写一个转换脚本。% convertVOCToGroundTruth.m —— 把VOC XML标注转为Matlab boxLabelDatastore function [imds, blds] convertVOCToGroundTruth(imgDir, annDir, classNames) imds imageDatastore(imgDir); labelTable table(); for i 1:numel(imds.Files) [~, name, ~] fileparts(imds.Files{i}); xmlPath fullfile(annDir, [name .xml]); if ~exist(xmlPath, file) % 缺少标注文件的图像直接跳过避免训练时报维度错误 continue; end % 用 xmlread 解析VOC标注 docNode xmlread(xmlPath); objects docNode.getElementsByTagName(object); numObj objects.getLength(); boxes zeros(numObj, 4); labels cell(numObj, 1); for j 0:numObj-1 objNode objects.item(j); % 提取bndbox子节点坐标 xmin str2double(objNode.getElementsByTagName(xmin).item(0).getTextContent()); ymin str2double(objNode.getElementsByTagName(ymin).item(0).getTextContent()); xmax str2double(objNode.getElementsByTagName(xmax).item(0).getTextContent()); ymax str2double(objNode.getElementsByTagName(ymax).item(0).getTextContent()); boxes(j1, :) [xmin ymin xmax-xmin ymax-ymin]; labels{j1} char(objNode.getElementsByTagName(name).item(0).getTextContent()); end % 只保留需要的类别别的目标忽略 keep ismember(labels, classNames); if any(keep) labelTable [labelTable; table({imds.Files{i}}, {boxes(keep, :)}, {labels(keep)}, ... VariableNames, {ImageFilename, Boxes, Labels})]; end end blds boxLabelDatastore(labelTable); end这段脚本把VOC的(xmin, ymin, xmax, ymax)坐标系转成Matlab检测器期望的(x, y, width, height)同时过滤掉不在classNames里的类别。使用时有两个参数容易出错一是classNames的顺序必须与此前创建检测器时的顺序一致二是XML里类别名可能存在大小写混写比如“Car”和“car”建议在labels{j1}赋值后统一lower()转换。转换完成后用boxLabelDatastore包装表格就可以直接丢给训练函数。检查数据是否正确的标准做法是随机抽10张图把标注框画上去看一眼% 可视化检查转换后的标注框 img readimage(imds, 5); boxData read(blds); annotated insertObjectAnnotation(img, rectangle, boxData.Boxes{5}, boxData.Labels{5}); imshow(annotated);这一步能发现坐标系翻转、框偏移、图像和标注错位三类典型问题。转换脚本第一次跑出来的结果几乎必然有问题不要跳过去。3.3 图像亮度平衡与数据增强让检测器在夜间和逆光下不翻车交通检测和一般物体检测最大的差异在于光照分布极不均匀白天强光、傍晚逆光、夜间路灯低照度。如果350张图里大量存在整体偏暗或局部过曝的样本YOLO会把亮度当成一种干扰特征白天训练集上F1很高一到夜间测试图上漏检率飙升。处理这类问题我一般会先做统计再做亮度平衡。统计方式是计算全部图像的HSV亮度通道均值画出分布直方图如果峰值集中在低亮度区间说明暗光样本占比过高。% 对整体偏暗的图像做HSV亮度补偿 function imgOut balanceBrightness(imgIn) imgHSV rgb2hsv(imgIn); vChannel imgHSV(:, :, 3); % 以全图亮度中位数为基准拉伸到[0.4, 0.8]区间 vMax max(vChannel(:)); vMin min(vChannel(:)); vNorm (vChannel - vMin) / (vMax - vMin eps); vNew vNorm * 0.4 0.4; imgHSV(:, :, 3) vNew; imgOut hsv2rgb(imgHSV); end这个函数只调整亮度通道不动色调和饱和度避免引入色偏。参数0.4和0.8是经验值把全图亮度线性映射到0.4到0.8之间暗部细节被提亮的同时高光不溢出。处理完所有图像后重新计算亮度直方图确认整体分布居中。亮度平衡之外数据增强也是让检测器在350张图的小样本上稳住精度的关键操作。Matlab的augmentedImageDatastore可以在训练时随机做翻转、缩放、平移等效扩充训练集。% 配置数据增强随机X翻转、随机缩放0.8~1.2、随机平移10% augmenter imageDataAugmenter(... RandXReflection, true, ... RandScale, [0.8 1.2], ... RandXTranslation, [-10 10], ... RandYTranslation, [-10 10]); augmentedDS augmentedImageDatastore(inputSize(1:2), imds, ... DataAugmentation, augmenter, ... OutputSizeMode, randcrop);注意增强只该用在训练数据上验证和测试阶段必须保证原始尺寸和内容不变否则评估指标失真。另外一个细节是OutputSizeMode设为randcrop而不是resize前者在缩放后随机裁剪到输入尺寸相当于额外做了轻微平移后者直接拉伸会让目标形状畸变降低检测精度。4. 训练配置与参数调优让损失函数降下来、让检测框贴上去4.1 用预训练模型起步训练参数这样设350张图像从头训练YOLO必然过拟合正确的起手式是加载COCO预训练检测器然后微调最后几层。Matlab的yolov4ObjectDetector在创建时就默认加载了预训练权重但如果你换了自己定义的类别集合检测头输出维度改变需要重新训练。这个过程在Matlab里是自动处理的不必手动裁剪层。训练参数的选择直接决定训练是否收敛下面这个配置是我在类似小数据集上调出来的比较稳的组合% 定义训练选项重点看学习率和MiniBatchSize options trainingOptions(adam, ... InitialLearnRate, 0.001, ... LearnRateSchedule, piecewise, ... LearnRateDropPeriod, 10, ... LearnRateDropFactor, 0.1, ... MiniBatchSize, 8, ... MaxEpochs, 50, ... Shuffle, every-epoch, ... VerboseFrequency, 10, ... ExecutionEnvironment, auto); % 开始训练gTruth来自imageLabeler导出或3.2节转换 [detector, info] trainYOLOv4ObjectDetector(detector, gTruth, options);几个参数的实际含义值得花时间理解。InitialLearnRate0.001是微调场景的安全起点如果从零训练需要0.0001甚至更低因为预训练权重已经接近最优解学习率太大会用一步就把之前的特征破坏掉。MiniBatchSize8受限于显存批量越大梯度估计越准但8是一个在6GB显存显卡上跑416x416输入的常见上限。MaxEpochs50对小数据集够用350张图每轮迭代次数不多50轮大概几分钟到半小时就能跑完。ExecutionEnvironmentauto会让Matlab自动检测CUDA显卡没有GPU就退回CPU。这里要明确一个血泪经验YOLO v4在CPU上训练一张416x416图像的前向传播就要几百毫秒50轮训练可能要跑到第二天早上一定要提前用一个小数据集测试单迭代耗时再决定要不要租云GPU。R2021a以上版本还支持multi-gpu选项最多可以同时用四块卡。4.2 读懂损失函数曲线trainYOLOv4ObjectDetector 的玄学指标训练过程中info结构里保存了每个迭代的损失值很多人只知道看曲线“有没有下降”却不知道YOLO的损失由三部分组成边界框回归损失、目标置信度损失、分类损失。Matlab在Verbose输出里显示的Training Loss是三者加权后的总值曲线平稳下降只代表整体在收敛不代表每个子项都正常。% 画出训练损失曲线对照训练日志观察下降趋势 figure; plot(info.TrainingLoss, LineWidth, 1.5); grid on; xlabel(Iteration); ylabel(Training Loss); title(YOLOv4 Training Loss Curve);正常的损失曲线形态是前10个迭代急速下降然后进入缓慢下降段最后在某个值附近小幅震荡。如果看到以下三种异常优先检查对应原因。第一损失开局就是NaN几乎可以断定学习率过大或标注中存在空框第二损失降到一定值后反弹且持续上升这是过拟合信号需要加大数据增强或减小模型容量第三损失下降速度远慢于同类项目检查是否忘记设置Shuffleevery-epoch顺序读取样本会让网络反复学习同一批图像的分布。还有一类问题是训练正常但验证精度不涨。这种情况我一般从“标签语义”入手排查交通场景中“car”和“truck”在视觉上高度相似如果标注时的边界没有严格统一——同一种面包车一半人标成car一半人标成truck——模型学到的是夹在两个类别中间的模糊特征损失照降精度停滞。解决手段是检查gTruth.LabelData里各类别框数量把数量悬殊的类别考虑合并。4.3 评估与导出混淆矩阵、召回率与 mAP 怎么算成论文素材训练完成后评估环节是毕业设计里最能体现工作量的部分。Matlab提供了evaluateDetectionPrecision函数可以计算每个类别的平均精确率AP以及整体mAP。% 在验证集图像上做检测 results detect(detector, valImds, Threshold, 0.5); % 计算每个类别的precision-recall曲线和AP值 [ap, recall, precision] evaluateDetectionPrecision(results, valGTruth, ... Threshold, 0.5, ... IoUThreshold, 0.5); % 打印每个类别的AP并求整体mAP for i 1:numel(ap) fprintf(Class %s AP %.3f\n, classNames{i}, ap(i)); end fprintf(mAP %.3f\n, mean(ap));Threshold0.5是置信度阈值低于0.5的检测结果直接丢弃IoUThreshold0.5是判断“框和真值是否匹配”的交并比门槛这两个阈值决定了AP数值的大小论文里务必写明。需要留意的陷阱是验证集里某张图有目标但检测器完全没输出时这张图的真值会被计入漏检拉低召回率这是正常行为不是代码bug。混淆矩阵的制作需要自己组装。先用detect得到所有检测框再按类别统计真正类、假正类、假负类。一个常见疑问是“yolo混淆矩阵总合不唯一”——这是因为不同置信度阈值下一个检测框可能被归为检测成功也可能归为漏检矩阵里的数字不是固定值。消除争议的办法是固定Threshold0.5并用这个阈值跑完整评估在论文里明确标注阈值条件否则结果不可复现。5. Matlab跑YOLO常见问题避坑5个实测翻车点5.1 yolov4ObjectDetector不存在版本与工具箱双重校验现象运行yolov4ObjectDetector直接报错Undefined function or variable或者提示缺少Deep Learning Toolbox。原因yolov4ObjectDetector从R2021a开始提供旧版本只有yolov2ObjectDetector。另一类场景是机器上装了R2021a但只装了基础Matlab环境没有购买Deep Learning Toolbox和Computer Vision Toolbox函数依旧不存在。解决先运行ver查看工具箱列表确认Deep Learning Toolbox在列。版本低于R2021a的话要么改用yolov2ObjectDetector重新走一遍流程要么升级Matlab。升级后注意原有代码里的trainYOLOv2ObjectDetector和trainYOLOv4ObjectDetector的函数签名有差异训练参数结构体基本兼容但检测器创建语句必须改。另外安装新版本后imageLabeler的标注数据格式可能与旧版本不一致建议重新导出一次groundTruth。5.2 训练Loss全是NaN学习率与空标注框现象训练日志第一行输出Loss就是NaN之后全部NaN模型完全无法收敛。原因最常见的是InitialLearnRate设得过大预训练权重被一步更新推出有效范围其次是标注数据中存在没有目标的图像损失计算时某些项的分母为0。解决先把学习率降到0.0001试跑5个epoch如果Loss恢复正常说明是学习率问题再逐步调回0.001。如果依然NaN逐个检查gTruth.LabelData找出空标注行——用ismissing函数批量检查单元格是否为空把空行删除或单独放到测试集。这个排查顺序是固定的先小学习率后查数据不要一上来就怀疑代码。5.3 检测框画不出来通道、阈值与渲染逻辑现象detect返回的检测框数组为空但肉眼明显能看到图像里有车辆。原因三选一的可能。第一置信度阈值太高交通目标在遮挡或暗光场景下置信度输出普遍只有0.3左右阈值设在0.5以上框全被过滤第二输入图像不是RGB三通道灰度图或RGBA图在检测器内部被错误处理第三模型没训练好检测头对所有候选区域都输出了低置信度。解决先用detect(detector, img, Threshold, 0.1)跑一遍确认低阈值下有没有框。如果有框而0.5阈值没有说明模型本身学到了目标但置信度偏低可以适当降阈值或者检查训练集的标注框是否都完整覆盖目标本体。如果0.1也没框检查图像尺寸是否接近训练时的InputSize——把一张1080p的大图直接丢给训练在416x416下的检测器小目标可能被压缩到几个像素必然检测不到需要先切分图像或缩放到接近输入尺寸的倍数。5.4 350张图过拟合增强、冻结层与验证集现象训练损失降到很低验证集的mAP停滞在0.2左右检测结果里大量误检框。原因典型的小数据过拟合。350张图对YOLO v4来说太少模型把训练图的背景纹理也记进了特征。解决首先在trainingOptions里调大LearnRateDropFactor配合LearnRateDropPeriod让后期学习率衰减更激进减小对高频噪声的拟合其次启用在3.3节配置的augmentedImageDatastore做增强最后可以把训练集改为前300张、验证集50张并确保验证集里各类目标数量比例与训练集相近避免验证集恰好都是稀有类别导致评估失真。我做这类项目时还会把detector里的主干层冻结只训练检测头——冻结后参数量减少过拟合风险显著下降训练速度也快一倍具体做法是查看layerGraph里主干层的LearnRateFactor属性将所有非检测头的层设为0。5.5 混淆矩阵总合对不上IoU阈值与置信度阈值现象用evaluateDetectionPrecision得到的总样本数和核对检测框数量时发现数对不上混淆矩阵里TPFPFN不等于总目标数。原因混淆矩阵的统计逻辑依赖两个前提——置信度阈值过滤掉的框不计入任何统计IoU阈值决定了一个预测框是TP还是FP。改任何一个阈值矩阵里的数字就全变了。解决明确在代码里固化阈值参数评估后把Threshold和IoUThreshold写进论文的实验设置小节。如果论文需要和同类算法对比必须保证对比时两者使用相同的阈值口径。另外evaluateDetectionPrecision返回的precision和recall已经是插值平滑后的值拿它手算混淆矩阵时中间数字会有小数这是正常情况不要追求整数。到这一步关于“yolo混淆矩阵总合不唯一”的疑问就能解释清楚不是bug是评估口径问题。6. 让毕设再进一步把YOLO检测做成视频演示与数据导出6.1 视频检测流程配出带框的交通监控输出毕业设计答辩时一张静态检测图的说服力远不如一段带检测框的视频。Matlab的VideoReader和VideoWriter组合可以完成从视频读取到结果输出的闭环而且代码量不大。% 读取交通监控视频逐帧检测并写出带框视频 vid VideoReader(traffic_clip.mp4); writer VideoWriter(detected_result.avi); open(writer); while hasFrame(vid) frame readFrame(vid); % 保持训练时一致的输入尺寸检测时用0.3阈值减少漏检 [bboxes, scores, labels] detect(detector, frame, Threshold, 0.3); if ~isempty(bboxes) annotations string(labels) : string(round(scores, 2)); frame insertObjectAnnotation(frame, rectangle, bboxes, annotations, ... FontSize, 14, LineWidth, 2); end writeVideo(writer, frame); end close(writer);这段代码有两个实用细节。一是detect的Threshold在视频里可以比评估时设低一些——视频的连续性让你能容忍单帧的少量误检但漏检造成的目标消失观感非常突兀。二是写视频前先确认VideoWriter的输出格式能被答辩电脑的播放器打开avi格式虽然通用但压缩率低文件大如果原视频超过两分钟建议改用MPEG-4格式。处理长视频时还需要考虑帧率匹配。VideoReader默认按原始帧率读VideoWriter默认写30fps如果原视频帧率不同输出视频会变快或变慢。解决方案是set(writer, FrameRate, vid.FrameRate)保持时间轴一致。6.2 检测结果批量导出Excel论文图表一步到位论文里除了检测截图还需要定量统计表比如“各类别目标数量统计”“不同时段的检测置信度均值”。手动数太累可以用writetable把检测结果直接输出成Excel表格。% 批量检测一个文件夹里的图像汇总结果到表格 imgFiles dir(fullfile(test_imgs, *.jpg)); resultTable table(); for i 1:numel(imgFiles) img imread(fullfile(imgFiles(i).folder, imgFiles(i).name)); [bboxes, scores, labels] detect(detector, img, Threshold, 0.5); for j 1:numel(scores) resultTable [resultTable; table(... string(imgFiles(i).name), ... string(labels(j)), ... scores(j), ... bboxes(j, 1), bboxes(j, 2), bboxes(j, 3), bboxes(j, 4), ... VariableNames, {ImageName, Label, Score, X, Y, W, H})]; end end % 写入Excel论文附录可以直接用 writetable(resultTable, detection_results.xlsx);导出Excel后用数据透视表按Label聚合就能统计每类的目标数量和平均置信度。这个步骤还有一个隐藏价值如果你发现某张图的检测框坐标异常——比如框跑到图像边界外——说明标注时把背景也圈进了目标回查gTruth修正后重训这就是一套数据闭环。论文里写“共标注350张图像包含xxx个目标训练后mAP为xxx”时所有数字都能从这个表格里找到出处。我自己的习惯是每次训练完都做这样一次全量检测导出把结果Excel存成一个固定文件论文写结果章节时直接引用而不是临时跑代码截图。这么做的另一个好处是答辩被问到某个具体检测案例时可以当场打开表格定位到对应的图像和置信度。这个方法陪我熬过了自己的毕设修改期也帮朋友补过两次被指出“结果无法复现”的检测项目——只要你把阈值、版本号、数据集划分三条信息写死在论文里任何审阅人都能按同样的步骤跑出相近的数字。希望帮到你。本文还有配套的精品资源点击获取
返回列表