前言:Hello大家好,我是小哥谈。CARAFE算子的主要特点是在保持轻量级功能的同时,能够提供比其他上采样算子更好的性能。它通过少量的参数和计算量来实现高效的图像上采样。CARAFE算子能够根据像素之间的关系进行自适应的上采样,从而更好地保留图像的细节和语义信息。🌈
目录
🚀1.基础概念
🚀2.网络结构
🚀3.添加步骤
🚀4.改进方法
🍀🍀步骤1:创建CARAFE.py文件
🍀🍀步骤2:修改tasks.py文件
🍀🍀步骤3:创建自定义yaml文件
🍀🍀步骤4:新建train.py文件
🚀1.基础概念
CARAFE(Content-Aware ReAssembly of FEatures)是一种用于增强卷积神经网络特征图的上采样方法,其主要旨在改进传统的上采样方法(Upsample)的性能。
核心思想:
使用输入特征本身的内容来指导上采样过程,从而实现更精准和高效的特征重建。CARAFE是一种即插即用的上采样机制其本身并没有任何的使用限制,特别是在需要精细上采样的场景中,如图像超分辨率、语义分割等。这种方法改善了上采样过程中的细节保留和重建质量,使网络能够生成更清晰、更准确的输出。具有以下特点:
- 感受野大:能够聚合上下文信息。
- 内容感知:不是对所有样本使用固定的内核(例如反卷积),而是支持特定于实例的内容感知处理,从而动态生成自适应内核。
- CARAFE引入了很少的计算开销,并且可以很容易地集成到现代网络架构中。
CARAFE算子如何进行特征融合?❓
CARAFE(Content-Aware ReAssembly of FEatures)算子是一种用于特征融合的方法,它可以在语义上对特征进行重组和重新分配。
CARAFE算子的特征融合过程如下:
- 首先,CARAFE算子将输入特征图进行上采样,得到一个更高分辨率的特征图。
- 然后,CARAFE算子通过卷积操作将上采样后的特征图转换为一个注意力图。这个注意力图用于指导特征的重组和重新分配。
- 接下来,CARAFE算子使用注意力图对原始特征图进行重组。它通过在原始特征图上进行插值操作,将上采样后的特征图的信息重新分配到原始特征图的相应位置。
- 最后,CARAFE算子将重组后的特征图与原始特征图进行融合。它使用逐元素相加的方式将两个特征图进行融合,得到最终的融合特征图。
通过这样的特征融合过程,CARAFE算子可以有效地利用上采样后的特征信息,并将其与原始特征进行融合,从而提高特征的表达能力和语义信息的传递效果。
论文题目:《CARAFE: Content-Aware ReAssembly of FEatures》
论文地址: https://arxiv.org/abs/1905.02188
代码实现: GitHub - open-mmlab/mmdetection: OpenMMLab Detection Toolbox and Benchmark
🚀2.网络结构
本文的改进是基于YOLO11,关于其网络结构具体如下图所示:
本文所做的改进是将UpSample更改为CARAFE。关于改进后的网络结构图具体如下图所示:
🚀3.添加步骤
针对本文的改进,具体步骤如下所示:👇
步骤1:创建CARAFE.py新文件
步骤2:修改tasks.py文件
步骤3:创建自定义yaml文件
步骤4:新建train.py文件
🚀4.改进方法
🍀🍀步骤1:创建CARAFE.py文件
在目录:ultralytics/nn/modules文件下创建CARAFE.py文件,该文件代码如下:
from ultralytics.nn.modules import Conv
import torch.nn as nn
import torchclass CARAFE(nn.Module):def __init__(self, c, k_enc=3, k_up=5, c_mid=64, scale=2):""" The unofficial implementation of the CARAFE module.The details are in "https://arxiv.org/abs/1905.02188".Args:c: The channel number of the input and the output.c_mid: The channel number after compression.scale: The expected upsample scale.k_up: The size of the reassembly kernel.k_enc: The kernel size of the encoder.Returns:X: The upsampled feature map."""super(CARAFE, self).__init__()self.scale = scaleself.comp = Conv(c, c_mid)self.enc = Conv(c_mid, (scale * k_up) ** 2, k=k_enc, act=False)self.pix_shf = nn.PixelShuffle(scale)self.upsmp = nn.Upsample(scale_factor=scale, mode='nearest')self.unfold = nn.Unfold(kernel_size=k_up, dilation=scale,padding=k_up // 2 * scale)def forward(self, X):b, c, h, w = X.size()h_, w_ = h * self.scale, w * self.scaleW = self.comp(X) # b * m * h * wW = self.enc(W) # b * 100 * h * wW = self.pix_shf(W) # b * 25 * h_ * w_W = torch.softmax(W, dim=1) # b * 25 * h_ * w_X = self.upsmp(X) # b * c * h_ * w_X = self.unfold(X) # b * 25c * h_ * w_X = X.view(b, c, -1, h_, w_) # b * 25 * c * h_ * w_X = torch.einsum('bkhw,bckhw->bchw', [W, X]) # b * c * h_ * w_return X
🍀🍀步骤2:修改tasks.py文件
首先,找到parse_model函数(935行左右),在下图所示位置加入下列代码。
# ---------添加代码----------elif m is CARAFE:c2 = ch[f]args = [c2, *args]# ---------添加代码----------
具体添加位置如下所示:
然后,在该文件头部导入代码:
from ultralytics.nn.modules.CARAFE import CARAFE
🍀🍀步骤3:创建自定义yaml文件
在目录:ultralytics/cfg/models/11下创建yolo11_CARAFE.yaml文件,该文件代码如下:
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# By CSDN 小哥谈# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'# [depth, width, max_channels]n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPss: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPsm: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPsl: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPsx: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs# YOLO11n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 2, C3k2, [256, False, 0.25]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 2, C3k2, [512, False, 0.25]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 2, C3k2, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 2, C3k2, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 2, C2PSA, [1024]] # 10# YOLO11n head
head:- [-1, 1, CARAFE, []]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 2, C3k2, [512, False]] # 13- [-1, 1, CARAFE, []]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)- [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)
🍀🍀步骤4:新建train.py文件
在根目录下,新建train.py文件,该文件代码如下:
# -*- coding: utf-8 -*-
# By CSDN 小哥谈
import warnings
import os
os.environ['KMP_DUPLICATE_LIB_OK']='TRUE'
warnings.filterwarnings('ignore')
from ultralytics import YOLOif __name__ == '__main__':# model.load('yolo11n.pt') # 加载预训练权重,改进或者做对比实验时候不建议打开,因为用预训练模型整体精度没有很明显的提升model = YOLO(model=r'C:\Users\Lenovo\PycharmProjects\ultralytics-main\ultralytics\cfg\models\11\yolo11_CARAFE.yaml')model.train(data=r'C:\Users\Lenovo\PycharmProjects\ultralytics-main\ultralytics\cfg\datasets\helmet.yaml',imgsz=640,epochs=50,batch=4,workers=0,device='',optimizer='SGD',close_mosaic=10,resume=False,project='runs/train',name='exp',single_cls=False,cache=False,)
点击“运行”,代码可以正常运行。