【完整源码+数据集+部署教程】胚胎发育阶段检测系统源码和数据集:改进yolo11-SCConv

发布于:2025-08-30 ⋅ 阅读:(11) ⋅ 点赞:(0)

背景意义

在生物医学领域,胚胎发育阶段的检测与分析对于生殖医学、胚胎干细胞研究以及人类健康具有重要意义。随着辅助生殖技术的不断发展,如何准确、快速地识别和分类不同阶段的胚胎,成为了提高成功率和优化治疗方案的关键因素之一。传统的胚胎发育阶段检测方法多依赖于人工观察,存在主观性强、效率低下等问题。因此,基于计算机视觉的自动化检测系统应运而生,成为研究的热点。

本研究旨在开发一个基于改进YOLOv11的胚胎发育阶段检测系统,利用深度学习技术实现对胚胎发育阶段的高效识别。我们所使用的数据集包含9700幅图像,涵盖了14个不同的胚胎发育阶段类别,包括从“Compaction”到“tPNf”的多个阶段。这些数据为模型的训练和验证提供了丰富的样本,有助于提高模型的准确性和鲁棒性。

通过对胚胎发育阶段的自动检测,能够显著降低人工操作的时间成本,提高检测的准确性,从而为临床提供更为可靠的决策支持。此外,改进YOLOv11模型在处理实例分割任务时的性能,将为胚胎图像的细粒度分析提供新的可能性。这不仅能够推动生殖医学的进步,还可能为相关领域的研究提供重要的技术支持。

综上所述,基于改进YOLOv11的胚胎发育阶段检测系统的研究,不仅具有重要的理论价值,也具备广泛的应用前景,能够为生殖医学、胚胎学研究等领域提供强有力的技术支持,推动相关领域的科学进步。

图片效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据集信息

本项目数据集信息介绍

本项目旨在改进YOLOv11的胚胎发育阶段检测系统,所使用的数据集专注于“Compaction Detection”,涵盖了胚胎发育过程中关键的阶段和状态。该数据集包含14个类别,具体类别包括:Compaction、Early_Blastocyst、Expanded_blast、t2、t3、t4、t5、t6、t7、t8、t9-、tB、tM和tPNf。这些类别代表了从胚胎的初始阶段到更为复杂的发育阶段的不同状态,反映了胚胎在早期发育过程中的重要变化。

数据集中“Compaction”类别标识了胚胎细胞在早期阶段的聚集现象,这是胚胎发育的一个重要标志,通常与细胞的分化和后续发育密切相关。紧接着是“Early_Blastocyst”类别,表示胚胎已经进入早期囊胚阶段,细胞开始形成内细胞团和外细胞层。随着发育的推进,数据集中的“Expanded_blast”类别则标识了囊胚的扩展状态,表明胚胎在发育过程中经历了显著的变化。

后续的类别如t2至t9-则代表了不同的发育阶段,每个阶段都具有独特的细胞特征和生物学意义。这些类别的划分不仅有助于研究人员理解胚胎发育的动态过程,也为临床应用提供了重要的参考依据。数据集中的“tB”、“tM”和“tPNf”类别则进一步细化了胚胎的发育状态,涵盖了不同的生物学特征和发育潜力。

通过使用这一丰富的数据集,改进后的YOLOv11系统将能够更准确地识别和分类胚胎的不同发育阶段,从而为胚胎研究和临床辅助生殖技术提供强有力的支持。这一数据集的构建和应用,旨在推动胚胎发育研究的深入发展,提升相关技术的准确性和可靠性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

核心代码

以下是经过简化并添加详细中文注释的核心代码部分:

import os
import torch
from ultralytics.engine.validator import BaseValidator
from ultralytics.utils.metrics import DetMetrics, box_iou
from ultralytics.utils import LOGGER, ops

class DetectionValidator(BaseValidator):
“”"
基于检测模型的验证器类,继承自BaseValidator类。
“”"

def __init__(self, dataloader=None, save_dir=None, args=None):
    """初始化检测模型所需的变量和设置。"""
    super().__init__(dataloader, save_dir, args=args)
    self.metrics = DetMetrics(save_dir=self.save_dir)  # 初始化检测指标
    self.iouv = torch.linspace(0.5, 0.95, 10)  # 定义IOU向量,用于计算mAP

