Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >YOLOv8独家原创改进: AKConv(可改变核卷积),即插即用的卷积,效果秒杀DSConv | 2023年11月最新发表

YOLOv8独家原创改进: AKConv(可改变核卷积),即插即用的卷积,效果秒杀DSConv | 2023年11月最新发表

原创
作者头像
AI小怪兽
修改于 2023-11-27 06:02:15
修改于 2023-11-27 06:02:15
1.7K00
代码可运行
举报
文章被收录于专栏:YOLO大作战YOLO大作战
运行总次数:0
代码可运行

💡💡💡💡💡💡​​​​​​​💡💡💡 论文作者邀请推广系列 💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡

💡💡💡本文全网首发独家改进:可改变核卷积(AKConv),赋予卷积核任意数量的参数和任意采样形状,为网络开销和性能之间的权衡提供更丰富的选择,解决具有固定样本形状和正方形的卷积核不能很好地适应不断变化的目标的问题点,效果秒殺DSConv

1)AKConv替代标准卷积进行使用

推荐指数:五星

AKConv | 全网独家首发,在多个数据集验证可行性,咋在COCO2017、VOC07+12 和 VisDrone-DET2021 展示了 AKConv 的优势,实现暴力涨点

1.AKConv原理介绍

论文:https://arxiv.org/pdf/2311.11587.pdf

摘要:基于卷积运算的神经网络在深度学习领域取得了令人瞩目的成果,但标准卷积运算存在两个固有的缺陷。一方面,卷积运算仅限于局部窗口,无法捕获其他位置的信息, 并且它的采样形状是固定的。 另一方面,卷积核的大小固定为k×k,是一个固定的正方形,参数的数量往往随大小呈平方增长。 很明显,不同数据集和不同位置的目标的形状和大小是不同的。 具有固定样本形状和正方形的卷积核不能很好地适应不断变化的目标针对上述问题,本工作探索了可改变核卷积(AKConv),它赋予卷积核任意数量的参数和任意采样形状,为网络开销和性能之间的权衡提供更丰富的选择。 在 AKConv 中,我们通过新的坐标生成算法定义任意大小的卷积核的初始位置。 为了适应目标的变化,我们引入了偏移量来调整每个位置的样本形状。 此外,我们通过使用具有相同大小和不同初始采样形状的 AKConv 来探索神经网络的效果。 AKConv 通过不规则卷积运算完成高效特征提取的过程,为卷积采样形状带来更多探索选择。 在代表性数据集 COCO2017、VOC 7+12 和 VisDrone-DET2021 上进行的物体检测实验充分展示了 AKConv 的优势。 AKConv可以作为即插即用的卷积运算来替代卷积运算来提高网络性能。

很明显,与 Deformabled 和标准 Conv 相比,AKConv 有更多的选择,并且卷积参数的数量随着卷积核大小呈线性增加。 注意:为了清楚地描述 AKConv 的优点,在 AKConv 和 Deformable Conv 中我们忽略了学习偏移量的参数数量,因为它远小于特征提取中涉及的卷积参数数量。

作者认为 AKConv 的设计是一种新颖的设计,它实现了从不规则和任意采样形状的卷积核中提取特征的壮举。 即使不使用 Deformable Conv 中的偏移思想,AKConv 仍然可以做出多种卷积核形状。 因为,AKConv可以用初始坐标重新采样来呈现多种变化。 如图4所示,我们为大小为5的卷积设计了各种初始采样形状。在图4中,我们只显示了大小为5的一些示例。但是,AKConv的大小可以是任意的,因此随着大小的增加,初始采样形状会随着大小的增加而变化。 AKConv 的卷积采样形状变得更加丰富甚至无限。 鉴于不同数据集的目标形状各不相同,设计与采样形状相对应的卷积运算至关重要。 AKConv完全是通过根据特定相位域设计相应形状的卷积运算来实现的。 它还可以类似于 Deformable Conv,通过添加可学习的偏移来动态适应对象的变化。 对于特定任务,卷积核初始采样位置的设计很重要,因为它是先验知识。 正如齐等人所言。 [27],他们为细长管状结构分割任务提出了具有相应形状的采样坐标,但他们的形状选择仅适用于细长管状结构。

展示核大小为5的初始样本形状。AKConv可以通过设计不同的初始采样形状来实现任意采样形状。

实验结果,数据集 COCO2017、VOC 7+12 和 VisDrone-DET2021 上进行的物体检测实验充分展示了 AKConv 的优势

