涨点技巧:基于Yolov5的轻量级上采样CARAFE算子,提升小目标检测性能

这篇具有很好参考价值的文章主要介绍了涨点技巧:基于Yolov5的轻量级上采样CARAFE算子,提升小目标检测性能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.CARAFE: Content-Aware ReAssembly of FEatures

2.基于yolov5的CARAFE小目标检测算法

2.1 CARAFE加入common.py中:

 2.2 CARAFE加入yolo.py中:

 2.3 修改yolov5s-carafe.yaml


 🏆🏆🏆🏆🏆🏆🏆Yolov5/Yolov7魔术师🏆🏆🏆🏆🏆🏆🏆 🌟🌟🌟魔改网络和复现cvpr等前沿论文,组合优化 🍉🍉🍉独家首创,可直接作为创新点使用 🚀🚀🚀在多个数据集进行验证mAP涨点明显,尤其是小目标、遮挡物精度提升明显;  🌰 🌰 🌰🌰 🌰 🌰🌰 🌰 🌰🌰 🌰 🌰🌰 🌰 🌰🌰 🌰 🌰

1.CARAFE: Content-Aware ReAssembly of FEatures

涨点技巧:基于Yolov5的轻量级上采样CARAFE算子,提升小目标检测性能

论文:https://arxiv.org/abs/1905.02188

代码:GitHub - open-mmlab/mmdetection: OpenMMLab Detection Toolbox and Benchmark

本文尝试提出一个新的上采样操作CARAFE,它应该具有以下特点:

  • 感受野大。不同于以往只利用亚像素邻域的工作(如双线性插值),CARAFE可以在一个大的接收域中聚合上下文信息。
  • 内容感知。CARAFE不是为所有的样本使用一个固定的内核(例如反卷积),而是支持特定于实例的内容感知处理,它可以动态地生成自适应的内核。
  • 轻量级、计算速度快。CARAFE引入了很少的计算开销,可以很容易地集成到现有的网络架构中

涨点技巧:基于Yolov5的轻量级上采样CARAFE算子,提升小目标检测性能

     在这项工作中,我们提出了内容感知特征重组(CARAFE)来上采样一个特征地图。在每个位置上,CARAFE可以利用底层的内容信息来预测重组内核,并在预定义的附近区域内重组特征。由于内容信息,CARAFE可以在不同的位置使用自适应和优化的重组核,实现比主流的上采样操作(如插值或反褶积)更好的性能。

涨点技巧:基于Yolov5的轻量级上采样CARAFE算子,提升小目标检测性能

为了验证CARAFE的有效性,包括目标检测、实例分割、语义分割、图像修复等,在MS COCO test-dev 2018上,CARAFE可以将Faster RCNN的检测性能提高1.2%,将Mask RCNN的实例分割性能提高1.3%。当对256通道的H × W特征图进行2倍的上采样时,CARAFE引入的计算开销只有H * W * 199k FLOPs,而反卷积的计算开销为H * W * 1180k FLOPs。因此,CARAFE是一个有效和高效的特征上采样算子。

涨点技巧:基于Yolov5的轻量级上采样CARAFE算子,提升小目标检测性能文章来源地址https://www.toymoban.com/news/detail-450866.html

2.基于yolov5的CARAFE小目标检测算法

2.1 CARAFE加入common.py中:

# ------------------------------------CARAFE -----start--------------------------------
class CARAFE(nn.Module):
    #CARAFE: Content-Aware ReAssembly of FEatures       https://arxiv.org/pdf/1905.02188.pdf
    def __init__(self, c1, c2, kernel_size=3, up_factor=2):
        super(CARAFE, self).__init__()
        self.kernel_size = kernel_size
        self.up_factor = up_factor
        self.down = nn.Conv2d(c1, c1 // 4, 1)
        self.encoder = nn.Conv2d(c1 // 4, self.up_factor ** 2 * self.kernel_size ** 2,
                                 self.kernel_size, 1, self.kernel_size // 2)
        self.out = nn.Conv2d(c1, c2, 1)

    def forward(self, x):
        N, C, H, W = x.size()
        # N,C,H,W -> N,C,delta*H,delta*W
        # kernel prediction module
        kernel_tensor = self.down(x)  # (N, Cm, H, W)
        kernel_tensor = self.encoder(kernel_tensor)  # (N, S^2 * Kup^2, H, W)
        kernel_tensor = F.pixel_shuffle(kernel_tensor, self.up_factor)  # (N, S^2 * Kup^2, H, W)->(N, Kup^2, S*H, S*W)
        kernel_tensor = F.softmax(kernel_tensor, dim=1)  # (N, Kup^2, S*H, S*W)
        kernel_tensor = kernel_tensor.unfold(2, self.up_factor, step=self.up_factor) # (N, Kup^2, H, W*S, S)
        kernel_tensor = kernel_tensor.unfold(3, self.up_factor, step=self.up_factor) # (N, Kup^2, H, W, S, S)
        kernel_tensor = kernel_tensor.reshape(N, self.kernel_size ** 2, H, W, self.up_factor ** 2) # (N, Kup^2, H, W, S^2)
        kernel_tensor = kernel_tensor.permute(0, 2, 3, 1, 4)  # (N, H, W, Kup^2, S^2)

        # content-aware reassembly module
        # tensor.unfold: dim, size, step
        x = F.pad(x, pad=(self.kernel_size // 2, self.kernel_size // 2,
                                          self.kernel_size // 2, self.kernel_size // 2),
                          mode='constant', value=0) # (N, C, H+Kup//2+Kup//2, W+Kup//2+Kup//2)
        x = x.unfold(2, self.kernel_size, step=1) # (N, C, H, W+Kup//2+Kup//2, Kup)
        x = x.unfold(3, self.kernel_size, step=1) # (N, C, H, W, Kup, Kup)
        x = x.reshape(N, C, H, W, -1) # (N, C, H, W, Kup^2)
        x = x.permute(0, 2, 3, 1, 4)  # (N, H, W, C, Kup^2)

        out_tensor = torch.matmul(x, kernel_tensor)  # (N, H, W, C, S^2)
        out_tensor = out_tensor.reshape(N, H, W, -1)
        out_tensor = out_tensor.permute(0, 3, 1, 2)
        out_tensor = F.pixel_shuffle(out_tensor, self.up_factor)
        out_tensor = self.out(out_tensor)
        #print("up shape:",out_tensor.shape)
        return out_tensor
# ------------------------------------CARAFE -----start--------------------------------

 2.2 CARAFE加入yolo.py中:

 if m in {
                Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv,
                BottleneckCSP, C3, C3TR, C3SPP, C3Ghost, nn.ConvTranspose2d, DWConvTranspose2d, C3x, C2f,CARAFE}:

 2.3 修改yolov5s-carafe.yaml

# parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# anchors
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPPF, [1024, 5]],
   [-1, 3, C3, [1024]],
    
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, CARAFE, [512,3,2]],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, CARAFE, [256,3,2]],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

到了这里,关于涨点技巧:基于Yolov5的轻量级上采样CARAFE算子,提升小目标检测性能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包