def preprocess(self, batch):
    """对图像批次进行预处理,以便于YOLO训练。"""
    batch["img"] = batch["img"].to(self.device, non_blocking=True)  # 将图像转移到设备上
    batch["img"] = batch["img"].float() / 255  # 将图像归一化到[0, 1]范围
    for k in ["batch_idx", "cls", "bboxes"]:
        batch[k] = batch[k].to(self.device)  # 将其他数据转移到设备上
    return batch

def postprocess(self, preds):
    """对预测输出应用非极大值抑制(NMS)。"""
    return ops.non_max_suppression(
        preds,
        self.args.conf,
        self.args.iou,
        multi_label=True,
        max_det=self.args.max_det,
    )

def update_metrics(self, preds, batch):
    """更新检测指标。"""
    for si, pred in enumerate(preds):
        npr = len(pred)  # 当前预测的数量
        pbatch = self._prepare_batch(si, batch)  # 准备当前批次的真实标签
        cls, bbox = pbatch.pop("cls"), pbatch.pop("bbox")  # 获取真实标签的类别和边界框

        if npr == 0:  # 如果没有预测
            continue

        predn = self._prepare_pred(pred, pbatch)  # 准备预测数据
        stat = {
            "conf": predn[:, 4],  # 置信度
            "pred_cls": predn[:, 5],  # 预测类别
            "tp": self._process_batch(predn, bbox, cls)  # 计算真正例
        }
        self.metrics.process(**stat)  # 更新指标

def _process_batch(self, detections, gt_bboxes, gt_cls):
    """
    返回正确的预测矩阵。
    """
    iou = box_iou(gt_bboxes, detections[:, :4])  # 计算IOU
    return self.match_predictions(detections[:, 5], gt_cls, iou)  # 匹配预测与真实标签

def get_stats(self):
    """返回指标统计信息和结果字典。"""
    stats = self.metrics.results_dict  # 获取结果字典
    return stats

def print_results(self):
    """打印每个类别的训练/验证集指标。"""
    pf = "%22s" + "%11i" * 2 + "%11.3g" * len(self.metrics.keys)  # 打印格式
    LOGGER.info(pf % ("all", self.seen, *self.metrics.mean_results()))  # 打印总体结果

代码说明:
DetectionValidator类:这是一个用于验证YOLO模型的类,继承自BaseValidator,主要负责处理验证过程中的数据预处理、指标更新和结果打印等功能。

__init__方法:初始化检测指标和IOU向量,为后续的验证过程做准备。

preprocess方法:对输入的图像批次进行预处理,包括将图像转移到设备上并进行归一化。

postprocess方法:对模型的预测结果应用非极大值抑制(NMS),以去除冗余的预测框。

update_metrics方法:更新检测指标,计算每个预测的置信度和类别,并与真实标签进行比较,更新真正例(TP)。

_process_batch方法:计算预测框与真实框之间的IOU,并返回匹配的预测结果。

get_stats方法:获取当前的指标统计信息和结果字典。

print_results方法:打印每个类别的验证结果,包括总体的检测指标。

这个程序文件 val.py 是一个用于目标检测模型验证的类,名为 DetectionValidator,它继承自 BaseValidator 类。这个类主要用于处理目标检测任务中的验证过程,包含数据预处理、指标计算、结果输出等功能。

在初始化时,DetectionValidator 类接收一些参数,如数据加载器、保存目录、进度条、参数字典等。它还设置了一些特定的变量,例如目标类别数量、是否使用 COCO 数据集、类别映射等。它的主要任务是进行目标检测模型的验证,并计算相关的性能指标。

preprocess 方法用于对输入的图像批次进行预处理,包括将图像转换为适合模型输入的格式,以及将边界框坐标调整为适当的比例。这个方法还会根据设置决定是否进行自动标注。

init_metrics 方法初始化评估指标,包括验证路径、类别映射、混淆矩阵等。它还会根据模型的类别名称设置相关的指标。

get_desc 方法返回一个格式化的字符串,用于描述每个类别的指标信息。

postprocess 方法应用非极大值抑制(NMS)来处理模型的预测输出,以减少重叠的边界框。

_prepare_batch 和 _prepare_pred 方法分别用于准备输入的图像和标签数据,以及处理模型的预测结果,以便后续的指标计算。

