def blk_forward(X, blk, sizes, ratios, cls_predictor, bbox_predictor): Y = blk(X) feature_map_size = (Y.size(2), Y.size(3)) # (h,w) anchors = d2l.MultiBoxPrior(feature_map_size, sizes=sizes, ratios=ratios) cls_preds = cls_predictor(Y) bbox_preds = bbox_predictor(Y) return (Y, anchors, cls_preds, bbox_preds)
def display_anchors(fmap_w, fmap_h, s): d2l.set_figsize((3.5, 2.5)) fig = plt.imshow(img) feature_map_size = (fmap_h, fmap_w) # (h,w) anchors = d2l.MultiBoxPrior(feature_map_size, sizes=s, ratios=[1, 2, 0.5]) bbox_scale = torch.tensor([[w, h, w, h]], dtype=torch.float32) d2l.show_bboxes(fig.axes, anchors * bbox_scale) plt.savefig('multiscale_anchor_{}_{}.png'.format(fmap_h, fmap_w))
def display_anchors(fmap_w, fmap_h, s): # 前两维的取值不影响输出结果(原书这里是(1, 10, fmap_w, fmap_h), 我认为错了) fmap = torch.zeros((1, 10, fmap_h, fmap_w), dtype=torch.float32) # 平移所有锚框使均匀分布在图片上 offset_x, offset_y = 1.0 / fmap_w, 1.0 / fmap_h anchors = d2l.MultiBoxPrior(fmap, sizes=s, ratios=[1, 2, 0.5]) + \ torch.tensor([offset_x/2, offset_y/2, offset_x/2, offset_y/2]) bbox_scale = torch.tensor([[w, h, w, h]], dtype=torch.float32) d2l.show_bboxes(d2l.plt.imshow(img).axes, anchors[0] * bbox_scale)
def display_anchors(fmap_w, fmap_h, s): # 前两维的取值不影响输出结果(原书这里是(1, 10, fmap_w, fmap_h), 我认为错了) fmap = torch.zeros((1, 10, fmap_h, fmap_w), dtype=torch.float32) # 平移所有锚框使均匀分布在图片上 offset_x, offset_y = 1.0 / fmap_w, 1.0 / fmap_h anchors = d2l.MultiBoxPrior(fmap, sizes=s, ratios=[ 1, 2, 0.5 ]) + torch.tensor([offset_x / 2, offset_y / 2, offset_x / 2, offset_y / 2]) # d2l.MultiBoxPrior函数用处:指定输入(fmap)、一组大小和一组宽高比,该函数将返回输入的所有锚框。 ''' 这里之所以说会均匀采样,是因为在图像位置标示值中都采用了归一化,及所有图像上的位置都可以用两个0到1的数表示。 通过 anchors=d2l.MultiBoxPrior(fmap,sizes=s,ratios=[1,2,0.5])+torch.tensor([offset_x/2,offset_y/2,offset_x/2,offset_y/2]) 得到的Anchors是针对fmap的anchor,其形状为1,fmap的像素高宽乘积再乘上设定的锚框高宽比长度,4 其实就是返回fmap的像素高宽乘积再乘上设定的锚框高宽比长度个锚框,每个锚框包含4个坐标,坐标值为归一化之后的值 在后面绘制目标图像(非fmap)时,因为采用的是归一化位置大小来表示锚框位置,所以本来在fmap上紧密排列的锚框被均匀分布了 ''' bbox_scale = torch.tensor([[w, h, w, h]], dtype=torch.float32) d2l.show_bboxes(d2l.plt.imshow(img).axes, anchors[0] * bbox_scale)
sys.path.append("../../") import d2lzh_pytorch as d2l import torch import numpy as np from matplotlib import pyplot as plt img = plt.imread('catdog.jpg') h, w = img.shape[0:2] print("catdog img shape: h {}, w {}".format(h, w)) X = torch.rand((1, 3, h, w)) # Construct input data feature_map_size = (X.shape[2], X.shape[3]) # (h,w) Y = d2l.MultiBoxPrior(feature_map_size, sizes=[0.75, 0.5, 0.25], ratios=[1, 2, 0.5]) print(Y.shape) # 展示某个像素点的anchor boxes = Y.reshape((h, w, 5, 4)) print(boxes[250, 250, 0, :]) # 本函数已保存在dd2lzh_pytorch包中方便以后使用 def show_bboxes(axes, bboxes, labels=None, colors=None): """Show bounding boxes. bboxes need be format as [[x1,y1,x2,y2],[...], ..., [...]] """ def _make_list(obj, default_values=None): if obj is None: