
简介本资源为肺炎检测数据集面向医学影像分析、计算机视觉方向的学习者与研究者可用于目标检测模型的训练与验证。数据集采用Pascal VOC与YOLO双格式标注包含jpg图片及对应的xml、txt文件标注类别为pneumonia negative与pneumonia positive两类共10041个标注框其中阴性5328框、阳性4713框使用labelImg工具按矩形框规则完成标注。压缩包为7z格式共2000个文件以1999个xml标注文件和1个说明txt为主整体约112.65MB。需注意数据集中包含较多增强图片建议结合预览仔细甄别后再下载。该数据集仅提供准确合理的标注不对训练模型或权重文件的精度作任何保证。目前已有469人学习下载适合需要开展肺炎检测实验、验证检测算法或构建医学影像识别流程的读者参考使用。1. 肺炎检测数据集实战4983 张 VOCYOLO 双格式到底怎么用胸片肺炎检测是医学影像里最容易被低估的一类任务。很多人第一次拿到公开数据集兴冲冲跑train.py结果 mAP 卡在 0.3 上不去回头一看标注框全是整张肺叶模型学的是「有没有肺」而不是「有没有病灶」。这次拆的这份资源是 4983 张、2 类别的肺炎检测数据集同时给了 Pascal VOC 的 XML 和 YOLO 的 TXT 两套标注省掉了自己写转换脚本的功夫。它适合三类人想跑通 YOLO 训练全流程的新手、需要做医学影像检测 baseline 的算法工程师、以及要验证自己数据增强策略是否过拟合的老手。2 类别通常对应正常与肺炎或不同病灶类型4983 张的体量不算大单卡几小时能跑完一轮正好用来做消融实验。下面按「格式怎么读 → 训练怎么配 → 坑在哪 → 怎么验证」的顺序拆开讲。2. VOC 与 YOLO 双格式解析坐标、类别与目录结构2.1 两套标注的本质差异Pascal VOC 用的是绝对像素坐标一个 XML 文件对应一张图里面xmin/ymin/xmax/ymax是框的左上角和右下角在原图上的像素位置类别名写在name标签里。YOLO 用的是归一化中心点坐标一个 TXT 文件对应一张图每行class_id cx cy w h五个值全部除以原图宽高落在 0 到 1 之间。这两种格式没有谁更高级VOC 可读性强、方便人工核对YOLO 读取快、直接喂给 Darknet 或 Ultralytics 系框架。这份资源两套都给意味着你可以用 VOC 做标注复核用 YOLO 直接开训不用来回转。常见做法是先用 VOC 的 XML 检查一遍标注质量确认没有越界框、没有漏标再切到 YOLO 格式训练。因为 YOLO 的归一化坐标一旦原图尺寸记录错了框会整体偏移而 XML 里像素坐标是死的肉眼一看就知道对不对。2.2 目录结构应该长什么样拿到压缩包解压后标准布局大致是这样不同打包者习惯略有差异但核心目录跑不掉pneumonia_dataset/ ├── JPEGImages/ # 4983 张原始胸片jpg 格式 ├── Annotations/ # VOC 格式 XML与图片同名 ├── labels/ # YOLO 格式 TXT与图片同名 ├── ImageSets/ │ └── Main/ │ ├── train.txt # 训练集图片名列表不带后缀 │ ├── val.txt # 验证集图片名列表 │ └── trainval.txt # 训练验证合并列表 └── classes.txt # 类别名两行顺序即 class_idclasses.txt的顺序极其关键。YOLO 的class_id是 0 和 1对应classes.txt第 1 行和第 2 行。如果你自己重排了类别顺序却没改 TXT模型会把正常当肺炎学loss 看着降但指标全乱。我一般会先cat classes.txt确认顺序再抽查几张图的 TXT 第一列是不是只有 0 和 1。2.3 用脚本核对标注一致性在开训之前花两分钟跑个校验脚本能省掉后面几小时的排查。下面这段检查图片、XML、TXT 三者是否一一对应以及 YOLO 坐标是否越界import os from pathlib import Path from xml.etree import ElementTree as ET root Path(pneumonia_dataset) img_dir root / JPEGImages xml_dir root / Annotations txt_dir root / labels imgs {p.stem for p in img_dir.glob(*.jpg)} xmls {p.stem for p in xml_dir.glob(*.xml)} txts {p.stem for p in txt_dir.glob(*.txt)} # 三者的交集才是能用的样本 print(图片无标注:, len(imgs - xmls)) print(标注无图片:, len(xmls - imgs)) print(YOLO缺失:, len(imgs - txts)) bad [] for p in txt_dir.glob(*.txt): for line in p.read_text().strip().splitlines(): parts line.split() if len(parts) ! 5: bad.append((p.name, 字段数不对)) continue cid, cx, cy, w, h parts vals list(map(float, parts[1:])) # 归一化坐标必须落在 0~1且宽高不能为 0 if any(v 0 or v 1 for v in vals) or vals[2] 0 or vals[3] 0: bad.append((p.name, line)) print(越界或异常框:, len(bad)) for b in bad[:10]: print(b)逻辑说明先做集合差找出「有图没标注」和「有标注没图」的脏样本这类样本在训练时会被框架直接跳过或报错。再逐行解析 TXT检查字段数和归一化范围。参数上vals[2]和vals[3]是宽高为 0 说明标注时框被拖没了这种框会让 loss 出现 NaN。跑完如果异常数为 0说明这份数据集的标注是干净的可以放心进训练。3. YOLO 训练配置从 data.yaml 到超参的落地写法3.1 data.yaml 的字段含义Ultralytics 系YOLOv5/v8/v11统一用 YAML 描述数据集路径和类别。这份资源解压后你需要自己写一个pneumonia.yamlpath: /data/pneumonia_dataset # 数据集根目录绝对路径最稳 train: ImageSets/Main/train.txt # 训练列表相对 path val: ImageSets/Main/val.txt # 验证列表 nc: 2 # 类别数必须和 classes.txt 行数一致 names: # 类别名顺序即 class_id 0: normal 1: pneumoniapath建议写绝对路径相对路径在不同工作目录下启动训练时经常找不到文件这是新手最高频的翻车点。train和val指向的是图片名列表文件不是图片目录本身框架会去path下按列表找图。nc和names必须和classes.txt严格对齐写反了模型照样能训但评估时类别全错。3.2 启动训练的命令与关键参数假设用 YOLOv8一条命令能跑起来yolo detect train \ datapneumonia.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/pneumonia \ nameexp1逐项说明modelyolov8n.pt用 nano 版做 baseline4983 张图用大模型容易过拟合n 或 s 足够imgsz640是输入分辨率胸片病灶通常不大640 是精度和显存的平衡点显存够可以上 768batch16在 8G 显存上比较稳爆显存就降到 8lr00.01是初始学习率小数据集建议再降到 0.005 避免震荡patience20表示 20 轮验证指标不升就早停省时间。训练日志里重点看mAP50和mAP50-95前者宽松后者严格医学检测更该盯后者。3.3 数据增强的取舍YOLO 默认开了 mosaic、HSV 抖动、随机翻转。对胸片来说左右翻转要谨慎——正常胸片左右翻转后心脏位置反了虽然多数模型仍能学但如果你的类别和左右肺位置强相关翻转会引入噪声。常见做法是保留 mosaic 和亮度抖动关掉上下翻转左右翻转视类别定义决定。在命令行加flipud0.0 fliplr0.5即可控制。另外医学影像常有灰度分布差异HSV 的饱和度通道抖动意义不大可以把hsv_s调低重点放在亮度和对比度上。4. 避坑与排查标注、显存与指标异常的五个血泪经验4.1 训练 loss 正常但 mAP 接近 0现象训练跑完box_loss 和 cls_loss 都在降但验证 mAP 始终在 0.01 附近。原因九成是data.yaml里的names顺序和 TXT 里的class_id对不上或者nc写成了 1。模型学到的类别索引和评估时用的名字错位指标自然崩。解决cat classes.txt看真实顺序把names逐行对齐nc改成实际类别数重训前先用 10 张图做一次yolo detect predict目视确认框和类别。4.2 报错「No labels found」现象启动训练直接抛No labels found in ...或者警告大量图片被跳过。原因通常是train.txt里写的是带.jpg后缀的完整文件名而框架期望的是不带后缀的 stem或者path配错框架在错误目录下找labels/。解决打开train.txt看一行正常应该是0001这种纯文件名。如果带后缀用sed s/\.jpg// train.txt train_fix.txt批量去掉再把 yaml 指向新文件。4.3 显存溢出CUDA out of memory现象训练几轮后突然 OOM或者一启动就爆。原因除了 batch 太大还可能是imgsz设太高或者 mosaic 增强一次性拼 4 张图导致峰值显存翻倍。解决先把batch减半还不行就降imgsz到 512再不行关掉 mosaicmosaic0.0。另外workers设太大也会占内存8 核机器设 4 就够设 16 反而拖慢。4.4 验证集指标虚高现象val mAP 0.9换一批新图测试掉到 0.4。原因多半是训练集和验证集有重复图片或者同一病人的多张胸片被分到了两边造成数据泄漏。解决按病人 ID 划分 train/val而不是随机按图片划分。如果数据集没给病人 ID至少做一次图片哈希去重把完全相同的图从验证集剔除。这个坑在医学数据里极其常见指标虚高会让你误以为模型可用。4.5 框偏移或框整体缩小现象预测框位置系统性偏移或者比真实病灶小一圈。原因通常是 YOLO 归一化时用错了原图尺寸——比如标注时按 1024 宽算的转换脚本却按 512 算坐标整体差一倍。解决抽查一张图用 XML 里的像素坐标除以图片真实宽高和 TXT 里的值对比对不上就说明转换环节尺寸记录错了需要重新生成 TXT。5. 进阶验证用混淆矩阵和 PR 曲线判断模型是否真的可用训练跑完不是看一个 mAP 就完事。Ultralytics 会在runs/pneumonia/exp1/下生成confusion_matrix.png和PR_curve.png这两个图比单一指标更能说明问题。混淆矩阵看的是「正常被误判成肺炎」和「肺炎被漏判成正常」各有多少。医学场景里漏判假阴性代价远高于误判所以你要重点看肺炎那一行的召回率而不是整体准确率。如果召回只有 0.6哪怕 mAP 有 0.8这个模型也不能上。PR 曲线看的是不同置信度阈值下的精度和召回权衡。曲线越靠右上越好曲线下的面积就是 AP。两类的 AP 如果差距很大比如正常类 0.95、肺炎类 0.55说明模型对肺炎特征学得不够可能是肺炎样本太少或病灶太小。这时候的进阶做法是对肺炎类做针对性过采样或者把imgsz提到 768 让小病灶在特征图上占更多像素。还有一个我每次都会做的动作把验证集里置信度在 0.3 到 0.6 之间的预测框单独导出来人工看一遍。这批「模型拿不准」的样本最能暴露问题——要么是标注本身模棱两可要么是病灶确实不典型。看完这批你对模型的能力边界就有数了比盯着 mAP 数字靠谱得多。从那以后我每次训完医学检测模型都强制走一遍「混淆矩阵看召回 → 低置信样本人工复核 → 再决定要不要调增强」这个流程希望帮到你。本文还有配套的精品资源点击获取