2. AKConv加入YOLOv8

2.1 新建ultralytics/nn/Conv/AKConv.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
        self.p_conv.register_full_backward_hook(self._set_lr)
    #https://blog.csdn.net/m0_63774211/category_12289773.html?spm=1001.2014.3001.5482
    @staticmethod
    def _set_lr(module, grad_input, grad_output):
        grad_input = (grad_input[i] * 0.1 for i in range(len(grad_input)))
        grad_output = (grad_output[i] * 0.1 for i in range(len(grad_output)))

    def forward(self, x):
        # N is num_param.
        offset = self.p_conv(x)
        dtype = offset.data.type()
        N = offset.size(1) // 2
        # (b, 2N, h, w)
        p = self._get_p(offset, dtype)

        # (b, h, w, 2N)
        p = p.contiguous().permute(0, 2, 3, 1)
        q_lt = p.detach().floor()
        q_rb = q_lt + 1

        q_lt = torch.cat([torch.clamp(q_lt[..., :N], 0, x.size(2) - 1), torch.clamp(q_lt[..., N:], 0, x.size(3) - 1)],
                         dim=-1).long()
        q_rb = torch.cat([torch.clamp(q_rb[..., :N], 0, x.size(2) - 1), torch.clamp(q_rb[..., N:], 0, x.size(3) - 1)],
                         dim=-1).long()
        q_lb = torch.cat([q_lt[..., :N], q_rb[..., N:]], dim=-1)
        q_rt = torch.cat([q_rb[..., :N], q_lt[..., N:]], dim=-1)

        # clip p
        p = torch.cat([torch.clamp(p[..., :N], 0, x.size(2) - 1), torch.clamp(p[..., N:], 0, x.size(3) - 1)], dim=-1)

        # bilinear kernel (b, h, w, N)
        g_lt = (1 + (q_lt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_lt[..., N:].type_as(p) - p[..., N:]))
        g_rb = (1 - (q_rb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_rb[..., N:].type_as(p) - p[..., N:]))
        g_lb = (1 + (q_lb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_lb[..., N:].type_as(p) - p[..., N:]))
        g_rt = (1 - (q_rt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_rt[..., N:].type_as(p) - p[..., N:]))

        # resampling the features based on the modified coordinates.
        x_q_lt = self._get_x_q(x, q_lt, N)
        x_q_rb = self._get_x_q(x, q_rb, N)
        x_q_lb = self._get_x_q(x, q_lb, N)
        x_q_rt = self._get_x_q(x, q_rt, N)

        # bilinear
        x_offset = g_lt.unsqueeze(dim=1) * x_q_lt + \
                   g_rb.unsqueeze(dim=1) * x_q_rb + \
                   g_lb.unsqueeze(dim=1) * x_q_lb + \
                   g_rt.unsqueeze(dim=1) * x_q_rt

        x_offset = self._reshape_x_offset(x_offset, self.num_param)
        out = self.conv(x_offset)

        return out
    #https://blog.csdn.net/m0_63774211/category_12289773.html?spm=1001.2014.3001.5482
    # generating the inital sampled shapes for the AKConv with different sizes.
    def _get_p_n(self, N, dtype):
        base_int = round(math.sqrt(self.num_param))
        row_number = self.num_param // base_int
        mod_number = self.num_param % base_int
        p_n_x,p_n_y = torch.meshgrid(
            torch.arange(0, row_number),
            torch.arange(0,base_int))
        p_n_x = torch.flatten(p_n_x)
        p_n_y = torch.flatten(p_n_y)
        if mod_number >  0:
            mod_p_n_x,mod_p_n_y = torch.meshgrid(
                torch.arange(row_number,row_number+1),
                torch.arange(0,mod_number))

            mod_p_n_x = torch.flatten(mod_p_n_x)
            mod_p_n_y = torch.flatten(mod_p_n_y)
            p_n_x,p_n_y  = torch.cat((p_n_x,mod_p_n_x)),torch.cat((p_n_y,mod_p_n_y))
        p_n = torch.cat([p_n_x,p_n_y], 0)
        p_n = p_n.view(1, 2 * N, 1, 1).type(dtype)
        return p_n

    # no zero-padding
    def _get_p_0(self, h, w, N, dtype):
        p_0_x, p_0_y = torch.meshgrid(
            torch.arange(0, h * self.stride, self.stride),
            torch.arange(0, w * self.stride, self.stride))

        p_0_x = torch.flatten(p_0_x).view(1, 1, h, w).repeat(1, N, 1, 1)
        p_0_y = torch.flatten(p_0_y).view(1, 1, h, w).repeat(1, N, 1, 1)
        p_0 = torch.cat([p_0_x, p_0_y], 1).type(dtype)

        return p_0

    def _get_p(self, offset, dtype):
        N, h, w = offset.size(1) // 2, offset.size(2), offset.size(3)

        # (1, 2N, 1, 1)
        p_n = self._get_p_n(N, dtype)
        # (1, 2N, h, w)
        p_0 = self._get_p_0(h, w, N, dtype)
        p = p_0 + p_n + offset
        return p

    def _get_x_q(self, x, q, N):
        b, h, w, _ = q.size()
        padded_w = x.size(3)
        c = x.size(1)
        # (b, c, h*w)
        x = x.contiguous().view(b, c, -1)

        # (b, h, w, N)
        index = q[..., :N] * padded_w + q[..., N:]  # offset_x*w + offset_y
        # (b, c, h*w*N)
        index = index.contiguous().unsqueeze(dim=1).expand(-1, c, -1, -1, -1).contiguous().view(b, c, -1)

        x_offset = x.gather(dim=-1, index=index).contiguous().view(b, c, h, w, N)

        return x_offset

    # https://blog.csdn.net/m0_63774211/category_12289773.html?spm=1001.2014.3001.5482
    #  Stacking resampled features in the row direction.
    @staticmethod
    def _reshape_x_offset(x_offset, num_param):
        b, c, h, w, n = x_offset.size()
        # using Conv3d
        # x_offset = x_offset.permute(0,1,4,2,3), then Conv3d(c,c_out, kernel_size =(num_param,1,1),stride=(num_param,1,1),bias= False)
        # using 1 × 1 Conv
        # x_offset = x_offset.permute(0,1,4,2,3), then, x_offset.view(b,c×num_param,h,w)  finally, Conv2d(c×num_param,c_out, kernel_size =1,stride=1,bias= False)
        # using the column conv as follow, then, Conv2d(inc, outc, kernel_size=(num_param, 1), stride=(num_param, 1), bias=bias)
        
        x_offset = rearrange(x_offset, 'b c h w n -> b c (h n) w')
        return x_offset