update_metrics 方法用于更新验证过程中计算的指标,包括正确预测的数量、置信度、预测类别等信息。它还会根据需要保存预测结果到 JSON 或 TXT 文件中。

finalize_metrics 方法设置最终的指标值,包括计算速度和混淆矩阵。

get_stats 方法返回指标统计信息和结果字典,方便后续的结果输出和分析。

print_results 方法用于打印训练或验证集的每个类别的指标,包括总的检测数量和每个类别的平均结果。

_process_batch 方法计算正确预测的矩阵,通过计算预测框与真实框之间的交并比(IoU)来评估预测的准确性。

build_dataset 和 get_dataloader 方法用于构建 YOLO 数据集和返回数据加载器,以便在验证过程中使用。

plot_val_samples 和 plot_predictions 方法用于可视化验证样本和模型的预测结果,生成相应的图像文件。

save_one_txt 和 pred_to_json 方法用于将模型的检测结果保存为特定格式的文件,方便后续分析和评估。

eval_json 方法用于评估 YOLO 输出的 JSON 格式结果,并返回性能统计信息,支持与 COCO 数据集的评估。

整体来看,这个程序文件提供了一个完整的框架,用于验证目标检测模型的性能,计算各种指标,并可视化和保存结果,适用于使用 YOLO 模型进行目标检测的场景。

10.4 wtconv2d.py
以下是代码中最核心的部分,并附上详细的中文注释:

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Function
import pywt

创建小波滤波器
def create_wavelet_filter(wave, in_size, out_size, type=torch.float):
# 使用pywt库创建小波对象
w = pywt.Wavelet(wave)

# 反转小波的分解高通和低通滤波器
dec_hi = torch.tensor(w.dec_hi[::-1], dtype=type)
dec_lo = torch.tensor(w.dec_lo[::-1], dtype=type)

# 创建分解滤波器
dec_filters = torch.stack([
    dec_lo.unsqueeze(0) * dec_lo.unsqueeze(1),
    dec_lo.unsqueeze(0) * dec_hi.unsqueeze(1),
    dec_hi.unsqueeze(0) * dec_lo.unsqueeze(1),
    dec_hi.unsqueeze(0) * dec_hi.unsqueeze(1)
], dim=0)

# 扩展滤波器以适应输入通道数
dec_filters = dec_filters[:, None].repeat(in_size, 1, 1, 1)

# 反转小波的重构高通和低通滤波器
rec_hi = torch.tensor(w.rec_hi[::-1], dtype=type).flip(dims=[0])
rec_lo = torch.tensor(w.rec_lo[::-1], dtype=type).flip(dims=[0])

# 创建重构滤波器
rec_filters = torch.stack([
    rec_lo.unsqueeze(0) * rec_lo.unsqueeze(1),
    rec_lo.unsqueeze(0) * rec_hi.unsqueeze(1),
    rec_hi.unsqueeze(0) * rec_lo.unsqueeze(1),
    rec_hi.unsqueeze(0) * rec_hi.unsqueeze(1)
], dim=0)

# 扩展滤波器以适应输出通道数
rec_filters = rec_filters[:, None].repeat(out_size, 1, 1, 1)

return dec_filters, rec_filters

