YOLOv5/v7 应用轻量级通用上采样算子CARAFE

《CARAFE: Content-Aware ReAssembly of FEatures》

CARAFE源码地址:https: //github.com/open-mmlab/mmdetection

在之前的博文中我介绍过多种常规的上采样方式,比如最近邻 / 双线性 / 双立方 / 三线性 / 转置卷积等方式,其应用场景和特点各有不同,详细请看我这篇博文

今天来给大家介绍一个2019年ICCV上提出的一个轻量级通用上采样算子CARAFE
在这里插入图片描述
上图是CARAFE 的整体框架。 CARAFE 由两个关键组件组成,即内核预测模块和内容感知重组模块。在该图中,大小为 YOLOv5/v7 应用轻量级通用上采样算子CARAFE的特征图被上采样了YOLOv5/v7 应用轻量级通用上采样算子CARAFE倍。

CARAFE 作为内容感知内核的重组运算符。它由两个步骤组成。第一步是根据每个目标位置的内容预测一个重组核,第二步是用预测的核对特征进行重组。给定大小为 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 的特征图 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 和上采样率 YOLOv5/v7 应用轻量级通用上采样算子CARAFE(假设 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 是整数),CARAFE 将生成大小为 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 的新特征图 YOLOv5/v7 应用轻量级通用上采样算子CARAFE。对于输出 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 的任意目标位置 YOLOv5/v7 应用轻量级通用上采样算子CARAFE,在输入 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 处都有对应的源位置 YOLOv5/v7 应用轻量级通用上采样算子CARAFE,其中 YOLOv5/v7 应用轻量级通用上采样算子CARAFE , YOLOv5/v7 应用轻量级通用上采样算子CARAFE。这里我们将 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 表示为以位置 l 为中心的 YOLOv5/v7 应用轻量级通用上采样算子CARAFEYOLOv5/v7 应用轻量级通用上采样算子CARAFE 子区域,即 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 的邻居。在第一步中,核预测模块 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 根据 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 的邻居预测每个位置YOLOv5/v7 应用轻量级通用上采样算子CARAFE 的位置核 YOLOv5/v7 应用轻量级通用上采样算子CARAFE,如方程式所示。
(1)重组步骤公式化为方程式。
(2)其中 YOLOv5/v7 应用轻量级通用上采样算子CARAFE 是内容感知重组模块,将 YOLOv5/v7 应用轻量级通用上采样算子CARAFE的邻居与内核 YOLOv5/v7 应用轻量级通用上采样算子CARAFE进行重组:

YOLOv5/v7 应用轻量级通用上采样算子CARAFE

在这里插入图片描述

YOLOv5/v7 应用轻量级通用上采样算子CARAFE

YOLOv5更换CARAFE方式:

第一步;将如下代码添加到common.py

import torch.nn.functional as F

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写入yolo.py
在这里插入图片描述

# 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, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],
    
  ]

# 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实战内容导航🍀🌟🚀

  1. 手把手带你调参Yolo v5 (v6.2)(推理)🌟强烈推荐

  2. 手把手带你调参Yolo v5 (v6.2)(训练)🚀

  3. 手把手带你调参Yolo v5 (v6.2)(验证)

  4. 如何快速使用自己的数据集训练Yolov5模型

  5. 手把手带你Yolov5 (v6.2)添加注意力机制(一)(并附上30多种顶会Attention原理图)🌟强烈推荐🍀新增8种

  6. 手把手带你Yolov5 (v6.2)添加注意力机制(二)(在C3模块中加入注意力机制)

  7. Yolov5如何更换激活函数?

  8. Yolov5如何更换BiFPN?

  9. Yolov5 (v6.2)数据增强方式解析

  10. Yolov5更换上采样方式( 最近邻 / 双线性 / 双立方 / 三线性 / 转置卷积)

  11. Yolov5如何更换EIOU / alpha IOU / SIoU?

  12. Yolov5更换主干网络之《旷视轻量化卷积神经网络ShuffleNetv2》

  13. YOLOv5应用轻量级通用上采样算子CARAFE

  14. 空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC🚀

  15. 用于低分辨率图像和小物体的模块SPD-Conv

  16. GSConv+Slim-neck 减轻模型的复杂度同时提升精度🍀

  17. 头部解耦 | 将YOLOX解耦头添加到YOLOv5 | 涨点杀器🍀

  18. Stand-Alone Self-Attention | 搭建纯注意力FPN+PAN结构🍀

  19. YOLOv5模型剪枝实战🚀

  20. YOLOv5知识蒸馏实战🚀

  21. YOLOv7知识蒸馏实战🚀

  22. 改进YOLOv5 | 引入密集连接卷积网络DenseNet思想 | 搭建密集连接模块🍀

有问题欢迎大家指正,如果感觉有帮助的话请点赞支持下👍📖🌟

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年3月1日 下午12:10
下一篇 2023年3月1日

相关推荐