文章目录
build_targets函数用于网络训练时计算loss所需要的目标框,即正样本。
r = t[..., 4:6] / anchors[:, None] # wh ratio
j = torch.max(r, 1 / r).max(2)[0] < self.hyp['anchor_t'] # compare
# j = wh_iou(anchors, t[:, 4:6]) > model.hyp['iou_t'] # iou(3,n)=wh_iou(anchors(3,2), gwh(n,2))
t = t[j] # filter
gxy = t[:, 2:4] # grid xy
gxi = gain[[2, 3]] - gxy # inverse
j, k = ((gxy % 1 < g) & (gxy > 1)).T
l, m = ((gxi % 1 < g) & (gxi > 1)).T
j = torch.stack((torch.ones_like(j), j, k, l, m))
t = t.repeat((5, 1, 1))[j]
def build_targets(self, p, targets):
P是网络预测的输出。
p的shape为:(batch_size,anchor_num,grid_cell,grid_cell,xywh+obj_confidence+classes_num)

P[0]的shape

P[1]的shape

P[2]的shape

targets是经过数据增强(mosaic等)后总的bbox。
targets的shape为:[num_obj, 6] , that number 6 means -> (img_index, obj_index, x, y, w, h)


na, nt = self.na, targets.shape[0] # number of anchors, targets

tcls, tbox, indices, anch = [], [], [], []
tcls:用来存储类别。
tbox:用来存储bbox
indices:用来存储第几张图片,当前层的第几个anchor,以及当前层grid的下标。
gain = torch.ones(7, device=self.device) # normalized to gridspace gain
初始化为1,用来还原bbox为当前层的尺度大小。
ai = torch.arange(na, device=self.device).float().view(na, 1).repeat(1, nt) # same as .repeat_interleave(nt)
扩充anchor数量和当前bbox一样多。
ai是anchor的下标


targets = torch.cat((targets.repeat(na, 1, 1), ai[..., None]), 2) # append anchor indices
targets的shape变为(3,101,7)。
targets[0]对应第一个anchor对应的(image_id, cls, center_x,center_y, w, h,第一个anchor)

targets[1]对应第一个anchor对应的(image_id, cls, center_x,center_y, w, h,第二个anchor)
targets[2]对应第一个anchor对应的(image_id, cls, center_x,center_y, w, h,第三个anchor)
# 预定义的偏移量
g = 0.5 # bias
off = torch.tensor(
[
[0, 0],
[1, 0],
[0, 1],
[-1, 0],
[0, -1], # j,k,l,m
# [1, 1], [1, -1], [-1, 1], [-1, -1], # jk,jm,lk,lm
],
device=self.device).float() * g # offsets
for i in range(self.nl): # 枚举每一层
anchors = self.anchors[i] # 当前层anchor
self.anchors

self.anchors[0]得到第一层归一化后的anchor

乘8得到的

self.anchors[1]得到第二层归一化后的anchor

乘16得到的

self.anchors[2]得到第三层归一化后的anchor

乘以32得到的

gain[2:6] = torch.tensor(p[i].shape)[[3, 2, 3, 2]] # xyxy gain
生成一个当前层的方格大小。
如果i=0

如果i=1,

如果i=2

t = targets * gain
将targets的大小映射到当前层,第六列是当前层的第几个anchor,第0列是位于哪张图片,第1列代表的是类别,2-5列是目标在当前层x,y,w,h。
下采样八倍的层

if nt: # 如果存在目标
r = t[..., 4:6] / anchors[:, None]
r是指bbox与当前层三个anchor的高宽的比值。

r[0]

r[1]

r[2]

j = torch.max(r, 1 / r).max(2)[0] < self.hyp['anchor_t'] # compare
torch.max(r, 1 / r).max(2)[0] 为什么是[0]不是[1].[0]代表的是value,[1]代表的index。

torch.max(r, 1 / r).max(2)[1]

torch.max(r, 1 / r).max(1)[0]
按行获取最大值。

torch.max(r, 1 / r).max(1)[1]
按行获取最大值,返回索引。

t = t[j] # filter
经过过滤后,全部汇总到来了一起。按照第六列anchor的顺序排列。

接下来是扩增正样本
gxy = t[:, 2:4] # grid xy # 获取x,y
gxi = gain[[2, 3]] - gxy # inverse
假设最后的特征图大小是8x8,有a-h8个目标边框如下。

下图中深灰色的表示满足条件的。

j, k = ((gxy % 1 < g) & (gxy > 1)).T
l, m = ((gxi % 1 < g) & (gxi > 1)).T
gxy % 1 < g和gxi % 1 < g包含两个方向,x和y方向。

((gxy % 1 < g) & (gxy > 1)) #条件合并得到下图

(gxi % 1 < g) & (gxi > 1) # 条件合并得到下图

j = torch.stack((torch.ones_like(j), j, k, l, m))
t = t.repeat((5, 1, 1))[j]
# yolov5不仅用目标中心点所在的网格预测该目标,还采用了距目标中心点的最近两个网格
# 所以有五种情况,网格本身,上下左右
|----------------------------------------------------------------------|
| 这里将t复制5个,然后使用j来过滤 |
| 第一个t是保留经过第一步过滤留下的gtbox,因为上一步里面增加了一个全为true的维度|
| 第二个t保留了靠近方格左边的gtbox, |
| 第三个t保留了靠近方格上方的gtbox, |
| 第四个t保留了靠近方格右边的gtbox, |
| 第五个t保留了靠近方格下边的gtbox, |
|----------------------------------------------------------------------|
offsets = (torch.zeros_like(gxy)[None] + off[:, None])[j] # 生成偏移矩阵
j的第一行全为1,意思是指经过第一步保留下的bbox所在的grid_cell为1.

else:
t = targets[0]
offsets = 0
# Define
bc, gxy, gwh, a = t.chunk(4, 1) # (image, class), grid xy, grid wh, anchors
a, (b, c) = a.long().view(-1), bc.long().T # anchors, image, class
gij = (gxy - offsets).long() #减去偏置,得到更多的正样本所在的网格。
gi, gj = gij.T # grid indices
下面的四张图展示了gij = (gxy - offsets).long() 做了啥。





# Append,将对应的结果存储下来。
indices.append((b, a, gj.clamp_(0, gain[3] - 1), gi.clamp_(0, gain[2] - 1))) # image, anchor, grid indices
tbox.append(torch.cat((gxy - gij, gwh), 1)) # box
anch.append(anchors[a]) # anchors
tcls.append(c) # class
tbox.append(torch.cat((gxy - gij, gwh), 1)) # box这句话做的如下:

如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题: