简介面向医学影像与计算机视觉学习者的血液细胞检测资源包基于 ultralytics-yolo11 实现对血小板、红细胞、白细胞等目标的检测与分析可用于辅助血液疾病诊断场景。资源内含标注好的 BCCD 血液细胞数据集提供 YOLO 格式 txt 标签与 VOC 格式 xml 标签共 364 张图像并已划分 train、val、test 集及配套 data.yaml 文件可直接用于 yolov5/v8/v9/v10/v11/v12 等算法训练降低数据准备门槛。压缩包共 1854 个文件大小 64.42MB主要文件类型包括 Python 脚本、YAML 配置、模型权重pt、标注文件、图像以及使用教程文档便于复现、训练与二次开发。同时附有训练好的模型和参考可视化链接方便对照效果快速上手。目前已有 93 人学习下载适合需要完整数据集与现成模型的初学者或研究人员开展血液细胞检测实验、疾病辅助诊断模型训练与算法验证。1. ultralytics-yolo11 血液细胞图像检测把 BCCD 数据集变成可复现的疾病辅助诊断方案一份血常规报告单的背后是检验科人员在显微镜下识别和计数成千上万个细胞。血液细胞的准确检测与分类对贫血分型、白细胞异常、感染性疾病等问题的初筛有直接参考价值而 YOLO11 这类目标检测模型恰好能把这件事从人工目视变成可批量执行的自动化流程。这份资源就是围绕这个场景搭好的一套完整方案ultralytics-yolo11 血液细胞图像检测项目内含 BCCD 数据集 364 张已标注图像同时提供 yolo 格式txt和 voc 格式xml两套标签已经预划分好 train、val、test 三个子集并附 data.yaml 和一份训练好的模型权重。对正在做医学图像目标检测、需要现成基线模型的从业者来说可以省掉标注和从零调参的周期对想搞清楚 YOLO 格式与 VOC 格式怎么转换、训练参数怎么设才有好效果的入门者也是一份能照着复现的资料。下面我从数据集结构讲到环境配置、训练推理最后把几个容易翻车的点单独列出来说清楚。2. 数据集与双格式标签BCCD 的结构、转换脚本与 data.yaml2.1 目录结构与文件数量核对拿到资源包第一件事不是立刻打开训练命令而是先把目录结构和对齐关系理清楚。这类打包好的 YOLO 数据集内部通常按 images、labels 两级目录组织train、val、test 各自持有自己的图像和标签子目录。BCCD 数据集总共 364 张图像还同时给了 VOC 的 XML 标注和 YOLO 的 TXT 标注。你解压后大概率看到类似这样的目录骨架blood_cell_detection/ ├── data.yaml ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ ├── test/ │ ├── images/ │ └── labels/ └── weights/ └── best.ptlabels 目录下的 txt 文件名必须与 images 目录下的图像文件名一一对应这是 YOLO 训练的基本前提。如果不一致训练时 ultralytics 只会输出 warning 然后跳过这些图像数据就白白浪费了。我习惯先把三个子集各有多少图像、多少标签做一个快速核对免得训练到一半才发现数据集有缺口。用一个简单的 shell 循环就能完成for split in train val test; do img_count$(ls images/$split/*.jpg 2/dev/null | wc -l) lab_count$(ls labels/$split/*.txt 2/dev/null | wc -l) echo $split: images$img_count labels$lab_count done这段命令做的事很简单分别统计 images 和 labels 目录下 jpg 文件与 txt 文件的数量然后按子集打印出来。如果某个子集两侧数量不一致说明存在缺标签或者多余标签的图像需要先处理再训练。还要注意一点有些数据集的图像后缀是 .png 或 .jpeg上面命令里只匹配了 .jpg如果统计结果是 0先确认后缀再改命令。这一步建议在训练前做掉比训练中途排查要省事得多。2.2 双格式标注VOC 和 YOLO 的差异与转换原理这份资源同时给了两套标注意味着你既能用 LabelImg 类的工具打开 XML 检查标注质量也能直接拿 TXT 开训。很多从零接触目标检测的人有一个误区以为 VOC 和 YOLO 格式只差一个后缀名实际上两者描述边界框的方式完全不同。VOC 格式记录的是边界框左上角和右下角的像素坐标同时记录类别名称YOLO 格式记录的是归一化后的中心点坐标和宽高只记录类别 id。下面用一个标注示例直观对比。VOC 格式的 XML 大概是这样的annotation filenameblood_001.jpg/filename size width640/width height480/height depth3/depth /size object nameRBC/name bndbox xmin213/xmin ymin198/ymin xmax328/xmax ymax260/ymax /bndbox /object /annotation而同一张图像对应的 YOLO txt 文件里内容是下面这样的1 0.422656 0.477083 0.179688 0.129167这里 class id 为 1对应 data.yaml 中的 RBC后面四个数字分别是中心点 x、中心点 y、宽度、高度。注意宽高比例变大或者坐标超界大部分是转换时没有用原始图像尺寸做归一化导致的。VOC 转 YOLO 的典型脚本我之前写过很多次这里给出一版可以直接参考的import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_file, out_dir, class_list): 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): cls_name obj.find(name).text if cls_name not in class_list: continue cls_id class_list.index(cls_name) 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 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}\n) out_path os.path.join(out_dir, os.path.basename(xml_file).replace(.xml, .txt)) with open(out_path, w) as f: f.writelines(lines) class_list [Platelets, RBC, WBC] voc_to_yolo(annotations/blood_001.xml, labels, class_list)脚本的关键逻辑是从 XML 中读取原始图像宽高和每个目标的边界框然后把对角坐标换算成归一化的中心点与宽高。class_list 的顺序必须和 data.yaml 中 names 的顺序严格一致否则类别会错位。这一点是转换流程中最隐蔽的坑我在后面避坑章节还会详细展开。转换完成后不要急着删掉 VOC 原文件先抽三到五张图把生成的 txt 画到图像上看一看确认框的位置和类别都对得上再做下一步。2.3 data.yaml 参数逐字段解读data.yaml 是 yolov5、v8、v9、v10、v11、v12 等所有 YOLO 系列训练流程的入口文件。内容很短但每个字段都会直接决定训练时数据是不是对得上。下面结合这份资源里附带的 data.yaml 来做拆解path: . train: train/images val: val/images test: test/images nc: 3 names: [Platelets, RBC, WBC]第一行 path 表示数据集根目录写的是当前目录也就是点号。train、val、test 分别指向三个子集的图像目录这些路径会与 path 拼接成完整路径。nc 声明类别总数这里是 3。names 是类别名称列表顺序和转换脚本里的 class_list 必须一致。注意这里的 names 顺序一旦定了就不要随意改动因为你标注文件里的 class id 就是按照这个顺序写入的改动 names 顺序等于把所有标签的类别含义全部改掉。在实际使用中data.yaml 最常见的坑有两个。一个是没有设置 path只写了 train: train/images在一些旧版本框架里可以运行但在新版本中路径拼接逻辑变了可能直接报找不到数据另一个是把 path 写成了绝对路径比如 C 盘解压到某个目录时的完整路径换一台机器或者换一个解压位置就失效。我的建议是始终把 data.yaml 放在数据集根目录下path 固定写点号这样整个数据集目录可以整体拷贝迁移配置文件不需要任何修改。如果你的图像后缀不是 jpg还要确认 data.yaml 里没有写死后缀ultralytics 默认会查找 jpg、png、jpeg 等常见格式一般不用额外处理。2.4 类别不平衡BCCD 三类目标的分布差异BCCD 数据集的三类目标在数量上并不平均。实际标注来看RBC 红细胞最多一张图里密集分布几十个红细胞非常常见血小板 Platelets 次之WBC 白细胞最少一张图上往往只有一两个。这种数量差异会直接影响模型训练时的梯度分布如果不做任何处理模型会把学习重心放在数量占优的 RBC 上WBC 和 Platelets 的检测精度会明显落后。在做训练之前先统计每个类别的目标总数会比较直观。统计脚本也很简单from collections import Counter import os counter Counter() for split in [train, val, test]: label_dir flabels/{split} for fn in os.listdir(label_dir): with open(os.path.join(label_dir, fn)) as f: for line in f: cls_id int(line.split()[0]) counter[(split, cls_id)] 1 print(counter)每个子集的每个类别数量打出来心里就有底了。如果某些类别确实偏少优先靠 YOLO 内置的 mosaic 数据增强来弥补。mosaic 会把四张图拼接成一张送入训练相当于在每次迭代中增加了样本多样性尤其是对小目标更友好。ultralytics 里 mosaic 默认开启epochs 后期会自动关闭一部分增强这个阶段叫 close_mosaic主要是为了让模型在最后几轮适应更接近真实分布的数据不要手动把 close_mosaic 关掉。如果经过几十轮训练后 WBC 的 AP 还是明显偏低再考虑针对性增强比如把包含 WBC 的图像单独复制一份并做少量随机色域变化加入到训练集里。3. ultralytics 环境配置与 YOLO11 训练实战从安装到参数落地3.1 环境安装Python、PyTorch 与 ultralytics 的版本匹配要跑 YOLO11先要确认环境链条。这里说的环境链条有三个环节Python 版本、PyTorch 版本、ultralytics 版本。任何一个环节对不上训练命令都会以各种奇怪的方式失败。ultralytics 官方要求 Python 3.8 以上我实际在 Python 3.10 和 3.11 上都跑过 YOLO11没有遇到兼容性问题。PyTorch 建议 2.0 以上因为混合精度训练在 2.x 上表现更稳定。装好后第一步是验证这段链条是否完整python --version python -c import torch; print(torch, torch.__version__); print(cuda, torch.cuda.is_available())第一句确认 Python 版本第二句确认 PyTorch 版本和 CUDA 是否可用。如果输出的是 cuda False说明你装的是 CPU 版 PyTorch训练速度会慢到让人没有耐心如果直接报 torch 不存在就需要先装 PyTorch。PyTorch 的安装命令建议去官网根据你的系统、CUDA 版本生成不要用 pip install torch 这种默认命令默认源给的版本往往不带 CUDA 支持。CUDA 驱动版本过旧也会导致 torch.cuda.is_available() 返回 False这种情况要去显卡厂商的官网更新驱动而不是重装 PyTorch。安装 ultralytics 本身很简单pip install ultralytics但这里有一个高频报错值得单独拿出来说Could not find a version that satisfies the requirement ultralytics。这个报错常见原因有两个一是本机 Python 版本过低二是当前 pip 源根本没有同步 ultralytics 包。解决办法是先检查 Python 版本确认在 3.8 以上后把 pip 源临时切到官方源再装一次pip install ultralytics -i https://pypi.org/simple/。内网环境如果连官方源都访问不了可以下载 whl 包离线安装但要注意选择与 Python 对应的版本。装完以后用 import 验证一次python -c from ultralytics import YOLO; print(ultralytics ok)能正常输出 ultralytics ok说明环境已经就绪。这里多说一句我在这类目标检测项目上吃过环境配错的亏后来养成的习惯是在新机器上永远先用 conda 建一个干净的环境再按顺序装 PyTorch 和 ultralytics应用之间互不干扰排查问题也能快速定位到环境差异。3.2 训练命令与关键超参数设置环境就绪后开始正式训练。BCCD 数据集只有 364 张图像属于小数据集和 COCO 这种几十万张的大数据集不在一个量级所以训练策略要针对性调整。下面是我在这类小数据集上常用的训练命令yolo detect train \ datadata.yaml \ modelyolo11n.pt \ epochs120 \ imgsz640 \ batch16 \ lr00.001 \ warmup_epochs3 \ freeze10逐项说明参数含义。data 指向 data.yamlmodel 指定预训练权重这里用 yolo11n.pt 作为初始化而不是从头训练是基于迁移学习的考虑。小数据集从头训练卷积网络几乎不可能收敛到理想效果用预训练权重做迁移是常规做法。epochs 设 120 轮对 364 张图来说是一个偏保守但可靠的配置训练到后面如果验证集指标还在上升可以再续训。imgsz 是输入图像尺寸640 是速度和精度的折中点如果你的原始显微图像中红细胞较小可以试 960但显存占用会大幅上升。batch 设为 16 是在 8GB 显存下 yolo11n 的可用值显存不够就把 batch 降到 8。lr0 是初始学习率小数据集微调时不宜用默认的 0.01我一般用 0.001 起步。warmup_epochs 让学习率在前几轮缓慢爬升避免开局就走偏。freeze10 表示冻结模型前 10 层不参与训练这样可以保住预训练模型在通用特征上的表达能力减少小数据集过拟合风险。还有一个细节是训练过程中的图像增强参数。ultralytics 默认开启 mosaic、hsv 增强、随机翻转等。对血液细胞图像来说hsv 增强的默认值基本够用不需要额外调整因为血细胞图像本身没有方向性翻转增强不会造成语义错误保持默认即可。训练过程中如果看到某几个 epoch 的 mAP 波动特别大不要急着中止有可能是增强策略切换造成的正常抖动再观察几个 epoch 再说。3.3 训练输出解析weights、results.csv 与 loss 曲线训练结束以后ultralytics 会在 runs/detect/train 目录下生成结果。最重要的文件是 weights/best.pt 和 weights/last.pt。best.pt 是验证集上综合指标最好的权重last.pt 是最后一轮的权重。实际部署时用 best.pt不需要犹豫。另外一个文件是 results.csv逐行记录每个 epoch 的 loss 和指标我会直接读取这个 CSV 判断训练是否有问题。读取 results.csv 用 pandas 很方便import pandas as pd df pd.read_csv(runs/detect/train/results.csv) print(df.columns.tolist()) print(df.tail(5))打印最后几行重点看 train/box_loss、val/box_loss、metrics/mAP50(M) 这三列。正常的训练过程应该是 box_loss 逐步下降mAP50 逐步上升最后趋于平稳。如果看到 val/box_loss 在某一个 epoch 之后开始回升同时 train/box_loss 还在继续下降说明模型开始过拟合此时 weights 目录里早先保存的 best.pt 就是验证集上的最优解直接用那个权重不需要等到全部训练结束。这一点特别是在小数据集上会发现得比较明显364 张图像训练超过 200 轮之后过拟合几乎一定会出现。4. 模型推理与评估用训练好的权重检验检测效果4.1 单图推理与置信度阈值调整资源里已经给了训练好的模型权重拿到手先做一轮推理验证是最稳妥的落地方式。ultralytics 的推理 API 很简单但参数设置直接影响输出质量。下面是一个可以直接运行的单图推理脚本from ultralytics import YOLO model YOLO(weights/best.pt) results model.predict( sourcetest/images/blood_001.jpg, conf0.3, iou0.45, imgsz640, saveTrue, projectruns/detect, nameinference ) for r in results: for box in r.boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() print(fclass{cls_id} conf{conf:.3f} bbox{xyxy})这段代码加载 best.pt 权重对指定图像做推理。conf0.3 表示置信度阈值低于 0.3 的检测框会被过滤。血液细胞检测场景中红细胞密集、目标小如果阈值设太低会输出大量重叠框设太高又会影响血小板的检出。我一般会先在 0.25、0.3、0.4 三档各跑一遍观察输出数量变化再定档。iou0.45 是 NMS 的 IoU 阈值用来抑制重叠框血液细胞图像特别是在红细胞密集区域重合度高可以适当降低到 0.4但一般不建议低于 0.35。saveTrue 会把可视化结果保存到 runs/detect/inference 目录第一次跑建议打开直接看框的位置是不是贴合细胞轮廓。这里注意predict 打印出的 class id 需要对照 data.yaml 的 names 才能知道是 Platelets、RBC 还是 WBC。比如 class1 对应 RBCclass2 对应 WBCclass0 对应 Platelets。在医疗场景下输出的解读一旦出错后果严重所以我建议在打印日志时直接把类别名映射出来不要停留在 id 层面。再加上这个资源里还给了一份参考可视化教程可以把标注框和原图画在一起看对照检查模型行为是否符合预期。4.2 批量推理与结果导出 CSV实际需求往往不是一张两张图而是整个测试集或者一批临床图像。批量推理不需要写循环直接把 source 指向目录就行但为了方便后续统计分析把每一条检测记录落到 CSV 会更实用。下面是我常用的批量导出写法from ultralytics import YOLO import csv model YOLO(weights/best.pt) results model.predict( sourcetest/images, conf0.3, imgsz640, batch1 ) with open(detections.csv, w, newline) as f: writer csv.writer(f) writer.writerow([image, class_id, class_name, conf, x1, y1, x2, y2]) for r in results: img_path r.path for box in r.boxes: cls_id int(box.cls[0]) cls_name [Platelets, RBC, WBC][cls_id] conf float(box.conf[0]) x1, y1, x2, y2 [round(v, 2) for v in box.xyxy[0].tolist()] writer.writerow([img_path, cls_id, cls_name, round(conf, 4), x1, y1, x2, y2])batch1 在推理阶段很重要尤其当图像分辨率高、显卡显存有限时批量推理很容易直接显存溢出。CSV 里同时写入了类别 ID 和类别名后面做统计分析时就不用反复回查 data.yaml。在临床应用场景这份 CSV 可以直接作为后续人工复核的清单检验人员按坐标回查原图比对着整张图找框高效得多。如果你需要更精细的分析还可以在 CSV 里加上置信度的分位数、每个类别检测数量的汇总这些用 pandas 读进来都是一行代码的事。4.3 评估指标mAP 不是唯一的裁判对检测模型做评估ultralytics 提供了 val 命令。很多人直接用默认参数在验证集上评估但这里有一个容易被忽略的点验证集在训练过程中已经参与过多次超参数选择它的指标存在一定水分。真正的泛化能力应该用测试集来验证。命令如下yolo detect val \ modelweights/best.pt \ datadata.yaml \ splittest \ imgsz640加一个 splittest让评估跑到测试集上。输出结果里会有 mAP50、mAP50-95 以及每一类的 AP。读指标的时候不要只看 mAP50 这个综合数值。血液细胞检测场景中三类目标难度差异很大红细胞数量多、形态规整AP 通常情况下最高白细胞数量少、外观相对明显但样本量少会导致指标波动大血小板目标小容易与碎片混淆AP 通常垫底。我在看评估结果时会单独观察每个类别的 Precision、Recall 和 AP如果血小板一类 PR 明显低于其他两类说明模型对小目标响应不足接下来应该从数据增强、图像分辨率、置信度阈值三个方向分别尝试而不是盲目加大训练轮数。5. 常见问题与避坑指南把训练和推理中的真实翻车点一次说清在跑这个资源的时候有几个问题几乎每个使用者都会撞上而且搜索历史里也大量出现所以单独开一章把这些坑讲透。每一条都是按现象、原因、解决的顺序来说你在复现时遇到对应问题可以直接对照着处理。5.1 报错 FileNotFoundError训练一开始就找不到图像现象执行 yolo detect train 后终端立刻提示 train: No images found in xxx日志里给出一个路径但这个路径明显不对。原因data.yaml 里 path 字段写成了解压时的绝对路径比如 C:/Users/xxx/Downloads/blood_cell一旦目录移动或换机器路径自然失效。ultralytics 拼接路径的方式是 path 加 train 目录名任何一个环节出错都会导致定位失败。还有一部分情况是 train 目录里放的标签后缀不是 txt或者是图像后缀与默认匹配规则不一致ultralytics 也会报同样的错误。解决把 data.yaml 移到数据集根目录path 写成点号train、val、test 全部写相对路径这样整个数据集目录无论拷贝到哪里都不需要改配置。修改后先跑一遍 yolo detect train datadata.yaml modelyolo11n.pt epochs1用一轮训练验证路径没问题再跑完整训练。如果确认路径没问题仍然报错就检查图像后缀把 images 目录下的文件名后缀统一成 jpg 或 png并确保 data.yaml 不写死扩展名。5.2 安装 ultralytics 时 pip 报找不到版本现象pip install ultralytics 返回 ERROR: Could not find a version that satisfies the requirement ultralytics后面紧跟 from versions: none。原因两种情况最多见。一种本机 Python 版本太低ultralytics 要求 3.8 以上另一种当前 pip 配置了内网源源服务器没有同步 ultralytics 包。很多人的直觉是重装 pip但这解决不了问题因为根因不在 pip 工具本身。解决先执行 python --version 确认版本。版本没问题就临时切换官方源pip install ultralytics -i https://pypi.org/simple/。如果内网环境限制访问外网到官方 PyPI 页面把对应 Python 版本的 whl 文件下载到本机再执行 pip install ultralytics-xxx.whl但要注意 whl 名称里的 cp 字段必须与 Python 版本匹配。装完以后用 import 验证一次确认不会再引入下一环节的报错。5.3 XML 转 TXT 后检测框跑到图像外现象转换后生成的 txt 标签可视化时框的位置漂移有的框明显超出图像边界或者框比目标大好几倍训练出来的模型预测结果也基本不能用。原因转换脚本没有用图像的原始宽高做归一化。VOC 的 xmin、ymin 等是像素坐标YOLO 需要的是归一化后的相对值。如果某个尺寸换算错了归一化值就会大于 1 或小于 0框自然跑偏。还有一种情况是读取 width 和 height 时用了缩略图或者预处理后的尺寸和实际训练图像尺寸不一致也会导致同样的偏移。解决转换前从 XML 的 size 节点读取 width 和 height确保归一化公式用的是同一个图像的原始尺寸。转换后不要急着训练抽 5 张图把框画出来人工核对。这一步最耗时间但最值得能避免整个训练过程建立在一套错误标签上。你可以用 opencv 直接把 txt 坐标反算成像素坐标画到图上几行代码就能完成核对。5.4 训练好的模型换到新图像上漏检明显现象best.pt 在测试集上 mAP 不错换到一批新拍摄的血液细胞图像上漏检明显特别是血小板几乎全部漏掉红细胞的框也有偏移。原因BCCD 数据集来自公开图像显微镜型号、染色方法、放大倍数都固定在一个范围内。新图像的色彩分布、分辨率、细胞形态如果偏移太大模型会表现出严重的分布差异。这不是训练没收敛而是训练数据和你的真实数据不在同一个分布里。解决先拿 20 张新图像用 predict 输出每个框的置信度统计三类目标的置信度分布。大部分血小板的置信度低于 0.3说明模型对这类目标适应性差。此时对这个数据做定向微调用 best.pt 作为预训练权重新图像标注几十张训练 30 到 50 轮学习率调到 0.0005 以下。这一招是把公开模型变成可用私域模型的关键一步不要指望一个通用权重通吃所有显微镜图像。5.5 推理时显存溢出 CUDA out of memory现象批量推理时程序中断终端输出 CUDA out of memory程序直接退出。原因显存溢出通常发生在两种场景一是图像分辨率很高、imgsz 又设得大二是预测时 batch 设置过大。ultralytics predict 默认 batch1但如果显式传了 batch32 跑高分辨率图8GB 显存很容易爆。解决推理场景保持 batch1 是最稳妥的做法。如果单图仍溢出把 imgsz 从 960 降到 640。训练场景同理显存不够优先降 batch不得已再降 imgsz。这两种做法对结果的影响程度不同imgsz 对精度影响更大所以我的优先级是降 batch 优先。另外如果是推理过程中单张图就溢出检查一下是否加载了多个模型实例模型对象不释放也会持续占用显存。6. 从部署到微调让模型真正适配你的样本分布跑通推理只是第一步把模型真正用起来还需要完成两件事评估它在你自己的图像上的表现以及在表现不足时做定向微调。资源里带的 best.pt 解决的是零基础启动的问题但它不可能覆盖所有显微镜和染色的差异所以落地时我一般走一个固定的三步流程。第一步用自有图像做基准推理。把 20 到 30 张来自你实际场景的图像放进一个目录用 predict 批量跑一遍输出每张图的检测数量和置信度分布。这一步的目的是量化分布差异而不是直接调参数。统计出来 RBC 的置信度集中在 0.7 以上而 Platelets 的置信度普遍在 0.3 以下说明模型对小目标类别明显弱势单纯提高置信度阈值只会让漏检更严重。正确的做法是走微调而不是在推理参数上硬调。第二步做一轮低学习率的定向微调。把 best.pt 放在 model 参数位置data.yaml 指向你的新数据学习率设置在 0.0001 到 0.0005 之间训练 30 到 50 轮。和从头训练不同定向微调的目的不是让模型学会一个全新任务而是让它在保持原有特征提取能力的基础上适应当前图像的色彩和形态分布。这个阶段不要开过强的增强mosaic 可以保留但关闭部分随机擦除避免小数据集上的信息被增强过度破坏。第三步盲测确认。微调结束后拿一批完全没参与训练的真实图像做盲测逐张记录漏检和误检只有盲测通过这个模型才算真正交付。从那以后我每次接手新的检测模型都会强制走一遍基准推理、阈值分析、定向微调、盲测确认这个流程这个顺序帮我过滤掉了绝大多数在部署阶段才发现模型不可用的踩坑场景希望帮到你。本文还有配套的精品资源点击获取