news 2026/10/1 4:43:28

骨骼癌目标检测数据集:1288张医学图像YOLO标注与训练实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
骨骼癌目标检测数据集:1288张医学图像YOLO标注与训练实践

简介:骨骼癌目标检测数据集.zip专为医学影像AI目标检测场景设计,面向需要训练骨骼肿瘤检测模型的算法工程师、医学影像研究者及医疗AI开发者。数据集内含骨肿瘤(bone-cancer)单一类别标注,训练集908张、验证集380张,涵盖溶骨性/成骨性病变、原发及转移性骨肿瘤等典型影像特征,并采用YOLO标准格式标注病灶边界框。压缩包共2000个文件,以1288个txt标注文件、710个jpg医学图像为主,另含1个yaml配置说明与1个docx数据集介绍文档,整体约41.14MB。该数据集可直接用于YOLOv5至YOLOv12等系列框架的训练与验证,也可作为CT/MRI辅助诊断工具、骨转移癌自动筛查模型以及医学影像教学案例库的数据基础。标注数据经临床影像专家校验,有助于提升骨肿瘤早期筛查效率和支持肿瘤生长模式分析,目前已吸引86人学习下载,适合希望快速开展医疗目标检测实验的开发者。

1. 骨骼癌目标检测数据集:1288张医学图像,YOLO标注开箱即用

做医疗影像 AI 方向的人应该都有体会:公开的病灶检测数据集要么标注格式老旧,要么类别杂、图像来源混乱,真正能直接丢进 YOLO 训练流程的并不多。这份骨骼癌目标检测数据集是我近期拿到手觉得最省心的一份——训练集 908 张、验证集 380 张,一共 1288 张医学图像,统一用 YOLO 标准格式标注,类别只有bone-cancer一个。全部图像来自医学影像设备采集,覆盖原发性与转移性骨肿瘤,包含溶骨性和成骨性病变样本。适合四类人:想跑通医疗目标检测完整流程的工程师、做肿瘤辅助检测课题的研究生、需要标准化教学案例的医学影像老师,以及刚接触 YOLO 想找一份干净数据练手的新手。下面从数据集内部结构开始拆,一路讲到训练、推理和踩坑。

2. 数据集内部结构:从文件名到标签文件,读透一份 YOLO 医疗数据集

2.1 文件名里的信息量:Roboflow 导出的命名规则与哈希后缀

先别急着把 zip 解压出来就开训。这个数据集的图片文件名长这样:

IMG_1411_JPG_jpg.rf.491d1f54e36d3ad66239c5aa349bbadb.jpg 94_JPG_jpg.rf.8c0a0f6c4732a25b99283b63139b6c73.jpg nodular-fasciitis-3-1-_JPG.rf.7ac29162dac11b1699ad8f2717bb11dd.jpg 139_JPG_jpg.rf.c9cb1a9791a9db4484ac77a6857dff74.jpg

.rf.是 Roboflow 导出的标志,后面那串 32 位十六进制哈希是原始图像内容的 MD5 值,用来保证全局唯一。文件名里IMG_1411、94、187、nodular-fasciitis-3-1这类前缀是原始采集时的命名,说明这批图像来自多个不同来源——有直接导出的影像截图,也有病例编号命名的切片。这对我们有两个实际意义:第一,训练验证集划分时不能只看前缀,否则很容易把同一病例的不同切片全分进训练集;第二,nodular-fasciitis(结节性筋膜炎)这类文件名提示部分样本是良性软组织病变,和骨肿瘤在影像上容易混淆,这反而对模型鲁棒性有帮助。

解压后建议先跑一遍目录结构确认:

unzip 骨骼癌目标检测数据集.zip -d bone_cancer_dataset cd bone_cancer_dataset find . -type f | head -20 find . -name "*.txt" | wc -l find . -name "*.jpg" | wc -l

第一第二条命令用于解压并预览文件列表,第三条统计标签文件数量,第四条统计图片数量。正常情况下图片和 txt 标签应该一一对应,都是 1288 个左右。如果哪边少了,优先检查是不是有空的标注文件或者损坏的图片,这种问题在网上下载的数据集里很常见——训练到一半报Image is not JPEG的错,多半就是源头有脏文件。

