YOLO12改进-模块-引入Convolutional Modulation模块 捕捉更丰富的局部 - 全局空间关系,提升目标边界定位精度。

发布于:2025-05-19 ⋅ 阅读:(28) ⋅ 点赞:(0)

          在视觉识别领域,卷积神经网络(ConvNets)擅长捕捉局部空间特征,但在建模全局上下文依赖方面存在不足;Vision Transformers(ViTs)通过自注意力机制能有效建模全局关系,却面临高分辨率图像下计算成本呈二次增长的问题。ConvNeXt 等研究虽表明大核卷积的潜力,但传统方法在核尺寸超过 7×7 时性能提升有限且计算负担加重。Convolutional Modulation应运而生,旨在通过卷积操作简化自注意力机制,更高效地利用大核卷积编码空间特征。

上面是原模型,下面是改进模型

1.  Convolutional Modulation介绍 

        Convolutional Modulation 的核心思想是利用卷积特征对值(Value)进行调制,替代自注意力中查询(Query)与键(Key)的矩阵乘法来生成注意力权重。具体而言,通过深度卷积(DConv)生成权重矩阵 A,再与线性投影后的特征 V 进行哈达玛积(Hadamard Product),实现局部区域内的特征加权聚合。其公式为:Z=A⊙V, A=DConvk×k​(W1​X), V=W2​X
其中,X 为输入特征,W1​ 和 W2​ 为线性层权重。该方法通过静态卷积核模拟动态注意力机制,避免了自注意力的二次复杂度,同时能有效利用大核卷积(如 11×11、21×21)捕捉更广域的空间交互。

Convolutional Modulation 模块的结构如图 所示,主要包含以下组件:

         线性投影层:对输入特征 X 进行线性变换,生成用于调制的特征(W1​X)和值特征(W2​X)。

        深度卷积层:对调制特征应用 k×k 深度卷积,生成权重矩阵 A,捕捉局部空间依赖。

        哈达玛积操作:将权重矩阵 A 与值特征 V 逐元素相乘,输出调制后的特征 Z。

 2. YOLOv12与Convolutional Modulation的结合      

        通过大核卷积(如 11×11)在不同层级特征图中捕捉更丰富的局部 - 全局空间关系,提升目标边界定位精度。

3. Convolutional Modulation代码部分

YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub

YOLO12模型改进方法,快速发论文,总有适合你的改进,还不改进上车_哔哩哔哩_bilibili

 4. 将Convolutional Modulation引入到YOLOv12中

第一: 先新建一个change_model,将下面的核心代码复制到下面这个路径当中,如下图如所示。YOLOv12\ultralytics\change_model。

            ​​​​​​       

第二:在task.py中导入

 ​​​        ​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​       

第三:在task.py中的模型配置部分下面代码

        ​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​    ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​  

第四:将模型配置文件复制到YOLOV12.YAMY文件中

 ​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​  

     ​​​​​​​ ​​​​​​​​​​​​​​ ​​​​​​​ ​​​​​​​​​​​​​第五:运行代码


from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld

if __name__=="__main__":

    # 使用自己的YOLOv12.yamy文件搭建模型并加载预训练权重训练模型
    model = YOLO(r"E:\Part_time_job_orders\YOLO_NEW\YOLOv12_all\ultralytics\cfg\models\12\yolo12_ConMod.yaml")
        # .load(r'E:\Part_time_job_orders\YOLO_NEW\YOLOv12\yolo12n.pt')  # build from YAML and transfer weights

    results = model.train(data=r'E:\Part_time_job_orders\YOLO\YOLOv12\ultralytics\cfg\datasets\VOC_my.yaml',
                          epochs=300,
                          imgsz=640,
                          batch=64,
                          # cache = False,
                          # single_cls = False,  # 是否是单类别检测
                          # workers = 0,
                         # resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
                          amp = True
                          )


网站公告

今日签到

点亮在社区的每一天
去签到