Ultralytics:解读Proto模块

📅 2026/7/25 2:00:59 👁️ 阅读次数 📝 编程学习
Ultralytics:解读Proto模块

Ultralytics:解读Proto模块

  • 前言
  • 相关介绍
    • Ultralytics 简介
  • 前提条件
  • 实验环境
  • Proto(YOLO 分割掩码原型生成模块)
      • 代码实现
      • 功能
      • 初始化参数
      • 前向方法
      • 使用示例
      • 流程示意图
      • 代码解读
      • 注意事项
      • 优缺点
        • 优点
        • 缺点
  • 参考文献

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏、人工智能混合编程实践专栏或我的个人主页查看
  • YOLOs-CPP:一个免费开源的YOLO全系列C++推理库(以YOLO26为例)
  • PaddleOCR:Win10上安装使用PPOCRLabel标注工具
  • 目标检测:使用自己的数据集微调DEIMv2进行物体检测
  • 图像分割:PyTorch从零开始实现SegFormer语义分割
  • 图像超分:使用自己的数据集微调Real-ESRGAN-x4plus进行超分重建
  • 图像生成:PyTorch从零开始实现一个简单的扩散模型
  • Stable Diffusion:使用自己的数据集微调 Stable Diffusion 3.5 LoRA 文生图模型
  • 图像超分:使用自己的数据集微调Real-ESRGAN-x2plus进行超分重建
  • Anomalib:使用Anomalib 2.1.0训练自己的数据集进行异常检测
  • Anomalib:在Linux服务器上安装使用Anomalib 2.1.0
  • 人工智能混合编程实践:C++调用封装好的DLL进行异常检测推理
  • 人工智能混合编程实践:C++调用封装好的DLL进行FP16图像超分重建(v3.0)
  • 隔离系统Python:源码编译3.11.8到自定义目录(含PGO性能优化)
  • 在线机的Python环境迁移到离线机上
  • Nuitka 将 Python 脚本封装为 .pyd 或 .so 文件
  • Ultralytics:使用 YOLO11 进行速度估计
  • Ultralytics:使用 YOLO11 进行物体追踪
  • Ultralytics:使用 YOLO11 进行物体计数
  • Ultralytics:使用 YOLO11 进行目标打码
  • 人工智能混合编程实践:C++调用Python ONNX进行YOLOv8推理
  • 人工智能混合编程实践:C++调用封装好的DLL进行YOLOv8实例分割
  • 人工智能混合编程实践:C++调用Python ONNX进行图像超分重建
  • 人工智能混合编程实践:C++调用Python AgentOCR进行文本识别
  • 通过计算实例简单地理解PatchCore异常检测
  • Python将YOLO格式实例分割数据集转换为COCO格式实例分割数据集
  • YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目
  • Stable Diffusion:在服务器上部署使用Stable Diffusion WebUI进行AI绘图(v2.0)
  • Stable Diffusion:使用自己的数据集微调训练LoRA模型(v2.0)

相关介绍

Ultralytics 简介

Ultralytics 基于多年的计算机视觉和人工智能基础研究,创建了最先进的 (SOTA) YOLO 模型。我们的模型不断更新性能和灵活性,快速、准确且易于使用。他们擅长对象检测、跟踪、实例分割、语义分割、图像分类和姿势估计任务。

  • 官方文档:https://docs.ultralytics.com/
  • 官方代码:https://github.com/ultralytics/ultralytics.git

前提条件

  • 熟悉Python、Pytorch

实验环境

