1,本文介绍
AKConv(可改变核卷积)是一种改进的卷积操作方法,其核心在于动态调整卷积核的形状和大小。与传统卷积层固定核大小不同,AKConv 通过引入可学习的机制,使卷积核在训练过程中能够自适应地调整,从而更好地适应不同的数据特征和任务需求。
核心特点:
-
可变核尺寸:AKConv 允许卷积核在不同的层和位置上具有不同的尺寸,这有助于捕捉更多的局部特征。
-
动态调整:卷积核的形状和大小可以在训练过程中进行调整,使得模型能够根据输入数据的特性自动优化卷积操作。
-
提高表达能力:通过自适应地调整核的参数,AKConv 可以提高网络的表达能力和性能,特别是在处理复杂或变化多端的输入数据时。
应用场景:
- 计算机视觉:在图像分类、目标检测等任务中,AKConv 能够有效提升模型对各种尺度和形状特征的敏感度。
- 特征提取:适用于需要捕捉多种尺度特征的应用,例如医学影像分析和高分辨率图像处理。
AKConv 提供了一种灵活且强大的卷积操作方式,能够在多个任务中提高模型的适应性和性能。
关于AKConv的详细介绍可以看论文:https://arxiv.org/pdf/2311.11587.pdf
本文将讲解如何将AKConv融合进yolov8
话不多说,上代码!
2, 将AKConv融合进yolov8
2.1 步骤一
找到如下的目录'ultralytics/nn/modules',然后在这个目录下创建一个AKConv.py文件,文件名字可以根据你自己的习惯起,然后将AKConv的核心代码复制进去
import torch.nn as nn
import torch
from einops import rearrange
import math
class AKConv(nn.Module):
def __init__(self, inc, outc, num_param, stride=1, bias=None):
super(AKConv, self).__init__()
self.num_param = num_param
self.stride = stride
self.conv = nn.Sequential(nn.Conv2d(inc, outc, kernel_size=(num_param, 1), stride=(num_param, 1), bias=bias),
nn.BatchNorm2d(outc),
nn.SiLU()) # the conv adds the BN and SiLU to compare original Conv in YOLOv5.
self.p_conv = nn.Conv2d(inc, 2 * num_param, kernel_size=3, padding=1, stride=stride)
nn.init.constant_(self.p_conv.weight, 0