拓冰建站拓冰建站
首页 / 资讯中心 / 正文

玻璃瓶塑料瓶检测数据集:VOC与YOLO格式详解及YOLOv8训练实战

简介目标检测是计算机视觉领域的核心任务之一其技术体系涵盖数据标注、模型训练与部署推理等多个环节。在回收分拣、智能垃圾箱等场景中准确识别不同材质的瓶类物体是自动化流程的关键前提。本文从数据集的构建出发介绍玻璃瓶与塑料瓶两类别检测任务的难点如高光反射、透明材质与外观差异等并深入解析VOC与YOLO两种标注格式的坐标转换原理。通过合理的训练集划分、数据增强策略与超参数调优基于YOLOv8框架可有效训练出高精度检测模型实现复杂环境下的可靠识别。该数据集包含8943张真实场景图像覆盖传送带、垃圾桶、货架等常见环境可直接用于模型训练或作为迁移学习的基础为垃圾分类与智能回收系统的开发提供工程实践参考。 忙活了小半个月终于把手上这套玻璃瓶和塑料瓶的检测数据集整理利索了。总共8943张图、两个类别同时给了VOC和YOLO两种格式打包成7z压缩包正好最近在折腾YOLO训练回收分拣场景的朋友可以直接拿去用。这篇博文不只是介绍数据集本身我尽量把标注格式的坑、数据集怎么划分、YOLO训练时怎么配路径、以及我自己实际跑训练时踩过的雷都写出来给大家一份能直接参考的实操笔记。先说清楚这套数据集能干什么。核心任务是识别画面里出现的玻璃瓶和塑料瓶覆盖的场景包括回收站传送带、垃圾桶周边、超市货架、户外地面等常见环境目标大小从近景占满画面到远景小目标都有。适合用来训练一个两类别检测器做垃圾分类提示、智能回收箱、自动分拣线的视觉模块或者作为迁移学习的底料。对象是刚接触目标检测的初学者以及已经有VOC格式旧数据、想转成YOLO格式跑YOLOv8/v5训练的老手。1. 数据集整体设计与标注格式拆解1.1 两类别检测任务的核心价值瓶类检测这个任务乍一看很简单就两个类别glass_bottle和plastic_bottle。实际做过的人知道这里面的坑一点都不少。玻璃瓶在光照下会有高光反射瓶身半透明背景一复杂就容易跟环境融为一体标注框稍微松一点模型学到的特征就歪了。塑料瓶更麻烦透明瓶、半透明瓶、带标签的、压扁的、套着其他垃圾袋的外观差异极大。数据集设计成两个类别而不是“瓶子”一个大类我觉得是合理的。因为后续如果要做回收分拣玻璃和塑料的处理路径完全不同下游设备需要区分材质不是光知道“这里有个瓶子”就完事。类别之间还有相似性——都是细长圆柱体都有瓶口瓶身靠纯形状很难区分模型必须学会通过纹理、透明度、反光特征去判断。这就是这个数据集值得训练的价值点类别少但类间相似度高适合用来调优模型的细粒度识别能力。这类数据集的另一个价值在场景覆盖。单纯从网上随便扒几百张“瓶子”图片模型在固定角度下可能表现很好一到实际场景就崩。标注数据时我特意保留了不同角度、不同光照、部分遮挡的样本宁可让模型在训练阶段“难”一点也不希望它只在测试集上好看。最终打包的8943张图里单一瓶子的大特写、多个瓶子互相遮挡的场景、瓶子和人手同时出现的场景都有这对实际部署意义更大。1.2 VOC和YOLO两种格式的差异与适用场景这份数据同时提供了VOC和YOLO两种标注格式很多人第一次接触可能会疑惑为什么同样一批图要存两遍标注直接用一种不就行了吗VOC格式全称Pascal VOC是目标检测领域最经典的标注格式之一。每张图片对应一个同名XML文件XML里用固定的标签结构记录标注目标。其核心元素包括filename图片名、size图片宽高和通道数、object目标物体块以及name类别名、bndbox边界框坐标用xmin、ymin、xmax、ymax表示绝对像素坐标。XML是人类可读的打开编辑器就能看清楚每个框的位置适合人工检查和手动修改也适合在xml.etree.ElementTree、lxml这类库中做脚本处理。但缺点是文件体积大、解析慢训练框架通常需要额外写转换代码。YOLO格式则完全不同。每张图片对应一个同名TXT文件一行标注一个目标格式为类别编号 x_center y_center width height。注意这个坐标不是像素值而是在0到1之间归一化后的相对值用边界框中心点的x、y坐标以及宽、高除以图片实际宽高得到。之所以要用归一化坐标是因为YOLO系列模型内部会把输入图片缩放到固定尺寸比如640x640归一化坐标在缩放过程中不会失真。VOC转YOLO的时候最关键的步骤就是坐标转换。我自己的转换脚本核心逻辑可以写成这样import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_file, class_names): tree ET.parse(xml_file) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_names: continue cls_id class_names.index(name) bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) return lines用这份数据时如果你用的是YOLOv5、YOLOv8、YOLOv9、YOLOv10这类框架直接拷贝TXT标注就好。如果你想用Faster R-CNN、SSD或者MMDetection里的模型那VOC的XML标注反而更方便因为MMDetection等工具原生支持VOC格式的数据加载器。同时提供两种格式就是让你在不同框架之间切换时不用重新标注也省去从零转换的精力。注意VOC格式中的类别名称和YOLO格式中的类别编号顺序必须一一对应。我的数据集里固定为glass_bottle: 0、plastic_bottle: 1。如果你自己写脚本转换或者调整类别顺序一定要同时修改TXT里的编号否则会出现标注错位。1.3 数据集目录结构与7z压缩说明拿到文件后解压出来的目录结构大致如下glass-plastic-bottle-dataset/ ├── VOC/ │ ├── Annotations/ │ │ ├── 000001.xml │ │ ├── 000002.xml │ │ └── ... │ ├── JPEGImages/ │ │ ├── 000001.jpg │ │ ├── 000002.jpg │ │ └── ... │ └── ImageSets/ │ └── Main/ │ ├── train.txt │ ├── val.txt │ └── test.txt └── YOLO/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamlVOC目录下Annotations放XML标注JPEGImages放原始图片ImageSets/Main里放着已经划分好的训练、验证、测试集图片名列表。YOLO目录下images和labels分别放图片和TXT标注并且已经按train/val/test分好文件夹。data.yaml是YOLO框架的数据配置文件里面定义了类别数量和类别名称。这里说一下7z格式的问题。7z是7-Zip软件默认的压缩格式压缩率通常比zip好不少尤其对图片这类文件实测下来能比zip再省10%到20%体积。解压工具方面Windows上可以直接装7-Zip或BandizipLinux服务器上可以用p7zipUbuntu/Debian下安装命令是sudo apt install p7zip-fullmacOS可以用brew install p7zip。解压命令很简单7z x glass-plastic-bottle-dataset.7z如果你在Linux服务器上遇到7z: command not found就是没装p7zip-full装上再执行即可。有一点需要提醒7z文件在网络传输过程中如果中断重新下载后建议先检查压缩包完整性避免解压到一半报CRC错误。下载完可以先跑一下7z t 文件名.7z测试压缩包是否完整。2. 训练前必须做好的数据准备工作2.1 数据划分策略与样本均衡性分析拿到数据集后第一件要做的事不是急着开训练而是检查数据划分是否合理。我这边默认给出的划分是训练集7180张、验证集1193张、测试集570张比例大约是8:1.3:0.7。这个比例跟常见的8:1:1略有不同原因是抽取测试集时我特意手动剔除了一些光线条件过于极端的图片保证验证和测试集能更接近真实部署环境。样本均衡性方面两个类别的标注框数不是完全对等的。玻璃瓶框数约为6800个塑料瓶框数约为9100个整体比例约4:6。这个偏差是真实场景的自然反映实际画面中塑料瓶确实更常见一点。训练时如果发现模型对玻璃瓶的Recall偏低可以考虑对玻璃瓶类别做适度过采样或者用数据增强时把mosaic拼图的概率提高让每张训练图里出现的瓶子组合更丰富。如果你打算自己重新划分数据集这里有个实操建议不要只按文件名随机分最好按图片的来源场景分。比如同一个视频片段或同一次拍摄得到的连续帧要么全部归训练集要么全部归验证集避免连续帧泄露导致验证指标虚高。我的数据集来源比较杂但划分时也尽量保证同一场景的图片落在同一个集合里。2.2 标注质量检查与坐标边界问题标注质量是整个数据集生命线。训练前我建议自己抽看一遍标注框至少抽查100张图重点看两类问题一是标注框是否紧贴目标轮廓过松或过紧都会影响模型收敛二是小目标是否漏标YOLO模型对漏标的小目标很敏感漏标会让模型把该学的前景当成背景。我这里整理了一个简单的脚本可以批量检查YOLO格式标注是否有越界或非法值import os def check_yolo_labels(label_dir, img_dir): for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: lines fp.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: print(f格式错误: {f} - {line}) continue cls, xc, yc, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) if not (0 xc 1 and 0 yc 1 and 0 w 1 and 0 h 1): print(f坐标越界: {f} - {line}) if xc - w/2 0 or xc w/2 1 or yc - h/2 0 or yc h/2 1: print(f越界外扩: {f} - {line})这个脚本跑一遍如果有异常就直接输出对应的TXT文件名和内容方便你找到对应的图片进行人工复核。我在整理数据时跑过一遍发现大约有0.3%的标注存在xmax超出图片边界1到2个像素的情况这在VOC转YOLO时被归一化处理掉了不影响训练。但如果你自己从标注工具导出这一步检查不能省。2.3 图片尺寸统一化与EXIF方向问题数据集里的原始图片尺寸并不统一有1920x1080的也有1280x720的还有部分手机拍摄的4032x3024大图。YOLO训练时模型会统一缩放到640x640所以图片分辨率不统一问题不大但过大的图片会在数据加载时增加IO开销拖慢训练速度。如果你想把图片全部统一调整到一个尺寸建议用Python的OpenCV或Pillow批量处理。要注意的是Pillow默认会读取EXIF信息自动旋转图片OpenCV的imread函数不会自动处理EXIF旋转这可能导致某些手机拍摄的竖图在训练时方向错误标注框就完全错位了。如果发现数据集里有竖图训练效果异常优先检查是否为EXIF方向问题用ImageOps.exif_transpose修正后再重新生成标注。3. 基于YOLOv8的训练流程与参数配置3.1 运行环境搭建与依赖安装如果你打算用YOLOv8跑这个数据集环境搭建非常简单。PyTorch版本建议1.8以上Python版本3.8到3.11都可以。安装Ultralytics包pip install ultralyticsGPU不是必需的但强烈建议有NVIDIA显卡。CPU训练8943张图的数据集即使只用100个epoch单卡CPU可能要跑几十个小时而一张RTX 3060大概三到六个小时就能跑完。如果没显卡可以先用Google Colab免费版顶着但要注意Colab的磁盘空间和会话时长限制数据解压后大约4GB左右需要预留足够的空间。目录结构方面Ultralytics支持绝对路径也支持相对路径。用我的数据集时把解压出来的YOLO文件夹放在项目目录下然后再写一个data.yaml这样最省事path: ./glass-plastic-bottle-dataset/YOLO # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 test: images/test # 测试集图片相对路径 nc: 2 names: [glass_bottle, plastic_bottle]3.2 训练命令与超参数的心得选择准备好data.yaml后训练命令长这样yolo detect train \ dataglass-plastic-bottle-dataset/YOLO/data.yaml \ modelyolov8s.pt \ epochs120 \ imgsz640 \ batch16 \ patience20 \ projectruns/detect \ namebottle_exp1模型选择上我推荐从yolov8s.pt开始而不是直接用yolov8n.pt。原因是瓶子检测虽然类别少但类间相似度高n模型参数量太少容易欠拟合。如果你算力紧张或者需要部署到边缘设备用n模型做baseline然后看mAP差异再决定是否升级。如果你对精度要求高且GPU显存充足12GB以上直接上yolov8m.pt也行。超参数方面epoch设120是一个比较稳的起点。这个数据集的规模不算大模型在第50到80个epoch之间一般就能收敛patience设为20可以避免过拟合——当验证集mAP连续20个epoch没有提升时训练会自动停止。batch大小根据显存调整12GB显存跑yolov8s可以设16如果OOM就降到8。学习率不用手动改Ultralytics默认的0.01配合自动调度器就够用。3.3 数据增强策略与过拟合控制数据增强是提升模型泛化能力的关键手段。YOLOv8默认开启了mosaic、仿射变换、HSV增强等策略但针对瓶子检测有几个默认设置可能需要微调。mosaic增强会把四张图拼成一张对小目标检测效果提升明显。但要注意当目标本身是长条形的瓶子时mosaic拼图容易出现目标被截断的情况如果截断比例太高模型会学到不完整的特征。我在实验中把mosaic从默认的1.0调到0.8同时把mixup设为0.2发现对小目标的检测稳定性更好了。另外瓶子反光厉害适当增加hsv_h、hsv_s、hsv_v的幅度可以让模型对光照变化更鲁棒但幅度过大也会导致颜色失真建议不要超过默认值太多。如果训练过程中发现验证集loss在下降但mAP50提升缓慢基本可以判断是数据增强过强模型学到的特征被噪声干扰了。这时可以降低增强参数或者增加训练数据量。还有一个实用技巧先关闭所有增强跑20个epoch查看模型在原始数据上的拟合能力上限然后再逐步增强这样能更清楚知道性能瓶颈到底在数据还是模型。3.4 训练过程监控与性能指标解读训练开始后Ultralytics会在终端输出每个epoch的loss和指标。最开始loss会快速下降随着训练进行会趋于平缓。重点关注的指标有三个box_loss、cls_loss、mAP50。box_loss衡量预测框与真实框的误差cls_loss衡量类别分类的准确性。mAP50是IoU阈值设为0.5时的平均精度这是目标检测最常用的评价指标。在训练过程中我个人的习惯是每隔10个epoch手动看一次验证集上的预测结果图。Ultralytics会在runs/detect/bottle_exp1/val_batch*.jpg里保存一批带预测框的验证图片打开看一眼就能直观发现模型存在的问题。比如如果很多塑料瓶只被框住一半说明box_loss还有下降空间如果玻璃瓶经常被漏检说明cls分支对玻璃特征的学习不足。训练结束后用测试集做最终评估yolo detect val \ dataglass-plastic-bottle-dataset/YOLO/data.yaml \ modelruns/detect/bottle_exp1/weights/best.pt如果是导出的best.pt测试集mAP50能稳定在0.90以上就算非常理想了。我的实验结果是mAP50在0.934左右mAP50-95约0.82。如果发现测试结果和验证结果差距很大比如相差超过5个百分点大概率是数据划分时存在场景泄露或者测试集里有训练集没见过的极端环境这时要回到第2.1节重新审视划分策略。4. 部署与推理时的关键问题4.1 导出模型格式与部署场景选择训练完的best.pt是PyTorch权重实际部署时通常需要转换格式。YOLOv8用一行命令就能导出多种格式yolo export modelruns/detect/bottle_exp1/weights/best.pt formatonnx yolo export modelruns/detect/bottle_exp1/weights/best.pt formatengine device0 # TensorRT如果是部署到Jetson Nano、树莓派或者普通ARM开发板ONNX格式配合ONNX Runtime或者OpenVINO是通用性最好的方案。如果是部署到NVIDIA GPU服务器TensorRT的engine格式推理速度最快封装风险也较低。需要注意的一个细节是ONNX导出后输入输出的张量维度是固定还是动态取决于导出时的设置。Ultralytics默认导出的是固定尺寸输入比如640x640。如果你的实际部署画面是长条形或者特殊分辨率最好在导出前把imgsz参数调整为实际部署尺寸避免运行时还要做resize导致精度损失。4.2 推理时置信度阈值与NMS参数调整很多人在部署时会有一个误区模型输出框置信度低就直接丢弃认为没检测到目标。实际上置信度阈值和NMS的IoU阈值是相辅相成的。对于瓶子检测这种类别少、目标可能遮挡严重的场景我建议置信度阈值设为0.25到0.35之间不要设太高。因为瓶子在远处或者遮挡严重时模型预测的置信度天然偏低设0.5以上容易漏检。NMS的IoU阈值默认值0.45在多数场景够用。但如果画面里瓶子堆叠严重比如回收站里一堆塑料瓶挤在一起IoU阈值可以适当调低到0.4减少相邻框被误合并的情况但调太低又会造成同一个目标被输出多个框。这个参数通常要靠实际测试视频来调优先跑一段模拟场景的视频看看漏检多还是误检多再决定怎么调整。4.3 实际场景中的鲁棒性提升模型训练完直接拿去跑实际场景多多少少会遇到分布外数据。比如训练集里瓶子大部分是完整的但实际生产线上有的是压扁的、有的是破碎的。这类场景模型没见过表现会掉。两个提升鲁棒性的方法。第一是部署前的测试集扩展把实际场景拍的照片补充到测试集里反复评估模型表现找出短板第二是通过TTA测试时增强在推理阶段提升精度YOLO的TTA会对图片做多尺度缩放和翻转然后综合多个结果准确率有提升但推理速度会变慢适合离线分析场景。实时性要求高的场景不建议开TTA。5. 常见问题与排查技巧实录5.1 解压与文件路径相关报错问题17z解压时报“Unexpected end of archive”这个大概率是压缩包下载不完整。先用7z t 文件名.7z测试压缩包如果提示测试失败重新下载。如果是在服务器上下载可以用md5sum或sha256sum比对哈希值。顺便说一句7z的压缩包不支持断点续传解压压缩包坏了只能重新下载完整文件。问题2YOLO训练时提示“AssertionError: Label class X exceeds nc2”这个报错的意思是某个TXT标注文件里的类别编号大于等于2。多半是数据集中混入了编号为2或更高的标注。可以自己写脚本遍历labels目录下所有TXT检查类别编号最大值是否小于2。按第2.2节里的脚本逻辑处理即可。如果找到异常文件看一下对应的图片判断是标注错误还是转换脚本写错了映射关系。问题3VOC格式XML文件缺少size节点有些公开数据集或者第三方标注工具导出的XML不包含size节点转换YOLO格式时就无法计算归一化坐标。遇到这种XML需要用图片本身的实际宽高去补全size节点或者用PIL.Image.open读取图片尺寸后重新生成XML。5.2 训练时loss不下降或mAP为0问题1loss始终不下降首先检查数据增强是否过强把mosaic、mixup关掉跑50个epoch试试。其次检查学习率如果初始学习率太大loss会出现震荡甚至发散如果太小loss下降极慢。还有一个容易被忽略的点是batch size过小比如batch2时BN层统计不稳定也会导致收敛困难。问题2mAP为0这个我遇到过最典型的原因就是数据集的类别编号和data.yaml里的names顺序对不上。比如TXT里写的是0 0.5 0.5 0.2 0.3data.yaml里names: [glass_bottle, plastic_bottle]那这个框的类别就是glass_bottle没问题。但如果转换脚本里类别顺序是plastic在前、glass在后而data.yaml没同步改就会出现所有框的类别都错位模型分不清类别mAP自然就为0。排查方法很简单用yolo detect predict对一张训练集图片做推理看预测框对应的类别名称和标注对比是否一致。5.3 推理阶段框位置偏移或尺寸错误如果训练时一切正常导出ONNX后推理时框的位置偏了基本可以确定是预处理/后处理环节问题。YOLOv8的预处理函数中图片会被letterbox到640x640推理结果里的坐标也是640x640坐标系下的必须经过缩放还原到原图尺寸。如果你的推理代码没有正确计算letterbox的填充偏移和缩放比例框就会整体偏移或者大小不对。推荐直接用Ultralytics包自带的YOLO类做推理它内部已经处理好了这些细节如果用ONNX Runtime自己写推理务必抄对预处理和后处理代码。另一个常见问题是输入图片的通道顺序。模型训练时输入是RGB顺序如果你用OpenCV的imread读图得到的是BGR顺序直接丢给模型会导致颜色通道混乱虽然不一定影响检测框位置但会影响类别判断的准确率。处理方式是cv2.cvtColor(img, cv2.COLOR_BGR2RGB)后再输入模型或者推理代码里本来就按BGR顺序做了适配。6. 数据集的扩展思路与后续优化建议6.1 基于现有数据做类别扩展如果你后续想在这个数据集上增加新类别比如易拉罐、纸盒不用重新标注全部图片。迁移学习的方式是保持现有玻璃瓶和塑料瓶的标注不变只补充新类别的图片并标注然后基于这份数据集训练好的权重做微调。这样新类别数据和旧类别数据混合训练模型既能保留对瓶子的识别能力又能学到新类别的特征。但要注意类别不均衡。如果一个新类别只有一两百张图而原来的类别有几千张图训练时新类别很容易被淹没。建议新类别的图片至少补充到原有类别数量的三分之一左右并且训练时适当提高新类别的loss权重或者用class_weights参数调整。6.2 细粒度分类与实例分割的演进路径目前这份数据集是检测级标注只有边界框没有分割掩码。如果在实际项目中需要区分瓶子的品牌、颜色、是否需要压扁回收等细粒度信息有两种演进路径。一是继续做检测但增加类别维度比如green_glass_bottle、brown_glass_bottle、transparent_plastic_bottle等二是升级到实例分割需要把标注框改成多边形掩码标注工作量会增加不少但能获得更精确的目标轮廓对机械臂抓取等场景意义很大。如果决定升级到实例分割VOC格式的XML无法直接承载多边形标注需要转换为COCO格式或YOLO分割格式。这个过程推荐用LabelMe或X-AnyLabeling这类工具手动补标注而不是纯脚本自动转换因为自动生成的掩码往往无法贴合物体边缘。6.3 与其他公开数据集融合的注意事项网上公开的瓶子类数据集有不少但直接混合使用时一定要检查类别语义是否一致。比如有的数据集把“塑料瓶”定义为“PET bottle”有的把“玻璃瓶”细分为“wine bottle”“beer bottle”如果直接混用会导致同一个模型里同一类物体出现多种标签类别数量膨胀训练效果反而变差。正确做法是先对类别做映射统一成自己的类别体系再进行混合训练。混合数据时还要注意图片分辨率和光照条件的差异。如果某个数据集图片整体偏暗、分辨率低混合后可能会拖低整体mAP。建议先小规模混合训练对比没混合前的baseline如果mAP下降超过2到3个百分点就要重新筛选外部数据。我在实际测试中还发现一个有效技巧用这份数据集预训练模型后在少量实际场景图片上做微调效果往往比直接混合大量外部数据更好。具体做法是先在这8943张图上训练到收敛然后用实际场景拍摄的几百张图做低学习率微调学习率设为正常值的1/10约0.001可以让模型快速适配目标环境。7. 一些实践体会七千多张图的标注听着不多真正处理起来才发现工作量大部分花在清洗和格式转换上。最耗时的不是画框而是反复检查标注和图像是否对齐、类别名是否统一、坐标是否越界。这套数据用下来我最满意的是场景覆盖度无论是室内灯光环境还是户外自然光模型都能有比较稳定的表现但也必须承认放在极端天气或者强逆光下识别准确率还是有明显下降。这也是所有视觉检测项目的通病——数据里没有的场景模型很难凭空学会。训练时建议先按默认配置跑通整个流程再逐步尝试调整增强参数。不要一上来就疯狂堆epoch或者堆模型大小这个数据集的规模不大yolov8s配合合理的增强已经能取得不错的效果。等模型表现稳定后再考虑换更大的骨干网络、做模型蒸馏或者导出TensorRT加速都是水到渠成的事。最后再分享一个小技巧做瓶子检测的时候IOU阈值和置信度阈值的搭配比换模型结构更影响实际体验。很多场景下你不需要99%的mAP但需要部署环境里的误检率和漏检率平衡。建议训练完先在测试集上做一次置信度阈值扫描找到最适合你业务场景的阈值组合再固化到推理代码里。我这边是一开始用了默认0.45置信度阈值发现小瓶子漏检太多后来降到0.3漏检明显减少虽然误检也跟着多了几个但用NMS和后续规则过滤可以压下去。这类调优经验在不同场景里会有差异但思路是通用的。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门