Package Version ------------------------ ------------ Python3.11.8 absl-py2.4.0 accelerate1.13.0 annotated-doc0.0.4 anyio4.13.0 calflops0.3.2 certifi2026.4.22 charset-normalizer3.4.7 click8.3.3 colorama0.4.6 contourpy1.3.3 cycler0.12.1 filelock3.29.0 flatbuffers25.12.19 fonttools4.62.1 fsspec2026.4.0 grpcio1.80.0 h110.16.0 hf-xet1.5.0 httpcore1.0.9 httpx0.28.1 huggingface_hub1.14.0 idna3.15Jinja23.1.6 kiwisolver1.5.0 Markdown3.10.2 markdown-it-py4.2.0 MarkupSafe3.0.3 matplotlib3.10.9 mdurl0.1.2 ml_dtypes0.5.0 mpmath1.3.0 networkx3.6.1 numpy1.26.4 nvidia-cublas-cu1212.8.3.14 nvidia-cuda-cupti-cu1212.8.57 nvidia-cuda-nvrtc-cu1212.8.61 nvidia-cuda-runtime-cu1212.8.57 nvidia-cudnn-cu129.7.1.26 nvidia-cufft-cu1211.3.3.41 nvidia-cufile-cu121.13.0.11 nvidia-curand-cu1210.3.9.55 nvidia-cusolver-cu1211.7.2.55 nvidia-cusparse-cu1212.5.7.53 nvidia-cusparselt-cu120.6.3 nvidia-nccl-cu122.26.2 nvidia-nvjitlink-cu1212.8.61 nvidia-nvtx-cu1212.8.55 onnx1.19.0 onnxruntime-gpu1.26.0 onnxslim0.1.94 opencv-python4.6.0.66 packaging26.2pillow12.2.0 pip24.0polars1.40.1 polars-runtime-321.40.1 protobuf7.34.1 psutil7.2.2 pycocotools2.0.11 Pygments2.20.0 pyparsing3.3.2 python-dateutil2.9.0.post0 PyYAML6.0.3 regex2026.5.9 requests2.34.1 rich15.0.0 safetensors0.7.0 scipy1.16.0 setuptools65.5.0 shellingham1.5.4 six1.17.0 sympy1.14.0 tabulate0.10.0 tensorboard2.20.0 tensorboard-data-server0.7.2 tokenizers0.22.2 torch2.7.1+cu128 torchaudio2.7.1+cu128 torchvision0.22.1+cu128 tqdm4.67.3 transformers5.8.1 triton3.3.1 typer0.25.1 typing_extensions4.15.0 ultralytics8.4.58 ultralytics-thop2.0.19 urllib32.7.0 Werkzeug3.1.8

Proto(YOLO 分割掩码原型生成模块)

Proto是 Ultralytics YOLO 系列(如 YOLOv8‑seg)中用于实例分割的核心组件,负责从特征图中生成一组原型掩码(prototype masks)。这些原型掩码是通用的、与类别无关的“基掩码”,后续会与每个检测框的掩码系数(mask coefficients)进行线性组合,得到最终的分割掩码。该模块通过卷积层 + 转置卷积上采样的方式,将输入特征图转换为固定数量的原型掩码图,其空间分辨率通常为输入特征图的 2 倍。


代码实现

importcv2importmathimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFimportnumpyasnpimportmatplotlib.pyplotaspltdefautopad(k,p=None,d=1):# kernel, padding, dilation"""Pad to 'same' shape outputs."""ifd>1:k=d*(k-1)+1ifisinstance(k,int)else[d*(x-1)+1forxink]# actual kernel-sizeifpisNone:p=k//2ifisinstance(k,int)else[x//2forxink]# auto-padreturnpclassConv(nn.Module):"""Standard convolution module with batch normalization and activation. Attributes: conv (nn.Conv2d): Convolutional layer. bn (nn.BatchNorm2d): Batch normalization layer. act (nn.Module): Activation function layer. default_act (nn.Module): Default activation function (SiLU). """default_act=nn.SiLU()# default activationdef__init__(self,c1,c2,k=1,s=1,p=None,g=1,d=1,act=True):"""Initialize Conv layer with given parameters. Args: c1 (int): Number of input channels. c2 (int): Number of output channels. k (int): Kernel size. s (int): Stride. p (int, optional): Padding. g (int): Groups. d (int): Dilation. act (bool | nn.Module): Activation function. """super().__init__()self.conv=nn.Conv2d(c1,c2,k,s,autopad(k,p,d),groups=g,dilation=d,bias=False)self.bn=nn.BatchNorm2d(c2)self.act=self.default_actifactisTrueelseactifisinstance(act,nn.Module)elsenn.Identity()defforward(self,x):"""Apply convolution, batch normalization and activation to input tensor. Args: x (torch.Tensor): Input tensor. Returns: (torch.Tensor): Output tensor. """returnself.act(self.bn(self.conv(x)))defforward_fuse(self,x):"""Apply convolution and activation without batch normalization. Args: x (torch.Tensor): Input tensor. Returns: (torch.Tensor): Output tensor. """returnself.act(self.conv(x))classProto(nn.Module):"""Ultralytics YOLO models mask Proto module for segmentation models."""def__init__(self,c1:int,c_:int=256,c2:int=32):"""Initialize the Ultralytics YOLO models mask Proto module with specified number of protos and masks. Args: c1 (int): Input channels. c_ (int): Intermediate channels. c2 (int): Output channels (number of protos). """super().__init__()self.cv1=Conv(c1,c_,k=3)self.upsample=nn.ConvTranspose2d(c_,c_,2,2,0,bias=True)# nn.Upsample(scale_factor=2, mode='nearest')self.cv2=Conv(c_,c_,k=3)self.cv3=Conv(c_,c2)defforward(self,x:torch.Tensor)->torch.Tensor:"""Perform a forward pass through layers using an upsampled input image."""returnself.cv3(self.cv2(self.upsample(self.cv1(x))))

