(13)10张结构图,深入理解YOLOv11算法各个模块

(13)10张结构图,深入理解YOLOv11算法各个模块

YOLOv11继承自YOLOv8,使同等精度下参数量降低20%。

在这里插入图片描述

一、yolo v11核心代码和对应的结构

(1)动态卷积层

def autopad(k, p=None, d=1): """自动填充以保持输出形状相同""" if d > 1: # 实际的卷积核大小 k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] if p is None: # 自动填充 p = k // 2 if isinstance(k, int) else [x // 2 for x in k] return p class DynamicConv(nn.Module): """动态卷积层""" def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True, num_experts=4): super().__init__() self.conv = nn.Sequential( DynamicConv_Single(c1, c2, kernel_size=k, stride=s, padding=autopad(k, p, d), dilation=d, groups=g, num_experts=num_experts), nn.BatchNorm2d(c2), nn.SiLU() if act else nn.Identity() ) def forward(self, x): return self.conv(x) 

(2)卷积层

image-20241214123406653
class Conv(nn.Module): """卷积层,包含卷积、批归一化和激活函数""" def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=None, groups=1, act=True): super(Conv, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, autopad(kernel_size, padding), groups=groups, bias=False) self.bn = nn.BatchNorm2d(out_channels) self.act = nn.SiLU() if act else nn.Identity() # 使用SiLU激活函数 def forward(self, x): return self.act(self.bn(self.conv(x))) 

(3)Bottleneck结构

image-20241214154638949
class Bottleneck(nn.Module): """标准瓶颈模块,包含两个卷积层""" def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5): super(Bottleneck, self).__init__() c_ = int(c2 * e) # 隐藏通道数 self.cv1 = Conv(c1, c_, k[0], 1) # 第一个卷积层 self.cv2 = Conv(c_, c2, k[1], 1) # 第二个卷积层 self.add = shortcut and c1 == c2 # 是否使用shortcut连接 def forward(self, x): """前向传播,使用shortcut连接""" return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x)) 

(4)C2f层

​ C2f层使用了2个Bottleneck模块,在小网络会使用这个模块。

image-20241214160813691
class C2f(nn.Module): def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5): """Initializes a CSP bottleneck with 2 convolutions and n Bottleneck blocks for faster processing.""" super().__init__() self.c = int(c2 * e) # hidden channels self.cv1 = Conv(c1, 2 * self.c, 1, 1) self.cv2 = Conv((2 + n) * self.c, c2, 1) # optional act=FReLU(c2) self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n)) def forward(self, x): y = list(self.cv1(x).chunk(2, 1)) y.extend(m(y[-1]) for m in self.m) return self.cv2(torch.cat(y, 1)) def forward_split(self, x): """Forward pass using split() instead of chunk().""" y = self.cv1(x).split((self.c, self.c), 1) y = [y[0], y[1]] y.extend(m(y[-1]) for m in self.m) return self.cv2(torch.cat(y, 1)) 

(5)C3k层

image-20241214163211679
class C3k(nn.Module): """C3k模块,包含多个瓶颈模块""" def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5, k=3): super(C3k, self).__init__() c_ = int(c2 * e) # hidden channels self.m = nn.Sequential(*(Bottleneck(c1, c2, shortcut, g, k=(k, k), e=e) for _ in range(n))) # 创建n个瓶颈模块 def forward(self, x): return self.m(x) # 前向传播 

(6)C3K2层

​ 实际就使用看2个上面讲的C3K层,在大网络会使用这个模块。

image-20241214164856010
class C3k2(C2f): def __init__(self, c1, c2, n=1, c3k=False, e=0.5, g=1, shortcut=True): super().__init__(c1, c2, n, shortcut, g, e) self.m = nn.ModuleList( C3k(self.c, self.c, 2, shortcut, g) if c3k else Bottleneck(self.c, self.c, shortcut, g) for _ in range(n) ) 

(7)C3k动态卷积

class C3k_DynamicConv(C3k): """C3k模块,使用动态卷积""" def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5, k=3): super().__init__(c1, c2, n, shortcut, g, e, k) c_ = int(c2 * e) # 隐藏通道数 self.m = nn.Sequential(*(Bottleneck_DynamicConv(c_, c_, shortcut, g, k=(k, k), e=1.0) for _ in range(n))) # 创建n个动态卷积瓶颈模块 class C3k2_DynamicConv(C3k2): """C3k2模块,使用动态卷积""" def __init__(self, c1, c2, n=1, c3k=False, e=0.5, g=1, shortcut=True): super().__init__(c1, c2, n, c3k, e, g, shortcut) self.m = nn.ModuleList(C3k_DynamicConv(self.c, self.c, 2, shortcut, g) if c3k else Bottleneck_DynamicConv(self.c, self.c, shortcut, g, k=(3, 3), e=1.0) for _ in range(n)) 

(8)FFN层

image-20241214165337258

(9)PSA层

​ 这些模块负责自注意力(self-attention)和前馈(feed-forward)操作。PSABlock 类实现了神经网络中的位置敏感注意力块。这个类封装了应用多头注意力和前馈神经网络层的功能,并可选地包含快捷连接。

image-20241214171145038
class PSABlock(nn.Module): def __init__(self, c, attn_ratio=0.5, num_heads=4, shortcut=True) -> None: super().__init__() self.attn = Attention(c, attn_ratio=attn_ratio, num_heads=num_heads) self.ffn = nn.Sequential(Conv(c, c * 2, 1), Conv(c * 2, c, 1, act=False)) self.add = shortcut def forward(self, x): x = x + self.attn(x) if self.add else self.attn(x) x = x + self.ffn(x) if self.add else self.ffn(x) return x 

