torch>=1.8.1
torchvision>=0.9.1
import torch
import torchvision.ops
from torch import nn
import math
class DCNv2(nn.Module):
def __init__(self,
in_channels,
out_channels,
kernel_size=3,
stride=1,
padding=1):
super(DCNv2, self).__init__()
self.in_channels = in_channels
self.out_channels = out_channels
self.kernel_size = kernel_size
self.stride = stride if type(stride) == tuple else (stride, stride)
self.padding = padding
# init weight and bias
self.weight = nn.Parameter(torch.Tensor(out_channels, in_channels, kernel_size, kernel_size))
self.bias = nn.Parameter(torch.Tensor(out_channels))
# offset conv
self.conv_offset_mask = nn.Conv2d(in_channels,
3 * kernel_size * kernel_size,
kernel_size=kernel_size,
stride=stride,
padding=self.padding,
bias=True)
# init
self.reset_parameters()
self._init_weight()
def reset_parameters(self):
n = self.in_channels * (self.kernel_size**2)
stdv = 1. / math.sqrt(n)
self.weight.data.uniform_(-stdv, stdv)
self.bias.data.zero_()
def _init_weight(self):
# init offset_mask conv
nn.init.constant_(self.conv_offset_mask.weight, 0.)
nn.init.constant_(self.conv_offset_mask.bias, 0.)
def forward(self, x):
out = self.conv_offset_mask(x)
o1, o2, mask = torch.chunk(out, 3, dim=1)
offset = torch.cat((o1, o2), dim=1)
mask = torch.sigmoid(mask)
x = torchvision.ops.deform_conv2d(input=x,
offset=offset,
weight=self.weight,
bias=self.bias,
padding=self.padding,
mask=mask,
stride=self.stride)
return x
model = nn.Sequential(
DCNv2(3, 32, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
DCNv2(32, 32, kernel_size=3, stride=1, padding=1),
DCNv2(32, 64, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
DCNv2(64, 64, kernel_size=3, stride=1, padding=1),
DCNv2(64, 128, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
DCNv2(128, 128, kernel_size=3, stride=1, padding=1),
DCNv2(128, 256, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2)
)
x = torch.randn(2, 3, 64, 64)
y = model(x)
print(x.size())
print(y.size())
"""
torch.Size([2, 3, 64, 64])
torch.Size([2, 256, 4, 4])
"""
如果能输出,则说明环境适配。
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 1 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23]
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, DCNv2, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]], # 2
[-1, 1, DCNv2, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]], # 4
[-1, 1, DCNv2, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]], # 6
[-1, 1, DCNv2, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]], # 8
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]], # 10
[-1, 1, nn.Upsample, [None, 2, 'nearest']], # 11
[[-1, 6], 1, Concat, [1]], # 12 cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]], # 14
[-1, 1, nn.Upsample, [None, 2, 'nearest']], # 15
[[-1, 4], 1, Concat, [1]], # 16 cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]], # 18
[[-1, 14], 1, Concat, [1]], # 19 cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]], # 21
[[-1, 10], 1, Concat, [1]], # 22 cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
# --------------------------DCNv2 start--------------------------
class DCNv2(nn.Module):
def __init__(self,
in_channels,
out_channels,
kernel_size=3,
stride=1,
padding=1):
super(DCNv2, self).__init__()
self.in_channels = in_channels
self.out_channels = out_channels
self.kernel_size = kernel_size
self.stride = stride if type(stride) == tuple else (stride, stride)
self.padding = padding
# init weight and bias
self.weight = nn.Parameter(torch.Tensor(out_channels, in_channels, kernel_size, kernel_size))
self.bias = nn.Parameter(torch.Tensor(out_channels))
# offset conv
self.conv_offset_mask = nn.Conv2d(in_channels,
3 * kernel_size * kernel_size,
kernel_size=kernel_size,
stride=stride,
padding=self.padding,
bias=True)
# init
self.reset_parameters()
self._init_weight()
def reset_parameters(self):
n = self.in_channels * (self.kernel_size**2)
stdv = 1. / math.sqrt(n)
self.weight.data.uniform_(-stdv, stdv)
self.bias.data.zero_()
def _init_weight(self):
# init offset_mask conv
nn.init.constant_(self.conv_offset_mask.weight, 0.)
nn.init.constant_(self.conv_offset_mask.bias, 0.)
def forward(self, x):
out = self.conv_offset_mask(x)
o1, o2, mask = torch.chunk(out, 3, dim=1)
offset = torch.cat((o1, o2), dim=1)
mask = torch.sigmoid(mask)
x = torchvision.ops.deform_conv2d(input=x,
offset=offset,
weight=self.weight,
bias=self.bias,
padding=self.padding,
mask=mask,
stride=self.stride)
return x
# ---------------------------DCNv2 end---------------------------
if m in [Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv,BottleneckCSP, C3]:
#在列表加DCNv2
if m in [Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv,BottleneckCSP, C3, DCNv2]:
完成以上操作后,在train.py中导入对应的yaml文件和确认参数,即可开始训练。
【1】 https://blog.csdn.net/shuaijieer/article/details/126249088
【2】 https://github.com/yjh0410/PyTorch_DCNv2
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
有没有一种简单的方法来测试一个对象是不可变的(数字,零)还是不可变的(数组,哈希,对象)?换句话说,是否可以通过其他代码的副作用更改它?动机:我想创建一个版本化的值存储,但有些数据是数组。一些数组将存储自定义对象,我可以通过存储“in”属性并搜索它来反转关系。但我也希望能够存储符号数组、其他数组等。 最佳答案 我发现了一个低效的方法:classObjectdefprimitive?beginself.dupfalserescueTypeErrortrueendendend 关于ruby-
SCIM是Google、Salesforce、PingIdentity等提出的用户配置的新标准。是否有现有的ruby实现来支持它?SimilarbutforJava 最佳答案 您可以获得一个面向Okta的开始fromhere或从头开始here但我认为您只能靠自己。耶!您有机会为Ruby社区贡献一个开源项目:) 关于SCIMv2的Ruby实现,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/ques
我有一个外部文件:path_to_external_file.rb带有一些类定义:classAsome_definitionsend我想在模块B中加载它,以便上面定义的类A可以称为B::A。我试过:classBload('path_to_external_file.rb')end但是A是在主环境中定义的,而不是在B中定义的:A#=>AB.constants#=>[]如何在某些类/模块中加载外部文件?编辑我是否应该将外部文件作为字符串读取,并在Class.new{...}中评估它们,然后在B中include该类? 最佳答案 你不能。至
我有一个函数,它接受可变数量的参数,如下所示:defmyfun(*args)#...end所有参数都是同一类型(Symbol),所以现在我记录函数就像只有一个参数一样,说它可以接受多个参数,例如:#thisfunctiondoesn’tdoanything#@param[Symbol]:thisargumentdoessomething,youcanaddmoresymbols#ifyouwantdefmyfun(*args)#...end是否有内置方法来处理这种情况? 最佳答案 以下是有道理的,因为args是方法内部的一个Arra
关于yolov5训练时参数workers和batch-size的理解yolov5训练命令workers和batch-size参数的理解两个参数的调优总结yolov5训练命令python.\train.py--datamy.yaml--workers8--batch-size32--epochs100yolov5的训练很简单,下载好仓库,装好依赖后,只需自定义一下data目录中的yaml文件就可以了。这里我使用自定义的my.yaml文件,里面就是定义数据集位置和训练种类数和名字。workers和batch-size参数的理解一般训练主要需要调整的参数是这两个:workers指数据装载时cpu所使
我试图以表格的形式在我的模型中显示一个对象,但我很难尝试动态创建行和列。我有一个名为Pictures的模型,目前我在一个很长的列表中显示所有这些。我怎样才能把它变成带有rails的View中的表格?**Here'swhereI'mconfused..HowcanIwriteafter6cellscreateanewrow??*****所以这个问题实际上与如何在View中分解此类数据有关。 最佳答案 看看可枚举方法“.each_slice”。http://www.ruby-doc.org/core/classes/Enumerable
这个让我抓狂。我可以通过irb加载gem:steve@server:/var/www/listings$irbirb(main):001:0>Gem.path=>["/home/steve/.gem/ruby/1.9.1","/usr/local/ruby/lib/ruby/gems/1.9.1"]irb(main):002:0>require'nokogiri'=>true但我无法通过Rails控制台加载它:irb(main):001:0>Gem.path=>["/home/steve/.gem/ruby/1.9.1","/usr/local/ruby/lib/ruby/gems/1
我正在使用YAML文件来存储一些secret配置数据。我只是在开发环境中使用该文件。在生产中,我使用ENV变量。这是我现在正在做的事情:我有一个config/confidental.yml文件,看起来像这样:email:user_name:'my_user'password:'my_passw'我有一个config/environments/development.rb文件(除其他外)有这些行:#Mailerconfigemail_confidential=YAML.load_file("#{Rails.root}/config/confidential.yml")['email']c
我有这个数组对:[{"a"=>"1"},{"b"=>"2"},{"a"=>"3"},{"b"=>"4"},{"a"=>"5"}]我想要一种方法来将具有多个值的公共(public)键合并到:[{"a"=>["1","3","5"]},{"b"=>["2","4"]}] 最佳答案 根据Marc-Andre的建议进行了改进。array=[{"a"=>"1"},{"b"=>"2"},{"a"=>"3"},{"b"=>"4"},{"a"=>"5"}]array.group_by(&:keys).map{|k,v|{k.first=>v.fla