功能

  • 特征降维与提炼:通过cv13×3 卷积将输入通道c1压缩到中间通道c_,提取紧凑特征。
  • 空间上采样:使用 2×2 转置卷积(ConvTranspose2d)将特征图的空间尺寸放大 2 倍(高和宽各翻倍),增加细节分辨率。
  • 特征精炼与输出:再经过cv2cv3两个 3×3 卷积,最终输出通道数为c2的特征图,其中每个通道即为一个原型掩码。
  • 输出尺寸:最终输出的空间尺寸为输入尺寸的 2 倍,通道数为原型数量c2

初始化参数

参数类型说明
c1int输入特征图的通道数(通常来自骨干网络)
c_int中间通道数(默认 256),用于降低计算量
c2int输出通道数(默认 32),即生成的原型掩码数量
  • cv1cv2cv3均为Conv模块(包含卷积 + BatchNorm + SiLU 激活),卷积核大小为 3,步长为 1,填充自动 same。
  • upsample为 2×2 转置卷积(nn.ConvTranspose2d),输入/输出通道均为c_,步长 2,无填充,带偏置。

前向方法

  • forward(x):输入x形状[B, c1, H, W],输出[B, c2, 2H, 2W]

计算流程

  1. x = self.cv1(x)[B, c_, H, W]
  2. x = self.upsample(x)[B, c_, 2H, 2W]
  3. x = self.cv2(x)[B, c_, 2H, 2W]
  4. x = self.cv3(x)[B, c2, 2H, 2W]

使用示例

if__name__=='__main__':# 1. 模拟输入特征图(通常来自骨干网络或 Neck)B,c1,H,W=2,128,32,32x=torch.randn(B,c1,H,W)# 2. 创建 Proto 模块(输入通道128,中间256,输出32个原型)proto=Proto(c1=128,c_=256,c2=32)# 3. 前向传播withtorch.no_grad():out=proto(x)print("输入形状:",x.shape)# [2, 128, 32, 32]print("输出形状:",out.shape)# [2, 32, 64, 64]# 4. 使用真实图像演示(仅演示流程,实际需提取特征图)img_path="cat_640x640.png"img_bgr=cv2.imread(img_path)ifimg_bgrisnotNone:# 缩放到 64x64 并转为张量img_rgb=cv2.cvtColor(cv2.resize(img_bgr,(64,64)),cv2.COLOR_BGR2RGB)img_tensor=torch.from_numpy(img_rgb).float().permute(2,0,1).unsqueeze(0)/255.0# [1,3,64,64]# 模拟一个简单的特征图(通过卷积提取)dummy_conv=nn.Conv2d(3,128,3,1,1)withtorch.no_grad():feat=dummy_conv(img_tensor)# [1,128,64,64]# 使用 Protoproto_img=Proto(c1=128,c_=64,c2=4)# 生成4个原型withtorch.no_grad():protos=proto_img(feat)# [1, 4, 128, 128]# 可视化第一个原型掩码proto0=protos[0,0].cpu().numpy()# [128, 128]proto0=(proto0-proto0.min())/(proto0.max()-proto0.min()+1e-8)plt.figure(figsize=(10,5))plt.subplot(1,2,1)plt.imshow(img_rgb)plt.title("Original")plt.axis("off")plt.subplot(1,2,2)plt.imshow(proto0,cmap='gray')plt.title("Prototype 0")plt.axis("off")plt.savefig("proto_demo.png",dpi=150)print("可视化已保存为 proto_demo.png")


输出示例

输入形状: torch.Size([2, 128, 32, 32]) 输出形状: torch.Size([2, 32, 64, 64]) 可视化已保存为 proto_demo.png

流程示意图

输入 x (B, c1, H, W)

cv1: Conv 3x3, c1 → c_

特征 (B, c_, H, W)

upsample: ConvTranspose2d, 2×2, stride=2

上采样 (B, c_, 2H, 2W)

cv2: Conv 3x3, c_ → c_

特征 (B, c_, 2H, 2W)

cv3: Conv 3x3, c_ → c2

输出原型 (B, c2, 2H, 2W)