2.2 标注格式详解:类别 ID、归一化坐标与空文件排查

YOLO 格式的标注规则是每个图像对应一个同名.txt文件,每一行代表一个目标框,格式为:

<class_id> <x_center> <y_center> <width> <height>

四个坐标值全部归一化到 [0, 1],除以图像宽高。这份数据集只有bone-cancer一个类别,按 YOLO 约定class_id就是0。随便挑一个标签文件看:

cat 94_JPG_jpg.rf.8c0a0f6c4732a25b99283b63139b6c73.txt

输出大概率是类似这样的:

0 0.562500 0.614583 0.125000 0.138889 0 0.302083 0.447917 0.090278 0.111111

第一行的含义是:类别0(骨骼癌病灶),边界框中心在图像横向 56.25% 处、纵向 61.46% 处,框宽为图像宽度的 12.5%,框高为图像高度的 13.89%。一个文件里有多行,说明这张图上有多个独立病灶区域,这种多框标注对检测任务很有价值。

需要特别检查的是空标注文件。Roboflow 导出时通常会把没有目标的图像也生成空 txt,YOLO 训练时这些图会作为负样本参与计算。空文件本身没问题,但如果你发现某张图明明有病灶却对应空 txt,那就是标注遗漏,属于脏数据。快速排查方式:

find . -name "*.txt" -empty | wc -l

统计空标签文件数量。如果数量较少(个位数),可以保留作为负样本;如果超过总数 5%,建议检查是否是导出异常,必要时应删掉对应图像,否则会拉低召回率。

下一步把整个数据集按标准的 YOLO 目录结构重新组织。常见做法是建立images/train、images/val、labels/train、labels/val四个目录,但这份数据集中训练集和验证集已经分开标注,所以只需将图片和标签分放两处并保持同名对应。一个稳妥的脚本框架如下:

mkdir -p bone_coco/{images/{train,val},labels/{train,val}} # 假设原目录里 train 和 val 子目录已区分 cp bone_cancer_dataset/train/*.jpg bone_coco/images/train/ cp bone_cancer_dataset/train/*.txt bone_coco/labels/train/ cp bone_cancer_dataset/valid/*.jpg bone_coco/images/val/ cp bone_cancer_dataset/valid/*.txt bone_coco/labels/val/

能跑通的前提是压缩包内已按 Roboflow 的三段式结构(train/valid/test)分好目录,实际操作时先ls确认再复制。目录组织统一后,后续训练脚本、推理脚本全都可以用相对路径引用,不用到处改绝对路径。

3. 跑通训练流程:用 YOLOv8 在骨骼癌数据集上从零开始

3.1 环境准备与数据集目录组织

YOLOv8 是目前训练这类中小尺寸目标检测数据集最顺手的框架,官方实现了数据加载、增强、分布式训练、评估一体化,比手写 PyTorch 数据管道省太多事。先用 conda 建独立环境,避免污染其他项目:

conda create -n yolo python=3.10 -y conda activate yolo pip install ultralytics

ultralytics 包会自动拉取 PyTorch 及相关依赖。如果机器有 Nvidia GPU,建议装对应版本的 CUDA 版 PyTorch,训练速度能差 10 倍以上。之后用一行命令确认安装:

yolo predict model=yolov8n.pt source=https://ultralytics.com/images/bus.jpg

能正常输出检测结果,说明环境没问题。此时模型是官方预训练 COCO 权重,接下来要换成自定义数据集做微调。

然后写数据集配置文件。YOLOv8 用 YAML 文件描述数据集路径和类别,内容如下,保存为bone_cancer.yaml:

path: ./bone_coco train: images/train val: images/val nc: 1 names: 0: bone-cancer

path是数据集根目录相对路径,train和val指向 YOLO 格式的图片目录,nc是类别数,names是类别名映射。注意这里只能填一个类别,多了会报错。YAML 文件路径在训练命令中会用到,建议放在工作目录根下,不要放进bone_coco内部,避免之后复制数据集时把配置覆盖掉。

3.2 训练配置与参数选择

训练命令是 YOLOv8 的核心入口,参数直接影响最终效果。基础命令如下:

