news 2026/7/27 8:36:33

Ultralytics:解读SCDown模块

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ultralytics:解读SCDown模块

Ultralytics:解读SCDown模块

  • 前言
  • 相关介绍
    • Ultralytics 简介
  • 前提条件
  • 实验环境
  • SCDown(可分离卷积下采样模块)
      • 代码实现
      • 功能
      • 初始化参数
      • 前向方法
      • 使用示例
      • 流程示意图
      • 代码解读
      • 注意事项
      • 优缺点
        • 优点
        • 缺点
  • 参考文献

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入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

SCDown(可分离卷积下采样模块)

SCDown是一种轻量级的下采样模块,它利用点卷积(Pointwise Conv)深度卷积(Depthwise Conv)的组合,在降低特征图空间分辨率的同时,保持或调整通道数,并减少计算量。该模块常用于移动端或轻量级网络中(如 YOLOv8 的某些变体),以替代传统的步长卷积,实现更高效的降采样。


代码实现

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))classSCDown(nn.Module):"""SCDown module for downsampling with separable convolutions. This module performs downsampling using a combination of pointwise and depthwise convolutions, which helps in efficiently reducing the spatial dimensions of the input tensor while maintaining the channel information. Attributes: cv1 (Conv): Pointwise convolution layer that reduces the number of channels. cv2 (Conv): Depthwise convolution layer that performs spatial downsampling. Methods: forward: Applies the SCDown module to the input tensor. Examples: >>> import torch >>> from ultralytics.nn.modules.block import SCDown >>> model = SCDown(c1=64, c2=128, k=3, s=2) >>> x = torch.randn(1, 64, 128, 128) >>> y = model(x) >>> print(y.shape) torch.Size([1, 128, 64, 64]) """def__init__(self,c1:int,c2:int,k:int,s:int):"""Initialize SCDown module. Args: c1 (int): Input channels. c2 (int): Output channels. k (int): Kernel size. s (int): Stride. """super().__init__()self.cv1=Conv(c1,c2,1,1)self.cv2=Conv(c2,c2,k=k,s=s,g=c2,act=False)defforward(self,x:torch.Tensor)->torch.Tensor:"""Apply convolution and downsampling to the input tensor. Args: x (torch.Tensor): Input tensor. Returns: (torch.Tensor): Downsampled output tensor. """returnself.cv2(self.cv1(x))

功能

  • 通道变换:首先通过 1×1 卷积(cv1)将输入通道从c1映射到c2,同时整合跨通道信息。
  • 空间下采样:然后通过深度卷积(cv2,分组数等于通道数g=c2)进行空间下采样(步长s),提取空间特征并降低分辨率。
  • 无额外激活:深度卷积cv2设置act=False,不添加激活函数,保持输出线性,可能减少非线性变换的影响。
  • 参数高效:深度卷积的参数量远低于标准卷积(k²·c2vsk²·c2²),适合轻量级网络。

初始化参数

参数类型说明
c1int输入通道数
c2int输出通道数
kint深度卷积的核大小
sint深度卷积的步长(通常 >1 实现下采样)
  • cv1:1×1 标准卷积(Conv,包含 BN + SiLU 激活),将通道从c1变换到c2
  • cv2:深度卷积(Conv设置g=c2),核大小k,步长s,无激活(act=False),只包含 BN。

前向方法

  • forward(x):输入x,输出形状[B, c2, H_out, W_out],其中H_out = floor((H + 2*p - k)/s) + 1(深度卷积的 padding 由autopad自动计算,保持 same 填充,因此通常H_out = ceil(H/s)或近似)。

计算流程

  1. y = self.cv1(x)[B, c2, H, W]
  2. z = self.cv2(y)[B, c2, H_out, W_out]

使用示例

if__name__=='__main__':# 1. 随机输入B,c1,H,W=2,32,64,64x=torch.randn(B,c1,H,W)# 2. 创建 SCDown(输入32,输出64,核3,步长2)scdown=SCDown(c1=32,c2=64,k=3,s=2)# 3. 前向传播withtorch.no_grad():out=scdown(x)print("输入形状:",x.shape)# [2, 32, 64, 64]print("输出形状:",out.shape)# [2, 64, 32, 32](步长2,空间减半)# 4. 使用真实图像演示(扩展为多通道)img_path="cat_640x640.png"img_bgr=cv2.imread(img_path)ifimg_bgrisnotNone:img_gray=cv2.cvtColor(cv2.resize(img_bgr,(64,64)),cv2.COLOR_BGR2GRAY)img_tensor=torch.from_numpy(img_gray).float().unsqueeze(0).unsqueeze(0)# [1,1,64,64]# 扩展通道至 c1=32x_img=img_tensor.repeat(1,32,1,1)model_img=SCDown(c1=32,c2=32,k=3,s=2)withtorch.no_grad():out_img=model_img(x_img)inp_ch0=x_img[0,0].cpu().numpy()out_ch0=out_img[0,0].cpu().numpy()defnorm(arr):return(arr-arr.min())/(arr.max()-arr.min()+1e-8)plt.figure(figsize=(12,5),constrained_layout=True)plt.subplot(1,3,1)plt.imshow(img_gray,cmap='gray')plt.title("Original")plt.axis("off")plt.subplot(1,3,2)plt.imshow(norm(inp_ch0),cmap='gray')plt.title("Input Ch0")plt.axis("off")plt.subplot(1,3,3)plt.imshow(norm(out_ch0),cmap='gray')plt.title("SCDown Output Ch0")plt.axis("off")plt.savefig("scdown_demo.png",dpi=150)print("可视化已保存为 scdown_demo.png")


