[yolo系列:yolov7添加可变形卷积Deformable Conv V2]

news/2024/12/22 1:25:41/

yolo系列文章目录

文章目录

  • yolo系列文章目录
  • 一、可变形卷积是什么?
  • 二、使用步骤
    • 1.在models/common.py文件添加
    • 2.然后再yolo.py里面添加DCNv2
    • 3.修改yolov7的yaml
  • 总结
  • 参考文章


一、可变形卷积是什么?

  可变形卷积即DCN(缩写取自Deformable ConvNets)提出于ICCV 2017的paper:Deformable Convolutional Networks

论文paper地址:https://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdf

codebase地址:(很多框架中都已实现,这里选择以pytorch的为例)https://github.com/4uiiurz1/pytorch-deform-conv-v2/blob/master/deform_conv_v2.py
DCN原文链接
代码链接
文章创新点(贡献):
本文提出了两个新模块:可变形卷积和可变形RoI池化

新模块可以很容易地取代现有CNN中的普通模块,并且可以通过标准反向传播轻松地进行端到端训练。

DCN目前也出到了v2,值得一提的是,DCN的思维也算一种可学习的自适应模块,跟注意力机制模块BAM/CBAM的思路有点像。

mmdetection里也有相关实现,可轻松移植进自己的项目,DCN对于大多数检测场景尤其是比赛都是有用的

二、使用步骤

1.在models/common.py文件添加

class DCNv2(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride=1,padding=1, groups=1, act=True, dilation=1, deformable_groups=1):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 = (autopad(kernel_size, padding), autopad(kernel_size, 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_size=self.kernel_size,stride=self.stride,padding=self.padding,bias=True,)self.bn = nn.BatchNorm2d(out_channels)self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())self.reset_parameters()def forward(self, x):offset_mask = self.conv_offset_mask(x)o1, o2, mask = torch.chunk(offset_mask, 3, dim=1)offset = torch.cat((o1, o2), dim=1)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_()

2.然后再yolo.py里面添加DCNv2

在这里插入图片描述

3.修改yolov7的yaml

添加到主干,只需要修改卷积核为3的,为1的没有必要修改,
在这里插入图片描述

总结

一般可变形卷积是添加到主干网上,如果想添加到head部分,自行尝试。

参考文章

[yolov5修改]在yolov5中加入可变形卷积模块
【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.57】引入可形变卷积
可变形卷积:Deformable ConvNets


http://www.ppmy.cn/news/1144822.html

相关文章

四川众佰诚:抖音开店后怎么运营的

抖音作为中国最大的短视频平台,其商业价值已经被众多商家所认可。开通抖音小店,可以帮助商家更好地在短视频场景中展示商品,提升销售效果。然而,成功的运营不仅需要有吸引人的商品,还需要精细的运营策略。以下是一些关…

找出多组分辨率中最接近目标值的一组

package com.test;import java.util.ArrayList; import java.util.List;public class Test {public static void main(String[] args) {// 目标分辨率int targetWidth 640;int targetHeight 480;//String str "3264x2448,3264x1836,2560x1920,3264x1472,3200x1440,2304…

leetCode 167.两数之和 || - 输入有序数组 双指针解法

167. 两数之和 II - 输入有序数组 - 力扣(LeetCode) 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] …

10.selenium进阶

上述我们学习了selenium入门的一些操作, 本节知识点学习一些selenium的高级用法 1、嵌套网页 ​ 在前端开发中如果有这么一个需求。一个页面上的内容要被其它页面所共用。也就是说两个或者两个以上的页面需要共同存在与同一个页面。在前端页面开发中可以把写好的代码在每个页面…

CDGA数据治理工程师考试心得

2023年8月初,准备备考CDGA。当时也是很迷茫,啥时候考试都不知道,也不知道该怎么做。写这篇文章的目的也只是记录一下。 1.什么是CDGA? CDGA就是数据治理工程师(Certified Data Governance Associate),“D…

SpringBoot 如何配置 OAuth2 认证

在Spring Boot中配置OAuth2认证 OAuth2是一种用于授权的开放标准,允许应用程序安全地访问用户的资源。Spring Boot提供了强大的支持,使得在应用程序中配置OAuth2认证变得非常容易。本文将介绍如何在Spring Boot中配置OAuth2认证,以便您可以在…

tortoise创建本地仓库

1.安装git和tortoise 推荐 TortoiseGit的安装与配置方法 以及 Git TortoiseGit 配置步骤以及本地版本管理 这里记录一下我遇到的问题 1.右键没有创建本地版本库 2 .创建了但是克隆不了 后续专有 一般选专有网络 注意自行谨慎选择 自行负责

Go 通道机制与应用详解

一、概述 Go语言(也称为Golang)是一个开源的编程语言,旨在构建简洁、高效和可靠的软件。其中,通道(Channel)是Go并发模型的核心概念之一,设计目的是为了解决不同协程(Goroutine&…