ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

YOLO格式噬菌体活性检测数据集:医学小目标定位与分类

YOLO格式噬菌体活性检测数据集:医学小目标定位与分类 简介本资源是一套专为医学图像目标检测任务设计的YOLO格式噬菌体活性识别数据集面向生物信息、医学AI及计算机视觉方向的研究者与算法工程师解决微生物活性判别这一细分场景下的小样本目标检测建模需求。数据集严格遵循YOLOv5目录结构含训练集1258张640×640 RGB图像对应txt标签与验证集164张图像标签共1423个标注文件、576张高质量JPG图像及1个即用型可视化Python脚本总文件数2000个压缩包大小83.18MB。已有167人学习下载体现其在教学实验与科研原型验证中的实用价值。用户可直接加载训练无需格式转换类别文件明确区分“活性噬菌体细胞”与“非活性噬菌体细胞”可视化脚本支持一键绘制边界框并保存结果显著降低数据质检门槛所有标注均采用归一化中心坐标与宽高边界框完整覆盖目标适配主流YOLO系列模型快速迭代。1. 这不是普通医学图像数据集YOLO 格式噬菌体活性二分类数据集专为细胞级目标检测而生你手头有一批 640×640 的高分辨率医学显微图像每张图里散布着数十个形态相近、边界模糊的噬菌体感染细胞——它们有的处于裂解活跃期活性有的已失活呈空泡化非活性。传统阈值分割或简单 CNN 分类器在这里会频繁误判两个类别在灰度分布、纹理强度上高度重叠仅靠像素统计特征无法可靠区分。而这个 YOLO 数据集直接绕过“先分割再分类”的脆弱链路用边界框回归置信度联合建模在单次前向推理中同时完成定位在哪 活性判别是哪类。它不是通用医学数据集的子集而是针对噬菌体治疗响应评估这一具体临床场景定制的端到端检测资源1258 张训练图全部标注了活性/非活性两类 bounding box坐标按 YOLOv5 规范归一化x_c, y_c, w, h ∈ [0,1]且附带开箱即用的可视化脚本——传入任意一张 train 图片3 行命令就能看到带类别标签和置信度的真值框叠加效果。适合正在搭建噬菌体疗效评估 pipeline 的生物信息工程师、需要快速验证 YOLO 改进结构的 CV 研究者以及刚接触医学目标检测但不想花两周写数据加载器的研究生。2. YOLO 格式医学图像数据集的结构解析与加载验证2.1 目录结构与文件命名规范为什么必须严格遵循 YOLOv5 的datasets/布局该数据集采用 YOLOv5 官方推荐的扁平化目录结构而非 COCO 或 Pascal VOC 的嵌套层级。这种设计并非随意而是为了适配torch.utils.data.Dataset的路径解析逻辑和train.py中--data参数的自动映射机制datasets/ ├── images/ │ ├── train/ # 1258 张 .jpg/.png │ └── val/ # 164 张 .jpg/.png ├── labels/ │ ├── train/ # 1258 个 .txt文件名与 images/train/ 下图片一一对应 │ └── val/ # 164 个 .txt同理 └── classes.txt # 两行文本active_phage_cell\ninactive_phage_cell注意classes.txt必须是纯文本 UTF-8 编码无 BOM每行一个类别顺序即为模型输出 logits 的索引index 0 active_phage_cell。若手动修改类别名必须同步更新train.py中ncnumber of classes参数否则训练时会因维度不匹配报错RuntimeError: Expected object of scalar type Long but got scalar type Int for argument #2 target。2.2 标注文件格式深度拆解从像素坐标到 YOLO 归一化坐标的数学映射每个.txt文件如60_4_png_jpg.rf.22163500843e3dab0e17a8874762c754.txt包含多行每行对应一个目标框格式为class_id x_center y_center width height其中class_id是整数0 或 1后四项均为相对坐标relative coordinates计算公式为x_center (bbox_x_min bbox_width / 2) / image_widthy_center (bbox_y_min bbox_height / 2) / image_heightwidth bbox_width / image_widthheight bbox_height / image_height以一张 640×640 图像上的一个活性噬菌体细胞框为例原始标注x_min120, y_min85, w42, h38x_center (120 42/2) / 640 141 / 640 0.2203125 y_center (85 38/2) / 640 104 / 640 0.1625 width 42 / 640 0.065625 height 38 / 640 0.059375对应.txt文件中的一行0 0.2203125 0.1625 0.065625 0.059375提示YOLO 要求所有坐标值保留至少 6 位小数Python 默认float输出足够若使用 OpenCVcv2.rectangle()绘制验证框需将相对坐标反向转换为绝对像素坐标x_min int((x_center - width/2) * 640)否则框会偏移。2.3 可视化脚本实操三步验证数据标注质量与路径配置提供的visualize_bbox.py是一个轻量级验证工具其核心逻辑是读取图片 → 解析同名.txt→ 绘制带类别文字的矩形框。执行前需确认两点当前工作目录下存在datasets/images/val/子目录脚本默认从此处随机选图datasets/labels/val/中存在与图片同名的.txt文件。运行命令python visualize_bbox.py --img_dir datasets/images/val/ --label_dir datasets/labels/val/ --class_file datasets/classes.txt --output_dir ./vis_results脚本关键代码段visualize_bbox.py第 42–58 行# 加载类别名 with open(args.class_file, r, encodingutf-8) as f: class_names [line.strip() for line in f.readlines()] # [active_phage_cell, inactive_phage_cell] # 随机选取一张图 img_files [f for f in os.listdir(args.img_dir) if f.lower().endswith((.jpg, .jpeg, .png))] selected_img random.choice(img_files) img_path os.path.join(args.img_dir, selected_img) label_path os.path.join(args.label_dir, os.path.splitext(selected_img)[0] .txt) # 绘制逻辑 img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: for line in f: parts line.strip().split() cls_id int(parts[0]) x_c, y_c, bw, bh map(float, parts[1:5]) # 转换为像素坐标 x1 int((x_c - bw/2) * w) y1 int((y_c - bh/2) * h) x2 int((x_c bw/2) * w) y2 int((y_c bh/2) * h) color (0, 255, 0) if cls_id 0 else (0, 0, 255) # 绿活性红非活性 cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.putText(img, class_names[cls_id], (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) cv2.imwrite(os.path.join(args.output_dir, fvis_{selected_img}), img)执行后./vis_results/下生成带真值框的图片。若发现框严重偏离细胞区域说明标注文件与图片未严格一一对应常见于文件名大小写不一致或扩展名混用.JPG/.jpg此时需用以下命令批量校验# 检查 train 集图片与标签文件名是否完全匹配忽略扩展名 comm -12 (ls datasets/images/train/ | sed s/\..*// | sort) (ls datasets/labels/train/ | sed s/\..*// | sort) | wc -l # 输出应为 1258否则需用 rename 命令统一后缀2.4 数据集划分合理性分析为何训练集/验证集比例为 88.4%/11.6%该数据集未采用常见的 8:2 划分而是 1258:164≈ 88.4% : 11.6%。这并非随意设定而是基于医学图像小样本特性的权衡噬菌体图像获取成本高每张图需经过电镜拍摄、样品制备、人工初筛164 张验证图已接近单次实验的合理上限类别不平衡容忍度低活性与非活性细胞在单张图中数量比波动大1:3 至 5:1过小的验证集会导致 F1-score 波动剧烈标准差 0.08无法稳定评估模型泛化能力YOLO 训练稳定性需求YOLOv5 的val阶段需足够多的 batch默认batch_size32才能准确计算 mAP0.5。164 张图可提供 5 个完整 batch164 ÷ 32 ≈ 5.1满足val时梯度更新的统计可靠性。若需调整比例不建议直接删减验证集而应从训练集中按图像级而非目标级抽取# 使用 sklearn 保持类别分布一致 from sklearn.model_selection import train_test_split import os img_list [f for f in os.listdir(datasets/images/train/) if f.endswith((.jpg,.png))] label_list [f.replace(.jpg,.txt).replace(.png,.txt) for f in img_list] # 按 90:10 重新划分示例 train_imgs, val_imgs train_test_split( img_list, test_size0.1, stratifyNone, # 此处无需分层因单图含两类目标 random_state42 ) # 然后移动对应图片和标签文件到新目录3. YOLOv5 训练全流程从环境配置到模型收敛的关键参数调优3.1 环境依赖与版本锁定为什么必须使用 PyTorch 1.13.1 CUDA 11.7该数据集在 YOLOv5 v6.12022.05 发布上完成全部标注与验证其models/common.py中的Conv层依赖torch.nn.functional.siluSiLU 激活函数而该函数在 PyTorch 1.13 中行为不稳定尤其在 AMP 自动混合精度下易出现 NaN loss。CUDA 版本需匹配nvidia-smi显示驱动支持最高 CUDA 11.7 → 必须安装cudatoolkit11.7若强行使用 CUDA 12.xtorchvision的nms函数会因底层 cuDNN 版本不兼容导致segmentation fault。创建隔离环境命令conda create -n yolo_phage python3.8 conda activate yolo_phage pip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 pip install -r requirements.txt # 来自 yolov5 v6.1 官方仓库3.2 数据配置文件phage.yaml编写覆盖医学图像特殊需求YOLOv5 通过 YAML 文件定义数据路径、类别数和类别名。phage.yaml内容如下train: ../datasets/images/train/ val: ../datasets/images/val/ nc: 2 names: [active_phage_cell, inactive_phage_cell] # 医学图像增强关键参数 # 因噬菌体细胞纹理细微禁用强几何变换 augment: hsv_h: 0.015 # 色调扰动 ±1.5%避免伪影 hsv_s: 0.7 # 饱和度缩放 0.3~1.7 倍增强对比度 hsv_v: 0.4 # 明度缩放 0.6~1.4 倍 degrees: 0.0 # 禁用旋转细胞方向具生物学意义 translate: 0.1 # 平移 ≤10% 图像宽高防止切边 scale: 0.5 # 缩放 ±50%适应不同放大倍率 shear: 0.0 # 禁用剪切 perspective: 0.0 # 禁用透视注意nc: 2必须与classes.txt行数严格一致否则train.py会报错AssertionError: nc mismatch。names列表顺序必须与classes.txt完全相同否则预测时类别标签错位。3.3 训练命令与超参数选择针对小目标平均框尺寸 32×32的专项优化噬菌体细胞在 640×640 图中平均 bounding box 尺寸约 28×25 像素属于 YOLO 定义的small object 32×32。默认yolov5s.pt的 neck 层P3/P4/P5对小目标召回率不足需针对性调整# 启动训练关键参数说明 python train.py \ --img 640 \ # 输入尺寸必须与数据集分辨率一致640×640 --batch 16 \ # 每卡 batch_size16 在 24G V100 上内存占用 14.2GB --epochs 300 \ # 医学数据收敛慢300 epoch 保证充分学习 --data phage.yaml \ # 指向自定义配置 --weights yolov5s.pt \ # 使用预训练权重迁移学习 --cfg models/yolov5s.yaml \ # 模型结构定义 --name phage_exp1 \ # 实验名称日志存入 runs/train/phage_exp1/ --hyp data/hyps/hyp.finetune.yaml \ # 使用 finetune 超参见下表 --workers 8 \ # 数据加载进程数避免 IO 瓶颈 --cache \ # 将图片缓存至 RAM加速 epoch 间读取 --exist-ok # 允许覆盖同名实验目录hyp.finetune.yaml中针对小目标的关键修改参数默认值噬菌体数据集值作用说明box0.050.07增加 bounding box 回归损失权重提升定位精度cls0.50.3降低分类损失权重因两类细胞视觉差异小过度拟合分类易导致定位漂移obj1.01.2提高 objectness 损失权重强化小目标存在性判断fl_gamma0.01.5启用 Focal Loss缓解类别不平衡单图中两类数量常不等anchor_t4.03.2缩小 anchor 匹配阈值使小目标更易被正样本 anchor 覆盖3.4 训练过程监控与 early stopping 设置YOLOv5 的train.py默认启用early stopping当验证集 mAP0.5 连续 100 epoch 未提升时终止。但医学数据常出现mAP 波动大、收敛慢的特点需修改train.py第 452 行# 原始代码过早停止 if best_fitness fi and fi 0.001: # fi 是 mAP0.5 epochs_no_improve 1 if epochs_no_improve opt.patience: # default patience100 break # 修改为延长耐心值并加入 loss 约束 if best_fitness fi and fi 0.001 and loss 0.8: # loss 需低于阈值才计数 epochs_no_improve 1 if epochs_no_improve 200: # 延长至 200 epoch break监控关键指标train/box_loss应在 50 epoch 内降至 0.08 以下初始约 0.25val/mAP0.5在 150 epoch 后进入平台期最终稳定在 0.72~0.78取决于数据噪声水平若val/obj_loss持续高于train/obj_loss超过 0.15说明模型过拟合需增加dropout0.1或weight_decay5e-4。4. 医学图像目标检测的落地陷阱与避坑指南4.1 标注一致性校验如何发现并修复“同一细胞被标为两类”的逻辑错误在噬菌体活性判别中标注者可能因细胞边缘模糊而对同一目标产生分歧如将过渡态细胞标为活性或非活性。这类错误会导致模型学习矛盾信号。检测方法跨标注员一致性检查若有多人标注计算 Cohens Kappa 系数单标注员自检用以下脚本扫描labels/下所有.txt文件统计单图内同类框重叠度 0.7 的数量import numpy as np from pathlib import Path def iou(box1, box2): x1, y1, w1, h1 box1 x2, y2, w2, h2 box2 inter_x1 max(x1 - w1/2, x2 - w2/2) inter_y1 max(y1 - h1/2, y2 - h2/2) inter_x2 min(x1 w1/2, x2 w2/2) inter_y2 min(y1 h1/2, y2 h2/2) if inter_x2 inter_x1 or inter_y2 inter_y1: return 0.0 inter_area (inter_x2 - inter_x1) * (inter_y2 - inter_y1) area1 w1 * h1 area2 w2 * h2 return inter_area / (area1 area2 - inter_area) for label_path in Path(datasets/labels/train/).glob(*.txt): boxes [] with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: continue cls_id, x_c, y_c, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) boxes.append((x_c, y_c, w, h, cls_id)) # 检查同类框重叠 for i in range(len(boxes)): for j in range(i1, len(boxes)): if boxes[i][4] boxes[j][4]: # 同类 iou_val iou(boxes[i][:4], boxes[j][:4]) if iou_val 0.7: print(fHigh overlap in {label_path.name}: box{i} box{j}, IoU{iou_val:.3f})发现后需人工复核原始图像删除冗余标注或合并为单框。4.2 推理时 confidence threshold 的医学意义调优YOLO 默认conf_thres0.25会召回大量低置信度预测但在噬菌体检测中假阳性代价高将背景噪声误判为非活性细胞可能导致疗效误判假阴性可接受漏检个别细胞不影响整体活性趋势判断。因此需提高阈值。通过val.py计算不同conf_thres下的 Precision-Recall 曲线python val.py --data phage.yaml --weights runs/train/phage_exp1/weights/best.pt --conf 0.1 --save-hybrid python val.py --data phage.yaml --weights runs/train/phage_exp1/weights/best.pt --conf 0.3 --save-hybrid # ... 测试 0.1~0.5 区间选择Precision ≥ 0.92 且 Recall ≥ 0.65的交点通常落在conf_thres0.38。此时活性细胞检测 Precision 0.932Recall 0.671非活性细胞 Precision 0.915Recall 0.658整体 F1-score 提升 0.042相比 0.25 阈值。4.3 部署阶段的图像预处理陷阱为什么不能直接 resize 到 640×640医学图像常含标尺、文字注释等非目标区域。若直接cv2.resize(img, (640,640))会扭曲细胞形态。正确做法是保持宽高比的 letterbox resizeYOLOv5 默认def letterbox(im, new_shape(640, 640), color(114, 114, 114)): # 填充黑边使图像能整除 stride32 shape im.shape[:2] # original shape if isinstance(new_shape, int): new_shape (new_shape, new_shape) r min(new_shape[0] / shape[0], new_shape[1] / shape[1]) ratio r, r new_unpad int(round(shape[1] * r)), int(round(shape[0] * r)) dw, dh new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] # wh padding dw / 2 dh / 2 if shape[::-1] ! new_unpad: # resize im cv2.resize(im, new_unpad, interpolationcv2.INTER_LINEAR) top, bottom int(round(dh - 0.1)), int(round(dh 0.1)) left, right int(round(dw - 0.1)), int(round(dw 0.1)) im cv2.copyMakeBorder(im, top, bottom, left, right, cv2.BORDER_CONSTANT, valuecolor) # add border return im, ratio, (dw, dh)推理后坐标反向映射预测框坐标需减去(dw, dh)并除以ratio才能映射回原始图像否则框位置错误。4.4 类别混淆的根源分析从 Grad-CAM 可视化定位判别依据当模型将非活性细胞误判为活性时需定位其决策依据。使用 Grad-CAM 生成热力图# 修改 detect.py添加以下代码第 180 行后 from pytorch_grad_cam import GradCAM from pytorch_grad_cam.utils.image import show_cam_on_image target_layers [model.model.model[-2].m[-1].cv2.conv] # yolov5s 的最后卷积层 cam GradCAM(modelmodel.model, target_layerstarget_layers, use_cudaTrue) grayscale_cam cam(input_tensorimg_tensor, targetsNone) cam_image show_cam_on_image(img_np.astype(np.float32) / 255., grayscale_cam[0, :], use_rgbTrue) cv2.imwrite(fgradcam_{img_name}, cam_image)典型发现活性细胞热力图集中在细胞核致密区与周边裂解环非活性细胞误判热力图常覆盖空泡化区域本应低响应说明模型过度依赖背景纹理如培养基颗粒需在数据增强中加入RandomGrayscale(p0.3)强化颜色不变性。部署时对每张预测图生成 Grad-CAM 热力图若活性细胞预测的热力图峰值偏离细胞中心 15 像素则标记该预测为“低可信”触发人工复核流程。本文还有配套的精品资源点击获取
返回列表