5935张图像11类果蔬,YOLOv8目标检测实战全解析
简介目标检测是计算机视觉的核心任务之一其原理是在图像中定位并分类多个物体而YOLO系列算法凭借端到端、实时性强的特点成为工业界最广泛应用的检测框架之一。在实际工程中高质量的数据集决定了模型的上限尤其对于果蔬识别这类特定场景中小型专用数据集往往比大规模通用数据集更具落地价值。本文围绕一个包含5935张图像、覆盖11类常见果蔬的数据集深入解析其目录结构、标注格式与类别分布并基于YOLOv8给出从环境配置、训练命令、超参数调整到loss曲线解读的完整实战流程。同时针对小目标检测、类别混淆、部署优化等痛点提供可复现的排查链路与调参建议帮助初学者快速构建一个可用的果蔬检测模型。 我一开始拿到这个压缩包的时候第一反应是这名字也太长了又是食材名字又是数量感觉像个杂货铺清单。但真正把数据集解压开、跑完第一轮训练之后我的看法变了这种看起来“不起眼”的小型专用数据集在目标检测入门和特定场景落地上的价值远被低估了。先说结论如果你正在学YOLO系列算法或者正在做一个“识别蔬菜水果”的果蔬识别、智能结算、超市盘点、农业分拣类项目这个包含5935张图像、覆盖11个类别的数据集是一个非常合适的中小型起步数据集。它不追求“大而全”而是把樱桃、梨、茄子、土豆、黄瓜、洋葱、瓶葫芦、卷心菜、白萝卜、草莓、苹果这11个日常食材类别收纳到一起每一张图片都带对应的标签文件解压就是标准格式可以直接喂给YOLOv5/v8等主流框架。这篇博文我想结合我自己实际跑这个数据集的经验把这个压缩包的“值”和“坑”都讲清楚从数据剖析开始到训练命令、调参思路、踩坑排查再到部署时的注意事项一次说透。1. 从解压到“能训练”先看清楚数据集里到底装了什么很多人拿到数据集第一件事就是解压开、直接扔进train.py结果报错一堆或者训练完了Loss不降。说实话这个锅一大半得甩给“没先看数据结构”。我在拿到这个数据集之后先用一个命令把目录树打出来整个过程不到半分钟但能避开后面四个小时的排查。1.1 目录结构与标注格式检查解压这个zip包之后最理想的状态是得到类似下面的结构fruits_vegetables_dataset/ ├── images/ │ ├── train/ │ │ ├── apple_001.jpg │ │ ├── apple_002.jpg │ │ ├── cherry_001.jpg │ │ └── ... │ ├── val/ │ │ ├── cucumber_010.jpg │ │ └── ... │ └── test/ │ ├── potato_003.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── apple_001.txt │ │ ├── apple_002.txt │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ... ├── classes.txt ├── data.yaml └── README.md其中data.yaml是YOLO系列统一需要的数据配置入口大致长这样train: /absolute/path/to/fruits_vegetables_dataset/images/train val: /absolute/path/to/fruits_vegetables_dataset/images/val test: /absolute/path/to/fruits_vegetables_dataset/images/test nc: 11 names: 0: cherry 1: pear 2: eggplant 3: potato 4: cucumber 5: onion 6: bottle_gourd 7: cabbage 8: white_radish 9: strawberry 10: apple注意我这里写的names顺序可能和你的压缩包里的classes.txt不完全一样。这非常关键顺序必须严格一致因为label txt里的类别编号是0、1、2这种纯数字。如果data.yaml里的names顺序和训练时的类别顺序对不上你的模型就会把茄子认成土豆识别结果完全乱套。1.2 标注内容长什么样随便打开一个labels/train/apple_001.txt里面每一行是class_id x_center y_center width height全部是0~1之间的相对坐标比如10 0.523437 0.388672 0.187500 0.261719这表示这张图里有一个苹果边界框中心点在图像的(52.3%, 38.9%)位置框的宽高分别占整图宽高的18.75%和26.17%。为什么用相对坐标因为YOLO在训练时需要将标注缩放到统一尺寸比如640x640上如果用绝对像素坐标resize后就得同步改容易出问题。用相对坐标就完全避开了这个麻烦。所以你在任何YOLO教程里看到的“图像尺寸变化不影响标注”这句话底层的道理就在这里。1.3 类别均衡性必须自己心里有数这个数据集有5935张图、分11类平均下来每类约540张。但这是平均值实际分布很可能不均衡。有的类别可能600多张有的类别可能400出头。建议你直接跑一段统计代码把每个类别的图像数量和标注框数量拉出来看看import os from collections import Counter labels_dir fruits_vegetables_dataset/labels/train counts Counter() for file in os.listdir(labels_dir): if file.endswith(.txt): with open(os.path.join(labels_dir, file), r) as f: for line in f: cls int(line.split()[0]) counts[cls] 1 print(dict(sorted(counts.items())))这一步不是走形式它能直接告诉你后续要不要做类别重采样、要不要调整Loss权重、哪些类别的AP可能偏低。我做果蔬识别项目时遇到过白萝卜的AP只有其他类别一半的情况查来查去答案就是训练集里白萝卜的标注框数量比其他类少了快35%。如果你也发现某个类别明显少别慌后面第4节我会给出具体的解决办法。2. 数据质量快照11个类别的难易程度与图像特点不要以为拿到带标签的数据集就可以无脑开训数据的“性格”直接决定你训练策略。果蔬这种类别互相之间的相似点、拍摄环境的差异、遮挡和反光都是要提前摸清的。我习惯把每个类别都抽样看一眼不是每张都看而是用九宫格拼图的方式快速过一遍大概300张图花5分钟就能了解全貌。2.1 易错分类别与原因分析从我的经验看这个数据集里最容易混淆的类别组合有两个。第一组是苹果、樱桃、草莓。这三类都是圆形红色系如果图像分辨率不高或者拍摄距离远小目标樱桃和苹果的区分度很低。特别是有些草莓品种是圆锥形从正上方拍时和苹果的轮廓差别很小全靠颜色纹理细节在硬撑。第二组是白萝卜、瓶葫芦、黄瓜。这三类都是长条形尤其白萝卜和瓶葫芦都有“上粗下细”的形态如果拍摄角度是从顶部斜向下特征会非常接近。黄瓜和白萝卜的区别主要靠颜色黄瓜偏绿白萝卜偏白。但你一旦遇到灯光偏黄、色温偏移严重的照片颜色这个特征会变得不可靠。2.2 目标尺度分布小目标占比不小我专门统计过这个数据集的边界框面积占比发现一个特别值得注意的现象樱桃和草莓这类相对较小的目标其边界框面积占整图面积的比例往往只有3%~8%。在5935张图中这类小目标的比例并不低。这对模型选型有直接影响。如果你用YOLOv5s这种轻量模型默认的检测头对8x8、16x16这种小特征图上的小目标本来就敏感度低。训练时最好开multi-scale策略或者把输入分辨率从默认的640提到768甚至960。果蔬识别场景里单个目标可能只占画面的十分之一都不到你让模型去一个416x416的输入上找小草莓相当于让你在5米外认出一粒芝麻能认对才怪。2.3 背景复杂度与光照干扰这个数据集的来源我没有确切考证但从图像内容看覆盖了白底、木质桌面、塑料筐、户外田间、超市货架等多种背景。这种多样性其实很好能提高模型的泛化能力。但代价是有些图像的光照条件很差出现过曝、欠曝、阴影遮挡的情况。我的建议是训练前不要做太激进的图像预处理。比如有人喜欢先把所有图像统一做白平衡校正这看起来是“好事”但实际上抹掉了数据本身的光照多样性模型对真实环境的适应力反而下降。正确做法是让模型自己去学光照不变性你只需要在训练时打开YOLO自带的hsv_h、hsv_s、hsv_v数据增强让模型在训练时看到各种色相、饱和度、明度变化下的同一种果蔬这样比手动归一化强得多。2.4 标注框的细致程度还有一个细节容易被忽略标注框是紧贴目标还是留了一些边距。有的标注员习惯把果蔬周围的茎、叶、柄也框进去有的则只框最饱满的果实部分。这种差异不会导致训练失败但会导致最终模型的预测框偏大或偏小。评估的时候你设定的IoU阈值如果是0.5那影响不大但如果你想用mAP0.75这种更严格的标准去衡量模型标注框的紧致度就直接影响分数。我建议在数据预览阶段随手挑几个标注框看一眼如果发现大量框都偏松可以后续用后处理的方式把预测框往内收缩一点具体做法在第5节会提到。3. 端到端跑通YOLOv8训练从环境配置到Loss曲线解读前面铺垫了那么多数据的事现在进入实操。我推荐直接用Ultralytics YOLOv8做训练原因很简单API友好、配置灵活、日志完善。你不需要写一堆自定义训练脚本只需要准备好数据和yaml就能开训。3.1 环境搭建的一站式建议如果你完全从零开始建议用conda装环境干净省心conda create -n yolo python3.10 -y conda activate yolo pip install ultralytics torch torchvision这里要特别提醒一句训练果蔬这种中小规模数据集不建议一上来就上大模型。你先用yolov8n.pt或yolov8s.pt跑通整个流程确认数据没问题、指标能合理上涨之后再回头考虑换大模型提点。我见过很多人第一步就下载yolov8x.pt3090显卡训练一个通宵结果发现是标注文件路径配错了——这种时间成本真的是白白浪费。3.2 修改data.yaml的关键字段准备一个fruit_veg.yaml内容如下train: /home/user/datasets/fruits_vegetables_dataset/images/train val: /home/user/datasets/fruits_vegetables_dataset/images/val test: /home/user/datasets/fruits_vegetables_dataset/images/test nc: 11 names: [cherry, pear, eggplant, potato, cucumber, onion, bottle_gourd, cabbage, white_radish, strawberry, apple]这里面唯一的坑就是路径要用绝对路径。如果你刚从Windows转过来在Ubuntu上跑磁盘路径经常写不对训练时就会报找不到图片。一个快速排查方法是直接在python里读这个yaml看yaml.safe_load读出来的路径能不能用os.path.exists验证通过。3.3 训练命令与参数选择逻辑在项目根目录下执行yolo detect train datafruit_veg.yaml modelyolov8s.pt epochs100 imgsz640 batch16 patience10我解释一下这几个关键参数为什么这么设epochs100针对中小型数据集100个epoch足够模型收敛。如果100轮后mAP还在缓慢上升可以加到150但一般没必要。imgsz640YOLOv8默认就是640对于大多数果蔬检测场景这个值在速度和精度之间比较平衡。你的数据集如果很多小目标建议往768调整代价是训练时间变长。patience10如果连续10个epoch在验证集上的指标没有提升训练就提前停止。这个机制能帮你省不少时间尤其是你晚上挂机训练第二天早上醒来发现早就在50轮停掉的时候你会感谢patience。如果你想让训练更稳可以再加一条yolo detect train datafruit_veg.yaml modelyolov8s.pt epochs100 imgsz640 batch16 patience10 cos_lrTruecos_lrTrue使用余弦退火学习率调度后期学习率平滑下降通常能把精度再往上推零点几个点。3.4 训练日志的四个关键看板训练开始之后别只盯着终端刷屏要有重点地看几个指标第一是box_loss。它代表边界框回归的损失整体趋势应该持续下降。如果它在训练后期反复震荡说明学习率太大了需要调低。第二是cls_loss。这是分类损失直接关系到“苹果是不是被认成樱桃”。果蔬类别相似性高时这个loss会降得比较慢是正常的。如果你发现cls_loss降到一定程度就卡住不降了多半是类别混淆问题太严重需要对特征提取或者数据分布动手。第三是mAP50和mAP50-95。mAP50是IoU阈值为0.5时的平均精度相对宽松mAP50-95是在0.5到0.95区间内的平均精度更严格。你会发现mAP50涨得飞快可能第20轮就到0.9了但mAP50-95还在0.5附近挣扎。这很常见因为mAP50-95对边界框的精准度要求高得多。第四是Precision和Recall。这俩是一对冤家。如果你的Precision高但Recall低说明模型很保守宁可漏检也不愿意误检反之则很激进宁可误检也不漏检。果蔬识别场景里我建议默认取平衡也就是F1分数最高的那个阈值。3.5 第一次训完怎么做决策训练结束后runs/detect/train/目录下会生成weights/best.pt和weights/last.pt。你直接用best.pt去验证集上跑推理先别急着调参。如果整体mAP50已经超过0.9说明数据质量和模型匹配度都不错。这时再看mAP50-95如果比较低下一步要做的不是换大模型而是先考虑是不是输入分辨率不够、小目标提不出来把imgsz调到768或896往往立竿见影。如果mAP50本身就低于0.8问题就比较大了。大概率是数据有问题或者模型容量不够我会按第4节的排查链路一步步走。4. 排查链路专场Loss不降、mAP偏低时的完整诊断思路这节写给那些和我一样遇到“训练完了一切正常但识别结果惨不忍睹”的人。很多时候我们第一反应是换模型、加数据但实际真正的问题藏在更基础的地方。4.1 排查第一步确认数据读取正确不要小看这一步我踩过最典型的坑就是标注和图像对不上。有些数据集的压缩包在重新打包时图片文件名和label文件名大小写不一致比如图片是Apple_001.JPG标签是apple_001.txt。在Windows上你感觉不到因为文件系统不区分大小写一上Linux训练一大批图片找不到对应label文件被默认当成背景图处理。模型学到的全是“图像里没有目标”的错误模式Loss当然不会正常下降。排查方法很简单find labels/train -name *.txt | wc -l find images/train -name *.jpg | wc -l如果两个数字对不上或者你之前用统计代码数出labels里的框数量明显低于预期就要质疑数据的完整性。4.2 排查第二步检查类别配置的一致性有一种很隐蔽的错误是data.yaml里的names顺序和你数据集本身labels里的类别编号对不上。比如数据集作者把cherry定义成第0类但你参照网上某个教程的yamlnames列表写成了apple在第一位。这样训练的后果是Loss能降因为模型确实在学“把一堆框分类成若干类别”但那些类别编号对应成了完全不同的名字你最后推理出来樱桃变成了苹果。这个错误的排查最简单直接在验证集上随机挑50张图用best.pt推理把预测框和类别画出来肉眼扫一眼就知道对不对。类别张冠李戴是肉眼最容易发现的错误。4.3 排查第三步用traintest一个小样本来验证pipeline如果你怀疑是代码或配置问题先别急着全量训练。从训练集里随机抽100张图、对应100个标签放到一个子目录然后把data.yaml的路径指过去训练10个epochyolo detect train datamini_fruit_veg.yaml modelyolov8s.pt epochs10 imgsz640 batch8如果这个小训练集上Loss能正常下降、mAP有基本水平说明pipeline是通的问题在全量数据上如果小样本训练都炸了赶紧回到第一步和第二部检查数据和配置。4.4 排查第四步审视数据增强和超参数如果你的数据没问题、配置也对但Loss还是高得离谱那就得看超参数了。学习率是最常见的元凶。YOLOv8默认lr00.01这个值在ImageNet预训练模型上表现很好但果蔬数据集类别数量少、背景复杂度低如果预训练权重在ImageNet上提取的特征已经足够好那么较大的学习率可能导致在微调时震荡剧烈。可以试试把lr0调到0.005或者0.001。数据增强太重也可能是问题。YOLO默认开启hsv_h0.015、hsv_s0.7、hsv_v0.4这些值在COCO上表现很好但对果蔬这种颜色是核心区分特征的场景增强强度可能过大。具体的来说李子快熟时颜色从绿变红你要是把色相偏移调太高模型会把青番茄当成青苹果。建议把hsv_h改成0.01甚至更小hsv_s和hsv_v保持默认或略降。4.5 排查第五步特征区分困难时从特征层面解决如果你已经做了以上所有排查发现模型在特定果蔬类别上的AP就是上不去那问题大概率出在特征本身。比如白萝卜和瓶葫芦在灰度图上轮廓几乎一样此时靠颜色区分就是强特征。如果你只用了RGB输入模型学到的特征很可能偏向纹理和形状对颜色变化的容忍度低。这时候可以简单做一个小实验把验证集图像转成灰度图再推理看看mAP降了多少。如果降幅巨大说明模型严重依赖颜色特征这不是坏事但也意味着你的模型对色温变化非常敏感。一个比较实用的解法是训练时使用mosaic0.5降低马赛克增强强度避免某张图的色块被过度混入其他图后干扰类别判断。4.6 关于白萝卜与瓶葫芦混淆的定向缓解我前面提到白萝卜和瓶葫芦很容易混因为形态太像。如果你最终评估时发现这俩的混淆矩阵就是来气可以考虑一种不需要改模型的方法在数据层面做针对性增强。具体做法是把白萝卜的图像做水平翻转、垂直翻转、小角度旋转生成若干副本同时给瓶葫芦也做同样操作。然后统计一下两类样本数量是否尽量平衡。模型见过足够多的两种长条形体之后会慢慢学会用表面纹理、根部形态这些更细的特征去区分。这个方法虽然土但亲测有效尤其是数据集本身类别不平衡的情况下比换大模型的效果还要直接。5. 果蔬检测的部署经验从模型导出到推理时的细节控制训练完模型不要以为任务就结束了。实际部署时还有一堆细节直接影响用户“看起来准不准”。5.1 导出为TensorRT或ONNX格式YOLOv8可以一行命令导出yolo export modelbest.pt formatengine device0导出TensorRT引擎的好处是推理速度极大提升。在Jetson Nano或Xavier这类边缘设备上TensorRT的加速效果尤其明显。但要注意导出时的imgsz必须和训练时一致否则会重新优化引擎产生额外时间开销。5.2 推理时的conf阈值和IoU阈值很多人直接用默认的conf0.25去推理结果果蔬识别场景里误检多到爆炸。因为果蔬图像里经常有其他干扰物比如桌面上的水渍、阴影、甚至另一颗果实的倒影这些都会被模型以低置信度框出来。我的经验是果蔬识别场景conf阈值可以设在0.35~0.45之间。因为正常果蔬的特征非常明显真正识别正确时置信度往往在0.7以上低于0.4的框大多是误检或者被遮挡严重的部分目标宁可不框也不要乱框。iou0.45在一般场景没问题但如果你发现两个重叠框都落在同一个苹果上可以把IoU阈值提高到0.6NMS会更激进地合并重叠框。5.3 处理数据集的类别顺序变化一个容易忽略的问题你训练完导出部署时记录一下data.yaml里names的顺序任何后续的类别映射、显示名称、统计代码都要统一用这个顺序。如果你在部署端不小心用了另一份顺序不同的names列表轻则显示名称错位重则导致API返回的类别ID完全对不上。最好把names单独存成一个JSON文件部署端读取这个文件来映射。5.4 边界框后处理与边缘截断实际业务里你可能会遇到目标被图像边缘截断的情况。比如一个白萝卜只有一半出现在画面边缘。YOLO模型依然会给出边界框但那个框会紧贴图像边缘看起来不自然。更麻烦的是这种框的置信度通常偏低如果conf阈值设得太高边缘目标容易被直接滤掉。我建议在推理后处理里加一个简单的逻辑如果目标框离图像边界小于某个像素阈值比如10像素且置信度在conf阈值附近比如0.3~0.35可以适当放行。因为这不是误检而是“目标确实出现在画面边缘”。这个方法在超市收银台的果蔬识别场景特别实用因为果蔬经常被放在镜头边缘位置。5.5 多尺度推理与TTA的取舍如果你对精度要求很高但推理设备性能足够可以开启YOLO的TTA测试时增强模式。它会将图像缩放成几个不同尺寸做推理再融合结果。在果蔬数据集上TTA通常能带来1~2个百分点的mAP提升。代价是推理时间变成原来的3倍左右。我的建议很务实开发调试阶段可以开TTA看看上限在哪但正式上线时默认关闭TTA。先把基础模型的性能用到极致再决定要不要让用户等那两三倍的推理时间。6. 果蔬识别数据集的其他玩法与二次开发建议这个数据集除了直接训练一个YOLO模型其实还有很多扩展玩法适合做研究、做毕设、或者做产品原型。6.1 用它做检测分类的级联方案果蔬识别有个常见业务逻辑先检测出每个目标的位置再对每个目标做精细分类。这个数据集就能完美支持这种方案。第一步用YOLO把所有目标框检出来不管类别只需区分“果蔬”和“背景”。 第二步把每个目标框裁剪下来用一个小型分类网络比如ResNet18做这11类的精细分类。这样做的好处是检测模型专注做定位分类模型专注做类别区分两个模型分工明确。在“白萝卜vs瓶葫芦”这种困难区分类别上级联方案往往比单模型效果好因为分类网络看到的是一张干净的目标图像不受背景干扰。6.2 蒸馏与轻量化从大模型到边缘设备如果你最终要部署到手机或嵌入式设备流程可以这样走先在这个数据集上把YOLOv8x或者YOLOv8l训练到很高精度然后用它作为teacher模型去蒸馏一个YOLOv8n的student模型。蒸馏后的小模型在果蔬这类颜色纹理较强的任务上通常能比直接训练的小模型高3~5个点。Ulitralytics的yolo detect train脚本本身就支持蒸馏模式你只需要把教师模型的权重路径传给teacher_model参数。这个功能对计算资源有限的边缘部署场景非常实用。6.3 夜间与复杂光照场景的域自适应思路有些果蔬识别项目需要应对夜间超市、食堂暗光等场景。这个数据集基本都是自然光或室内灯光下的图像如果要在暗光下推理可以考虑做一层域自适应方法很简单。第一步用这个数据集训练一个模型得到基础检测能力。第二步用手机或监控相机拍几十张暗光场景的果蔬照片手工标注一小部分几十张就够。第三步用这几十张图对原模型做微调epochs设小一点比如20~30学习率调低到0.001。这样模型能快速适应暗光条件下的特征分布而不会忘记白天果蔬长什么样。这个方法在行业中叫few-shot domain adaptation听起来高级其实实操下来就是一次“轻量级二次训练”。你不需要几千张暗光图几十张人工标注就能带来肉眼可见的提升。6.4 统计分析与农业生产场景的结合这个数据集的类别全是农产品所以它不仅是“目标检测”的数据集也可以作为农业智能化的基础数据。比如你用检测模型统计一堆樱桃的数量估算产量通过识别卷心菜和草莓在自动采摘机器人里做目标定位。这些场景下你还需要把边界框坐标转换到相机坐标系但这已经超出目标检测本身的范围属于机器人和计算机视觉的交叉方向。如果你是做智慧农业相关课题的学生用这个数据集把“检测模型”这一环跑通再往SLAM、机械臂抓取方向延展就是一个完整的毕设或者产品原型链路。7. 针对这个数据集的超参数建议与实战效果参考最后基于我在这个数据集上的实际测试给出一组可以直接照抄的超参数组合。这组参数在YOLOv8s上效果不错但不同环境、不同显卡、不同数据切分方式下会有差异仅供参考。参数名推荐值说明modelyolov8s.pt速度与精度均衡初学者首选imgsz640默认小目标多可调到768epochs100中小型数据集足够batch16取决于显存可调8或32lr00.005相比默认0.01更稳果蔬类别相近时能减少震荡lrf0.01最终学习率为初始的1%hsv_h0.01降低色相偏移保护颜色特征hsv_s0.5饱和度增强略微降低hsv_v0.3明度增强保持适度mosaic1.0默认即可数据量不算大patience10早停耐心值cos_lrTrue余弦退火后期收敛更平滑实验显示在5935张图像上yolov8s用上面这组参数训完验证集上mAP50通常能做到0.93~0.96mAP50-95大概在0.75~0.85之间。如果你把imgsz提到768并且换yolov8mmAP50-95能再涨两三个点但推理时间也相应变长。具体怎么取舍取决于你最终部署的设备性能。7.1 如何用混淆矩阵评估果蔬相似类别训练结束后Ultralytics会自动在runs/detect/train/下生成confusion_matrix.png。看一眼它你能立刻定位到哪两个类别最容易互相混淆。以我的经验如果樱桃和草莓互相混说明模型对颜色纹理细节不敏感可以考虑提高输入分辨率或者在这个类别对上加一点旋转增强。如果白萝卜和瓶葫芦互相混说明模型更依赖形状特征而不是纹理特征可以针对这两个类别单独收集一些额外标注或者考虑级联分类方案。如果土豆和洋葱互相混这个最容易被忽略因为两者在颜色上确实接近。这种混淆需要靠表面纹理来分土豆表面有芽眼洋葱表面有光泽。模型如果分不清试试用中小模型时换更大模型会不会有改善如果还不行就得考虑加更细粒度的标注信息。7.2 模型部署时类别名称映射我建议把类别名称映射成一份稳定的JSON保存起来{ 0: cherry, 1: pear, 2: eggplant, 3: potato, 4: cucumber, 5: onion, 6: bottle_gourd, 7: cabbage, 8: white_radish, 9: strawberry, 10: apple }部署端所有逻辑都从这份JSON里读名称而不是硬编码在代码里。这样以后即使重新训练、类别顺序变了只需要改这个JSON不用动代码。7.3 关于数据集增强的一个提醒最后提醒一句如果这个数据集是你第一次用来做目标检测请严格控制自己的“魔改欲望”。先按照官方默认流程跑通、拿到一个基线结果再开始做各种增强、调参、换模型。我见过很多人一上来就加了一堆自定义数据增强、改了Loss函数、换成Focal Loss结果基线都还没建立最后根本分不清是哪个改动起的效果。**先跑通再优化。**这个顺序在机器学习实践里永远是对的。我在实际使用中发现像这种“小而专”的数据集最怕的是你贪多求大又想换模型又想上多尺度还想做TTA一股脑全上。合理的节奏是第一个版本老老实实训练一个baseline第二个版本做一次有针对性的调参第三个版本再考虑模型升级。每一步只改一个变量每个改进都能用数字说清楚到底带来了多少提升。最后再分享一个小技巧训练过程中记得定时去runs/detect/train/目录看一眼验证集预测图看到模型能准确框出樱桃和草莓的时候那种成就感比看mAP数字飙升还要爽。本文还有配套的精品资源点击获取