输出示例

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

流程示意图

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

cv1: Conv 1x1, c1→c2, s=1

特征 (B, c2, H, W)

cv2: Depthwise Conv, k×k, stride=s, groups=c2, act=False

输出 (B, c2, H/s, W/s)


代码解读

  • __init__
    • self.cv1:1×1 标准卷积,负责通道变换,激活为默认 SiLU。
    • self.cv2:深度卷积,分组数g=c2,核大小k,步长s,无激活(act=False),仅含 BN。该卷积不改变通道数,只进行空间采样。
  • forward:顺序执行两个卷积。

注意事项

  1. 步长与下采样s通常大于 1(如 2)以实现空间降维;若s=1,则仅进行通道变换,无下采样。
  2. 深度卷积的填充Conv内部使用autopad自动计算填充,保证stride=1时尺寸不变;当stride>1时,输出尺寸约为输入尺寸除以s(向上取整)。
  3. 激活函数cv2无激活,但cv1有激活,因此整体模块仍包含非线性。
  4. 计算效率:深度卷积参数为k²·c2,远小于标准卷积k²·c2²,大幅减少 FLOPs。
  5. 通道数要求c2必须为整数,且深度卷积要求c2能被分组数整除(g=c2总是成立)。

优缺点

优点
  1. 轻量高效:深度卷积大幅减少参数量和计算量,适合移动端部署。
  2. 通道可调:通过 1×1 卷积灵活控制输出通道数。
  3. 即插即用:可替换标准步长卷积,降低网络开销。
  4. 保持空间信息:深度卷积逐通道处理,保留各通道的空间细节。
缺点
  1. 深度卷积可能限制表达能力:逐通道卷积无法跨通道融合,但前面的 1×1 卷积已做融合,所以影响较小。
  2. 无激活可能降低非线性cv2无激活,可能略弱于标准卷积(但通常可接受)。
  3. 不适合大幅通道变换:若c1c2差异悬殊,1×1 卷积可能成为瓶颈。

在轻量级网络中,SCDown常用于骨干网络的前几层,以降低分辨率并增加通道数,同时保持计算成本可控。使用时可根据任务调整k(通常 3)和s,并监控模型精度与速度的平衡。

参考文献

[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)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 8:35:49

AI Agent开发核心架构与Google ADK实战指南

1. 从零理解AI Agent开发的核心架构在当今AI技术快速发展的时代,Google开源的Agent Development Kit(ADK)为开发者提供了一个强大的框架来构建智能代理系统。ADK不是一个独立的大模型,而是一个"智能操作系统"&#xff0…

作者头像 李华
网站建设 2026/7/27 8:34:40

AD-Copilot:工业异常检测新范式与多模态技术实践

1. 工业异常检测的痛点与AD-Copilot的突破 工业生产线上的质检环节,往往需要工人用肉眼比对产品与标准模板的差异。这种工作看似简单,实则暗藏挑战:微小划痕的识别需要将图片放大到像素级比对,色差检测要求在不同光照条件下保持判…

作者头像 李华
网站建设 2026/7/27 8:31:19

基于机器视觉的水果质量检测技术实践

1. 水果质量检测的行业背景与挑战 水果作为全球农产品贸易中的重要商品,其质量直接决定了市场价格和消费者满意度。在传统的水果分选流水线上,主要依赖人工目检进行品质筛选,这种方式存在几个明显的痛点: 效率瓶颈 :…

作者头像 李华
网站建设 2026/7/27 8:31:13

HarmonyOS7 ArkUI 视频列表 - 封面卡片、播放量、关注按钮实战

文章目录前言从界面倒推代码交互入口在哪里代码里的重点片段 1:toggleFollow(id: number) {片段 2:likesDisplay(count: number): string {使用方式完整代码收个尾前言 这篇不讲空概念,直接从页面代码拆。能复用的不是某个颜色值&#xff0c…

作者头像 李华
网站建设 2026/7/27 8:31:02

PyPI供应链攻击深度解析:从LiteLLM恶意包事件看开源依赖安全

1. 事件概述:LiteLLM PyPI包安全事件深度解析最近在AI开发圈和开源安全领域,一个事件引发了不小的震动:一个名为“litellm”的Python包在PyPI(Python Package Index)官方仓库中被发现植入了恶意代码。如果你最近执行过…

作者头像 李华
网站建设 2026/7/27 8:29:03

解决ssh的rviz显示问题

sudo apt update sudo apt install -y ros-noetic-rviz 三、解决你 OK3588 MobaXterm 远程 xcb 报错(重点) 补齐全部 XCB/Qt 图形依赖(ARM 板必装) bash 运行 sudo apt install -y libxcb1 libxcb-cursor0 libxcb-xinerama0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 l…

作者头像 李华