讲在前面的话:
这篇文章的目的是两点,首先还是一样的介绍下ACNet与DBBNet的涨点原理,另外现在的网上的教程在代码方面,如何与自己的工程如何集成讲的比较少,需要读者自己去抠,对于初学者不太友好。这里不仅讲原理,还把代码抠出来,讲一讲,然后开箱即用。
首先来看ACNet的原理如下图所示:
模型首先在训练阶段将3x3的卷积核增加为3x3 , 1x3 和 3x1的并行三个卷积核,同时1x3和 3x1 是以原有3x3卷积核的中心展开,这样的好处是首先整个模型的参数量变大了,能够从直观上拟合更多的信息,微观上这种中心对称的非对称卷积核,可以在图像翻转这一类的图像处理中取得更好的鲁棒性。
随后模型训练完成后,3x3的卷积核能够与1x3以及3x1卷积核直接融合,并且不改变相关结果,因为这个乘累加过程是线性的。感兴趣的同学可以去推导一下。推导过程如下图所示:
有相关问题搜索知识星球号:1453755 【CV老司机】加入星球提问。扫码也可加入:
也可以搜索关注微信公众号: CV老司机
相关代码和详细资源或者相关问题,可联系牛先生小猪wx号: jishudashou
原理的点很少,同时在实际的使用中要嫁接到自己的代码中,也十分的方便。其实现代码如下:
import torch.nn as nn
import torch.nn.init as init
import torch
class ACBlock(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, padding_mode='zeros', deploy=False,
use_affine=True, reduce_gamma=False, gamma_init=None ):
super(ACBlock, self).__init__()
self.deploy = deploy
if deploy: