(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 组件 random_color 的适配 鸿蒙Harmony 实战 - 驾驭视觉美学随机化、实现鸿蒙端高阶灵动 UI 调色盘与动态主题生成方案

Flutter 组件 random_color 的适配 鸿蒙Harmony 实战 - 驾驭视觉美学随机化、实现鸿蒙端高阶灵动 UI 调色盘与动态主题生成方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 random_color 的适配 鸿蒙Harmony 实战 - 驾驭视觉美学随机化、实现鸿蒙端高阶灵动 UI 调色盘与动态主题生成方案 前言 在鸿蒙(OpenHarmony)应用开发中,尤其是在涉及内容创作、个性化看板或动态标签系统时,我们经常需要生成一些“丰富多彩但又不显杂乱”的颜色。如果你仅仅依赖 Random().nextInt(0xFFFFFF),那么生成的色彩极易出现灰暗、过度饱和或者是对比度极低的“色块灾难”。 一个具备极致审美的鸿蒙应用,应当学会在随机中寻找平衡。 random_color 是一套基于色彩理论的高阶生成引擎。它不仅能产生随机色,更能根据“色相(Hue)”、“明度(Luminosity)”和“饱和度”进行定向搜索。适配到鸿蒙平台后,它不仅能支撑起灵动的 UI

By Ne0inhk
鸿蒙APP开发从入门到精通:性能优化与Next原生合规

鸿蒙APP开发从入门到精通:性能优化与Next原生合规

《鸿蒙APP开发从入门到精通》第11篇:性能优化与Next原生合规 🏎️✅ 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第11篇——性能优化与Next原生合规篇,承接第10篇的「AI原生与用户增长」,100%复用项目架构,为后续第12篇的电商购物车全栈项目最终上线铺垫性能优化与Next原生合规的核心技术。 学习目标: * 掌握鸿蒙APP性能优化的定义与架构; * 实现启动优化、渲染优化、网络优化等性能优化功能; * 理解Next原生合规的原理与实现方式; * 开发代码规范、权限合规、数据合规等合规功能; * 优化性能与合规的用户体验(响应速度、内存占用、电池消耗)。 学习重点: * 鸿蒙APP性能优化的开发流程; * 性能优化的分类与使用场景; * 启动优化、渲染优化、网络优化的实现; * Next原生合规的设计与实现。 一、 性能优化基础 🎯 1.1 性能优化定义 性能优化是指对应用进行优化,提高应用的响应速度、降低内存占用、减少电池消耗等,主要包括以下方面: * 启动优化:优化应用的启动时间; * 渲染优化:优化应用的界

By Ne0inhk
《Linux复习指南》Shell脚本中最常见指令总结

《Linux复习指南》Shell脚本中最常见指令总结

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” ———————— 早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。 Linux常见指令总结 对于一些简单的就不过诉了(自己可以忘记的可以多尝试下) 1. 创建目录:mkdir <dir目录名> 可以递归多层创建 2. 删除目录:rmdir <dir目录名> 3. 打开目录:cd <dir目录名> 4. 删除文件的指令:rm -r:递归式删除,可以删除掉目录 -f:不需要确认,自动确认要删除(一般在删除目录的时候会进行询问) 5. 查看目录中的文件:ls <dir目录名&

By Ne0inhk
大模型本地部署神器:llama.cpp使用介绍

大模型本地部署神器:llama.cpp使用介绍

介绍llama.cpp 本节主要介绍什么是llama.cpp,以及llama.cpp、llama、ollama的区别。同时说明一下GGUF这种模型文件格式。 什么是llama.cpp llama.cpp是一个由Georgi Gerganov开发的高性能C++库,主要目标是在各种硬件上(本地和云端)以最少的设置和最先进的性能实现大型语言模型推理。 主要特点: * 纯C/C++实现,没有任何依赖 * 对Apple Silicon(如M1/M2/M3芯片)提供一流支持 - 通过ARM NEON、Accelerate和Metal框架优化 * 支持x86架构的AVX、AVX2、AVX512和AMX指令集 * 支持1.5位、2位、3位、4位、5位、6位和8位整数量化,实现更快的推理和更低的内存使用 * 为NVIDIA GPU提供自定义CUDA内核(通过HIP支持AMD GPU,通过MUSA支持摩尔线程MTT GPU)

By Ne0inhk