ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CT肾脏结石检测数据集详解:YOLOv5格式、标注与训练实践

CT肾脏结石检测数据集详解:YOLOv5格式、标注与训练实践 简介一份面向目标检测初学者与医学影像分析场景的YOLOv5格式数据集专门用于CT图像中肾脏和结石的检测。数据按YOLOv5标准目录保存包含训练集325张图片、验证集135张图片均为640x640分辨率RGB图像边界框标注清晰可直接用于模型训练与效果验证。压缩包共923个文件其中460张jpg图像、461个txt标注文件另附1个可视化脚本和1张示例图整体大小约16.9MB。脚本支持随机读取一张图片绘制边界框并保存到当前目录无需修改即可运行便于快速检查标注质量。该资源已有133人学习适合需要现成医学检测数据集进行实验或入门YOLOv5的目标检测开发者。1. 拆解这份 CT 肾脏与结石检测数据集YOLOv5 格式开箱即用做医学影像目标检测的人最头疼的不是模型选型而是手里没有干净可用的数据集。我拆过不少标注乱七八糟的医疗数据集有些标签和图像对不上有些类别文件缺失折腾一晚上数据清洗模型还没开始训练。这份 CT 图像肾脏、结石检测数据集是个例外325 张训练图加 135 张验证图全部按 YOLOv5 标准文件夹结构排好图像分辨率统一为 640×640 RGB边界框标注清晰压缩后仅 17MB下载解压就能跑训练不需要额外做格式转换。它解决的核心问题是让 YOLOv5 新手能跳过数据准备阶段直接把精力放在训练和调参上让熟手能快速验证 CT 影像场景下的检测思路。适合正在做医学影像检测、结石识别、YOLOv5 入门实践的人。2. 数据结构与标签格式先搞清 YOLOv5 到底要什么2.1 文件夹结构与 images/labels 对应关系YOLOv5 训练时默认读取的数据集结构是 images 和 labels 两个兄弟目录images 放图像labels 放同名 txt 标签文件。这个数据集已经把目录名定为 datasets内含 images-train、images-val、labels-train、labels-val 四个子目录txt 文件名和图像文件名一一对应去重后一一匹配。datasets/ ├── images-train/ │ ├── Stone-697-_jpg.rf.1bc818b9afab4ee9e9292d379d687769.jpg │ └── ... (共325张) ├── images-val/ │ ├── Stone-700-_jpg.rf.c8f6f0a15b1a7cb855c424c920bae2d7.jpg │ └── ... (共135张) ├── labels-train/ │ ├── Stone-697-_jpg.rf.1bc818b9afab4ee9e9292d379d687769.txt │ └── ... (共325个) └── labels-val/ ├── Stone-700-_jpg.rf.c8f6f0a15b1a7cb855c424c920bae2d7.txt └── ... (共135个)这种结构是 YOLOv5 官方推荐的标准布局不需要写脚本去重组目录。值得注意的是文件命名带了一长串 hash 后缀我一般会先检查一遍文件名中是否包含特殊字符避免训练时路径解析出错。文件名里的rf是 Roboflow 导出的标记说明这份数据集大概率经过 Roboflow 平台的格式化和增强处理边界框坐标已经做了归一化可以直接喂给模型。2.2 标签 txt 内容解析与类别映射打开任意一个标签文件每一行代表一个目标框格式为类别ID、中心点x坐标、中心点y坐标、框宽度、框高度。所有坐标值都是相对于图像宽高的归一化数值范围在 0 到 1 之间。0 0.48203125 0.4921875 0.203125 0.1796875 1 0.728125 0.4359375 0.165625 0.1234375第一列 0 表示结石1 表示肾脏其余四列是归一化后的边界框参数。坐标归一化的好处是模型训练时不受输入图像尺寸影响这也是 YOLOv5 默认的数据格式要求。对应到 classes.txt 文件里面只有两行内容是stone kidney类别顺序必须和标签文件中的数字 ID 严格对应0 永远是 stone1 永远是 kidney顺序反了会造成训练时语义错乱。如果后续想加入第三类比如输尿管需要在 classes.txt 中追加并重写所有标签文件的 ID这一步最容易出错。2.3 和 COCO/VOC 格式的差异与转换思路COCO 格式用 JSON 文件存储标注信息包含 annotations、categories、images 三个核心字段VOC 格式是每个图像配一个 XML 文件用object标签描述目标类别和坐标范围。这个数据集是 txt 格式属于 YOLO 家族原生格式三者之间的区别主要体现在坐标表示方式和存储结构上。# VOC 转 YOLO 的核心逻辑示例 import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, classes, img_w, img_h): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue cls_id classes.index(cls) 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 / img_w y_center (ymin ymax) / 2 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) return linesxml.etree.ElementTree 是 Python 标准库不需要额外安装。img_w 和 img_h 必须取原图尺寸而不是缩放后尺寸否则归一化坐标会偏移。如果你手头有其他格式的数据集这套转换逻辑可以直接套用改造。3. 可视化验证跑通标注检查脚本3.1 脚本功能与运行方式数据集附带了一个可视化 py 文件作用是把任意一张图像和对应的 txt 标签绘制在一起直接输出带边界框的图片方便检查标注是否准确。python visualize.py --image datasets/images-train/Stone-697-_jpg.rf.1bc818b9afab4ee9e9292d379d687769.jpg脚本内部流程是读取图像 → 解析同名 txt → 用 cv2.rectangle 绘制边界框 → 用 cv2.putText 标注类别名 → 保存结果到当前目录。不需要修改任何配置传一个图片路径进去就能出结果。3.2 检查标注质量的三个核心点跑完可视化脚本后重点看三类问题这是判断一个检测数据集是否值得继续用的关键。先看边界框是否紧贴目标边缘CT 图像中肾脏和结石的边界往往比较模糊标注框太松会造成训练时 IoU 计算偏差太紧又会丢失上下文信息。再看类别是否混淆结石和肾脏在 CT 灰度图上容易看错如果发现同一块区域被重复标注成两个类别说明原始标注质量不过关。最后看是否漏检有些小尺寸结石在低剂量 CT 图像上对比度很低人工标注时容易遗漏。# 批量生成多张可视化结果建议随机抽 20 张检查 python visualize.py --image datasets/images-train/Stone-698-_jpg.rf.bb061fedc493e2891511718a880d0d29.jpg python visualize.py --image datasets/images-train/Stone-700-_jpg.rf.c8f6f0a15b1a7cb855c424c920bae2d7.jpg python visualize.py --image datasets/images-val/Stone-705-_jpg.rf.43b6f3c477810e7046b0bc47b7738adb.jpg逐个执行上面三条命令分别检查训练集和验证集中不同位置的图像。如果发现标注问题可以用 LabelImg 或 Roboflow 修正后重新导出这类修正工作数据量不大时一小时左右能完成。3.3 数据增强与样本平衡分析这个数据集共 460 张图其中主流样本是肾脏结石的正样本数量相对偏少。直接训练时模型会对肾脏类别过拟合对结石的召回率偏低。常见做法是通过数据增强手段平衡样本比例比如对含结石的图像做水平翻转、小角度旋转、亮度对比度调整生成 2~3 倍扩展副本。YOLOv5 训练时开启 mosaic、mixup 等内置增强策略也能缓解样本不平衡问题在 hyp.scratch-low.yaml 中设置对应参数权重即可。4. 训练配置与超参数让模型在自己的数据上动起来4.1 编写 dataset.yamlYOLOv5 训练前必须准备一个 dataset.yaml 文件指定训练集、验证集路径和类别信息。把这份数据集下载到本地后按实际路径修改以下内容# dataset.yaml train: /path/to/your/datasets/images-train val: /path/to/your/datasets/images-val nc: 2 names: [stone, kidney]train 和 val 指向的是 images 目录而不是 labels 目录YOLOv5 会根据文件名自动在兄弟路径下匹配 labels。路径建议写绝对路径相对路径在跨目录执行训练脚本时容易出问题。nc 是类别数必须为 2names 要和 classes.txt 中的顺序一致这里 stone 在前、kidney 在后。4.2 选择预训练权重与模型规模针对 17MB 的小数据集不建议从零训练 YOLOv5s更高效的方式是使用 COCO 预训练权重做迁移学习。COCO 预训练模型已经具备通用的特征提取能力CT 图像虽然有别于自然图像但底层边缘、纹理特征可以复用。python train.py --img 640 --batch 16 --epochs 100 --data dataset.yaml --weights yolov5s.pt --cache--img 640 对应训练图像分辨率和数据集本身的分辨率一致不需要额外 resize--batch 16 在显存不足时可降到 8--epochs 100 对于小数据集足够训练过程会保存 best.pt 和 last.pt 两个权重文件。--cache 表示把图像缓存到内存加速数据读取但如果机器内存小于 8GB不建议加这个参数CT 图像按 float32 读入内存会占用较大空间。4.3 核心超参数调整经验YOLOv5 的超参数配置文件是 data/hyps/hyp.scratch-low.yaml默认参数在 COCO 上表现好但医疗影像任务里有两个参数值得重点调整。lr0 学习率从默认的 0.01 降到 0.005 左右医学数据样本少、分布特殊学习率太高容易震荡anchor 参数不用手动改YOLOv5 会自动做 k-means 聚类适配当前数据集训练日志中会输出 AutoAnchor 的优化结果。如果训练后发现验证集的 PR 曲线抖动优先调低 lr0 和增加 warmup epoch。4.4 训练过程中的监控指标训练时可以打开 TensorBoard 或直接看终端输出的指标变化重点关注 box_loss、obj_loss、cls_loss 三个损失值和 mAP0.5。一个合格的训练曲线要满足下图规律loss 曲线整体下降且没有突然反弹mAP 曲线上升后趋于平缓。如果 cls_loss 一直降不下来大概率是标注类别错乱如果 mAP 在 30 epoch 后开始下降可能是过拟合此时应提前用 best.pt 做验证而不是等 100 epoch 跑完。5. 避坑指南CT 影像数据集的四个经验教训5.1 灰度图与三通道的坑现象训练时报错通道数不匹配或者可视化时图像看起来发绿。原因部分 CT 原图是单通道灰度图直接保存为 jpg 时可能被压缩成三通道但有些工具导出的标签坐标仍按单通道尺寸计算导致边界框偏移。解决用 OpenCV 读取时统一转成 RGB 三通道再检查图像尺寸是否与标注一致。import cv2 img cv2.imread(image.jpg) if len(img.shape) 2: img cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)5.2 CT 窗宽窗位导致的对比度问题现象模型在验证集上把许多非结石区域误检为结石。原因CT 图像的 HU 值范围极大不同设备、不同扫描参数下肾脏和结石的灰度表现差异显著模型可能学到了设备特征而不是病理特征。解决训练前对图像做归一化裁剪把灰度范围限制在肾脏和结石的典型 HU 区间比如 -100 到 300 之间再映射到 0~255能显著提升泛化能力。5.3 标签文件为空的情况现象训练过程中突然报错提示某张图片没有对应标签。原因Roboflow 导出时部分图像存在漏标或者目标过小被过滤掉导致 txt 文件为空。解决训练前写个脚本扫描所有 labels 文件为空或行数为 0 的直接删除对应图像。# 找出空标签文件 find datasets/images-train -name *.txt -size 0 find datasets/images-val -name *.txt -size 05.4 小目标结石漏检现象验证集 mAP 尚可但实际推断时直径小于 5mm 的结石检测不到。原因640×640 分辨率下小尺寸目标占据像素少特征提取不充分。解决把 --img 提升到 1280 训练一轮显存不够时使用 --rect 参数开启矩形训练减少空白区域填充或者在 yaml 中开启 mosaic 增强让模型在小目标上见更多样化的样本。6. 训练后评估可视化推理与模型局限验证6.1 用 detect.py 跑一批验证集图像训练完成后使用 YOLOv5 自带的 detect.py 脚本在验证集上进行测试观察模型对未见过的 CT 图像的实际表现。python detect.py --weights runs/train/exp/weights/best.pt --source datasets/images-val --conf-thres 0.25 --iou-thres 0.45 --save-txt --save-conf--conf-thres 0.25 表示置信度低于 0.25 的预测框会被过滤--save-txt 会保留每个预测框的类别和坐标--save-conf 会在 txt 中附加置信度。运行完以后进入 runs/detect/exp 目录先看图片再看标签文件里预测出的 bounding box 数量是否合理。6.2 用混淆矩阵定位错误类型YOLOv5 训练完会自动生成 confusion_matrix.png存放在 runs/train/exp 目录下。看混淆矩阵时重点盯两个格子stone 被预测成 kidney 的比例以及 kidney 被预测成 stone 的比例。如果 stone 那行向 kidney 方向的错误率超过 10%说明两类目标的特征在 CT 图像上存在交叠需要回看原始标注确认是否有人为标错。6.3 使用测试集做最终泛化验证如果手头有额外的 CT 图像最好单独留出一部分图像做最终验证这种做法能判断模型是否对训练集过拟合。常见做法是把这份数据集中验证集再按 8:2 切分用 8 成做验证2 成做最终测试在最终测试上跑一次 map 和召回率对比训练时的验证集指标差值过大就要回到第 5 章的排查方法找原因。这套流程走完模型的基本可靠性就能心里有数。从那以后我每次拿到新的检测数据集都会强制先做完可视化检查、空标签扫描、CT 灰度范围统计这三步再决定要不要花时间训练省下来的返工时间比什么都值钱。希望帮到你。本文还有配套的精品资源点击获取
返回列表