YOLOv11震撼来袭
2024YOLO发展史
2024年可谓是YOLO历史性的一年,9月份的最后一天迎来了YOLO2024年的第三部巨作。2024年2月21日,继 2023 年 1 月 YOLOv8 正式发布一年多以后,YOLOv9 才终于到来了!YOLOv9提出了可编程梯度信息(Programmable Gradient Information,PGI)的概念,我们可以用它来获取完整的信息,从而使从头开始训练的模型能够比使用大型数据集预训练的 SOTA 模型获得更好的结果。通过多级辅助网络分支和通用高效层聚合网络(Generalized Efficient Layer Aggregation Network,GELAN)有效提升了YOLO检测器的信息提取能力。2024年5月25日,清华大学研究团队开发的最新版本:YOLOV10发布,通过紧凑的倒置瓶颈层(Compact Inverted Bottleneck,CIB)和有效的部分自注意力(Partial Self-attention,PSA)模块来增强模型能力,实现了更高效率和精度的实时目标检测。用于无 NMS 训练的一致双重分配策略,大大降低了计算开销。2024年9月30日,YOLOv11震撼来袭。
YOLOV11
YOLOv11在以前 YOLO 版本的成功基础上,引入了C3k2和C2PSA两个全新模块,并延续了YOLOv10无NMS的训练策略,实现了端到端的目标检测能力,进一步提高了性能和灵活性。YOLOv11与YOLOv8一致提供了五个不同尺度大小的网络,仅在网络尺度上有所差异。YOLOv11的结构如下图所示,由于C3k2与C2PSA的结构相对复杂,在后面进行详细介绍。
C3K2
C3K2模块的结构集成了C2f和C3模块的组合,外层由C2f结构主导,内层是一个C3的结构。C3K2结构中以C2f结构为基础,将其中的特征提取层由BottleNeck层替换为C3k层,C3k层与C3结构一致,不同之处在于将BottleNeck的卷积核大小进行了调整,转变为两个核大小为3的卷积层。具体的模型结构如下图所示,代码实现附后。
BottleNeck代码
class Bottleneck(nn.Module):
"""Standard bottleneck."""
def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):
"""Initializes a standard bottleneck module with optional shortcut connection and configurable parameters."""
super().__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_, k[0], 1)
self.cv2 = Conv(c_, c2, k[1], 1, g=g)
self.add = shortcut and c1 == c2
def forward(self, x):
"""Applies the YOLO FPN to input data."""
return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
C3代码
class C3(nn.Module):
"""CSP Bottleneck with 3 convolutions."""
def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
"""Initialize the CSP Bottleneck with given channels, number, shortcut, groups, and expansion values."""
super().__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c1, c_, 1, 1)
self.cv3 = Conv(2 * c_, c2, 1) # optional act=FReLU(c2)
self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, k=((1, 1), (3, 3)), e=1.0) for _ in range(n)))
def