锚框
什么是锚框
这个在论文(paper)中说法不太一样,如Faster RCNN中称之为anchor(锚),而SSD称之为prior bounding box(先验框),以下遇到的目标选择框,在还没有进行模型训练之前预设的选择框,使用先验框的说法。
锚框生成程序
在CV中,对图像先进行特征采集,一般使用CNN网络,这里使用VGG16模型,输入3×224×224的图像,输出512×7×7针对特征图,随后,对每一个cell 上生成9个先验框。
选择特征图进行先验框生成的原因:若在特征图上生成每一个cell生成9个先验框,一共有7×7×9个;若在原图上生成那么就要有224×224×9,没必要!我们的目的能够覆盖全图就可以,所以特征图是不错的选择。
这里先验框存储 使用 中间+宽高坐标 。
定义9个先验框
参数 | 说明 |
---|---|
scale_anchor | 先验框大小 |
ratio_anchor | 先验框宽高比 |
先来个示意图,获得就是这9个先验框。
scale_anchor = [0.1, 0.2, 0.3] # 表示原图长/宽的0.1那么大
ratio_anchor = [1., 2., 0.5]
上图以中间点为例,并且已经将特征图所确定的先验框,映射到原图进行可视化展示。要的就是这个效果,随后不是所有的都留到最后,有一些与目标框毫无重叠的没有必要考虑,接下来的的步骤,那么可以利用IoU指标,设定阈值,初步设定为0.5,那么<0.5的框我们就直接分类为背景,哪些要回归目标的任务就让IoU>0.5的去实现。补充一点,这只是以一个点为例,每个cell都有9个框那么也要有441个框,那么原图可视化之后可谓密密麻麻!
程序
def create_prior_boxes():
"""
VGG16最后的特征图尺寸为 7*7 具体间网络模型中简化的SSD示意图
:return: prior boxes in center-size coordinates, a tensor of dimensions (441, 4)
"""
fmap_dims = 7
scale_anchor = [0.1, 0.2, 0.4]
ratio_anchor = [1., 2., 0.5]
prior_boxes = []
for i in range(fmap_dims):
for j in range(fmap_dims):
cx = (j + 0.5) / fmap_dims
cy = (i + 0.5) / fmap_dims
for obj_scale in scale_anchor:
for ratio in ratio_anchor:
prior_boxes.append([cx, cy, obj_scale * sqrt(ratio), obj_scale / sqrt(ratio)])
prior_boxes = torch.FloatTensor(prior_boxes) # (441, 4).to(device)
prior_boxes.clamp_(0, 1) # (441, 4)
return prior_boxes
网络模型
简化的SSD模型
回归与分类
就是设置CNN网络对应输出的通道数。
SSD模型
说明推荐这篇博文链接: link.
参考链接: 动手学CV-Pytorch.