yolo detect train data=bone_cancer.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16 device=0 patience=20

解释每个参数的实际作用:

  • data=bone_cancer.yaml:指定数据集配置,训练前会先校验图片和标签的匹配情况,路径不对会直接报错。
  • model=yolov8n.pt:使用 YOLOv8n 预训练权重作为起始点。n 是 nano 版本,模型最小、速度最快,适合 1288 张的小数据集;显存足够且想追求精度可以换成yolov8s.pt或yolov8m.pt。
  • epochs=100:训练轮数。医疗影像数据量小,100 轮足够收敛,配合早停机制避免过拟合。
  • imgsz=640:输入图像统一缩放到 640×640。原图可能是各种尺寸,YOLO 会自动 resize,但病灶区域太小的话建议改成 960 或 1280 以保留细节,代价是显存占用和训练时长增加。
  • batch=16:批大小。显存 8G 用默认 16 一般没问题;爆显存则降到 8,同时观察 loss 波动是否变大。
  • device=0:使用第一块 GPU。CPU 训练要把这行改为device=cpu,1288 张图大概要多花 3 到 5 倍时间。
  • patience=20:连续 20 轮验证集指标无提升就提前终止,防止小数据集上后期过拟合。

3.3 开始训练与损失曲线观察

训练启动后终端会实时打印每个 epoch 的 loss 和验证集指标。第一次训练建议盯这几项:

box_loss # 边界框回归损失 cls_loss # 分类损失(单类场景这个值很小) mAP50 # IoU 阈值 0.5 时的平均精度 mAP50-95 # 更严格的综合指标,反映定位精度

正常状态下box_loss单调下降,mAP50稳步上升并逐渐收敛。如果box_loss上下剧烈震荡或者mAP50长时间 0,先停掉训练检查数据配置,不要盲目加 epoch——后面避坑章节会细说。

训练结束后,工作目录下会生成runs/detect/train/目录,里面保存了权重文件、训练曲线图和验证集预测样例图。下一步的验证和推理都依赖这里的产物。

4. 验证与推理:让模型在未见图上框出骨肿瘤

4.1 用验证集评估:mAP、精确率与召回率的读法

训练完成后,第一件事是用验证集做一次完整评估,确认模型在未见过的图像上的表现:

yolo detect val model=runs/detect/train/weights/best.pt data=bone_cancer.yaml

命令会自动读取验证集图片和标签,计算 mAP、精确率(Precision)、召回率(Recall)等指标。单类检测场景下重点关注两个数:mAP50反映基本检测能力,mAP50-95反映边界框定位精度。

这里有一个医疗场景特有的注意点:通用检测任务习惯把mAP50当唯一标准,但骨肿瘤筛查更看重召回率——漏检一个病灶的代价比误报高得多。如果验证集输出显示mAP50=0.85但Recall=0.78,说明有 22% 的病灶没被框出来,这在辅助诊断场景是不能接受的。后续在推理阶段要把置信度阈值调低来提升召回率,这是第 6 章要展开的内容。

4.2 对新图像做推理:脚本与参数设置

验证集指标只能说明整体能力,落到具体应用时需要对单张图像做推理。YOLOv8 提供了最简形式:

yolo detect predict model=runs/detect/train/weights/best.pt source=test_img.jpg conf=0.5 save=True

conf=0.5表示置信度高于 0.5 的检测框才会保留,save=True会把标注了边界框的结果图存到runs/detect/predict/。首次跑通后,批量推理更常见的是写一个 Python 脚本:

from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") results = model.predict( source="test_folder/", conf=0.25, iou=0.45, imgsz=640, save=True, ) for result in results: boxes = result.boxes print(f"图像: {result.path}") print(f"检测到 {len(boxes)} 个病灶") for box in boxes: cls_id = int(box.cls[0]) conf_score = float(box.conf[0]) xyxy = box.xyxy[0].tolist() print(f" 类别 {cls_id} 置信度 {conf_score:.2f} 坐标 {xyxy}")

