资讯动态

YOLOv5实战:乳腺癌检测数据集训练全流程与避坑指南

发布时间:2026/10/6 2:54:56 来源:尧图企业网站定制
简介面向YOLO目标检测任务的乳腺癌医学图像数据集包含训练集与验证集类别为breast cancer适合医学影像检测、癌症病灶识别等场景的模型训练与算法验证。数据已按YOLOv5目录格式整理图像分辨率统一为640×640无需额外转换即可直接接入训练流程包体共1845个文件以921张jpg图像与922个txt标签为主另附可视化py脚本与png示例图压缩包约12.87MB。训练集含778张图像及标签验证集含143张图像及标签边界框标注清晰前景丰富且覆盖多样病例表现划分明确可直接用于训练与评估。随包提供的可视化脚本无需修改随机传入一张图片即可自动绘制边界框并保存结果方便快速核验标注质量。目前已有1074人学习浏览适合需要现成YOLO格式医疗数据集的开发者、研究人员及高校学生使用。1. 拿到手就能训练一份 1 类别乳腺癌检测数据集的真实面貌这份压缩包解压以后你会看到一堆kkkkk_jpg.rf.xxxx.jpg和同名.txt文件命名格式一看就是从 Roboflow 导出的。数据倒是很干净1 个类别breast cancer训练集 778 张、验证集 143 张全部是 640×640 的 RGB 图标注文件是 YOLOv5 直接能读的 txt。也就是说你从下载到敲出第一条训练命令中间不需要写任何格式转换脚本也不需要改标签目录——这是它最大的价值省掉最脏的活。但别急着高兴。我拿到手第一件事不是训练而是先拆目录、查标签范围、看背景复杂度。因为这种医学图像数据集能不能出效果取决于你愿不愿意再花半小时做数据体检。这篇文章我按自己的使用路径写先讲数据长什么样再讲怎么训练、参数怎么定、坑在哪最后把自带的可视化脚本改造成趁手的调试工具。2. 数据格式拆解目录结构、标签 txt 与那份会骗人的 data.yaml2.1 目录结构先摸清家底再动手解压以后第一件事是tree一下确认目录层次和文件名对应关系。这份数据的标准排布是这样的dataset/ ├── data.yaml ├── images/ │ ├── train/ # 778 张 .jpg │ └── val/ # 143 张 .jpg └── labels/ ├── train/ # 778 个 .txt └── val/ # 143 个 .txt注意图片和标签必须严格同名.jpg对应.txt文件名去掉后缀以后要完全一致。训练时 YOLO 是靠这个同名关系去找标签的只要有一张图找不到对应 txt它就会在训练日志里打一条警告但不会中断训练——这恰恰是很多人在不知情的情况下把坏数据送进模型的原因。data.yaml 的内容一般是这样的train: ../images/train val: ../images/val nc: 1 names: [breast cancer]这段配置里有个隐患train和val写的是相对路径而你如果把它移到别的目录、换一台机器跑相对路径往往会失效。YOLOv5 的train.py拿到路径会先check_file()找不到就会去网上拉取再报错。我的习惯是改成本机绝对路径写完顺手用 Python 验证一次路径真实存在。2.2 标签 txt 里的五个数字先看懂再训练打开任意一个标签文件比如kkkkk_jpg.rf.3f4bbd5aa943efae5ba8b60a5d49d109.txt里面每一行是五个浮点数用空格分隔0 0.460156 0.320833 0.0703125 0.0833333五个数的含义依次是字段含义取值范围第 1 列类别编号0本数据集只有 0第 2 列边界框中心点 X 坐标0~1相对图像宽度归一化第 3 列边界框中心点 Y 坐标0~1相对图像高度归一化第 4 列边界框宽度0~1相对图像宽度归一化第 5 列边界框高度0~1相对图像高度归一化这里最关键的坑在取值范围。YOLO 要求的归一化坐标是 [0, 1] 区间如果标注工具导出时出了问题可能会出现w等于 0、或者坐标越界的情况比如某个框的 x 中心落在 0.98但宽度是 0.1那框的一部分就超出图了。训练时 U 网格会在边界把这类框截断虽然不报错但框的定位精度会变差。所以我拿到数据集后的第一个动作从来不是训练而是写个脚本扫一遍所有 txtimport os from pathlib import Path label_dir Path(dataset/labels/train) # 换成你自己的路径 bad [] for txt in label_dir.glob(*.txt): lines txt.read_text().strip().splitlines() if not lines: # 空标签文件 bad.append((txt.name, empty)) continue for line in lines: parts line.split() if len(parts) ! 5: bad.append((txt.name, columns ! 5)) continue _, x, y, w, h map(float, parts) if w 0 or h 0 or x 0 or x 1 or y 0 or y 1: bad.append((txt.name, fout of range: {line})) print(异常文件数:, len(bad)) for name, reason in bad[:20]: print(name, reason)逻辑很直接逐行拆出五列检查列数、检查 w/h 是否为正、检查归一化坐标是否出界。空标签文件我单独记出来因为 YOLO 允许空标签表示这张图里没有目标但如果训练集里空标签占比太高模型会偏向预测“无目标”这值得警惕。参数上唯一要改的只有label_dir路径脚本本身没有依赖第三方库标准库就能跑。体检完如果一切正常这份数据集在格式上就算过关了。接下来才能放心进训练流程。2.3 图像侧检查坏图与重复图标签干净不代表图像干净。还要看一眼图像本身——分辨率、通道数、能不能正常解码。这种公开数据集一般不会放损坏的图但下载过程中丢包、解压出错是有的。我一般用 PIL 批量过一遍主要看两个指标尺寸是否为 640×640、模式是否为 RGBfrom PIL import Image from pathlib import Path img_dir Path(dataset/images/train) errors [] for img_path in img_dir.glob(*.jpg): try: with Image.open(img_path) as im: im.verify() size im.size mode im.mode if size ! (640, 640) or mode ! RGB: errors.append((img_path.name, size, mode)) except Exception as e: errors.append((img_path.name, decode_error, str(e))) print(异常图像数:, len(errors)) for e in errors[:10]: print(e)这一步有意义吗有。YOLOv5 训练时会把图像批量 resize 到 640×640 再进网络虽然非 640 的图也能训但两个问题随之而来一是宽高比拉伸会改变框的比例二是letterbox加灰边后小目标框坐标换算容易出错。确认原图都是 640×640就能排除这个变量之后训练里的任何定位误差都跟图像缩放无关了。3. 端到端训练 YOLOv5从环境搭建到 best.pt 推理全流程3.1 环境准备Python 版本与 PyTorch 匹配这份数据集按 YOLOv5 的目录格式存放那就直接用 YOLOv5 仓库训练。克隆到本地以后先确认环境别急着装包git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt python -c import torch; print(torch.__version__, torch.cuda.is_available())requirements.txt会装好 torch、torchvision、opencv-python 等一套依赖。但注意一个现实问题pip install默认装的是 CPU 版 torchtorch.cuda.is_available()返回 False 时训练会异常慢。如果你机器上有 NVIDIA 显卡正确姿势是先装 CUDA 版再装其他依赖pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt参数说明cu118是 CUDA 11.8 的 PyTorch 预编译包常见的还有cu121、cu126选哪个取决于你的显卡驱动支持哪个 CUDA 版本nvidia-smi看一眼右上角就能确定。这一步不需要背装错了无非是训练时慢到怀疑人生不会有其他副作用。3.2 修改 data.yaml 并启动训练数据格式是标准的所以训练脚本几乎不用改只需要把 data.yaml 里那三个路径改成你自己的机器路径。我最终是这样配的train: /home/user/dataset/images/train val: /home/user/dataset/images/val nc: 1 names: [breast cancer]然后跑训练python train.py \ --data dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0解释几个关键参数参数值我的选择理由--weightsyolov5s.pts 模型体积小、显存占用低这种单类别小数据集不需要上 l 或 x--img640与数据集原始分辨率一致锁死这个值--batch16显存不够就把这个值往下调8 也能跑--epochs100数据集只有 778 张100 轮足够收敛再多容易过拟合--device0指定第一张 GPU没有 GPU 就改成--device cpu但要做好等很久的心理准备这里有一个很多新手会犯的错直接使用某个自定义模型时盲目套大预训练权重。yolov5x.pt 在 COCO 上确实更强但在 13MB 的小数据集上它学到的先验特征占主导微调反而可能不如从 yolov5s 开始。我一般遵循“数据集越小模型越轻”的经验规则。3.3 训练过程的三个观察点训练启动后终端会实时刷 loss 和 mAP。我不太看每个 step 的数值而是盯三个阶段第一个阶段是前 10 个 epoch 的box_loss和cls_loss是否稳定下降。如果 losses 出现震荡甚至上升优先检查学习率YOLOv5 默认 lr00.01小数据集可以降到 0.005 再试。第二个阶段是验证集上的mAP0.5。这种单类别任务mAP0.5 冲上 0.9 不算稀奇真正要关注的是 mAP0.5:0.95它要求框的位置准、置信度高两者的差距能反映数据复杂度。第三个阶段是训练结束后runs/train/exp/weights/目录下会生成last.pt和best.pt。best.pt是验证集指标最好的那一个不是最后一个 epoch 的权重。我从来只拿 best.pt 做后续推理。3.4 用 best.pt 跑推理验证效果训练完成后立刻拿验证集里没见过的图跑一次推理python detect.py \ --weights runs/train/exp/weights/best.pt \ --source ../dataset/images/val/206_jpg.rf.f05e29de0bbd67676e6fdd637acf4a8c.jpg \ --conf-thres 0.25输出会写到runs/detect/exp/下。跑完以后一定打开图片肉眼看一遍重点看三件事框有没有把病灶区域完整包住、有没有把背景组织误检成病灶、置信度分数普遍在什么范围。这一眼比任何指标都直观。顺带说一句YOLOv5 的 detect.py 可以直接输视频但医学图像场景下一般不用。它更常见的价值是把测试集整批跑一遍配合后面的可视化脚本一起看能快速定位模型在哪些图上翻车。4. 避坑乳腺癌目标检测训练里的五个典型翻车现场4.1 路径失效换机器以后 data.yaml 里的相对路径会骗人现象在 A 机器上训练一切正常把项目整个拷到 B 机器后运行train.py直接报FileNotFoundError提示找不到训练图片目录。原因这份数据默认 data.yaml 里写的是相对路径比如../dataset/images/train。这个写法依赖你执行命令时的工作目录一旦目录层级变了路径就指向不存在的位置。YOLOv5 的check_file()逻辑还会尝试联网找文件网络不通时错误信息更迷惑。解决在任何机器上跑训练前先花 10 秒把 data.yaml 改成绝对路径并且用下面这段代码验证import yaml cfg yaml.safe_load(open(dataset/data.yaml)) from pathlib import Path for k in (train, val): p Path(cfg[k]) print(k, 存在 if p.exists() else 不存在)从那以后我每次换机器都强制走一遍这段检查再没被路径坑过。4.2 标签文件空内容训练日志里没有警告但 loss 会异常现象某个 epoch 的cls_loss突然跳高然后一直不下来或者模型对负样本没有目标的区域疯狂输出低置信度框。原因部分 txt 文件是空的写着 0 行。YOLOv5 对空标签文件的态度是“这张图没有目标”不会报错但这张图每次迭代都会贡献纯背景梯度如果空文件集中出现在训练集某几类路径下模型就会被带偏。解决用我前面写的扫描脚本把所有空标签文件列出来。如果数量少比如个位数直接把对应图片和空标签一起移出数据集保持训练集完整性如果数量多留着也行但要观察它占比是否过高。占比超过 10% 时建议增加置信度阈值或者做负样本挖掘——不过这份数据 778 张图里空标签极少属于继续用没事的级别。4.3 背景高噪声纹理超声图像的误检框比漏检框更烦人现象模型把图像里偏亮、偏暗的区域误认为病灶推理结果里出现大量置信度 0.3~0.5 的假阳性框。原因医学图像尤其乳腺超声和钼靶背景纹理复杂脂肪组织、腺体、钙化点都可能产生局部高对比区域。YOLO 的定位分支依赖纹理特征训练集如果不做针对性增广模型自然会学到“有纹理就有病灶”的错误映射。解决训练时增加--hsv-h 0.015 --hsv-s 0.7 --hsv-v 0.4YOLOv5 默认值还可以通过修改 hyp 文件里的mosaic、mixup参数做增广。推理端最直接的手段是提高--conf-thres从 0.25 提到 0.4 或 0.5宁可漏检一些低置信度边界框也别让误检框污染结果。这个取舍在医疗场景下要提前想清楚你要的是高召回还是高精确率。4.4 训练中断显存溢出与进程被杀白跑十几个小时现象训练到 60 多个 epoch突然CUDA out of memory之前的进度全部白费。原因batch size 设太大或者--workers数值太高。YOLOv5 默认缓存图像到显存的选项--cache如果打开显存占用会直接翻倍。小显存卡6G/8G上尤其容易中招。解决--batch 8--workers 4并且去掉--cache如果还是炸就把--img 512数据图是 640 的但 512 也能训代价是精度小降。另一个后悔药训练前先把last.pt所在的输出目录复制一份到别处这样炸了以后可以用--resume从最后一个 checkpoint 继续而不用从头再来。4.5 验证集和训练集分布不一致指标虚高却没有实际价值现象验证集 mAP0.5 到 0.98但导入新图推理时框的位置明显偏漏检严重。原因公开数据集往往把同一个病人的多张切片随机切分到训练/验证导致验证集和训练集图像高度相似。模型训练时记住了特定纹理验证时碰巧又遇到相近图像分数自然好看但它对新图没有任何泛化能力。解决看验证集图像里有没有和训练集重复或近似的文件名。如果有用图像哈希简单查重没有工具的话至少按“来源批次”手工划分。训练完以后一定要保留一部分从未参与训练的图做最终人工评估不要只看验证集数值。5. 把可视化脚本改成调试工具单张、批量与视频帧的三种玩法这份数据自带一个可视化 py 文件功能是一张图 对应 txt 画边界框并保存。它最大的价值不是省一张图的功夫而是你验证模型、排查数据集时能立刻看到标注和预测的对齐关系。我把它拆成三段式用法按不同场景选择。第一段单张调试适合快速看某一张图的标注是否合理。原脚本基本就是这个逻辑我稍作改动让它可以同时展示两个窗口——左边是原始标注来自 txt右边是模型预测来自 best.ptimport cv2 import torch # 第 1 步加载模型 model torch.hub.load(ultralytics/yolov5, custom, pathruns/train/exp/weights/best.pt) # 第 2 步读取图像与标注 img_path dataset/images/val/kkkkk_jpg.rf.72cedd5cdb684585007c0a669d69a399.jpg img cv2.imread(img_path) # 第 3 步推理并画框 results model(img) out results.render()[0] # results.render() 返回带框的图像 list cv2.imshow(prediction, out) cv2.waitKey(0)参数说明results.render()是 YOLOv5 推理结果对象自带的可视化方法会在原图副本上绘制边界框和类别名返回 list取第一张就是我们要的图。torch.hub.load会自动从 GitHub 拉代码第一次运行需要联网之后会在本地缓存。第二段批量体检。把验证集所有图片跑一遍把置信度低于 0.3 的预测框单独挑出来存到文件夹用命名区分。这比一张张看效率高太多from pathlib import Path import cv2 val_dir Path(dataset/images/val) weak_dir Path(weak_pred) weak_dir.mkdir(exist_okTrue) for img_path in val_dir.glob(*.jpg): results model(str(img_path)) pred results.pred[0] # [N, 6] 张量 weak pred[pred[:, 4] 0.3] # 置信度列索引为 4 if len(weak) 0: img cv2.imread(str(img_path)) cv2.imwrite(str(weak_dir / img_path.name), img)这里pred[:, 4]是置信度列pred[:, 5]是类别列别搞混。跑完后weak_pred/里存的就是模型犹豫不决的样本批量翻一遍比看十页日志直观。第三段也最实用给自己留一套“训练前后对比图”。把清洗后的标注框在验证图上画好训练完用 best.pt 再画一遍预测框两张并排贴在一起。我后来发现判断这轮训练值不值得留看这种对比图比看 mAP 数字有效得多。从那以后我每次训练完都强制走一遍这个流程——标注框太乱的数据集模型是学不出好框的先修数据再调参顺序不能反。这份数据集的标签质量在公开数据里算干净的格式也标准是一份拿来做 YOLO 检测基线、跑通整套流程的好样本。你唯一要做的就是别把它当“医学诊断工具”把它当“目标检测练手 流程跑通”的基准数据。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