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)
Example #2
0
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))
Example #3
0
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)
Example #5
0
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: