恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
YOLOV5医学图像目标检测数据集构建与训练避坑指南
首页
资讯中心
/
YOLOV5医学图像目标检测数据集构建与训练避坑指南
YOLOV5医学图像目标检测数据集构建与训练避坑指南
发布时间:2026/9/1 0:09:49
简介本资源是专为医学图像目标检测任务设计的宫颈癌病灶数据集面向人工智能医疗方向的研究者、算法工程师及高校相关专业学生解决小目标癌症病灶在高分辨率影像中精准定位的建模需求。数据集严格遵循YOLOv5目录结构组织含训练集816张JPEG图像816个对应txt标签与验证集216张JPEG图像216个txt标签共916张RGB图像、1083个标注文件及1个可视化绘图Python脚本总文件数2000个压缩包大小614.59MB。已有733人学习下载体现其在医学AI实践中的实际应用热度。用户可直接加载至YOLOv5等主流检测框架训练无需格式转换配套可视化脚本支持一键绘制边界框并保存结果图显著降低数据验证门槛所有图像分辨率达1000–4000像素病灶目标细小但标注清晰完整特别适用于小目标检测算法的开发与优化。 最近一直在折腾医学图像目标检测手头正好整理完一份宫颈癌检测数据集格式是标准的YOLOV5目录结构1个类别训练集、验证集都配好了。这东西看着简单但实际从原始图像到能直接喂给模型的目录格式中间有不少门道文件怎么命名、标签怎么归一化、训练集和验证集按什么逻辑划分、标注边界怎么约定每一步都有讲究。我把自己踩过的坑和验证过的做法整理成这篇笔记给准备做医学目标检测、或者想拿现成数据集快速跑通YOLOV5训练流程的朋友一个参考。这份数据集适合三类人一是刚入门YOLOV5、想找一个结构完整、能直接训练的数据集练手的人二是做医学影像分析相关研究需要先跑通基线模型的研究者三是想了解数据标注规范和数据划分逻辑的算法工程师。它不是简单的“把图片扔进文件夹”就完事背后涉及检测任务的本质理解。1. 为什么这份数据集采用YOLOV5目录格式而不是其他格式1.1 单类别方案的取舍检出是第一步分型是第二步先说一个可能让很多人困惑的点宫颈癌检测为什么只做1个类别医学图像里的宫颈癌筛查从算法角度看其实是两个层次的问题。第一层是“有没有异常区域”——也就是从整张病理切片或者细胞涂片里把可疑病变区域找出来这本质上是一个目标检测中的单类别检出问题类名可以叫“可疑病变”或“异常区域”。第二层是“异常区域属于哪一级”——低度病变、高度病变、还是浸润癌这属于细粒度分类。这份数据集采用1个类别核心逻辑是把任务切分成两个独立阶段。先解决“找得到”的问题再解决“认得准”的问题。从工程实践来看单类别检出模型训练更稳定类别不平衡的影响更小而且可以作为后续多类别模型的基础预训练权重。很多做医学检测的团队会先用单类别跑通检出再在检出框基础上接一个分类头或者独立的分类模型效果往往比一步到位做多类别检测更好。另外还有一个现实原因医学图像的精细标注成本极高。一个标注过宫颈细胞涂片的标注员要在高倍率视野下区分不同病变等级需要长期的专业培训。而单类别标注只需要圈出可疑区域标注一致性和效率都能得到保证。这也直接影响数据质量而数据质量又比算法结构更决定模型性能的上限。1.2 目录格式约定就是框架的“接口协议”YOLOV5的目录格式之所以成为事实标准是因为它定义了一套清晰的约定相当于给数据集和训练框架之间签了一份“接口协议”。这份协议的核心要求是训练集和验证集有对应的图片目录和标签目录图片和标签通过相同的主文件名关联标签文件内容是归一化后的检测框坐标。你只要按这个约定整理数据YOLOV5的训练脚本不需要改任何代码就能开始训练。相比VOC格式的XML文件或者COCO格式的JSON文件YOLO的TXT标签格式有几个务实的好处。首先是文件小每一行就是“类别 中心点x 中心点y 宽度 高度”一个框只占几十字节几千张图片的标签加起来也没多大。其次是人眼可读打开TXT就能直接检查坐标是否合理调试方便。最后是处理简单不需要解析复杂的数据结构几行Python就能完成检查和转换。不过这份简洁也带来了一个代价标签信息量有限。XML和JSON可以附带属性信息比如标注者、时间、难度等级但YOLO的TXT格式只能存五个数字。所以如果你需要记录额外的元信息建议在数据集根目录加一个单独的meta.csv文件按图片文件名索引存储例如图像来源、染色方法、病变分级等补充信息。我在整理这份数据集时就在根目录放了一个meta.csv后续做多中心测试或分型实验时非常有用。1.3 训练集、验证集为什么不能混在一起很多第一次接触数据集划分的人会问训练集和验证集都是同一批来源的图片随便分一下就行了吧我在刚入行时也这么想过直到第一次被验证集指标“欺骗”。验证集的作用是模拟模型在没见过的数据上的表现提供对泛化能力的无偏估计。如果训练集和验证集划分不合理比如同一个患者的多个视野图像同时出现在两边那模型在验证集上的表现就会虚高因为它在训练时已经见过同一个患者的组织纹理习惯了。这种数据泄露在医学图像里尤其严重因为同一患者的不同切片之间相似度非常高。另一个常见问题是随机划分带来的分布偏差。如果没有做分层抽样有可能训练集里都是明亮背景的图像而验证集里恰好集中了暗光或染色偏淡的图像导致验证指标突然崩掉。所以在划分时我采用了“按样本来源分组 组内随机分配”的策略确保同一个样本来源的所有图像要么全部在训练集要么全部在验证集。这一点下面会详细展开。2. YOLOV5目录格式拆解与标注规范2.1 目录树长什么样每个文件夹放什么拿到这份数据集后第一件事就是看目录结构。它是标准的YOLOV5训练格式整体长这样cervical_cancer_detection/ ├── images/ │ ├── train/ │ │ ├── sample_0001.jpg │ │ ├── sample_0002.jpg │ │ └── ... │ └── val/ │ ├── sample_0101.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── sample_0001.txt │ │ ├── sample_0002.txt │ │ └── ... │ └── val/ │ ├── sample_0101.txt │ └── ... ├── classes.txt ├── data.yaml └── meta.csvimages目录存放原始图像labels目录存放对应的标签TXT文件。需要特别注意images/train里的sample_0001.jpg对应的标签文件必须是labels/train/sample_0001.txt文件主名完全一致扩展名不同。这个配对关系是YOLOV5读取数据的基本约定一旦文件名对不上训练时就会提示图像没有对应标签导致大量背景图被当成负样本。classes.txt里面只写一行内容是类别名称我用的名称是“lesion”也就是“病变区域”。如果你下载到其他数据集类别名可能是英文的“cell”、“abnormal”或者是中文拼音这些都不影响训练只是名字而已。真正重要的是顺序YOLOV5里类别编号从0开始classes.txt的第一行对应标签文件里的0第二行对应1以此类推。data.yaml是训练时的数据集配置文件内容如下train: data/cervical_cancer_detection/images/train val: data/cervical_cancer_detection/images/val nc: 1 names: [lesion]这里train和val填的是图片目录路径YOLOV5会自动在同级目录下找对应的labels目录所以不需要在yaml里写labels路径。nc是类别数量因为只有1个类别所以是1。names列表跟classes.txt保持一致的顺序。2.2 label文件里的数字到底怎么读打开任意一个标签文件你会看到类似这样的内容0 0.4325 0.6183 0.1250 0.0833这行数字的含义是类别ID为0检测框中心点的x坐标为0.4325中心点的y坐标为0.6183框宽度为0.1250框高度为0.0833。关键点在于x、y、width、height全部是归一化坐标数值范围在0到1之间是通过“像素坐标除以图像宽高”得到的。例如一张宽1600像素、高1200像素的图像上某个检测框左上角像素坐标是(500, 600)右下角是(700, 700)那么框宽度 (700 - 500) / 1600 0.125框高度 (700 - 600) / 1200 0.0833框中心x (500 700) / 2 / 1600 0.375框中心y (600 700) / 2 / 1200 0.5417很多新手会在这里犯错直接把像素坐标写进TXT结果训练时检测框全部偏移甚至跑到图像外面。还有一个容易踩的坑YOLO格式的坐标是以图像左上角为原点向右向下增加的不要搞成直角坐标系的原点方向。如果你需要对标签做校验有一个很实用的Python脚本思路读取所有标签文件检查每个坐标值是否均在0到1之间同时检查框宽高是否大于0。任何超出范围的数值都说明标注或者转换过程出了问题。这种检查我每构建一次数据集都会跑一遍能拦下大部分低级错误。2.3 data.yaml与classes.txt的配套配置很多初学者会把data.yaml和classes.txt的内容搞混。它们的区别是data.yaml是给YOLOV5训练脚本读的配置里面除了类别信息还包含数据路径classes.txt是给人和其他工具看的类别清单。二者类别名称的顺序必须严格一致否则会出现标签错位的严重问题。比如如果classes.txt里写的是lesion而data.yaml里写的是names: [lesion]那没问题。但如果classes.txt里第一行是“lesion”而data.yaml里names写成了“tumor”虽然数据集只有1个类别不会出现编号错位但在后续分析结果时容易混淆。养成“两个文件同时维护”的习惯可以减少不必要的麻烦。另外如果你把数据集放在别的项目目录下data.yaml里的train和val路径可能没法用相对路径。我习惯用绝对路径写yaml或者在训练命令里通过传入参数覆盖路径。YOLOV5支持在命令行指定data时拼上路径前缀例如python train.py --data /absolute/path/to/cervical_cancer_detection/data.yaml如果你希望数据集可移植也可以把images和labels目录放到YOLOV5项目目录下然后data.yaml里直接写相对于项目根的路径。但我的建议是医学数据集一般体积大不会频繁移动直接用绝对路径更省心。3. 训练集和验证集怎么划分才能不翻车3.1 划分比例与分层抽样训练集和验证集的比例是数据科学里的经典问题。对YOLOV5目标检测来说8:2是常用的划分比例但具体数字要根据数据总量来调整。如果总图像数只有几百张验证集比例可以适当降低到10%保证训练集有足够样本如果总数据量有几万张验证集可以提高到20%甚至30%让评估更稳健。更关键的是划分的随机性。简单粗暴地使用random.shuffle然后按比例切分在医学数据集上是不推荐的。前面提到过同源图像的相似性会导致数据泄露。正确做法是先按样本来源分组再把组划分到训练集或验证集。具体来说我的数据集里每张图像有一个来源编号比如来自同一个病理样本的不同视野图。划分时先按来源编号聚合然后对来源编号列表做随机打乱再按比例切分。这样划分后同一个来源的所有图像只会出现在一边验证集指标才可信。这种方法还有一个额外的好处可以防止模型“背下”某个样本的纹理模式而获得虚高的检测精度。医学图像中同一个样本的染色风格、组织背景高度一致如果同时出现在训练集和验证集模型很容易通过背景线索“猜”出目标位置而不是真正学习了病变区域的特征。3.2 一个可复用的Python划分脚本这里给出一个我实际用过的划分脚本可以直接套用。它的输入是images目录和记录样本来源的meta.csv输出是划分后的目录结构。import os import random import shutil import pandas as pd random.seed(42) src_img_dir raw_images src_label_dir raw_labels meta pd.read_csv(meta.csv) # 按来源分组 groups {} for _, row in meta.iterrows(): source row[source_id] img_name row[image_name] groups.setdefault(source, []).append(img_name) # 打乱来源顺序 sources list(groups.keys()) random.shuffle(sources) split int(len(sources) * 0.8) train_sources set(sources[:split]) val_sources set(sources[split:]) def copy_images(names, img_dst, label_dst): os.makedirs(img_dst, exist_okTrue) os.makedirs(label_dst, exist_okTrue) for name in names: shutil.copy(os.path.join(src_img_dir, name), img_dst) label_name name.rsplit(., 1)[0] .txt shutil.copy(os.path.join(src_label_dir, label_name), label_dst) for src in train_sources: copy_images(groups[src], images/train, labels/train) for src in val_sources: copy_images(groups[src], images/val, labels/val)脚本的核心逻辑是“先对来源分组再对来源集合划分”。random.seed(42)保证可复现性这样后续实验对拍时不会因为数据划分不同而产生干扰。如果你没有meta.csv、也没有来源分组的概念可以直接按图像文件名前缀分组或者退一步用纯随机划分但要在心里清楚验证集的可信度会打折扣。3.3 标注工具的选型与标注边界约定数据集的源头是标注标注质量直接决定训练效果。我常用的标注工具是LabelImg和Label Studio。LabelImg轻量、操作简单适合中小规模数据集的快速标注Label Studio功能更多支持多人协作、任务分配和审核流程适合团队协作标注医学数据。不管用哪个工具最重要的是提前定好标注边界。我在这份数据集里约定了以下规则检测框必须紧贴目标区域不留大背景边距也不裁剪到目标边缘以内。如果两个目标高度重叠且难以分离合并为一个框避免同一区域产生多个凌乱的框。目标非常模糊、或者被遮挡超过80%时不标注。每个目标的置信度由标注者主观判断但边界必须客观。这些规则看起来很基础但实际标注时非常容易产生歧义。比如“高度重叠”怎么定义不同标注者可能有不同理解。所以我还要求在标注前先做一个小样本试标由负责人检查标注一致性后再大规模展开。这比事后返工高效得多。还有一个经验是医学图像的标注最好有领域专家参与或者至少做抽检。病理学家对病变边界的判断和一般标注员差异很大尤其是在细胞形态不规则、边界不清楚的区域。即使做不到全程专家标注至少要在最终提交前做一轮专家抽检发现系统性偏差及时纠正。4. 用这份数据集训练时常见的坑4.1 loss降不下来先怀疑标注而不是网络如果你拿着这份数据集开始训练发现train loss降到一定程度就下不去了或者验证集mAP一直上不来我建议第一个排查的对象不是模型结构而是标注。医学图像的标注一致性比自然图像更难保证。细胞边缘模糊、背景杂乱、染色差异大这些都会导致标注框之间完全没有统一的标准。我见过一个典型案例训练集里有一批图像标注员C习惯把病变区域的边界框放得很松多圈一圈正常组织另一批图像标注员D则把框收得很紧。同一个类别两种风格模型一会儿学“大框”、一会儿学“小框”loss自然降不下去。排查方法其实很简单把训练集里随机挑几十张图像把标签框画上去人眼检查一遍。重点看框和目标的贴合程度、是否有多标或漏标、是否有看似正确的错误标签。这个过程虽然费时间但往往能发现很多模型层面的问题无法解释的原因。此外还要检查标签里是否存在空文件。训练集和验证集中如果某个图像对应的TXT文件是空的YOLOV5会把它当作负样本参与训练。少量空文件问题不大但如果空文件比例太高模型会倾向于不输出任何检测框导致召回率极低。我写过一个脚本统计每个标签文件的行数发现空文件或者只有0行的情况会直接打印出来这个检查值得做。4.2 验证集指标虚高的原因验证集指标虚高是一个容易被忽略、但危害很大的问题。除了前面提到的数据划分泄露原因外还有一个更隐蔽的来源验证集图像和训练集图像在采集时间、设备、环境上的相关性。医学图像经常是按批次采集的同一批次的图像可能来自同一台设备、同一个染色批次背景颜色、亮度、对比度高度一致。如果你随机划分数据集那么验证集中可能有相当一部分图像和训练集中某些图像来自同一批次。模型可能不是真正“看到了”病变区域而是根据背景风格“猜”出了目标位置这会让验证指标虚高。解决思路是把采集批次或样本来源作为划分依据而不是简单随机。如果没有来源信息可以通过图像的统计特征做聚类再按聚类结果划分。比如用整图的颜色直方图作为特征做KMeans聚类然后按聚类组划分训练验证集。这个方法虽然不完美但能在一定程度上缓解批次相关性问题。4.3 单类别场景的评估指标怎么读单类别检测的评估通常看precision、recall和mAP。mAP0.5表示IoU阈值为0.5时的平均精度YOLOV5训练日志里还会给出mAP0.5:0.95这个指标更严格要求模型在多个IoU阈值下都表现良好。在医学检测场景我更看重recall因为漏检的代价远高于误检。一次漏检可能意味着错过一个病变区域而一次误检可以通过后续人工复核排除。所以在调整置信度阈值时我会选择recall更高但precision略有下降的配置。这需要通过验证集上的PR曲线来确定YOLOV5训练结束后会在runs/val目录下生成PR_curve.png直接看图就能判断阈值应该设在哪儿。另一个容易被忽略的指标是F1 score的峰值。YOLOV5的验证结果里会给出F1曲线F1峰值对应的置信度阈值是一个不错的默认选择。不过这个值只代表验证集上的最优部署时还需要根据实际场景调整。4.4 医学图像数据增强的边界YOLOV5默认开启Mosaic、随机仿射变换、HSV color jitter等数据增强这些增强对自然图像效果很好但用在医学图像上要谨慎。最典型的问题是HSV色彩增强。医学图像的染色比如HE染色是有标准流程的颜色差异本身就是病理诊断的重要依据。如果增强时把色调、饱和度调得太过模型可能学习到错误的颜色关联或者对染色偏差过于敏感。我实际测试过把saturation增强幅度降低到默认值的一半验证集mAP明显更稳定。另一个问题是翻转增强。医学图像的左右翻转通常可以接受但上下翻转要看具体情况。对于细胞涂片翻转影响不大但对于有解剖方向信息的组织切片上下翻转可能破坏语义关系。YOLOV5默认的fliplr是0.5而flipud要手动启动我建议对医学图像关闭上下翻转。Mosaic增强和随机仿射变换对医学图像相对友好因为检测目标在图像中的位置和尺度多样。但要注意过度的缩放和裁剪可能让细小病变区域变得太小反而增加检测难度。建议把Mosaic的启用概率降低一些或者直接关闭用轻度随机仿射替代。我自己在这份数据集上做过对比实验默认增强配置的训练验证集mAP0.5大约在0.87左右关闭色彩增强后mAP稳定提升到0.90以上。这说明数据增强策略对医学图像的影响很大值得花时间调参。最后分享两个我在实际操作中形成的小习惯。第一每次训练前先检查data.yaml和classes.txt是否匹配再把验证集里所有图像和标签画出来人眼过一遍这个环节虽然耗时间但能拦下很多低级错误。第二在训练日志里记录数据集的source版本号比如“cervical_v1_20240815”方便后期复现结果。医学数据集的生命周期往往比模型还长数据管理和版本控制的重要性可能超过调参本身。本文还有配套的精品资源点击获取