本文借鉴
源码地址:https://github.com/bubbliiiing/faster-rcnn-pytorch

RPN

1.获得建议框网络的预测结果
2.生成先验框
3.对先验框调整

对应文件rpn.py
image.png
image.pngimage.png
loc2bbox函数在utils.py(好多的定义的函数在这里)中定义
# 将RPN网络预测结果转化成建议框
roi = loc2bbox(anchor, loc)
image.png
(非极大抑制)nms函数(将区域中得分最大的框取出,防止一定区域中框过多)
image.png

slice(start,stop,step)

  • start — 起始位置
  • stop — 结束位置
  • step — 间距

1.np.where(condition, x, y)
满足条件(condition),输出x,不满足输出y
2.np.where(condition)
只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。

image.png
先进行3x3卷积
(1x1卷积)判断所框物体是不是前景(不是背景)self.score = nn.Conv2d(mid_channels, n_anchor 2, 1, 1, 0)
(1x1卷积对先验框调整得到建议框self.loc = nn.Conv2d(mid_channels, n_anchor
4, 1, 1, 0)
image.png
contiguous().view(n, -1, 4)view原矩阵变换到其他大小,需要原矩阵tensor的内存是整块的
contiguous()函数可将之连成块
softmax(softmax能得到不同条件下的概率,多分类)

softmax详情查看https://www.cnblogs.com/wangyarui/p/8670769.html

image.png
RPN后面为生成先验框操作
先验框如下讲解

先验框

生成先验框对应代码anchors.py
fasterrcnn中的先验框是预先在图片上框好的框,在建议框网络的预测结果会判断先验框中是否包含物体进而生成建议框

image.pnggenerate_anchor_base(这部分代码很容易看的)
看循环一共循环了9次 生成如下9个框
image.pngimage.png

image.png
#生成中心点的坐标
shift_x = np.arange(0, width feat_stride, feat_stride)
shift_y = np.arange(0, height
feat_stride, feat_stride)
#通过坐标生成中心点
shift_x, shift_y = np.meshgrid(shift_x, shift_y)
#堆叠中心点
shift = np.stack((shift_x.ravel(),shift_y.ravel(),
shift_x.ravel(),shift_y.ravel(),), axis=1)

image.png
这部分调用上面定义好的函数生成先验框并显示