脚本逻辑:遍历每张图的检测结果,读取类别 ID、置信度和边界框坐标并打印。关键参数有三个:conf=0.25是我在医疗场景下常用的起点值,比默认 0.5 低,能抓到更多疑似病灶——宁可多报让医生筛,不能少报漏诊;iou=0.45控制重叠框的合并,同一病灶产生多个重叠框时阈值越低越倾向于保留最大框;imgsz=640要与训练时保持一致,否则检测效果会退化。

输出坐标是xyxy格式,即左上角和右下角的像素坐标。如果后续要对接 DICOM 查看器或 HIS 系统,通常需要转成中心点加宽高的格式,用result.boxes.xywh可以直接拿到。

5. 避坑:小样本医疗目标检测的四个高频翻车现场

5.1 漏检多发:只盯着 mAP 导致召回率不合格

现象:验证集 mAP50 到 0.87 看着不错,但随机抽了 20 张写报告用的样例图,发现 3 张有明显病灶却没框出来。

原因:小数据集上 mAP 容易被易检样本拉高。这个数据集里溶骨性病变边界清晰、对比度高,模型很快学会;成骨性病变在 CT 上表现为高密度硬化区,和骨骼本身灰度接近,模型学不到位,漏检全集中在这些难样本上。

解决:训练和评估时强制打印每个类别的 Recall。YOLOv8 的val输出里per-class表格会按类别列出 Precision 和 Recall,单类也要盯。推理阶段把conf从 0.5 降到 0.2~0.3,先保证召回率,再人工筛误报。

5.2 类别 ID 配置错误:loss 震荡不收敛

现象:训练到第 30 轮,box_loss 还在 1.0 以上反复横跳,mAP50 一直是 0。

原因:YAML 里nc=1但标签文件里出现class_id=1或更高的值。这种情况多数是下载的数据集里混入了其他类别的标签文件,或者标签文件格式被误改过。YOLOv8 遇到超出范围的类别 ID 有时不报错,而是产生 NaN loss,然后整个训练发散。

解决:训练前跑一遍标签扫描脚本:

awk '{print $1}' bone_coco/labels/train/*.txt | sort | uniq -c

检查输出结果,正常应该只有一行908 0(或者略少)。如果出现其他数字,找到对应文件删除或修正后再训练。

5.3 过拟合:验证集 mAP 先升后崩

现象:训练曲线显示验证集 mAP50 在 60 轮时达到峰值 0.86,之后持续下降,到 100 轮掉到 0.79,而训练 loss 还在继续下降。

原因:1288 张图对 YOLOv8n 来说偏少。模型在后期开始记忆训练图像的纹理噪声和背景特征,泛化能力反而退化。

解决:patience 参数设小一点,比如patience=15,让早停机制在验证集指标开始下滑时自动截断。另外可以换用更强的数据增强策略(见第 6 章)增加样本多样性,或者改用更小的yolov8n而不是盲目上yolov8m——小模型在数据量不足时表现反而更好。

5.4 数据泄漏:同源图像被划分到训练集和验证集

现象:训练时验证集 mAP50 高达 0.92,但把模型部署到新采集的 CT 序列上,检测率明显下降。

原因:原始数据集中同一病例的不同切片被分散到了训练集和验证集。文件名前缀相同的图像本质上来自同一个患者、同一个扫描序列,图像背景和病灶形态高度相似。模型相当于已经见过验证集的“近似样本”,指标虚高。这个数据集解压后能看到IMG_1411、94、187等多个前缀系列,很可能存在这个问题。

解决:重新划分数据前,先按文件名前缀聚类,把同一前缀的图片全部放到同一个集合。如果资源允许,用GroupKFold按病例分组做交叉验证,比随机划分可靠的统计意义。修改划分后重新生成bone_coco目录再训练,得到的指标才是可对外宣称的。

6. 进阶:把单类检测做扎实,从数据增强到置信度调优

6.1 医疗影像的增强参数怎么调

1288 张图训 YOLO,数据增强不是可选项,是必需品。但医疗影像的增强参数和通用场景差别很大。我一般这样配置:

yolo detect train data=bone_cancer.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16 device=0 patience=15 hsv_h=0.02 hsv_s=0.2 hsv_v=0.2 flipud=0.0 fliplr=0.5 mosaic=0.8

参数含义:hsv_h/s/v控制色调、饱和度和明度扰动,CT 和 X 光这类灰度图像对色调扰动极敏感,hsv_h=0.02已经是上限前的不出错数值;flipud=0.0关闭上下翻转,倒置扫描切片在医疗场景没意义,反而引入错误先验;fliplr=0.5保留左右翻转,骨骼病灶左右对称性在解剖学上通常成立;mosaic=0.8启用拼图增强,四张图拼一张,对小数据集提升最明显。

6.2 用验证集扫一遍置信度,找到最优阈值

最后一个习惯我坚持了很久:不要用默认conf=0.25或者conf=0.5直接上线,而是拿验证集把阈值从 0.1 扫到 0.9,找到 F1 分数最高的那个点。脚本思路:

import numpy as np from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") results = model.val(data="bone_cancer.yaml", conf=0.001, iou=0.5) best_f1, best_conf = 0.0, 0.25 for conf in np.arange(0.05, 0.95, 0.05): # 用 val 输出的 PR 曲线数据重算该阈值下的 P/R precision = results.box.pr_curve[results.box.conf == conf] recall = results.box.rc_curve[results.box.conf == conf] f1 = 2 * precision * recall / (precision + recall + 1e-9) if f1 > best_f1: best_f1, best_conf = f1, conf print(f"最优置信度阈值: {best_conf:.2f}, 最优 F1: {best_f1:.3f}")

这段脚本的原理:YOLOv8 的val模式会输出所有预测框的置信度和对应标签,遍历不同阈值计算精确率和召回率的调和均值 F1,F1 最高的阈值就是当前模型在该数据集上的最优工作点。医疗辅助诊断场景如果更偏保守,可以在最优 F1 基础上再降 0.05~0.1,换取更高召回率。

把训练好的模型接到一个简易的推理服务上,用第 4 章的脚本批量跑一个未参与训练的 CT 序列,记录漏检和误报数量,和医生标注对比——这一步才算真正验证了数据集和模型的可用性。从那以后我拿到任何数据集,都会先做一遍标签扫描、分病例去重、阈值扫描这三步,数据质量没确认绝不动手训练。希望这次的拆解能帮你少走几步弯路。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 4:43:21

安卓模拟器过检测:设备指纹与自动化测试环境适配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 4:43:03

Unreal Engine中IsValid、IsValidLowLevel与IsValidLowLevelFast深度解析

1. 项目概述&#xff1a;三个IsValid方法&#xff0c;到底在验什么&#xff1f;在Unreal Engine的C开发中&#xff0c;尤其是涉及UObject生命周期管理、GC&#xff08;垃圾回收&#xff09;和多线程安全的场景下&#xff0c;你几乎一定会撞上这三个名字高度相似的方法&#xff…

作者头像 李华
网站建设 2026/10/1 4:41:14

RAG检索效果量化测评:从指标选型到工程实现

1. 从“凭感觉”到“可量化”&#xff1a;为什么要做检索效果测评先说一个扎心的事实&#xff1a;很多团队做 RAG&#xff0c;上线前最常问的一句话是“效果怎么样”&#xff0c;而答案通常是“我测了几个问题&#xff0c;感觉还行”。感觉这个东西&#xff0c;在技术方案评审和…

作者头像 李华
网站建设 2026/10/1 4:41:13

Apple ID已停用怎么恢复?App Store登录排查、账单与申诉指南

前一天更新 App 还好好的&#xff0c;第二天早上点开 App Store 想装个新应用&#xff0c;屏幕中央直接弹出一行字&#xff1a;"此 Apple ID 已停用"。密码肯定没记错&#xff0c;Wi-Fi 也正常&#xff0c;可就是卡在这一步登不进去。很多人第一反应是"是不是密…

作者头像 李华
网站建设 2026/10/1 4:40:51

Windows下TensorFlow GPU环境配置:CUDA/cuDNN版本匹配全指南

1. 这不是“装个包”那么简单&#xff1a;为什么Windows下TensorFlow环境配置总让人卡在第一步&#xff1f; 你搜“tensorflow安装”&#xff0c;页面刷出来几百篇教程&#xff0c;点开前五条&#xff0c;清一色标题写着“5分钟搞定TensorFlow Windows安装”。结果呢&#xff…

作者头像 李华