代码解读

  • __init__
    • self.cv1:3×3 卷积,将输入通道c1压缩到c_,减少后续计算量。
    • self.upsample:转置卷积(反卷积),将空间尺寸放大 2 倍,同时保持通道数c_。与双线性插值上采样相比,转置卷积是可学习的,能提供更精细的上采样效果。
    • self.cv2self.cv3:两个 3×3 卷积,进一步精炼特征,最终将通道数压缩到原型数量c2
  • forward:顺序执行上述层,输出原型掩码。

注意事项

  1. 输入与输出尺寸关系:输出空间尺寸为输入尺寸的 2 倍,因此输入特征图的分辨率需适中(过高会增加计算量,过低则丢失细节)。
  2. 原型数量c2:通常设置为 32 左右,过多会增加计算量,过少则影响分割精度。
  3. 转置卷积的“棋盘效应”:使用ConvTranspose2d可能产生棋盘格伪影,但 YOLO 设计中后续会与掩码系数结合,且使用了 BatchNorm 和激活,可缓解该问题。
  4. 激活函数Conv模块默认使用 SiLU(Swish),与 YOLOv8 整体风格一致。
  5. 训练与推理:该模块在训练和推理阶段行为相同,无特殊模式。

优缺点

优点
  1. 高效:仅由 3 个卷积层和 1 个上采样层组成,参数少,计算快。
  2. 可学习上采样:使用转置卷积而非固定插值,使上采样过程可调,有助于生成更精细的原型。
  3. 输出分辨率高:将特征图分辨率提升至 2 倍,有利于小目标分割。
缺点
  1. 转置卷积可能引入伪影:在不适当的初始化或训练下,可能产生棋盘格效应。
  2. 输出尺寸固定为 2 倍:无法灵活调整上采样倍数(如需 4 倍需修改代码)。
  3. 原型之间缺乏显式约束:生成的原型掩码可能重复或冗余,需依赖训练数据学习多样性。

在 YOLOv8‑seg 中,Proto模块位于检测头之前,与掩码系数预测分支并行,共同生成最终的分割掩码。它通过少量参数实现了从特征图到原型掩码的转换,是实例分割任务的关键组成部分。使用时可根据输入特征图尺寸调整c_c2,以平衡计算量和精度。

参考文献

[1] https://docs.ultralytics.com/
[2] https://github.com/ultralytics/ultralytics.git

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏、人工智能混合编程实践专栏或我的个人主页查看
  • YOLOs-CPP:一个免费开源的YOLO全系列C++推理库(以YOLO26为例)
  • PaddleOCR:Win10上安装使用PPOCRLabel标注工具
  • 目标检测:使用自己的数据集微调DEIMv2进行物体检测
  • 图像分割:PyTorch从零开始实现SegFormer语义分割
  • 图像超分:使用自己的数据集微调Real-ESRGAN-x4plus进行超分重建
  • 图像生成:PyTorch从零开始实现一个简单的扩散模型
  • Stable Diffusion:使用自己的数据集微调 Stable Diffusion 3.5 LoRA 文生图模型
  • 图像超分:使用自己的数据集微调Real-ESRGAN-x2plus进行超分重建
  • Anomalib:使用Anomalib 2.1.0训练自己的数据集进行异常检测
  • Anomalib:在Linux服务器上安装使用Anomalib 2.1.0
  • 人工智能混合编程实践:C++调用封装好的DLL进行异常检测推理
  • 人工智能混合编程实践:C++调用封装好的DLL进行FP16图像超分重建(v3.0)
  • 隔离系统Python:源码编译3.11.8到自定义目录(含PGO性能优化)
  • 在线机的Python环境迁移到离线机上
  • Nuitka 将 Python 脚本封装为 .pyd 或 .so 文件
  • Ultralytics:使用 YOLO11 进行速度估计
  • Ultralytics:使用 YOLO11 进行物体追踪
  • Ultralytics:使用 YOLO11 进行物体计数
  • Ultralytics:使用 YOLO11 进行目标打码
  • 人工智能混合编程实践:C++调用Python ONNX进行YOLOv8推理
  • 人工智能混合编程实践:C++调用封装好的DLL进行YOLOv8实例分割
  • 人工智能混合编程实践:C++调用Python ONNX进行图像超分重建
  • 人工智能混合编程实践:C++调用Python AgentOCR进行文本识别
  • 通过计算实例简单地理解PatchCore异常检测
  • Python将YOLO格式实例分割数据集转换为COCO格式实例分割数据集
  • YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目
  • Stable Diffusion:在服务器上部署使用Stable Diffusion WebUI进行AI绘图(v2.0)
  • Stable Diffusion:使用自己的数据集微调训练LoRA模型(v2.0)