详见:

https://blog.csdn.net/m0_63774211/category_12289773.html

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[SEO知识讲解] 如何打造搜引擎和用户喜爱的高质量内容?
| 我们网站上内容的好坏,直接影响着百度的收录、索引,最终影响我们网站在百度搜索的排名。 第一、什么的文章才是高质量的呢? 高质量内容是指那些能让百度更好的收录和索引,给用户更好的帮助,能解决用户问题的内容。 1、内容要与主题相符合、要有相关性、可读性高、完整性高; 2、内容要有有图有文字,做到图文并茂,不要是一片空白页面,也不要有广告影响用户的阅读; 3、内容页面不要设置阅读权限、不要胡乱的下载链接、也不要设置用户登陆才能看到内容; 4、从搜索引擎来说,      a、百度不能识别代码,不能识别图片中的文字,这时我们可以给图片设置alt属性、视频展示,在下面做文字说明;      b、内容要与主题匹配;      c、要做搜索引擎能够抓取的内容;      d、与数据库原有对比,我们的内容要比原有的在相似度上低于80%,这样才会被百度收录、索引; 总结:网站内容是由一个一个的文章页面构成的,这些文章一方面是给用户看的,另一方面是给搜索引擎看的。所以,内容质量的好坏,最核心的一点就是能否解决用户的实际问题和需求。做到人无我有,人有我优。 第二、怎么做高质量的文章呢? 1、以后每天都要看一篇文章,同时坚持每天自己撰写一篇文章; 2、考虑用户的搜索习惯:如:“什么是SEO?”  “SEO是什么?” 3、文章中:图片占三分之一,要配有文字说明;一篇文章解决一个问题,一篇文章一个核心点; 4、文章段落清晰、对标题的延伸、适当增加能够解决用户问题的图片、视频、文字等; 5、要考虑有没有用户去阅读,用户能不能读懂,明白自己想要表达的中心内容; 最终目的:让百度能更好的收录和索引页面,给用户更好的帮助,能够解决用户问题的内容,就是高质量内容。 |
AlexTao
2019/12/13
4630
百度优化VS谷歌优化的差异
在页面更新上,Google要比Baidu快很多。一般做一个关键词页面,第二天甚至更快,Google就会收录,并且会有一个很好的排名,但是你要想保持也不是见容易的事情,在接下来的几天里,如果你的内容可读性不是很高,Google的排名会慢慢下降,直到你找不到。而Baidu收录关键词页面就会慢很多,审查也更加严格,但是一旦你的关键词页面被收录,并且获得了一个好的排名,这个位置很长一段时间就会是你的,除非你的网站被降权或者作弊了。
zhaoJian.Net
2023/02/24
5060
网站SEO优化步骤超详细完整版教程
一、准备 1、心态 长时间,不断学习。学习建站、基础代码、SEO全过程、实际操作并成功。
宜轩
2022/12/29
2.1K0
干货SEO实现网站秒收录
收录是指网页被搜索引擎蜘蛛爬行并保存索引可以被用户检索到,就代表网页被录取了。企业做SEO的目的是增加网站排名,以便网站可以在搜索引擎获取流量。随着搜索引擎算法的不断更新,对网站的要求越来越高。那么应该如何实现网站内页在较短时间内被搜索引擎收录呢?
悉知科技建站
2020/04/24
9130
干货SEO实现网站秒收录
[SEO知识讲解] 收录的内容被纳入底层库的解决办法
在前面的文章中,谈到了网站有收录没排名的解决办法,对于解决办法,只做了大致的讲解,本文就此问题,继续探讨:如果被收录的内容已经被纳入底层库中,该如何有效解决?
AlexTao
2019/12/13
4450
百度 SEO:不是玄学,是科学与艺术的 “恋爱”
恩爸编程
2024/12/12
790
百度 SEO:不是玄学,是科学与艺术的 “恋爱”
2019年,熊掌号内容优化,8个小技巧!
在2019年,SEO人员明显可以感觉到每天关键词的浮动变化,还是相对比较大的,这与百度算法迭代更新有直接的关系,我们知道,搜索排序规则将逐渐从超链技术向领域权威度倾斜,因此,在SEO下半场,熊掌号SEO的内容优化与运营将显得格外重要。 
蝙蝠侠IT
2019/12/20
4590
2019年,熊掌号内容优化,8个小技巧!
影响站内SEO关键词排名优化的几个因素
网站站内优化对于关键词排名优化工作来讲无疑是最重要的一部分,只有做好站内优化才能更加快速有效的提升排名。很多SEO在网站内部没有优化好之前就匆忙上线,上线之后又觉得关键词不合理、网站结构不合理,总之是喜欢在线反复调整。搜索引擎对这类网站降低印象分,会影响日后的SEO优化。
茹莱神兽
2021/05/22
7890
影响站内SEO关键词排名优化的几个因素
百度SEO排名,最近频繁波动,到底怎么办?
在2019年,我们已经不止一次再谈论百度SEO排名的问题,特别是最近,很多站长都会遇到排名大涨大降的情况,特别是感觉自己并没有采用过度优化的方式,仍然存在诸多问题,一时间,让大量SEO从业人员,摸不清头脑。
蝙蝠侠IT
2019/12/05
4880
百度SEO排名,最近频繁波动,到底怎么办?
「思考」5个方面解析什么是百度眼中的优质内容
别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得吊儿郎当,和你一样会抱怨,而只有你相信这些都是真的,最后也只有你一人继续不思进取。 今天给大家讲下有关内容质量的问题,相信大家在百度站长学院或是其他网站看过相关的文章,也有一定的了解,现在谈谈我个人看法,到底有哪些因素影响这百度对内容质量的判断? 什么样的内容容易被百度认为是优质内容 在这里的“优质内容”应该是指“优质页面”,因为搜索引擎收录的是页面,用户访问的也是一个页面,不是单纯的主体内容,那么一个优质页面,应该具备哪些条件才会被
黄伟SEO
2018/05/17
6200
百度快照更新是什么意思啊_百度快照和百度推广的区别
最近发现有很多刚入SEO行业的新手对网站seo的技巧有很多的误区,比如网站快照不更新就代表网站被惩罚。关于这个观点我们先看看什么是百度快照?百度快照的作用是什么?我们有该如何让百度快照持续更新呢?
全栈程序员站长
2022/11/10
1.1K0
代理IP如何帮助SEO优化?
SEO优化工作对于网站而言是很有必要的,网站的运营推广工作比较复杂,有很多需要注意的地方,并且提高网站排名是需要逐渐累积的长期性的工作。而且在SEO优化的过程中,往往需要借助于代理IP的帮助才能够完成关键的数据优化与分析一环,接下来就一起来了解一下网站SEO优化的方式有哪些以及代理IP是如何帮助SEO优化的:
IPIDEA
2022/10/20
4660
代理IP如何帮助SEO优化?
百度快速收录SEO优化关键词排名优化技巧
前言:新站优化是有方法技巧的,关键词S排名优化,百度快速收录,新站如何快速出关键词排名,新站想要获取排名需要做好词库规划布局,做好文章内容优化,编写用户需求文章,做好更新和提交给百度站长,稳定持续操作优化推广,来做关键词排名优化
星泽V社
2022/03/02
1.5K0
橙柚青SEO优化:怎么提高百度对网站内容质量的打分呢?
对于新网站来说,网站内容的质量是很重要的。我们在新网站的初期,为了保证网站的收录和网站的质量,最好写高内容品质的文章。这样是有利于搜索引擎尽快提高网站的收录。
橙柚青
2019/09/25
4750
橙柚青SEO优化:怎么提高百度对网站内容质量的打分呢?
文章百度SEO优化教程大纲
百度SEO优化教程的目的是帮助网站管理员和数字营销人员更好地理解和应用百度搜索引擎优化策略,提高其网站在百度搜索结果页面上的排名,获得更多的有机流量和增加业务收益。本教程包括关键词研究、内容优化、链接建设、数据分析和跟踪等方面的内容,旨在为读者提供全面的SEO知识和操作技巧。本教程适用于所有想要在百度搜索引擎上提高网站可见性,增加网站流量和业务收益的人员。
用户1408666
2023/05/23
7920
哪些内容更容易被百度收录 百度喜欢什么内容
作为一名SEOer,如果你以前从事过内容营销的工作,你就会发现有良好内容结构的文章更容易被百度收录,并且更有利于被社交媒体转发。哪些内容更容易被百度收录?百度爬虫喜欢什么样的内容结构呢?武汉SEO和大家一起来容易被百度收录的文章有哪些特征。
安邦运维ruangseo
2019/08/12
6740
百度SEO排名信号,值得关注的6个方向有哪些?
对于每一个SEO人员,我们都非常清楚,当你把所有的百度SEO排名信号,组合在一起的时候,实际上它就构成了搜索引擎的算法。
蝙蝠侠IT
2019/11/22
4050
百度SEO排名信号,值得关注的6个方向有哪些?
SEO新手必知50个SEO术语词解释
刚入门SEO都需要了解哪些SEO基础知识呢?今天,在这里给各位同学讲解下SEO基础入门专业词汇都有哪些,从新思考它们在我们实际操作中都有哪些用途及意义。 白帽SEO(White hat SEO) 1 白帽SEO是通过正规优化手法,来对网站进行优化,是符合搜索引擎优化的规则。它与黑帽SEO是相反,它是业界主流的优化手法,避免了一切风险进行操作的优化手法。虽然白帽SEO见效时间周期要长,但往往成功后,就可以稳定的带来流量,它也是SEO从业者最高道德标准。 黑帽SEO(Black hat SEO) 2 对于黑帽
黄伟SEO
2018/05/17
1.8K0
徐大大seo:网站的内容百度为什么不收录?
百度蜘蛛目前抓取途径两种,第一种是主动抓取,第二种是在百度站长平台的链接提交工具中获取数据。
徐大大seo
2022/05/22
5550
前端SEO—详细讲解
一、搜索引擎工作原理 当我们在输入框中输入关键词,点击搜索或查询时,然后得到结果。深究其背后的故事,搜索引擎做了很多事情。 在搜索引擎网站,比如百度,在其后台有一个非常庞大的数据库,里面存储了海量的关键词,而每个关键词又对应着很多网址,这些网址是百度程序从茫茫的互联网上一点一点下载收集而来的,这些程序称之为“搜索引擎蜘蛛”或“网络爬虫”。这些勤劳的“蜘蛛”每天在互联网上爬行,从一个链接到另一个链接,下载其中的内容,进行分析提炼,找到其中的关键词,如果“蜘蛛”认为关键词在数据库中没有而对用户是有用的便存入数据
企鹅号小编
2018/01/17
1.2K0
推荐阅读
相关推荐
[SEO知识讲解] 如何打造搜引擎和用户喜爱的高质量内容?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验