小波变换
def wavelet_transform(x, filters):
b, c, h, w = x.shape # 获取输入的形状
pad = (filters.shape[2] // 2 - 1, filters.shape[3] // 2 - 1) # 计算填充
# 使用卷积进行小波变换
x = F.conv2d(x, filters.to(x.dtype).to(x.device), stride=2, groups=c, padding=pad)
x = x.reshape(b, c, 4, h // 2, w // 2) # 重塑输出形状
return x

反小波变换
def inverse_wavelet_transform(x, filters):
b, c, _, h_half, w_half = x.shape # 获取输入的形状
pad = (filters.shape[2] // 2 - 1, filters.shape[3] // 2 - 1) # 计算填充
x = x.reshape(b, c * 4, h_half, w_half) # 重塑输入形状
# 使用转置卷积进行反小波变换
x = F.conv_transpose2d(x, filters.to(x.dtype).to(x.device), stride=2, groups=c, padding=pad)
return x

定义小波变换的类
class WaveletTransform(Function):
@staticmethod
def forward(ctx, input, filters):
ctx.filters = filters # 保存滤波器
with torch.no_grad():
x = wavelet_transform(input, filters) # 执行小波变换
return x

@staticmethod
def backward(ctx, grad_output):
    grad = inverse_wavelet_transform(grad_output, ctx.filters)  # 计算反向传播
    return grad, None

定义WTConv2d类
class WTConv2d(nn.Module):
def init(self, in_channels, out_channels, kernel_size=5, stride=1, bias=True, wt_levels=1, wt_type=‘db1’):
super(WTConv2d, self).init()

    assert in_channels == out_channels  # 输入通道数必须等于输出通道数

    self.in_channels = in_channels
    self.wt_levels = wt_levels
    self.stride = stride

    # 创建小波滤波器
    self.wt_filter, self.iwt_filter = create_wavelet_filter(wt_type, in_channels, in_channels, torch.float)
    self.wt_filter = nn.Parameter(self.wt_filter, requires_grad=False)  # 不需要梯度
    self.iwt_filter = nn.Parameter(self.iwt_filter, requires_grad=False)  # 不需要梯度

    # 定义小波变换和反小波变换的函数
    self.wt_function = wavelet_transform_init(self.wt_filter)
    self.iwt_function = inverse_wavelet_transform_init(self.iwt_filter)

    # 基础卷积层
    self.base_conv = nn.Conv2d(in_channels, in_channels, kernel_size, padding='same', stride=1, groups=in_channels, bias=bias)

def forward(self, x):
    # 执行小波变换和卷积操作
    # 省略具体实现细节
    return x  # 返回处理后的结果

代码核心部分解释:
创建小波滤波器:create_wavelet_filter 函数生成小波变换和反变换所需的滤波器。
小波变换与反变换:wavelet_transform 和 inverse_wavelet_transform 函数分别实现小波变换和反小波变换的过程。
自定义小波变换类:WaveletTransform 类使用 PyTorch 的 Function 机制实现前向和反向传播。
小波卷积层:WTConv2d 类是一个卷积层,结合了小波变换的特性,用于处理输入数据。
这个程序文件wtconv2d.py实现了一个基于小波变换的二维卷积层,主要用于深度学习中的图像处理任务。文件中包含多个函数和类,具体功能如下:

首先,导入了必要的库,包括PyTorch和PyWavelets。PyTorch用于构建神经网络和进行张量运算,而PyWavelets用于处理小波变换。

接下来,定义了一个create_wavelet_filter函数,该函数用于创建小波变换的滤波器。它接受小波类型、输入通道数和输出通道数作为参数,并返回用于小波分解和重构的滤波器。该函数使用PyWavelets库生成小波的高通和低通滤波器,并将其转换为PyTorch张量。

wavelet_transform和inverse_wavelet_transform函数分别实现了小波变换和逆小波变换。小波变换通过对输入张量进行卷积操作来提取特征,而逆小波变换则通过转置卷积将特征重构回原始空间。

接下来,定义了两个类WaveletTransform和InverseWaveletTransform,它们继承自Function类。WaveletTransform类实现了小波变换的前向和反向传播,InverseWaveletTransform类实现了逆小波变换的前向和反向传播。这些类的设计使得小波变换可以在神经网络中进行自动求导。

wavelet_transform_init和inverse_wavelet_transform_init函数用于初始化小波变换和逆小波变换的应用函数,这些函数会在后续的卷积操作中被调用。

WTConv2d类是文件的核心部分,继承自nn.Module。它实现了一个自定义的卷积层,结合了小波变换和常规卷积操作。在初始化时,该类会创建小波滤波器、基础卷积层和小波卷积层。小波卷积层的数量由wt_levels参数决定,表示小波变换的层数。

在forward方法中,输入张量经过小波变换、卷积操作和逆小波变换,最终输出结果。该方法首先对输入进行小波变换,然后通过多个小波卷积层处理特征,最后将处理后的特征通过逆小波变换重构回原始空间。

最后,定义了一个_ScaleModule类,用于对输入进行缩放操作。这个模块包含一个可学习的权重参数,用于调整输出的幅度。

总体而言,这个程序文件实现了一个结合小波变换的卷积神经网络层,能够在图像处理任务中提取多尺度特征,并通过小波变换的方式提高模型的表现。

源码文件

源码获取

欢迎大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式