简介这份资源面向目标检测初学者与医学影像算法开发者提供一套可直接投入训练的宫颈癌YOLOv5检测数据集解决自建医学数据集标注繁琐、格式不统一的问题。数据按YOLOv5标准目录组织无需额外转换即可开箱使用适合小目标检测方向的模型训练与验证。压缩包共约2000个文件以txt标签、jpeg图像和1个可视化py脚本为主整体约180MB其中训练集含816张图片及对应标签验证集含216张图片及对应标签图像为640×640大分辨率RGB图标注边界框清晰、图像完整病灶目标偏小契合小目标检测场景。配套脚本随机传入一张图片即可绘制并保存边界框无需修改即可运行便于快速核验标注质量。目前已有27人学习适合用于宫颈癌病灶检测的模型训练、算法对比与教学演示。1. 一份宫颈癌 YOLOv5 数据集到底能帮你省下多少标注时间宫颈癌病理切片的目标检测卡人的从来不是模型结构而是数据。你手上如果只有几百张原始涂片或活检切片想跑 YOLOv5第一步就会死在标注上细胞核边界模糊、重叠细胞成团、阳性阴性差异细微一个熟手标一张高倍视野图要十几分钟。所以当我看到「高质量宫颈癌 YOLOv5 检测数据集包含完整训练与验证集」这类资源时第一反应不是它有多大而是它有没有把训练集和验证集切干净、类别定义是否统一、标注框是不是贴着细胞核边缘。这份数据集面向的就是做医学图像检测的从业者想快速验证 YOLOv5 在自己场景下的可行性或者拿它当预训练底座再迁移到自家医院的数据上。它解决的是「从零标注」这个最贵的环节让你把精力放在调参、部署和业务闭环上而不是天天对着切片画框。下面我按自己实际跑这类数据集的顺序把选型、环境、训练、验证和踩坑讲透。2. 拿到数据集先别急着训练宫颈癌 YOLOv5 数据的结构核对与类别映射2.1 目录结构决定你能不能直接开跑一份标着「完整训练与验证集」的 YOLO 数据集正常应该长这样根目录下分images和labels各自再分train和val每张图对应一个同名.txt标注文件内容格式是class_id x_center y_center width height坐标全部归一化到 0~1。宫颈癌数据常见的坑是类别命名不统一有的用0/1表示阴性和阳性有的用0/1/2表示正常、低级别、高级别。你拿到手第一件事不是train.py而是先数类别、看分布。# 统计训练集和验证集的图片数量、标注文件数量是否一一对应 find datasets/cervical/images/train -type f | wc -l find datasets/cervical/labels/train -type f | wc -l find datasets/cervical/images/val -type f | wc -l find datasets/cervical/labels/val -type f | wc -l # 查看标注文件里出现过的类别 id确认没有越界 cat datasets/cervical/labels/train/*.txt | awk {print $1} | sort | uniq -c这几条命令的逻辑很直接图片数和标注数必须相等否则训练时 YOLOv5 会跳过没有标注的图或者报No labels found。awk那行是看类别 id 分布如果出现3而你的data.yaml只定义了 3 类id 0/1/2训练直接崩。参数上唯一要注意的是路径别用相对路径在错误的工作目录下执行我一般先cd到项目根再跑。2.2 data.yaml 写错一个字段训练白跑一晚上YOLOv5 靠data.yaml找数据字段就四个train、val、nc、names。宫颈癌数据集最容易翻车的是names顺序和标注里的 id 对不上。比如标注里0是阳性、1是阴性你names写成[阴性,阳性]模型学出来的类别就全反了验证时 mAP 看着还行实际推理全错。# datasets/cervical/data.yaml train: ./datasets/cervical/images/train val: ./datasets/cervical/images/val nc: 2 names: [negative, positive] # 顺序必须和标注 id 严格一致逻辑说明train和val指向图片目录YOLOv5 会自动把路径里的images替换成labels去找标注。nc是类别数必须等于names长度。参数上路径建议用相对项目根的写法方便换机器。改完data.yaml后我习惯再跑一次python utils/general.py --check之类的自检或者直接看训练第一轮有没有class报错。这一步花五分钟能省你一晚上的无效训练。2.3 训练集和验证集的划分逻辑别被「完整」两个字骗了很多数据集号称有验证集其实是把训练集随机切了 10% 出来同一张切片的不同视野可能同时出现在训练和验证里这叫数据泄漏。宫颈癌切片尤其严重同一张玻片的不同区域高度相似随机切分会让验证集 mAP 虚高。我一般会按「病例」或「玻片编号」来切确保同一来源的图只出现在一个集合里。如果你拿到的数据集没有病例编号至少检查一下验证集图片的文件名前缀看有没有和训练集同源的。import os from collections import defaultdict # 按文件名前缀假设前缀是玻片号统计训练/验证是否有重叠 def prefix(f): return os.path.basename(f).split(_)[0] train_prefix {prefix(f) for f in os.listdir(datasets/cervical/images/train)} val_prefix {prefix(f) for f in os.listdir(datasets/cervical/images/val)} overlap train_prefix val_prefix print(f重叠玻片数: {len(overlap)}) if overlap: print(存在数据泄漏风险建议重新划分)这段代码的逻辑是提取文件名前缀当玻片号求交集。参数上split(_)[0]要根据你实际命名规则改。如果重叠数不为零别急着训练先重新按玻片划分否则你看到的指标都是假的。这一步是很多新手直接跳过、老手必做的动作。3. YOLOv5 环境配置与训练启动从 conda 到第一个 epoch3.1 conda 环境配置要求与依赖版本锁定YOLOv5 对环境不算挑剔但 PyTorch 和 CUDA 版本对不上就会在torch.cuda.is_available()那里返回 False然后你莫名其妙用 CPU 跑了一整晚。我一般用 conda 建一个干净环境Python 3.8 或 3.9PyTorch 选和显卡驱动匹配的版本。别直接pip install -r requirements.txt就完事那个文件里的 torch 版本可能和你 CUDA 不匹配。conda create -n cervical_yolo python3.9 -y conda activate cervical_yolo # 根据你的 CUDA 版本装 PyTorch下面以 CUDA 11.8 为例 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 再装 YOLOv5 其余依赖 pip install -r requirements.txt逻辑说明先建环境隔离依赖再单独装匹配 CUDA 的 torch最后补其余包。参数上cu118要换成你nvidia-smi右上角显示的 CUDA 版本对应值。装完跑一句python -c import torch; print(torch.cuda.is_available())输出 True 才算过关。这一步翻车最多血泪经验就是别信 requirements 里的 torch 版本。3.2 用预训练权重启动训练的最小命令环境好了训练命令其实很短。YOLOv5 官方提供yolov5s.pt这类预训练模型宫颈癌数据量通常不大用yolov5s或yolov5m就够别一上来上x显存吃不消还容易过拟合。python train.py \ --data datasets/cervical/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --project runs/train \ --name cervical_exp1逻辑说明--data指向刚才写好的 yaml--weights加载预训练权重比从头训收敛快很多--img 640是输入尺寸宫颈癌细胞核小如果显存够可以试 1024--batch 16按显存调OOM 就减半--epochs 100是上限实际看早停。参数上--project和--name决定结果存哪方便你对比多次实验。跑起来后看第一轮 loss 有没有正常下降如果box_loss一直是 nan回去查标注坐标有没有超过 1。3.3 超参数怎么调宫颈癌数据的三个关键项YOLOv5 的超参数在data/hyps/hyp.scratch-low.yaml里但宫颈癌数据我一般只动三个学习率、锚框、数据增强。学习率默认 0.01小数据集容易震荡我会降到 0.001 并配合余弦退火。锚框如果数据里目标普遍偏小用python utils/autoanchor.py重新聚类一遍。数据增强里mosaic对小目标有帮助但宫颈癌细胞重叠严重时mosaic 拼出来的图可能不真实我会把mosaic概率从 1.0 降到 0.5。# 自动重新聚类锚框适配宫颈癌细胞尺寸 python utils/autoanchor.py --data datasets/cervical/data.yaml --img 640逻辑说明autoanchor 会统计你数据里所有标注框的宽高用 k-means 重新算 9 个锚框。参数上--img要和训练时一致。跑完把输出的锚框值填回模型配置或 hyp 文件。这一步对 mAP 提升通常有 1~3 个点尤其是目标尺寸和 COCO 差异大的医学数据。4. 训练过程监控与验证集评估看懂 YOLOv5 输出的每一列4.1 训练日志里哪些指标值得盯YOLOv5 训练时终端会刷一堆列Epoch、gpu_mem、box_loss、obj_loss、cls_loss、Labels、img_size、P、R、mAP.5、mAP.5:.95。宫颈癌检测最该盯的是mAP.5:.95和R召回率。医学场景漏检代价高召回率比精确率重要。如果P很高但R低说明模型太保守很多阳性细胞没检出来这时候要降置信度阈值或调obj_loss权重。# 训练结束后用验证集单独评估输出每类指标 python val.py \ --data datasets/cervical/data.yaml \ --weights runs/train/cervical_exp1/weights/best.pt \ --img 640 \ --task val逻辑说明val.py加载 best.pt 在验证集上跑一遍输出每类的 P、R、mAP。参数--task val表示只评估不训练。跑完看per class那几行如果阴性类 mAP 0.9、阳性类只有 0.4说明类别不平衡阳性样本太少需要过采样或加 focal loss。4.2 用混淆矩阵定位「把阳性判成阴性」的问题YOLOv5 验证完会在runs/val/exp下生成confusion_matrix.png。宫颈癌二分类矩阵就 2x2但信息量很大。如果右下角真阳性数值低右上角假阴性高说明模型把阳性漏了。原因通常是阳性样本标注框太小、或者训练时阳性样本被大量阴性淹没。import cv2 import numpy as np # 简单统计验证集里阳性框的尺寸分布判断是否目标过小 def box_sizes(label_dir): sizes [] for f in os.listdir(label_dir): with open(os.path.join(label_dir, f)) as fp: for line in fp: cls, x, y, w, h line.split() if int(cls) 1: # 假设 1 是阳性 sizes.append((float(w), float(h))) return np.array(sizes) sizes box_sizes(datasets/cervical/labels/val) print(阳性框平均宽高:, sizes.mean(axis0)) print(小于 0.02 的占比:, (sizes.max(axis1) 0.02).mean())逻辑说明这段代码读验证集标注筛出阳性类统计宽高。参数上int(cls) 1要按你实际类别 id 改。如果小于 0.02 的占比超过一半说明目标极小--img 640不够要上 1024 或切图训练。这是宫颈癌数据最典型的坑。4.3 置信度门限调整推理时怎么把漏检压下去训练完的模型默认置信度阈值 0.25NMS IoU 0.45。宫颈癌推理时如果发现漏检多把置信度降到 0.1同时把 NMS IoU 降到 0.3减少重叠框被误删。但降太低会引入大量假阳性所以要结合业务筛查场景宁可假阳不可漏阳那就降辅助诊断场景要精确那就保持默认。python detect.py \ --weights runs/train/cervical_exp1/weights/best.pt \ --source datasets/cervical/images/val \ --conf 0.1 \ --iou 0.3 \ --save-txt逻辑说明--conf 0.1降低置信度门限--iou 0.3收紧 NMS--save-txt保存检测结果方便和标注对比。参数上这两个值要反复试我一般会画一条 P-R 曲线找 F1 最大的点。这一步没有银弹只能靠验证集调。5. 宫颈癌 YOLOv5 训练避坑5 个我真实踩过的坑5.1 现象训练 loss 正常下降但 mAP 一直是 0原因data.yaml里names和标注 id 顺序不一致或者nc写错。YOLOv5 不报错但类别对不上验证时算 mAP 全错。解决重新核对names顺序用cat labels/*.txt | awk {print $1} | sort -u看实际 id确保nc等于最大 id1。5.2 现象训练到一半突然 OOMbatch 已经很小原因--img设太大或者mosaic增强拼出超大图。宫颈癌切片分辨率高1024 输入下 batch 16 很容易爆。解决降--img到 640或把--batch降到 8同时开--accumulate梯度累积模拟大 batch。我一般先nvidia-smi看显存占用留 1G 余量。5.3 现象验证集 mAP 很高但拿新切片推理全错原因数据泄漏。训练集和验证集来自同一玻片模型记住了背景而不是细胞特征。解决按玻片号重新划分数据集确保同一玻片只出现在一个集合。这个坑最隐蔽指标好看但没意义。5.4 现象阳性细胞检测框大量重叠NMS 后只剩一个原因宫颈癌细胞成团模型对同一团细胞输出多个框NMS IoU 默认 0.45 删不干净或删太多。解决调--iou成团严重时降到 0.3或者改用 soft-NMS。YOLOv5 默认不支持 soft-NMS需要自己改utils/general.py里的non_max_suppression。5.5 现象训练速度极慢GPU 利用率只有 20%原因数据加载是瓶颈--workers默认 8但磁盘 IO 跟不上或者图片太大解码慢。解决把数据集转成 YOLOv5 推荐的缓存格式训练前跑一次python utils/general.py生成.npy缓存或者把--workers调到 16看 CPU 核数。我一般还会把图片统一缩放到短边 640 再存一份减少解码开销。6. 把宫颈癌数据集用出第二层价值迁移到自家切片与模型导出数据集跑通只是第一步真正值钱的是拿它当预训练底座迁移到你自己的宫颈癌切片上。我的习惯是先用这份完整数据集训一个yolov5s基线记下 mAP 和召回然后冻结 backbone只训 head用自家几百张标注图微调。这样通常比从头训快 3 倍且小样本下更稳。# 冻结 backbone 微调--freeze 10 表示冻结前 10 层 python train.py \ --data datasets/my_cervical/data.yaml \ --weights runs/train/cervical_exp1/weights/best.pt \ --freeze 10 \ --epochs 50 \ --img 640 \ --batch 8逻辑说明--freeze 10冻结前 10 层只更新检测头适合自家数据少的情况。参数上冻结层数看模型结构yolov5s总共约 24 层冻 10 层是常用值。微调完再跑val.py对比基线如果 mAP 提升不明显说明自家数据和源域差异大要解冻更多层或加数据增强。导出部署时YOLOv5 支持 ONNX、TensorRT、TorchScript。宫颈癌筛查如果上边缘设备我一般导 ONNX 再转 TensorRTFP16 量化后速度翻倍精度掉 1 个点以内。# 导出 ONNX--dynamic 支持动态 batch python export.py \ --weights runs/train/cervical_exp1/weights/best.pt \ --include onnx \ --img 640 \ --dynamic逻辑说明--include onnx指定导出格式--dynamic让 batch 维度可变方便服务端并发。参数上--img要和训练一致否则锚框对不上。导出后用onnxruntime跑一张图对比 PyTorch 输出误差在 1e-3 以内才算成功。最后说个我自己的习惯每次拿到新数据集先花半小时做数据体检再花十分钟写data.yaml最后才开训练。这四十分钟能挡掉后面百分之八十的玄学问题。宫颈癌检测这条路模型结构已经卷到头了真正拉开差距的是数据质量和验证方法。希望帮到你。本文还有配套的精品资源点击获取