(10)C2PSA层

  • C2PSA模块:这个模块实现了一个带有注意力机制的卷积块,目的是提升特征提取和处理的效果。
image-20241214172508365

**注意力机制的卷积块 **:

image-20241214182853058

代码:

class C2PSA(nn.Module): def __init__(self, c1, c2, n=1, e=0.5): super().__init__() assert c1 == c2 self.c = int(c1 * e) self.cv1 = Conv(c1, 2 * self.c, 1, 1) self.cv2 = Conv(2 * self.c, c1, 1) self.m = nn.Sequential(*(PSABlock(self.c, attn_ratio=0.5, num_heads=self.c // 64) for _ in range(n))) def forward(self, x): a, b = self.cv1(x).split((self.c, self.c), dim=1) b = self.m(b) return self.cv2(torch.cat((a, b), 1)) 

二、yolo入门实战教程

​ 视频教程点击:《吐血录制,yolo11猫狗实时检测实战项目,从零开始写yolov11代码》,视频全程25分钟,或B站搜“AI莫大猫”。

image-20241212090014863

​ 从零训练自己的数据集。

三、往期回顾

(1)yolo11猫狗实时检测实战项目,从零开始写yolov11代码
(2)yolo实战:从零开始学yolo之yolov1的技术原理
(3)YOLOv1训练过程,新手入门
高清动画,3分钟揭秘神经网络技术原理

在这里插入图片描述

Transfermer的Q、K、V设计的底层逻辑

Read more

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务并全面实现无损语言壁垒交互 前言 在 OpenHarmony 应用向高性能计算领域扩展的过程中,如何优雅地接入已有的 C/C++ 算法库(如加密引擎、重型图像处理、数学模拟)而又不失跨平台的便捷性?传统的 NAPI 虽然稳健,但在 Flutter 生态中,直接利用 WebAssembly (WASM) 配合 FFI(External Function Interface)的语义可以在一定程度上实现代码的高度复用。wasm_ffi 库为 Flutter 开发者提供了一套在 Dart 环境下调用 WASM

By Ne0inhk
前端 Axios 深度封装实战:拦截器 + 文件处理 + 业务接口统一管理

前端 Axios 深度封装实战:拦截器 + 文件处理 + 业务接口统一管理

嘿,开发的小伙伴们!今天咱来好好唠唠Axios,这可是在前端数据请求领域相当火的一个工具库。我第一次用Axios的时候,就被它的简洁易用和强大功能给吸引住了,感觉像是找到了一个能帮我轻松搞定数据请求的得力助手。 注:章节 1-4 是通过 AI 生成的入门介绍,人工进行了审核和勘误,如已比较熟悉可跳过,章节 5 是纯人工创作,结合真实项目详细说明如何封装与使用。 一、Axios是什么 Axios本质上是一个基于Promise的HTTP客户端,主要用于浏览器和Node.js环境。它就像是一座桥梁,负责在前端应用和后端服务器之间传递数据。无论是向服务器发送GET、POST、PUT、DELETE等各种请求,还是处理服务器返回的响应,Axios都能轻松应对。 想象一下,你的前端应用就像一个热闹的集市,各种组件都需要从服务器获取数据来展示,比如商品信息、用户资料等等。Axios就是那个勤劳的“采购员”,它穿梭于集市(前端应用)和仓库(服务器)之间,按需获取数据,确保每个组件都能及时拿到所需信息。 二、Axios的特点 1. 简洁易用的API

By Ne0inhk
根据设计图生成前端代码,零基础入门到精通,收藏这篇就够了

根据设计图生成前端代码,零基础入门到精通,收藏这篇就够了

在现代前端开发中,从设计稿到可用页面的交付往往需要大量重复劳动:切图、手写样式、布局调整……而借助 MCP Server - Figma AI Bridge,我们可以将 Figma 设计稿自动转换成整洁的 HTML/CSS/JS 代码,并立即生成可预览的网页。一键化、傻瓜式操作,让设计交付效率跃升。 本文测试使用的系统环境如下: * Trae IDE 版本:2.4.5 * macOS 版本:14.7 * Node.js 版本:24.6.0 * npx 版本:11.5.2 * Python 版本:3.13.3

By Ne0inhk

前端大数据渲染性能优化:Web Worker + 分片处理 + 渐进式渲染

当你的页面需要解析和渲染大量数据时,用户可能会面对长时间的白屏等待。本文将介绍一种"Web Worker 分片处理 + 主线程渐进式渲染"的优化方案,让用户在数据加载过程中就能看到内容逐步呈现。 目录 1. 问题场景 2. 为什么传统方案不够好 3. 解决方案概述 4. 技术原理详解 5. 完整代码实现 6. 性能对比 7. 适用场景 8. 总结 问题场景 最近在做一个历史聊天记录恢复的功能,后端返回大量数据需要前端进行解析拼接在渲染到页面上,如果数据量大,聊天记录可能得十几秒才会显示,用户体验极差。我们需要解决的问题有两个,数据解析和DOM渲染 为什么传统方案不够好 方案一:直接同步处理 // ❌ 问题:阻塞主线程,页面完全卡死const transactions = rawData.map(item =>parseTransaction(item))setTransactions(

By Ne0inhk