
简介这份脑肿瘤实例分割医疗影像数据集面向医学影像AI开发者、算法研究人员及放射科教学人员用于解决脑部肿瘤自动识别与病灶边界精准分割的训练数据需求。数据集共含803张训练、237张验证与129张测试影像以YOLO多边形实例分割格式标注Brain_Tumor类别覆盖胶质瘤、脑膜瘤等多种肿瘤类型标注经三甲医院放射科医师双重校验并保留肿瘤异质性与边界模糊等临床特征。资源包共2000个文件以829张jpg医学影像与1169个txt标注文件为主另附1个yaml数据配置和1份docx说明文档压缩包约30.6MB原生适配YOLOv5/v7/v8等主流实例分割框架。已有171人学习下载。读者可据此搭建脑肿瘤识别与病灶定位系统开展UNet、Mask R-CNN等算法的训练验证并利用肿瘤面积占比等量化基准完成术前规划与三维重建研究。1. 脑肿瘤实例分割数据集1169 张临床影像与 YOLO 多边形标注的落地价值拿到一份标注好的脑肿瘤实例分割数据集第一反应往往不是兴奋而是怀疑——标注边界到底贴不贴肿瘤实际轮廓正常组织和病灶混在一起会不会让模型学偏这份脑肿瘤实例分割医疗影像数据集给出的答案是训练集 803 张、验证集 237 张、测试集 129 张合计 1169 张临床医学影像全部按 YOLO 实例分割格式用多边形坐标点标注类别只有一个 Brain_Tumor。它解决的不是“有没有数据”的问题而是“标注能不能直接喂给 YOLOv5/v7/v8/v12 系列实例分割头”的问题。适合做医疗影像 AI 系统开发、智能诊断工具研发也适合拿来做 UNet、Mask R-CNN 的对照实验。如果你正在找一份能直接跑通训练管线、又带临床边界模糊特征的脑肿瘤数据集这份资源值得先拆开看清楚再决定怎么用。2. 拆开压缩包目录结构、标注格式与划分逻辑2.1 从文件名到目录树先搞清楚数据是怎么组织的项目正文里列出的文件名很有代表性y44_jpg.rf.546d963fda9b5329d3d771e867384f95.jpg、no106_jpg.rf.496280a5a1cd97bef419e780908ebaca.jpg、y431_jpg.rf.9c1a5dacc2d3b48ebec90cfbca16391d.jpg等。这种原名_jpg.rf.hash.jpg的命名方式是 Roboflow 导出数据集时的典型特征rf后面的长哈希是导出流水线生成的唯一标识用来避免不同来源图片重名覆盖。y前缀大概率对应有肿瘤的阳性样本no前缀对应正常脑组织或阴性样本这一点从摘要里“包含正常脑组织与肿瘤组织的对比样本”也能对上。解压后常见的目录结构是brain_tumor_seg/ ├── train/ │ ├── images/ # 803 张训练影像 │ └── labels/ # 对应的 YOLO 分割标注 .txt ├── valid/ │ ├── images/ # 237 张验证影像 │ └── labels/ ├── test/ │ ├── images/ # 129 张测试影像 │ └── labels/ └── data.yaml # 数据集配置文件images和labels必须一一对应文件名主干相同、扩展名不同。如果解压后发现 labels 目录缺失或为空说明压缩包只带了原图没带标注那就不是完整可训练的数据集需要先确认再往下走。2.2 YOLO 实例分割标注长什么样一行一个多边形YOLO 实例分割的标注文件是.txt每行代表一个实例格式为class_id x1 y1 x2 y2 ... xn yn所有坐标都是归一化到 0~1 之间的浮点数class_id从 0 开始。这份数据集只有一个类别 Brain_Tumor所以 class_id 恒为 0。一个典型的标注行看起来像这样0 0.412 0.335 0.428 0.341 0.445 0.352 0.451 0.370 0.438 0.388 0.419 0.379 0.405 0.361这串数字的意思是从归一化坐标 (0.412, 0.335) 开始依次连接后续点最后回到起点围成一个多边形区域这个区域就是肿瘤的边界。多边形点数不固定边界越复杂点数越多。摘要里提到“标注数据呈现肿瘤异质性和边界模糊等临床特征”反映在标注上就是多边形顶点密度不均匀——边界清晰的地方点少模糊浸润区域点会加密。验证标注是否正确可以用下面这段脚本快速检查import os import glob label_dir brain_tumor_seg/train/labels issues [] for txt_path in glob.glob(os.path.join(label_dir, *.txt)): with open(txt_path, r) as f: lines f.readlines() if len(lines) 0: issues.append(f{txt_path}: 空标注文件) continue for i, line in enumerate(lines): parts line.strip().split() if len(parts) 7: # class_id 至少3个点(6个坐标) issues.append(f{txt_path} 第{i1}行: 点数不足仅{len(parts)-1}个坐标值) continue coords [float(x) for x in parts[1:]] if any(c 0 or c 1 for c in coords): issues.append(f{txt_path} 第{i1}行: 坐标超出[0,1]范围) if len(coords) % 2 ! 0: issues.append(f{txt_path} 第{i1}行: 坐标数不是偶数无法配对) print(f共检查 {len(glob.glob(os.path.join(label_dir, *.txt)))} 个标注文件) print(f发现 {len(issues)} 个问题) for issue in issues[:20]: print(issue)这段脚本做三件事检查空标注文件、检查每行坐标数是否为偶数x/y 必须成对、检查坐标是否越界。参数上label_dir指向你的标注目录len(parts) 7是因为一个有效多边形至少需要 3 个点即 6 个坐标加 1 个 class_id。跑完如果问题数为 0说明标注格式干净可以进入训练配置。2.3 数据划分比例与验证集的作用803/237/129 这个划分大约是 69%/20%/11%训练验证比接近 7:2测试集单独留出约 11%。这个比例在医学影像里算合理——训练集够撑起基本收敛验证集够做早停和超参选择测试集够出一份不偏的最终指标。需要注意的是如果原始数据里同一病例有多张切片划分时必须按病例分而不是按图片随机分否则同一病人的切片同时出现在训练和验证集里验证指标会虚高。摘要里提到“包含完整病例的 DICOM 原始数据转换样本”说明数据来源是病例级的划分时是否按病例隔离需要自己确认一遍。确认方法很简单看训练集和验证集里有没有文件名主干高度相似的图片。如果y44出现在训练集y44_1出现在验证集那大概率是同一病例泄漏了。常见做法是先把所有文件名的主干前缀提取出来按前缀分组后再做划分。如果这份数据集已经划分好了至少要在训练前做一次泄漏检查别等验证 mAP 高得离谱才发现问题。3. 用 YOLOv8 跑通脑肿瘤实例分割配置、训练与指标解读3.1 data.yaml 怎么写路径、类别数与任务类型YOLO 系列训练实例分割任务第一步是准备data.yaml。这份数据集只有一个类别配置很简洁path: ./brain_tumor_seg train: train/images val: valid/images test: test/images nc: 1 names: 0: Brain_Tumorpath是数据集根目录train/val/test是相对于path的图片目录。YOLO 会自动在同级找同名labels目录。nc: 1表示只有一个类别names里 0 对应 Brain_Tumor。这里最容易翻车的地方是路径写错——如果path用了绝对路径但换机器后目录变了训练直接报找不到文件。我一般用相对路径把data.yaml放在数据集根目录旁边训练时从项目根目录启动。注意names的键必须是整数写成字符串0在部分 YOLO 版本里会报类别索引错误。3.2 启动训练命令行参数与关键超参用 YOLOv8 做实例分割训练命令如下yolo segment train \ databrain_tumor_seg/data.yaml \ modelyolov8n-seg.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/brain_tumor \ nameexp1 \ device0逐项说明modelyolov8n-seg.pt用的是 nano 分割模型参数量小适合先跑通管线如果显存够、追求精度可以换yolov8m-seg.pt或yolov8l-seg.pt。imgsz640是输入分辨率医学影像里肿瘤区域可能只占几十个像素如果缩小后边界信息丢失严重可以提到 1024但显存占用会翻倍。batch16在 8GB 显存上跑 640 分辨率基本够用不够就降到 8。lr00.01是初始学习率YOLO 默认值如果 loss 震荡厉害可以降到 0.001。patience20表示验证指标 20 轮不提升就早停避免过拟合。device0指定第一块 GPUCPU 训练把这里改成cpu。训练启动后重点看三个输出box_loss、seg_loss、cls_loss。分割任务里seg_loss是 mask 分割损失它下降得比box_loss慢是正常的因为多边形回归比边界框回归难。如果seg_loss在前 10 轮几乎不降先检查标注文件是不是空的或者坐标全越界了。3.3 验证与指标mAP50(M) 才是分割任务的核心训练完在验证集上评估yolo segment val \ modelruns/brain_tumor/exp1/weights/best.pt \ databrain_tumor_seg/data.yaml \ imgsz640 \ batch16输出里会同时给检测指标和分割指标。检测看mAP50(B)和mAP50-95(B)分割看mAP50(M)和mAP50-95(M)。括号里的 B 是 boxM 是 mask。对脑肿瘤实例分割来说mAP50(M)比mAP50(B)更能反映模型是否真的贴合肿瘤边界。如果mAP50(B)很高但mAP50(M)明显低一截说明模型能找到肿瘤大概位置但多边形边界回归不准常见原因是标注多边形点数太少或者训练轮数不够。推理单张图片看效果yolo segment predict \ modelruns/brain_tumor/exp1/weights/best.pt \ sourcebrain_tumor_seg/test/images \ imgsz640 \ conf0.25 \ saveTrueconf0.25是置信度阈值低于这个值的检测框会被过滤。医学影像里宁可多留一些候选区域也不要漏检所以这个值可以降到 0.1 先看召回再根据假阳性情况往上调。saveTrue会把带 mask 的结果图存到runs/segment/predict目录下直接肉眼比对预测边界和原图肿瘤轮廓。3.4 从 YOLOv8 迁移到 YOLOv12需要注意的接口差异摘要里提到数据集“原生支持 YOLOv5/v7/v8 等主流实例分割框架”关键词里也出现了 yolov12。如果你打算用 YOLOv12 跑这份数据标注格式本身不用改YOLO 系列的实例分割标注是通用的。差异主要在训练脚本和配置项上YOLOv12 的部分实现把segment任务合并进了统一训练入口data.yaml的字段名可能从val变成validnc和names保持一致。常见做法是先用 YOLOv8 跑通基线确认数据没问题后再把data.yaml按 YOLOv12 的文档微调字段名模型权重换成对应的yolov12*-seg.pt。别一上来就用新版本否则数据问题和框架问题混在一起排查成本翻倍。4. 避坑与排查脑肿瘤分割训练里最容易翻车的五件事4.1 现象训练 loss 正常下降但验证 mAP50(M) 始终低于 0.3原因标注多边形和实际肿瘤边界偏差大或者训练集和验证集存在病例泄漏导致验证集难度分布和训练集不一致。医学影像里肿瘤边界模糊区域标注一致性本来就差如果标注时没有统一标准多边形会偏。解决先抽 20 张验证集图片用yolo segment predict输出预测 mask和原图叠加肉眼比对。如果预测边界系统性偏大或偏小检查标注时用的显示窗口设置是否一致。如果是病例泄漏按文件名前缀重新划分训练验证集。4.2 现象训练到一半突然报 CUDA out of memory原因imgsz或batch设太大或者数据集中有异常大尺寸图片导致显存峰值飙升。解决先把batch减半如果还报就降imgsz。另外用脚本检查所有图片尺寸把超过 2048 像素的图片统一缩放到 1024 以内再训练。YOLO 默认会做 letterbox 缩放但极端长宽比的图片仍可能撑爆显存。4.3 现象推理结果里同一个肿瘤被预测出多个重叠 mask原因conf阈值设太低或者 NMS 的 IoU 阈值不合适。实例分割的 mask NMS 比 box NMS 更敏感重叠区域容易被重复检出。解决把conf从 0.1 提到 0.25 以上同时在推理时加iou0.5控制 NMS 阈值。如果仍然重叠检查标注里同一个肿瘤是不是被标成了多个实例——这种情况在标注阶段就要合并。4.4 现象data.yaml路径没问题但训练报 “No labels found”原因YOLO 找 labels 的规则是images同级目录下把images替换成labels。如果你的目录结构是train/images和train/labels但data.yaml里写的是train: train/imagesYOLO 会去train/labels找这是对的。但如果 labels 目录名是label或annotations就找不到了。解决确认 labels 目录名严格是labels且和images同级。如果目录名改不了就在data.yaml里显式指定train: train/images并在训练命令里加rectFalse排除其他干扰。4.5 现象验证集指标很高但测试集指标掉一大截原因验证集和测试集分布不一致或者模型在验证集上过拟合了。803 张训练集对分割任务来说不算大如果模型参数量大、训练轮数多很容易记住训练集。解决用patience早停同时把测试集留到最后只跑一次。如果测试集指标明显低先检查测试集里有没有训练集没出现过的肿瘤类型。摘要里提到涵盖胶质瘤、脑膜瘤等多种类型如果测试集里某种类型占比高而训练集里少指标下降是数据分布问题不是模型问题。5. 进阶技巧用面积占比做量化评估与模型选择训练跑通之后真正决定这份数据集能不能用在临床辅助场景的是模型输出的肿瘤区域面积占比是否稳定。摘要里提到“提供肿瘤区域面积占比等量化指标计算基准”这个指标比 mAP 更贴近实际使用——医生关心的是肿瘤占位比例不是 mask 的 IoU 小数点后第三位。计算面积占比的脚本如下import cv2 import numpy as np from ultralytics import YOLO model YOLO(runs/brain_tumor/exp1/weights/best.pt) img_path brain_tumor_seg/test/images/y44_jpg.rf.546d963fda9b5329d3d771e867384f95.jpg results model(img_path, imgsz640, conf0.25, retina_masksTrue) img cv2.imread(img_path) h, w img.shape[:2] total_area h * w for r in results: if r.masks is None: print(未检测到肿瘤区域) continue masks r.masks.data.cpu().numpy() # shape: (n, h, w) for i, mask in enumerate(masks): mask_resized cv2.resize(mask, (w, h), interpolationcv2.INTER_NEAREST) tumor_area np.sum(mask_resized 0.5) ratio tumor_area / total_area print(f实例 {i1}: 肿瘤面积 {tumor_area} 像素, 占比 {ratio:.2%})这段脚本的关键参数是retina_masksTrue它让 YOLO 输出原图分辨率下的 mask而不是缩放到模型输入尺寸的 mask。如果不加这个参数mask 是 640x640 的直接算面积占比会因为 letterbox 填充而偏小。mask_resized用最近邻插值把 mask 还原到原图尺寸 0.5是二值化阈值YOLO 输出的 mask 是概率图0.5 是常用切分点。拿到面积占比后可以做两件事。第一和放射科医师手工勾画的面积占比做对比如果平均偏差在 5% 以内说明模型输出有临床参考价值。第二用面积占比的方差来选模型——同一个肿瘤在不同增强扫描序列上的面积占比应该接近如果方差大说明模型对扫描参数敏感需要增加数据增强或者换更鲁棒的骨干网络。我自己的习惯是每次训练完不只看 mAP一定把测试集前 20 张图的面积占比跑一遍和标注多边形算出的面积占比做散点图。如果散点偏离对角线超过 10%不管 mAP 多高这个模型我都不会往下一步推。从那以后我每次拿到新的医学影像数据集都强制走一遍“标注格式检查 → 病例泄漏排查 → 面积占比验证”这三步省下来的返工时间比训练本身还多。希望帮到你。本文还有配套的精品资源点击获取