太原网站优化价格,房地产网站策划,php做网站好学吗,购物网站的详细设计Deformable ConvNets v2
简介#xff1a;由于构造卷积神经网络所用的模块中几何结构是固定的#xff0c;其几何变换建模的能力本质上是有限的。在DCN v1中引入了两种新的模块来提高卷积神经网络对变换的建模能力#xff0c;即可变形卷积 (deformable convolution) 和可变形…Deformable ConvNets v2
简介由于构造卷积神经网络所用的模块中几何结构是固定的其几何变换建模的能力本质上是有限的。在DCN v1中引入了两种新的模块来提高卷积神经网络对变换的建模能力即可变形卷积 (deformable convolution) 和可变形兴趣区域池化 (deformable ROI pooling)。它们都是基于在模块中对空间采样的位置信息作进一步位移调整的想法该位移可在目标任务中学习得到并不需要额外的监督信号。新的模块可以很方便在现有的卷积神经网络 中取代它们的一般版本并能很容易进行标准反向传播端到端的训练从而得到可变形卷积网络 (deformable convolutional network)。但是增加偏移之后可能会将无关的信息考虑进去影响最终的结果。所以在DCN v2中作者对DCN v1进行了提升减小无关信息的干扰。
原文地址Deformable ConvNets v2: More Deformable, Better Results pytorch代码实现
class DCNv2(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride1,padding1, dilation1, groups1, deformable_groups1):super(DCNv2, self).__init__()self.in_channels in_channelsself.out_channels out_channelsself.kernel_size (kernel_size, kernel_size)self.stride (stride, stride)self.padding (padding, padding)self.dilation (dilation, dilation)self.groups groupsself.deformable_groups deformable_groupsself.weight nn.Parameter(torch.empty(out_channels, in_channels, *self.kernel_size))self.bias nn.Parameter(torch.empty(out_channels))out_channels_offset_mask (self.deformable_groups * 3 *self.kernel_size[0] * self.kernel_size[1])self.conv_offset_mask nn.Conv2d(self.in_channels,out_channels_offset_mask,kernel_sizeself.kernel_size,strideself.stride,paddingself.padding,biasTrue,)self.bn nn.BatchNorm2d(out_channels)self.act Conv.default_actself.reset_parameters()def forward(self, x):offset_mask self.conv_offset_mask(x)o1, o2, mask torch.chunk(offset_mask, 3, dim1)offset torch.cat((o1, o2), dim1)mask torch.sigmoid(mask)x torch.ops.torchvision.deform_conv2d(x,self.weight,offset,mask,self.bias,self.stride[0], self.stride[1],self.padding[0], self.padding[1],self.dilation[0], self.dilation[1],self.groups,self.deformable_groups,True)x self.bn(x)x self.act(x)return xdef reset_parameters(self):n self.in_channelsfor k in self.kernel_size:n * kstd 1. / math.sqrt(n)self.weight.data.uniform_(-std, std)self.bias.data.zero_()self.conv_offset_mask.weight.data.zero_()self.conv_offset_mask.bias.data.zero_()class Bottleneck_DCN(nn.Module):# Standard bottleneck with DCNdef __init__(self, c1, c2, shortcutTrue, g1, k(3, 3), e0.5): # ch_in, ch_out, shortcut, groups, kernels, expandsuper().__init__()c_ int(c2 * e) # hidden channelsif k[0] 3:self.cv1 DCNv2(c1, c_, k[0], 1)else:self.cv1 Conv(c1, c_, k[0], 1)if k[1] 3:self.cv2 DCNv2(c_, c2, k[1], 1, groupsg)else:self.cv2 Conv(c_, c2, k[1], 1, gg)self.add shortcut and c1 c2def forward(self, x):return x self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))class C2f_DCN(nn.Module):# CSP Bottleneck with 2 convolutionsdef __init__(self, c1, c2, n1, shortcutFalse, g1, e0.5): # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()self.c int(c2 * e) # hidden channelsself.cv1 Conv(c1, 2 * self.c, 1, 1)self.cv2 Conv((2 n) * self.c, c2, 1) # optional actFReLU(c2)self.m nn.ModuleList(Bottleneck_DCN(self.c, self.c, shortcut, g, k(3, 3), e1.0) for _ in range(n))def forward(self, x):y list(self.cv1(x).split((self.c, self.c), 1))y.extend(m(y[-1]) for m in self.m)return self.cv2(torch.cat(y, 1))具体修改
module.py文件修改
将pytorch代码实现中的定义代码添加至module.py文件最后
task.py文件修改
导入C2f-DCN模块 def parse_model函数部分导入C2f-DCN
yolov8.yaml配置文件修改
替换原有C2f模块最后进行训练即可。