目录
一、YOLOv11介绍
二、YOLOv11与YOLOv8网络结构对比及解析
变化1:C3k2模块
变化2:C2PSA模块
变化3:检测头中的DWConv
三、YOLOv11网络结构图
四、模型训练
五、模型测试
一、YOLOv11介绍
此专栏提供完整的改进后的YOLOv11项目文件,你也可以直接下载到本地,然后打开项目,修改数据集配置文件以及合适的网络yaml文件即可运行,操作很简单!订阅专栏的小伙伴可以私信博主,或者直接联系博主,加入yolov11改进交流群;
+Qq:1921873112
YOLOv11 是 Ultralytics 推出的最新的集目标检测、语义分割、图像分类等任务于一体的神经网络,其基本原理涉及到主干网络、颈部网络(neck)、检测头等部分,以下是详细介绍:
- 主干网络:
- C3K2 模块:C3K2 是 YOLOv11 主干网络中的重要模块。它继承自类 C2F,C2F 是一种特征融合模块,而 C3K2 在此基础上进行了改进。代码中通过设置
c3k
参数为True
或False
来决定其具体行为。当c3k
为False
时,C3K2 模块就是普通的 C2F 模块,其中的瓶颈结构(bottleneck)是常规的;当c3k
为True
时,会将瓶颈模块替换成 C3 模块。C3 模块是一种具有特定结构的模块,用于更高效地提取特征。这种可切换的设计使得模型能够根据不同的需求和场景选择合适的特征提取方式,增强了模型的灵活性和适应性。
- C3K2 模块:C3K2 是 YOLOv11 主干网络中的重要模块。它继承自类 C2F,C2F 是一种特征融合模块,而 C3K2 在此基础上进行了改进。代码中通过设置
- 颈部网络(Neck):
- C2PSA 模块:C2PSA 是在颈部网络中引入的关键模块,它是对 C2F 模块的扩展2。该模块结合了 PSA(Pointwise Spatial Attention,点式空间注意力)块,通过在标准 C2F 模块中引入 PSA 块,实现了更强大的注意力机制,从而提高了模型对重要特征的捕捉能力2。PSA 块利用多头注意力机制和前馈神经网络,能够选择性地关注输入特征中的重要部分,抑制不重要的信息。这种注意力机制对于处理复杂的图像数据非常有效,可以帮助模型更好地聚焦于目标物体的特征,提高检测的准确性1。并且,C2PSA 模块可以选择性地添加残差结构(shortcut),以优化梯度传播和网络训练效果2。
二、YOLOv11与YOLOv8网络结构对比及解析
变化1:C2f模块更换成了C3k2模块;
变化2:在第九层SPPF之后,YOLOv11加上了一层C2PSA模块;
变化三:在检测部分,YOLOv11也替换了C2F模块为C3K2模块;并且检测头内卷积更换成了深度可分离卷积
下面详细介绍这三个变化:
变化1:C3k2模块
首先,第一个变化的C3k2模块其实并没有改变网络结构,其网络结构与C2F还是一样的,代码中也体现了这一点。可以看到,C3k2其实是c2f的一个子类,其遵循了父类的forward流程,并且在self.m定义网络结构部分,使用的也是相同的bottleneck模块。
变化2:C2PSA模块
首先,此模块引入 PSABlock:C2PSA 模块结合了 PSA(Pointwise Spatial Attention,点式空间注意力)块。PSA 机制通过多头注意力机制和前馈神经网络来增强特征提取能力。多头注意力机制可以让模型同时关注输入特征的不同部分,捕捉到更丰富的特征信息;前馈神经网络则可以进一步处理特征,使其能够学习到更复杂的非线性关系。
变化3:检测头中的DWConv
这一部分大家直接看结构图即可理解!就是在分类分支中增加了两个DWConv。
三、YOLOv11网络结构图
四、模型训练
可以通过在根目录下创建一个train.py文件训练代码,在其中输入代码:
只需更换数据集路径以及yaml文件路径即可!
import sys import argparse import os from ultralytics import YOLO def main(opt): yaml = opt.cfg weights = opt.weights model = YOLO(yaml) # 直接加载yaml文件训练 # model = YOLO(weights) # 直接加载权重文件进行训练 # model = YOLO(yaml).load(weights) # 加载yaml配置文件的同时,加载权重进行训练 model.info() results = model.train(data=r'coco128.yaml', epochs=200, imgsz=640, workers=2, batch=2, ) def parse_opt(known=False): parser = argparse.ArgumentParser() parser.add_argument('--cfg', type=str, default= r'ultralytics\cfg\models\v11\yolov11.yaml', help='initial weights path') parser.add_argument('--weights', type=str, default='yolov8n.pt', help='') opt = parser.parse_known_args()[0] if known else parser.parse_args() return opt if __name__ == "__main__": opt = parse_opt() main(opt)
复制
这样,训练就算成功了!
五、模型测试
使用这行命令就可以进行预测!
yolo task=detect mode=val model=best.pt data=data.yaml device=0
复制