尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

1702张西瓜照片训练目标检测模型:VOC格式与YOLO实战解析

1702张西瓜照片训练目标检测模型:VOC格式与YOLO实战解析 简介面向目标检测入门与实战的Pascal VOC格式数据集包含1702张西瓜图片及对应XML标注文件是一个干净、规范的单一类别检测样本集。数据集仅保留jpg图像与xml标注不包含分割路径和YOLO格式内容共3405个文件压缩包167.78MB其中1702个xml记录每个西瓜的矩形框位置1702张jpg覆盖不同生长阶段与拍摄场景下的西瓜图像另附1个txt文件。标注类别仅watermelon一类框总数为2812使用labelImg按矩形框规则绘制标注准确、格式统一可直接用于训练YOLO、SSD、Faster R-CNN等主流目标检测模型也可作为学习VOC格式构建与数据预处理的教学样例。资源目录命名清晰jpg与xml一一对应便于脚本划分训练集和验证集。已有487人学习下载适合计算机视觉初学者验证检测流程或研究者开展农产品检测相关实验。1. 1702 张西瓜照片能训练出能用的西瓜目标检测模型吗先说结论能但前提是标注格式选对、训练策略得当。这个「数据集VOC格式目标检测数据集西瓜数据集-1702张」解决的是农业场景里一个非常具体的问题——在田间或大棚里用摄像头找到西瓜果实框出它在画面里的位置。1702 张图像不是大数据量对大模型来说连热身都不够但对西瓜这种目标特征相对单一的场景配合 VOC 格式标注和预训练权重完全能跑出一个可部署的中小模型。它适合那些手头有西瓜园、想做个自动计数或成熟度筛选原型的人也适合刚学目标检测的学生拿真实小样本数据练手——不是拿 COCO 那种几十万张的大路货而是真正会遇到漏标、遮挡、藤蔓干扰的落地数据。之所以强调 VOC 格式是因为它是一个极其稳定的中间格式。无论你后面想用 YOLO、MMDetection 还是 Detectron2转一圈就行而且 VOC 的 xml 标注人类可读出了问题能直接用文本编辑器打开排查。这篇文章就按「格式拆解 → 标注步骤 → 转 YOLO 训练 → 避坑 → 验证」这条线把这个 1702 张的西瓜数据集从一张张 jpg 变成能出 mAP 指标的检测模型。2. VOC 格式下的西瓜目标检测xml 里到底存了什么目录怎么摆2.1 VOC 标注文件里的五个关键字段VOCPASCAL VOC格式的核心不是图片而是和图片同名的 xml 文件。每张图对应一个 xml里面记录了这张图的所有标注信息。你在网上下载到的西瓜数据集解压后大概是「jpg xml」成对出现的结构少量平台会多一个单独的标签文件说明。打开任意一个 xml你会看到五个必须理解的字段。annotation folderJPEGImages/folder filenamewatermelon_001.jpg/filename size width1280/width height720/height depth3/depth /size object namewatermelon/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin256/xmin ymin180/ymin xmax812/xmax ymax540/ymax /bndbox /object /annotationfilename 必须和 jpg 文件名完全一致否则后续读取时图片找不到标注size 里是图片原始宽高后续转 YOLO 格式做归一化全靠它object 可以出现多次代表一张图里有多个西瓜bndbox 是四个坐标值xmin/ymin 是左上角xmax/ymax 是右下角单位是像素。name 是类别名这个数据集里一般就一个类 watermelon但如果你自己扩展数据要保证这个值和标签映射表对得上。有一个字段经常被新手忽略difficult。VOC 原始规范里difficult1 表示这个目标很难识别比如严重遮挡或极小目标部分框架训练时会直接跳过这些标注。你拿到的西瓜数据集如果原作者标注时把某些被叶子挡住一半的西瓜标成 difficult1转 YOLO 格式时建议直接丢弃这些框——因为 YOLO 的 txt 标注没有 difficult 概念强行转换会把难样本和正常样本混在一起影响训练时对 loss 的判断。truncated 表示目标是否超出图像边界同样在转 YOLO 时可以忽略只要 bndbox 坐标本身没越界就行。2.2 目录三件套JPEGImages、Annotations、ImageSets/MainVOC 格式的标准目录结构是固定的下载到的西瓜数据集如果组织规范你会看到这三个目录。VOCdevkit/ └── VOC2007/ ├── JPEGImages/ # 所有原始图片jpg 格式 ├── Annotations/ # 与图片同名的 xml 标注文件 └── ImageSets/ └── Main/ # train.txt / val.txt / trainval.txtJPEGImages 里放 1702 张西瓜照片Annot ations 里放对应的 1702 个 xmlImageSets/Main 里是划分好的训练集和验证集名单。这个 txt 文件里每行是一个图片文件名不含扩展名用来告诉训练脚本哪些图参与训练、哪些图参与验证。很多初学者会把这个目录结构和后面 YOLO 的 data.yaml 混淆。区别在于VOC 的 ImageSets/Main 是「名单式」划分训练时按 txt 里的名字去 JPEGImages 里找图YOLO 的 data.yaml 是「目录式」划分直接指定 train 和 val 指向两个图片文件夹。如果你拿到手的西瓜数据集没有 ImageSets 目录只有一堆 jpg 和 xml也不影响使用。你可以自己写个脚本做随机划分生成 train.txt 和 val.txt后续转 YOLO 格式时这两个文件就是划分依据。很多从百度、Gitee 上流出的数据集就是这么干的——原作者只给了原始标注划分得自己做。这不算数据集缺陷反而给了你一次可控划分的机会避免直接踩到「训练集和验证集同源」这种坑。2.3 VOC 和 COCO、YOLO 的差异为什么先选 VOC同一个西瓜数据集市面上可能有 VOC 和 COCO 两种版本。COCO 格式把标注集中在一个大 json 文件里训练集一个 json、验证集一个 json图片分散在文件夹里VOC 则是一个图片一个 xml。对小数据集来说VOC 明显更友好COCO 的 json 里一个语法错误就全部读不了VOC 的 xml 坏一个只影响一张图排查成本低一个量级。至于 YOLO 的 txt 格式它本质上是 VOC 的「归一化坐标压缩版」。YOLO 格式每行是「类别 中心点x 中心点y 宽度 高度」四个数值都是 0~1 的浮点数。这种格式内存占用最小、训练时读取最快但人类不可读坐标错了很难直接发现。实践中最稳的工作流是数据源头保持 VOC 格式训练前用脚本转成 YOLO txt训练完后如果发现某些类别 mAP 异常低回到 VOC 的 xml 里检查标注是不是画错了。这个「双格式保底」习惯能帮你省下大量排错时间。3. 从原始照片到 VOC 标注西瓜数据集的清洗、标注与格式落地3.1 数据清洗1702 张里哪些图必须扔掉不是所有照片都适合进训练集。西瓜数据集里最常见的劣质图有三种一是严重过曝或过暗的西瓜的纹理细节完全丢失标注员都看不清果实边界模型更学不到有效特征二是画面里西瓜占比极小的比如航拍下来的整片瓜田缩略图一个西瓜只有十几个像素这类图对训练贡献极低三是重复帧从视频里抽帧得到的序列帧可能有两张几乎一模一样的图如果直接全量进训练集验证集里也很可能出现同源图mAP 虚高得一塌糊涂。清洗建议是先按文件名排序肉眼扫一遍缩略图再用脚本做感知哈希去重相似度超过 0.95 的只留一张最后把分辨率低于 640x640 的剔除。1702 张清洗完可能只剩 1500 张左右。别心疼干净的小数据比浑浊的大数据训练效果好得多。另外要注意数据集的分布。如果这 1702 张里 70% 都是顺光拍摄的、西瓜完整露出地面的模型在逆光或者果实被藤蔓遮挡的场景下大概率翻车。清洗阶段就按「光照条件、拍摄距离、遮挡程度、生长阶段」四个维度给每张图打个粗略标签后面划分训练验证集时按维度分层采样能显著提升模型的泛化表现。3.2 用 LabelImg 标西瓜安装、PascalVOC 模式与快捷键拿到手的数据集如果标注不全或者你想自己补充标注最常见的开源标注工具是 LabelImg。它默认就支持输出 VOC 格式的 xml 文件。# Python 3 环境下安装 LabelImg pip install labelImg # 启动默认进入 PascalVOC 标注模式 labelImg启动后界面很简单。左侧工具栏点「Open Dir」选择 JPEGImages 文件夹点「Change Save Dir」选择 Annotations 文件夹保存目录要和图片目录分开避免 xml 混进图片里。标注前确认左下角有「PascalVOC」标识如果显示的是 YOLO需要点菜单栏的 View 切换回来。标注操作就三板斧W 键开始画框绕着西瓜边缘拉一个矩形画完弹出对话框输入类别名这个数据集里统一填 watermelon然后 CmdS 保存 xmlWindows/Linux 是 CtrlS。W 键画完后按 D 键切到下一张图A 键回到上一张。还有两个常用快捷键Ctrl鼠标滚轮可以缩放图片画小果实特写时很管用Delete 键删除误画的框。标注一小时的节奏大概是 80~120 张图取决于每张图的西瓜数量。标完一个批次后建议做一次抽查。随便开几个 xml看 bndbox 坐标是否在图片尺寸范围内 是否统一是 watermelon——这里的教训是如果中间有人手滑把某个框的类别填成 waterlmelo 或者带了个空格训练时模型会多出一个几乎没样本的垃圾类别而且这种错误在训练曲线里很难发现因为 loss 会正常下降直到你看验证集的分类明细才知道出了问题。3.3 检查标注质量xml 与 jpg 的完整性和坐标越界巡检1702 张图、可能有 5000 多个框标注质量巡检不能靠肉眼。写个脚本做三件事检查每个 xml 是否都能在 JPEGImages 里找到同名 jpg检查 bndbox 四个坐标是否小于对应图的宽高检查有没有重复标注同一位置的框。import os import xml.etree.ElementTree as ET from PIL import Image img_dir JPEGImages ann_dir Annotations # 遍历所有xml检查文件配对和坐标越界 for xml_name in os.listdir(ann_dir): if not xml_name.endswith(.xml): continue stem xml_name[:-4] img_path os.path.join(img_dir, stem .jpg) # 1. xml和jpg是否成对存在 if not os.path.exists(img_path): print(f[缺失图片] {xml_name}) continue # 2. 读取图片尺寸与xml中的width/height核对 with Image.open(img_path) as img: w, h img.size tree ET.parse(os.path.join(ann_dir, xml_name)) size tree.find(size) if int(size.find(width).text) ! w or int(size.find(height).text) ! h: print(f[尺寸不一致] {xml_name}: xml({size.find(width).text}*{size.find(height).text}) vs img({w}*{h})) # 3. 检查bndbox是否越界 for obj in tree.iter(object): box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) if xmin 0 or ymin 0 or xmax w or ymax h or xmin xmax or ymin ymax: print(f[坐标异常] {xml_name}: ({xmin}, {ymin}, {xmax}, {ymax}))这段脚本的逻辑是先用 xml 文件名去掉 .xml 后缀拼出对应 jpg 路径检查文件是否存在——如果不存在说明标注和图片有一方缺失然后用 Pillow 读取真实图片尺寸和 xml 里 size 字段的宽度高度对比避免训练时缩放和坐标换算出现系统性错位最后遍历每个 object 的 bndbox做基本的合法性校验。这段巡检脚本跑一遍花费不到一分钟能拦下 90% 的标注低级错误。需要注意一个细节有些标注工具生成的 xml 里 size 字段是写死的如果后来你用脚本批量压缩过图片却没同步更新 xml 的 size就会出现尺寸不一致报错。处理方式是重新生成 xml 的 size 字段或者压缩图片前先保存一份尺寸映射表。4. 把西瓜 VOC 转成 YOLO 训练格式转换脚本、数据集划分与参数调优4.1 VOC 转 YOLO txt坐标归一化怎么写才不丢精度YOLO 系列训练yolov8、yolov11 等读的是 txt 格式标注。VOC 的 xml 是像素绝对坐标YOLO 需要归一化后的相对坐标。转换脚本是所有目标检测数据集落地的必经步骤也是出错率最高的地方。import os import xml.etree.ElementTree as ET # 类别映射表VOC的name 转成 YOLO 的类别id class_dict {watermelon: 0} xml_dir Annotations txt_dir labels os.makedirs(txt_dir, exist_okTrue) for xml_name in os.listdir(xml_dir): if not xml_name.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_name)) size tree.find(size) img_w float(size.find(width).text) img_h float(size.find(height).text) lines [] for obj in tree.iter(object): name obj.find(name).text.strip() if name not in class_dict: print(f[警告] 未知类别 {name} 在 {xml_name}已跳过) continue box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) # 归一化中心点坐标和宽高都除以图片宽高 x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 越界裁剪防止浮点误差导致的越界 x_center min(max(x_center, 0.0), 1.0) y_center min(max(y_center, 0.0), 1.0) w min(w, 1.0) h min(h, 1.0) lines.append(f{class_dict[name]} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) out_name xml_name[:-4] .txt with open(os.path.join(txt_dir, out_name), w) as f: f.write(\n.join(lines))脚本核心有两个一是 class_dict 确定类别名与 id 的映射西瓜数据集只有一个类所以就是 0如果你后续加了「未成熟西瓜」等新类从 0 开始往后排二是归一化公式——把 bndbox 的左上角右下角先转成中心点加宽高再分别除以图片宽高。有几个细节容易踩坑归一化后的 w 和 h 不能直接使用 xml 里的宽高差值除图片宽高必须用浮点数Python 2 里整数相除会直接变 0同一张图的多个目标要写进同一个 txt 文件每个目标占一行。这里最大的隐蔽坑是坐标越界。xmax、ymax 由于标注时手抖可能略微超出图片边界归一化后中心点可能变成 1.0 以上YOLO 训练时读入这种坐标会直接报 format 错误。脚本里的越界裁剪就是兜底。保存时用 .6f 保留 6 位小数精度足够 YOLO 使用不要用 round 取整否则小目标的框会偏移几个像素对精度有可见影响。4.2 train/val 划分与 data.yaml 配置小数据集别让验证集太胖转完 txt 后下一步是把数据集划分成训练集和验证集。$1702$ 张的规模验证集占比控制在 15%~20% 是合理区间也就是留 260~340 张做验证。划分时有个对西瓜数据集特别重要的原则按图划分而不是按标注框划分。同一个 jpg 的所有标注必须进同一个集合否则模型在验证时看到训练过的那张图上的田地和藤蔓背景mAP 会虚高。import os import random # 读取所有图片名 image_dir JPEGImages all_imgs [f[:-4] for f in os.listdir(image_dir) if f.endswith(.jpg)] random.seed(42) random.shuffle(all_imgs) # 按 85:15 分层切分 val_ratio 0.15 val_count int(len(all_imgs) * val_ratio) val_imgs all_imgs[:val_count] train_imgs all_imgs[val_count:] # 写入YOLO训练需要的train.txt和val.txt with open(train.txt, w) as f: for stem in train_imgs: f.write(fimages/{stem}.jpg\n) with open(val.txt, w) as f: for stem in val_imgs: f.write(fimages/{stem}.jpg\n)划分完成后YOLO 需要一份 data.yaml 描述数据集。如果你用的是 yolov8 或 yolov11 的官方代码文件内容是这样# data.yaml path: /your/abs/path/to/watermelon_dataset train: train.txt val: val.txt nc: 1 names: [watermelon]path 必须是绝对路径train 和 val 指向刚才生成的 txt 文件。注意这里 train 可以指向 txt也可以直接指向 images 文件夹但指向 txt 更稳因为划分顺序由你自己控制。nc 是类别数西瓜单类就是 1names 列表的顺序要和转换脚本里 class_dict 的 id 一一对应。如果你的类别 id 是 0但 names 里把 watermelon 放在了第 1 位即列表索引 1训练时类别映射会错位损失函数看起来在下降实际检测结果全是错的。4.3 模型选择yolov8n 还是 yolov8s旋转框要不要上小样本西瓜数据集上模型规模要克制。yolov8n 参数量约 320 万yolov8s 约 1110 万。1702 张的规模用 yolov8s 已经偏大缺少足够的样本喂饱那么多参数容易过拟合。常见做法是先跑 yolov8n看验证集 mAP50 和 mAP50-95 的差距。如果 mAP50 超过 90 但 mAP50-95 明显偏低说明模型在「宽松匹配」下效果好但对精确位置和尺度不够敏感这时再上 yolov8s利用其更强的特征提取能力改善回归精度。训练命令以 yolov8 官方 CLI 为例yolo detect train \ modelyolov8n.pt \ datadata.yaml \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ project./runs \ namewatermelon_v8n几个关键参数patience20 是早停阈值验证集 mAP 连续 20 轮不提升就自动停止小数据集过拟合来得快这个值不能设太大imgsz640 是标准输入尺寸西瓜目标如果是中等大小约占画面 15% 以上640 就够了不用强行上 1280不然显存翻倍且小样本更容易过拟合batch16 在单卡 24GB 显存下无压力显存小于 12GB 就降到 8。lr0 沿用默认 0.01 即可小数据集调高学习率容易震荡调低又收敛太慢。西瓜检测还有一种特殊情况果实是椭圆形的用轴对齐矩形框会框进大量背景。如果后续要做产量估算这类精度要求高的任务可以考虑 mmrotate 这类旋转框检测框架。旋转框的回归目标从 4 个值变成 5 个中心点、宽高、角度训练难度上了一个台阶需要先把 VOC 格式转成 DOTA 格式再用 mmrotate 训练。1702 张的样本量对于旋转框来说偏紧做之前先评估是不是非转不可——如果只是定位和计数轴对齐框够用。5. 西瓜数据集避坑名单小样本与标注质量的五个翻车点5.1 漏标藤蔓遮挡的西瓜没画框模型学成了「半只瓜」现象训练出来的模型在完整露出的西瓜上表现很好但只要西瓜被叶子挡住一部分就检测不到。原因原始标注阶段标注员倾向于只框出轮廓清晰的完整果实被遮挡的、只露出一角的西瓜经常被跳过。模型没有见过「不完整西瓜」的正样本推理时遇到被挡住的瓜就无法激活。解决把标注规范改成「能看到多少就框多少」哪怕只露出西瓜的 1/4 也标一个框。框住可见部分的任意区域都可以YOLO 的损失函数会自己学习预测完整物体。如果数据集的标注已经固定不想重标可以用复制粘贴增强——把被遮挡西瓜的图像块粘贴到大图上生成新样本但这种方法治标不治本。5.2 同源图泄漏验证集和训练集来自同一段视频现象训练集 mAP50 高达 95验证集却有 85而且自己的测试图上检测效果明显差于验证集表现。原因如果数据集是从视频里抽帧得到的视频相邻帧可能被同时分到了训练集和验证集。两帧之间的差异只有几像素的位移验证集等于考了训练题指标虚高。解决按视频片段分组划分而不是按单帧随机划分。划分代码里先读文件名前缀比如 frame_001、frame_002 来自同一段视频把同前缀的帧全部放进同一个集合。做数据集拆分时有一个技巧——先按拍摄时间或地点分组再从组维度抽样。所有从这个数据集训练出来的模型最终都要用一段完全没参与过训练的实拍视频去验证这才是真正的泛化指标。5.3 过拟合早到loss 一直降但验证集曲线在第 20 轮就开始反弹现象训练到某个 epoch 后训练 loss 还在下降验证 loss 却先降后升呈 U 型曲线。原因1702 张图对 yolov8n 来说本来就偏少模型在后期开始「背题」记忆训练集的纹理细节而不是学习西瓜的通用特征。另一个原因是增强策略太弱mosaic、旋转、色彩抖动没打开或强度太低模型没见过足够多的视角变化。解决修改增强参数YOLO 里对应的配置是 hsv_h、hsv_s、hsv_v 和 degrees、translate、scale。小数据集上通常把 degrees 调大到 10~15 度让西瓜在画面里出现轻微的倾斜fliplr0.5 开启水平翻转西瓜形状接近对称这个增强几乎无损。如果早停机制已经触发说明模型确实到头了别硬加 epoch。5.4 xml 批量损坏UILabel 导出的文件里出现未闭合的 object 标签现象转 YOLO 格式时脚本报错报错信息类似ET.ParseError: mismatched tag打开 xml 发现某个object标签没有对应的/object。原因如果原数据集是从标注平台导出或做过批量修改可能出现编码问题和标签未闭合。xml 是文本格式任何一个标签没配对整个文件都解析不了。解决写一个纯字符层的修复脚本用xml.dom.minidom.parse逐个文件解析对报错的 xml 用正则把缺失的/object补上。如果报错文件比例超过 5%直接放弃这些图更省事。日常操作中养成一个好习惯是每次转换后统计 xml 和 jpg 的数量差数量对不上就说明有静默错误被漏掉了。5.5 类别混淆西瓜和背景里的圆形物体轮胎、水桶混在一起现象验证集里出现不少把深色轮胎、黑色水桶误检成西瓜的框。原因西瓜数据集如果只给了类别标签 watermelon模型学会的核心特征可能是「暗绿色圆形有一定纹理」而农机具修理区的常见杂物恰好满足这些特征。解决在训练集里补充负样本——专门挑一些不含西瓜但背景相似的图片标注文件为空txt 文件内容为空。yolov8 对负样本的处理方式是提供背景置信度一个 batch 里混入 10%~20% 的负样本比例。这一步对小目标数据集特别有用是「假阳率」最直接的压制手段。6. 训练后的验证与进阶从 mAP 数值反推数据缺口用混淆矩阵指导补标6.1 用 val 集算 mAP、P-R 曲线与混淆矩阵训练结束后不能只看 train 阶段的 loss 曲线就结束。拿到 best.pt或 last.pt后跑一次正式的 val 评估yolo detect val \ modelruns/watermelon_v8n/weights/best.pt \ datadata.yaml \ splitval \ save_jsonTrue \ project./runs \ namewatermelon_eval加上 save_jsonTrue 后评估产物里会多一个 predictions.json包含每张图的每个检测框的类别、置信度和坐标。拉出来按置信度排序逐个打开对应图片检查——这是我验证阶段最常做的事不是看 mAP 数字而是看「模型在什么情况下会犯什么错」。mAP50 过了 90 不代表能用因为很可能是在简单样本上刷出来的难样本全漏了。看混淆矩阵时如果出现大量 background 被误判为 watermelon说明负样本不足回到 5.5 的策略补负样本如果 watermelon 被漏判成 background说明召回率不够需要检查是不是标注漏标导致正样本不充分。6.2 从误检图反推数据缺口集中补拍弱光与背光场景让评估代码输出误检图列表按「假阳性」「假阴性」两个文件夹分类整理。花一小时集中看这些图你会清晰地看到这个西瓜数据集的短板是不是所有假阴性的图都集中在逆光拍摄的角落是不是所有假阳性的图都发生在瓜蔓密集的草丛区域针对性地补拍或收集这两个场景的图各补充 100~200 张标注好放进训练集重新训练。这一轮补样本通常比单纯调参数带来的提升大得多。1702 张数据集的核心价值不在于这个数量本身而在于它能暴露出的场景缺口——把缺口补上模型才能接近部署要求。6.3 进阶用旋转框检测和集成学习方法尝试突破 mAP 天花板如果你的目标是做成熟度分级或产量估算轴对齐框的定位精度会成为瓶颈。此时可以试一次 mmrotate 训练需要先转成 DOTA 格式并定义旋转框参数训练配置里 angle_version、loss 类型都要单独调整这对新手的排错成本不低但值得尝试。另外一个性价比更高的操作是模型集成——用 yolov8n 和 yolov8s 各训一个模型推理时把两者的检测结果做加权 NMS。小数据集上两个模型过拟合的方向不同集成后通常能拉高 1~2 个点的 mAP50代价是推理时间翻倍。按你的实际算力预算决定取舍如果跑边缘设备就别用集成。我自己的习惯是每个数据集版本保留一个评估记录文件写下当时 mAP 数值和误检图里的典型错误。回头再看这些记录能准确说出「是第几次补标之后夜间反光场景的漏检率降下来了」——这种积累比单次训练报告有用得多。希望这次基于 1702 张西瓜数据集和 VOC 格式的整套流程能帮你少走几趟弯路。本文还有配套的精品资源点击获取
返回列表