生成多个锚框(contrib.nd.MultiBoxPrior)
每个像素点构造多个锚框,假设设定一组大小s1,...,sn和一组宽高比r1,...,rm。然后每个像素组合,就有hwnm个锚框,一般情况下,只要s1,和r1的组合。即:
共wh(n+m-1)个锚框
交并比(IoU)
面试中有提问过。。。
标注训练集的锚框
为了训练检测模型,为每一个锚框标注两类信息(类别,与真实边界框的偏移量offset)
目标检测过程:
- 生成多个锚框
- 计算每个锚框的预测类别和偏移量
- 调整锚框位置
- 筛选需要输出的预测边界框
假设:
生成的锚框为A1,A2,...,Ana,真实边界框为B1,B2,...,Bnb。(na>=nb)
矩阵Xna*nb 是对应锚框与真实边界框的IoU,然后不停筛maxX即可,多余的na-nb,横着查max,看是否达到阀值:
生成锚框的类别就弄好了,偏移量的计算:
其中:
A : 宽高 wa , ha , 中心 (xa , ya)
B : 宽高 wb , hb , 中心 (xb , yb)
若 A 没有分配真实框 B,则 A 为背景(负类锚框)
%matplotlib inline import sys import gluonbook as gb from mxnet import image,nd,gluon,contrib import numpy as np np.set_printoptions(2) img = image.imread('./catdog.jpg').asnumpy() h, w = img.shape[0:2] h, w X = nd.random.uniform(shape=(1,3,h,w)) Y = contrib.nd.MultiBoxPrior(X,sizes=[0.75,0.5,0.25],ratios=[1,2,0.5]) Y.shape boxes = Y.reshape((h,w,5,4)) boxes[25,250,:,:] # 画出一个像素的所有锚框 def show_bboxes(axes, bboxes, labels=None, colors=None): def _make_list(obj, default_values=None): if obj is None: obj = default_values elif not isinstance(obj, (list, tuple)): obj = [obj] return obj labels = _make_list(labels) colors = _make_list(colors, ['b', 'g', 'r', 'm', 'c']) for i, bbox in enumerate(bboxes): color = colors[i % len(colors)] rect = gb.bbox_to_rect(bbox.asnumpy(), color) axes.add_patch(rect) if labels and len(labels) > i: text_color = 'k' if color == 'w' else 'w' axes.text(rect.xy[0], rect.xy[1], labels[i], va='center', ha='center', fontsize=9, color=text_color, bbox=dict(facecolor=color, lw=0)) gb.set_figsize() bbox_scale = nd.array((w,h,w,h)) fig = gb.plt.imshow(img) show_bboxes(fig.axes,boxes[250,250,:,:]*bbox_scale,['s=0.75, r=1', 's=0.5, r=1', 's=0.25, r=1', 's=0.75, r=2', 's=0.75, r=0.5'])
labels = contrib.nd.MultiBoxTarget(anchors.expand_dims(axis=0), ground_truth.expand_dims(axis=0), nd.zeros((1, 3, 5))) # 标注类别 labels[2] # mask变量,用来过滤掉背景的偏移量 labels[1] # 偏移量 labels[0]