简介:资源为乳腺癌医学影像检测专用数据集,面向医学影像AI开发者与研究者,包含1,316张标注图片,划分训练集1,053张、验证集263张,专注乳腺癌病灶区域检测,可直接用于YOLOv5/v7/v8等主流框架训练,也可用于乳腺X光、超声等设备AI辅助模块开发,帮助快速定位可疑病灶,提升阅片效率。压缩包共2,000个文件,包含1,316个txt标注文件、682张jpg影像、1个yaml配置及1个docx说明文档,整体大小57.65MB,已按训练/验证集组织,目录结构清晰,便于即插即用。数据集由专业医学团队标注,覆盖不同密度与形态的癌变组织,反映临床多样性,适合医疗AI诊断系统开发、智能医疗设备集成及癌症早期检测研究。目前已有235人学习下载,对于需要开展医学影像目标检测模型训练或撰写相关论文的开发者,能省去数据采集与清洗标注环节,直接聚焦模型迭代与临床场景验证。
1. 乳腺癌医学影像检测数据集.zip:一份压缩包背后的完整工程链
如果你下载过「乳腺癌医学影像检测数据集.zip」,大概率是冲着训练一个乳腺病灶检测模型去的。这份压缩包通常装的是钼靶或超声图像、对应的肿块与钙化标注,可能还附带 BI-RADS 分级和病理信息。但真正拿到手你会发现,麻烦从解压那一刻才开始:格式不统一、标注坐标系对不上、图像像素值是个黑匣子、同一个病人多张图泄漏进验证集导致指标虚高。这个标题不只代表一份资源,它背后是从 zip 解压、影像读取、标注转换到模型训练的完整链路。这篇文章适合刚拿到数据集想跑通基线的人,也适合已经被各种玄学翻车折磨过、想系统排查一遍数据链路的从业者。
2. 解压与校验:先别急着看图像,把 zip 和目录结构搞清楚
拿到压缩包后,我一般不会直接双击解压。理由有三个:第一,图形界面解压失败时看不到中途哪个文件出错;第二,命令行能先查看压缩包内的文件清单,判断是单层目录还是嵌套目录;第三,zip 在传输过程中静默损坏的概率不低,尤其是用网盘转存再下载的大文件,解压到一半报 CRC 错误是家常便饭。下面这套流程值得每次都走一遍。
2.1 用命令行解压并查看压缩包内容
拿到 zip 后的第一个动作是看清单,而不是解压。先确认文件本身完整:
ls -lh 乳腺癌医学影像检测数据集.zip zipinfo 乳腺癌医学影像检测数据集.zip | head -30第一行ls -lh输出压缩包实际大小,方便和下载页标注的尺寸对比,如果差了几百 MB,基本可以断定没下完。第二行zipinfo列出压缩包内所有文件的路径、原始大小和压缩后大小,head -30只截前 30 行——医学影像数据集动辄上千个文件,全刷出来没有意义。看清单重点看两样:最外层目录层数,以及文件名里是否带了 patient_id 或 case_id 这类能区分病人的字段。
清单确认没问题再解压:
unzip -o -q 乳腺癌医学影像检测数据集.zip -d 乳腺影像数据/三个参数都很常用。-o表示目标目录已存在时直接覆盖,避免交互式提问打断批量脚本;-q是静默模式,不打印几千行解压日志;-d指定输出目录。我习惯单独建目录而不是解压到当前目录,这样后面写 Python 脚本时路径不会和 zip 文件混在一起。如果你的系统没有 unzip,用7z x也可以,参数稍有差异,7z 不需要-d,直接把输出目录写在最后即可。
2.2 校验 zip 完整性:别把损坏的数据喂给模型
这一节必须单独说。zip 是静默损坏率比较高的格式,特别是从网盘转存再下载的大文件,经常出现解压到 60% 报一个 CRC 错误,前面 60% 的文件看似正常,实际上也可能已经有问题。更隐蔽的情况是压缩包头部正常、中间某个文件坏掉,图形界面只提示无法完成,完全不告诉你是哪个文件。先做哈希校验:
sha256sum 乳腺癌医学影像检测数据集.zipsha256sum对整个压缩包算一个 256 位哈希。如果发布方提供了原始哈希值,比对一致就能确认文件完整;没提供的话,至少记录当前值,以后数据异常时可以判断是源头问题还是自己操作问题。再跑一遍压缩包内置校验:
unzip -t 乳腺癌医学影像检测数据集.zip | tail -10注意unzip -t是 test 而不是解压,它会遍历压缩包内每个文件做 CRC 校验,打印 ok 或错误信息。tail -10只看末尾的汇总结果,不用刷屏。这一步比哈希更直接,能定位到具体哪个文件损坏。如果坏的是独立的图像文件,单独重新下载那一个就行;如果坏的是中央目录区,整个压缩包都要重下。这条命令是我拿到任何 .zip 数据集后的固定动作,几乎每个数据集都可能有坏文件,和来源是否可靠无关。
注意:
unzip -t只做校验,不会解压任何文件,可以放心反复执行。
2.3 目录结构:三种常见组织方式与 tree 检查
校验通过后,先看解压出来的目录长什么样:
tree -L 2 乳腺影像数据/没有 tree 就用 find 代替:
find 乳腺影像数据 -maxdepth 2 -type d医学影像检测数据集的目录组织方式,我见过的大致有三种。第一种是扁平式,images/下全是图像文件,标注集中在annotations.json一个文件里,这种最常见于从 COCO 或通用检测社区改造来的数据集,处理起来最快。第二种是按病例分,每个 case 一个目录,里面是该病人的多张影像和对应标注,保留了解剖语义,但训练时需要自己写遍历逻辑。第三种是按模态分,mammo/、ultrasound/、dicom/分开放,通常意味着同一套数据里有多种影像模态,先确认你需要的是哪一种,不要一股脑全喂给模型。
解压后你可能会看到类似这样的结构,但这只是常见做法的示意,每个数据集都有自己的层级习惯:
乳腺影像数据/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── metadata/ ├── patients.tsv └── annotations.json不管哪种组织方式,拿到手第一件事是把完整目录树存一份快照,后面写预处理脚本时随时回来对照,省得在多层嵌套路径里迷路。可视化软件或文件夹侧边栏看到的目录往往省略了空层级,和脚本里看到的路径对不上,这是很多路径报错的根源。
2.4 中文文件名乱码与 zip 伪加密:两个解压阶段的老坑
这一节是很多人第一个翻车点。Windows 默认用 GBK 处理 zip 里的中文文件名,而压缩包在 Linux 或 macOS 上创建时常用 UTF-8,解压出来你会发现文件名变成乱码,比如「数据」变成「鏁版嵁」。图像文件名乱码不影响像素内容,但会直接影响按文件名匹配标注,必须尽早解决。
from zipfile import ZipFile with ZipFile("乳腺癌医学影像检测数据集.zip") as zf: for info in zf.infolist(): name = info.filename.encode("cp437").decode("utf-8", errors="ignore") print(name, "encrypted" if info.flag_bits & 0x1 else "plain")Python 的zipfile模块读文件名时按 cp437 解码,乱码文件名需要重新编码后再解码为 UTF-8。上面脚本同时打印了加密标记,flag_bits最低位为 1 表示该文件有加密标记。这就引出 zip 伪加密:有些压缩包制作工具会把加密标记位置 1,但文件本身并没有真正加密,表现是解压时提示输入密码,随便输入或留空也能解出来。遇到这种,先用脚本看哪些文件被标记,再用 7-Zip 打开测试,7-Zip 对伪加密的处理比系统自带解压工具宽容很多。如果确实有真密码,只能回发布页找密码说明,不要浪费时间在暴力猜解上——医学影像数据的密码通常是数据使用协议的一部分,按规矩走比破解划算。
3. 读取乳腺影像与标注:DICOM、PNG 和标注格式的处理差异
3.1 先认清模态再动手:钼靶、超声、MRI 的存储差异
乳腺影像不是同一种东西。钼靶、超声、MRI 在像素深度、图像尺寸、标注对象上差异很大,拿到数据集后先分清模态,后面的路才走得对。我一般先看文件后缀和目录名判断,再抽一张图看像素统计量。常见模态的差异可以整理成一张表:
| 模态 | 常见格式 | 灰度/彩色 | 典型标注对象 | 处理要点 |
|---|---|---|---|---|
| 钼靶(MG) | DICOM、PNG | 灰度,常见 16bit 原始值 | 肿块、钙化簇、非对称致密 | 图像大,训练前常做 ROI 或降采样 |
| 超声(US) | PNG、JPG | 灰度为主 | 肿块轮廓、BI-RADS 分级 | 像素值语义弱,注意探头参数框噪声 |
| MRI | DICOM 多序列 | 灰度 16bit | 病灶增强区域 | 多序列要按 series 区分,不能混读 |
很多人把乳腺超声数据集(类似 BUSI 那种结构)当成普通图像数据集直接喂 ResNet,结果模型把图像角落的探头参数框当成特征学进去了,这类血泪经验在医学影像社区反复出现。记住一点:医学影像的像素和自然图像不一样,先理解成像物理,再谈模型。乳腺超声的灰度范围窄、噪声大,和钼靶的高分辨率钙化细节完全是两套处理思路。
3.2 Python 读取 DICOM:pydicom 最小脚本与像素值转换
如果压缩包里是 DICOM 格式,直接用 cv2 读大概率读出一片全黑。DICOM 需要专门的解析库,而且像素值不能直接当灰度图用:
import pydicom import numpy as np ds = pydicom.dcmread("BRCA_001_01.dcm") pixel = ds.pixel_array.astype(np.float32) # 有些设备存的原始值不是真实物理值,需要线性变换 slope = float(ds.RescaleSlope) if "RescaleSlope" in ds else 1.0 intercept = float(ds.RescaleIntercept) if "RescaleIntercept" in ds else 0.0 real_value = pixel * slope + intercept # 16bit 转 8bit:用百分位拉伸,两端的极端值切掉一点 lo, hi = np.percentile(real_value, [1, 99]) img_8bit = np.clip((real_value - lo) / (hi - lo) * 255.0, 0, 255).astype(np.uint8)这段脚本的核心在两处。第一处是RescaleSlope和RescaleIntercept,这两个字段是 DICOM 标准里的线性变换参数,把存储值换算成有物理意义的数值;CT 里换算结果是亨氏单位,乳腺钼靶虽然不是 CT,但原理相同。很多公开乳腺数据集已经把这一步做完并转成 PNG,但如果你拿到的是原始 DICOM,不处理这两个字段就会出现整片偏暗或溢出。第二处是百分位拉伸,16bit 数据的有效范围通常只占一小段,直接除以 65535 再乘 255,暗部细节会全部丢失,图像看起来就是一块黑。取 1% 到 99% 百分位做线性拉伸,是医学影像转 8bit 显示和训练最通用的做法,代价是丢掉两端极值,但检测任务里肿块和钙化的灰度信息都在中间段,损失可以接受。
读出来的img_8bit就是后续训练和画图用的底图。如果数据集里已经给了 PNG,这步可以跳过,但要确认 PNG 是不是 16bit 的。很多工具会把 16bit PNG 存成 PNG 格式,cv2.imread默认按 8bit 读,同样会出现整片发黑,检查方式很简单,读出来后看img.dtype是不是 uint16。
3.3 标注文件解析:JSON、XML、TXT 三种格式的读取
标注格式决定预处理脚本怎么写。先判断格式再写解析,判断方法很笨但有效:用文本方式打开标注文件,看前几个字符。JSON 以{或[开头,XML 以<开头,YOLO 的 TXT 每行是一组空格分隔的数字。
import json from pathlib import Path ann_path = Path("metadata/annotations.json") if ann_path.suffix == ".json": data = json.loads(ann_path.read_text(encoding="utf-8")) # COCO 风格:categories 定义类别,annotations 里是 bbox cat_map = {c["id"]: c["name"] for c in data.get("categories", [])} print("类别映射:", cat_map) print("标注条数:", len(data.get("annotations", []))) elif ann_path.suffix == ".xml": # Pascal VOC 风格:一个 XML 对应一张图,object 节点是目标 from xml.etree import ElementTree as ET root = ET.parse(ann_path).getroot() objs = root.findall("object") for obj in objs: name = obj.findtext("name") box = obj.find("bndbox") xmin, ymin = int(box.findtext("xmin")), int(box.findtext("ymin")) xmax, ymax = int(box.findtext("xmax")), int(box.findtext("ymax")) print(name, (xmin, ymin, xmax, ymax))这段把两种常见格式都解析了一遍,实际使用时选一个分支就行。COCO 的 bbox 是[x, y, w, h],左上角加宽高,单位是像素;Pascal VOC 的bndbox是[xmin, ymin, xmax, ymax],两个角点,单位也是像素。两种格式在检测领域最常见,但乳腺数据集经常自己定义字段,比如 extra 里带 BI-RADS 分级、病理类型,这些额外信息先别丢,后面做多模态验证和分层评估都用得上。第三种 TXT 格式一般是 YOLO 风格,每行五个数:类别、中心 x、中心 y、宽、高,而且全部归一化到 0 到 1 的浮点数。三种格式的坐标不能混用,这是后续转换脚本里最容易出错的地方。
4. 转成 YOLO 训练格式:从标注到 yolov8 跑通的最小链路
4.1 为什么要统一成 YOLO 格式
YOLO 系(特别是 yolov8 训练自己的数据集)要求标注放在与 images 对应的 labels 目录里,每张图一个 txt 文件,每行一个目标。之所以多数人最后还是落到这个格式,是因为不管原数据是 COCO 还是 VOC,训练框架的 dataset 接口只认它自己那套;与其在各个训练配置里写转换回调,不如一次性把所有标注转成 YOLO txt,之后所有实验复用同一份 labels。更重要的是,YOLO 格式的归一化坐标与图像尺寸解耦,训练时框架随意做缩放、翻转、mosaic 增强,标注都不会跟着错位,这也是它成为事实标准的原因。
4.2 COCO JSON 转 YOLO txt:转换脚本与参数说明
假设压缩包里的标注是 COCO JSON。转换逻辑不复杂,但细节非常容易错:
import json from pathlib import Path import cv2 with open("metadata/annotations.json", "r", encoding="utf-8") as f: coco = json.load(f) img_id2name = {img["id"]: img["file_name"] for img in coco["images"]} # COCO 的 category_id 可能是 1,3,7,必须重映射成 0,1,2 cat_id2label = {cat["id"]: i for i, cat in enumerate(coco["categories"])} out_root = Path("labels") out_root.mkdir(exist_ok=True) for ann in coco["annotations"]: img_name = img_id2name[ann["image_id"]] txt_path = out_root / (Path(img_name).stem + ".txt") x, y, w, h = ann["bbox"] # COCO bbox: 左上角 + 宽高,像素单位 img = cv2.imread(str(Path("images") / img_name)) ih, iw = img.shape[:2] # YOLO 需要中心点 + 宽高,且都除以图像宽高做归一化 cx = (x + w / 2.0) / iw cy = (y + h / 2.0) / ih nw = w / iw nh = h / ih with open(txt_path, "a", encoding="utf-8") as f: f.write(f"{cat_id2label[ann['category_id']]} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}\n")三个细节值得单独说。第一,COCO 的 category_id 往往不是连续整数,直接写进 txt 会让类别索引错乱,必须通过enumerate重映射成 0 到 N-1。第二,COCO 的 bbox 是[x, y, w, h],x、y 是左上角坐标,而 YOLO 要的是中心点坐标,换算时 x 要加 w 的一半、y 要加 h 的一半,很多初学者只除以图像宽高忘了加偏移,画出来的框全部偏到右下角。第三,除以的必须是这张图实际读出来的高宽iw和ih,不能写死成某个固定值——乳腺钼靶图经常是几千乘几千的大图,不同病例尺寸可能不一样,写死尺寸必然错位。
这段脚本写出的 labels 目录和 images 一一对应,目标检测训练的最小数据资产就齐了。注意脚本用的是追加写"a",如果重复执行同一张图的转换,txt 里会堆积重复行,训练时同一个目标算多次;保险做法是转换前先清空输出目录,或者改成单图单文件单独写。
4.3 训练集划分:按病人分而不是按图像分
这一步是医学影像和自然图像最本质的区别。自然图像里一张图通常对应一个独立个体,但乳腺影像里同一个病人可能有钼靶的正位和侧位两张图,甚至还有超声多张图。如果按图像随机划分,同一个病人的多张图会分别进入训练集和验证集,模型记住的是这个病人的特征,验证指标虚高,临床场景完全不可信。我一般这样划分:
import random from pathlib import Path random.seed(42) image_paths = sorted(Path("images").glob("*.png")) # 文件名形如 BRCA_001234_01.png,第二个字段是 patient_id def get_patient(p: Path) -> str: return p.name.split("_")[1] patient_ids = sorted({get_patient(p) for p in image_paths}) random.shuffle(patient_ids) split = int(len(patient_ids) * 0.8) train_patients, val_patients = set(patient_ids[:split]), set(patient_ids[split:]) train_images = [p for p in image_paths if get_patient(p) in train_patients] val_images = [p for p in image_paths if get_patient(p) in val_patients] print(f"train: {len(train_images)} 张, {len(train_patients)} 病人") print(f"val: {len(val_images)} 张, {len(val_patients)} 病人")关键在get_patient这个函数,它决定了按什么维度切分。文件名规则不同,这个函数要跟着改:有的数据集文件名是patient_日期_视图,有的在子目录里区分 case_id。改之前先打印所有文件名看一眼,不要假设格式统一。random.seed(42)保证每次跑划分结果一致,这是实验可复现的底线;不设种子,同一个数据集跑两次训练集就不同,后续对比实验完全没法做。划分完成后打印病人数量而不是只打印图像数量,图像多病人少的情况并不少见,如果训练集只有十几个病人,后面泛化基本没戏。如果数据横跨多个采集设备,最好再按设备做一次分层划分,否则模型可能学的是设备差异而不是病灶差异。
4.4 最小训练命令与三个必调参数
数据集和标签都齐了,写一个 dataset.yaml 指向它们:
path: ./乳腺影像数据/ train: images/train val: images/val names: 0: benign 1: malignant 2: calcification注意 names 的顺序必须和转换脚本里cat_id2label的顺序完全一致,这里错了模型也能跑,但预测结果的类别含义全反了。然后用 yolov8 直接开训:
yolo detect train data=dataset.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=8三个参数一开始就要定好。imgsz是输入分辨率,乳腺钼靶原始图几千乘几千,直接 640 会把小钙化灶缩没了,尽量用 1024 或 1280,显存不够就先对原图做 ROI 裁剪,保留病灶区域再缩放,这是医学影像检测里最常用的做法。batch受显存约束,不一定越大越好,8 到 16 通常能覆盖大多数情况,梯度不收敛时优先调学习率而不是盲目加 batch。epochs用 100 起步没问题,配合早停回调看验证集 mAP 不再上升就停,不用硬跑满。还有一个小坑:dataset.yaml 里path写相对路径时,终端工作目录必须在项目根目录,否则 yolo 会报找不到数据集;另外中文路径在部分 Linux 环境下会触发编码问题,统一改成英文路径更保险。
提示:第一次训练建议只用 yolov8n 这种最小模型跑通全流程,确认数据链路没问题再换大模型,能省大量排查时间。
5. 乳腺影像数据集避坑:5 个常见问题与排查记录
5.1 解压阶段:伪加密与中文乱码导致标注匹配失败
现象:解压时提示输入密码,或者解压后文件名不可读,图像和标注文件名对不上。
原因:压缩包在 Unix 系系统用 UTF-8 创建文件名,Windows 自带解压按 GBK 处理,产生乱码;伪加密则是文件头的加密标记位被错误置 1,文件本身并未加密。这两个问题经常一起出现,导致还没看到图像,匹配关系就乱成一团。
解决:先用第 2 章的 zipfile 脚本检查每个文件的加密标记和原始编码,再用 7-Zip 解压绕过伪加密。文件名乱码时,用 Python 把 cp437 解码后的文件名重新编码到原始编码再转 UTF-8,或者用 rename 脚本批量修正。原则只有一条:文件名是数据集的索引,宁可多花半小时修文件名,也不要在乱码文件名上写匹配逻辑。
5.2 读图阶段:图像全黑、全白或对比度异常
现象:图像读出来是一块纯黑或纯白,或者只有微弱轮廓看不清结构。
原因:DICOM 的 16bit 原始像素值被 uint8 读取时发生截断;或者漏掉 RescaleSlope 和 RescaleIntercept 变换,真实物理值范围不对。PNG 看起来正常但对比度极低,则大概率是 16bit PNG 被按 8bit 读取。
解决:读取时先看 dtype 和像素值 min/max。dtype 是 uint16,就走百分位拉伸到 uint8;dtype 已经是 uint8 但对比度差,检查是不是只用了中间一段灰度,用直方图均衡或 CLAHE 做增强。乳腺影像的病灶对比度天然低,不要追求自然图像的鲜艳感,过度增强会把钙化细节抹平。
5.3 标注阶段:坐标错位与类别映射错乱
现象:把标注画到图像上验证时,框整体偏到右下角,或者图像缩放后标注对不上。
原因:COCO 的[x, y, w, h]转 YOLO 的中心点[cx, cy, w, h]时忘了加w/2和h/2;或者在预处理里 resize 了图像,但没有同步缩放标注坐标。类别映射错乱则是因为直接用了 COCO 原始的 category_id 写入 YOLO txt,不连续编号把类别索引打乱了。
解决:转换后立刻做一次反向验证:把 YOLO 的归一化坐标乘回图像宽高,用cv2.rectangle画到图上,随机抽 20 张肉眼检查。这一步应该是自动化流程的一部分,而不是一次性的手工操作,每次修改预处理函数后都要重跑。类别映射用enumerate重映射,并把映射表存成 json,训练和推理共用同一个映射文件,避免两套编号。
5.4 训练阶段:病人泄漏导致指标虚高
现象:验证集 mAP 很高,但在新数据或临床场景上掉得厉害。
原因:同一病人的多张图像被随机划分进了训练集和验证集,模型训练时见过同一解剖结构的图像,验证时只是认人而不是认病灶。这是医学影像最典型的指标失真来源,比任何超参问题都隐蔽。
解决:按 patient_id 划分数据,划分前先统计每个病人的图像数量分布。如果数据集没有提供 patient_id,用文件名规则推断;推断不了就按图像相似度聚类后再划分。划分完成后检查 train 和 val 的 patient_id 交集是否为空,这是最后一道防线。数据增强阶段的同一病人图像翻转后跨集虽然少见,但并非不可能,交集检查能一并发现。
5.5 训练阶段:类别不平衡与模型只学背景
现象:loss 在下降,但 mAP 很低,恶性类别的 AP 接近 0,或者所有框都预测成良性。
原因:乳腺数据集中恶性样本占比通常远低于良性和正常,单阶段检测器在正负样本极度失衡时,梯度被大量背景样本主导,模型学会输出没有目标,因为这样 loss 最小。
解决:先看训练集类别分布,恶性样本占比低于 20% 就考虑过采样恶性样本或按类别加权 loss,YOLOv8 可以在 loss 层面对类别项加权。另一个更有效的做法是调整任务边界:先检测所有肿块,再单独用分类头区分良恶性,把二分类问题拆成检测加分类两个阶段,收敛难度会明显下降。这个思路在乳腺超声和钼靶数据集上都验证过,比单纯调参有用得多。
6. 进阶验证:用标注叠加图和多模态信息反向检查数据集
训练跑起来之后,不要只盯着 loss 曲线。我习惯先做两个便宜的检查,再决定要不要继续投入调参。第一个检查是画标注叠加图:随机抽 30 张验证集图像,把 YOLO 标注的归一化坐标乘回图像宽高,用cv2.rectangle画框,横向拼成一张大图。这一步能暴露绝大多数坐标错位和类别映射错乱的问题,比看任何指标都直观:
import cv2 from pathlib import Path for p in sorted(Path("images/val").glob("*.png"))[:30]: img = cv2.imread(str(p)) label_path = Path("labels/val") / (p.stem + ".txt") for line in label_path.read_text().strip().splitlines(): cls, cx, cy, w, h = map(float, line.split()) x1 = int((cx - w / 2) * img.shape[1]) y1 = int((cy - h / 2) * img.shape[0]) x2 = int((cx + w / 2) * img.shape[1]) y2 = int((cy + h / 2) * img.shape[0]) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.imwrite("check/" + p.name, img)第二个检查是跑一个缩短版的冒烟测试:10 个 epoch,固定随机种子,只看训练 loss 是否持续下降、验证集上每个类别是否都出现过一次预测框。如果某个类从头到尾没有框,问题通常不在模型,而在标注或类别权重。做完这两个检查再谈调参,能省掉大量无效实验。
如果你的数据集标注带的是 mask 而不是检测框,顺手先跑一个语义分割基线,既能把数据链路完整验证一遍,又能给检测模型一个后悔药——当检测结果可疑时,分割结果可以回查原图确认病灶范围。如果还附带 BI-RADS 分级或病理报告文本,可以做一步多模态数据质量验证:把影像预测结果和报告关键词做一致性抽查,比如预测为恶性的样本,对应报告里是否出现 BI-RADS 4 或更高级别的描述。这种多模态数据的配对检查不需要训练模型,只是在样本层面核对标注可靠性,但能发现纯影像检查发现不了的标注错误。乳腺影像数据集的坑从来不在模型,而在数据本身,这是做过一段时间后最深的体会。先把数据验证扎实,再谈精度,希望帮到你。
本文还有配套的精品资源,点击获取