日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mmdetection学习之anchor_generator

發布時間:2024/8/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mmdetection学习之anchor_generator 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是mmdetection就不介紹了,自己可取baidu或者google

文件:mmdet/core/anchor/anchor_generator.py

在文件中定義了一個detector產生預選框的類。

程序具體如下。

import torchclass AnchorGenerator(object):def __init__(self, base_size, scales, ratios, scale_major=True, ctr=None):self.base_size = base_sizeself.scales = torch.Tensor(scales)self.ratios = torch.Tensor(ratios)self.scale_major = scale_majorself.ctr = ctrself.base_anchors = self.gen_base_anchors()@propertydef num_base_anchors(self):return self.base_anchors.size(0)def gen_base_anchors(self):w = self.base_sizeh = self.base_sizeif self.ctr is None:x_ctr = 0.5 * (w - 1)y_ctr = 0.5 * (h - 1)else:x_ctr, y_ctr = self.ctrh_ratios = torch.sqrt(self.ratios)w_ratios = 1 / h_ratiosif self.scale_major:ws = (w * w_ratios[:, None] * self.scales[None, :]).view(-1)hs = (h * h_ratios[:, None] * self.scales[None, :]).view(-1)else:ws = (w * self.scales[:, None] * w_ratios[None, :]).view(-1)hs = (h * self.scales[:, None] * h_ratios[None, :]).view(-1)base_anchors = torch.stack([x_ctr - 0.5 * (ws - 1), y_ctr - 0.5 * (hs - 1),x_ctr + 0.5 * (ws - 1), y_ctr + 0.5 * (hs - 1)],dim=-1).round()return base_anchorsdef _meshgrid(self, x, y, row_major=True):xx = x.repeat(len(y))yy = y.view(-1, 1).repeat(1, len(x)).view(-1)if row_major:return xx, yyelse:return yy, xxdef grid_anchors(self, featmap_size, stride=16, device='cuda'):base_anchors = self.base_anchors.to(device)feat_h, feat_w = featmap_sizeshift_x = torch.arange(0, feat_w, device=device) * strideshift_y = torch.arange(0, feat_h, device=device) * strideshift_xx, shift_yy = self._meshgrid(shift_x, shift_y)shifts = torch.stack([shift_xx, shift_yy, shift_xx, shift_yy], dim=-1)shifts = shifts.type_as(base_anchors)# first feat_w elements correspond to the first row of shifts# add A anchors (1, A, 4) to K shifts (K, 1, 4) to get# shifted anchors (K, A, 4), reshape to (K*A, 4)all_anchors = base_anchors[None, :, :] + shifts[:, None, :]all_anchors = all_anchors.view(-1, 4)# first A rows correspond to A anchors of (0, 0) in feature map,# then (0, 1), (0, 2), ...return all_anchorsdef valid_flags(self, featmap_size, valid_size, device='cuda'):feat_h, feat_w = featmap_sizevalid_h, valid_w = valid_sizeassert valid_h <= feat_h and valid_w <= feat_wvalid_x = torch.zeros(feat_w, dtype=torch.uint8, device=device)valid_y = torch.zeros(feat_h, dtype=torch.uint8, device=device)valid_x[:valid_w] = 1valid_y[:valid_h] = 1valid_xx, valid_yy = self._meshgrid(valid_x, valid_y)valid = valid_xx & valid_yyvalid = valid[:, None].expand(valid.size(0), self.num_base_anchors).contiguous().view(-1)return valid

?
num_base_anchors:產生的是以特征圖上一個點為中心產生的預框的數量,數量由scales, ratios這兩個tensor的size決定。例如:這兩個tensor的size都為3,則預選框的數量為3X3=9

gen_base_anchors:產生的上述預選框的具體操作

_meshgrid:在給定兩個tensor情況下,產生這兩個tensor的形狀的網格

grid_anchors:在給定一個特征圖具體尺寸,如特征圖大小為[10,10],scales, ratios這兩個tensor的size均為3的情況下,會以特征圖的每一個點為中心,在這個點上產生不同的9個預選框,共產生10X10X9=900個預選框。

valid_flags:給定兩個尺寸,如第一個尺寸為特征圖尺寸,第二個為標簽在特征圖同一尺寸下的標簽,則該函數會產生產生一個區域,該區域大小和特征圖尺寸一樣,標簽在該特征圖下的區域中的值全為1,其他區域值全為0。函數最后還將該區域使用expand操作將該區域擴張了多次,次數為特征圖一個點下預選框的數目。

?

總結

以上是生活随笔為你收集整理的mmdetection学习之anchor_generator的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。