代码理解网络选择候选区域及确定最终目标框的过程

之前小鱼在获取Faster RCNN最终候选框坐标值中介绍怎么得到最终目标框的坐标值(左上角及右下角),但是因为还需要获取最终目标框的特征向量,所以简单的以为在代码中加入:

    fea=net.blobs['fc6'].data
    print fea.shape

但是结果只是达到一个1*4096维度的向量,很是郁闷,按道理最终目标框有多少个就应该会输出多少个1*4096维度的向量,所以小鱼的目标就是获取最终每个目标框的特征向量.在探究的过程中小鱼完全理清了网络如何选择候选区域和最终怎么确定目标框.

首先网络通过RPN网络得到2000个region proposals,然而并不是所有的都送入Fast RCNN进行分类和位置进修,而是通过去重叠和去边缘无效候选框等操作,得到前300个score 最高(已经从大到小进行排序过)的region proposals送入Fast RCNN.代码为~/py-faster-rcnn/tools/demo.py中:

dets = np.hstack((cls_boxes,
                          cls_scores[:, np.newaxis])).astype(np.float32)

这里可以加入:print dets.shape来查看dets的维度进行验证.

接着对这300个region proposals进行NMS非极大值抑制操作,又可以滤掉一部分region proposals,实现的代码是~/py-faster-rcnn/tools/demo.py中:

        keep = nms(dets, NMS_THRESH)
        dets = dets[keep, :]

keep为结果NMS操作之后剩下来的region proposals序列号,属于[0-299]
数字之间,再跳过dets[keep,:]就得到dets数组中序号为keep那一行的数组[x1,x2,x3,x4,score].比如这里通过NMS操作之后剩下93个候选框,这些候选框的score值已经进行排序.

最后,对这剩下的93个候选框进行阈值判断,也就是对score进行判断,大于某个阈值就判定是有效正样本并保留为最终候选框.实现的代码是~/py-faster-rcnn/tools/demo.py中:

 inds = np.where(dets[:, -1] >= thresh)[0]

inds为最终比较完阈值剩下的目标框总数,假设这里为23,就表示最终可以进行可视化显示的bounding box为23个.

这里的各种变换有点绕,希望小鱼这篇博客对大家有帮助,有问题可以进行留言相互讨论,喜欢留个赞哦,谢谢.

猜你喜欢

转载自blog.csdn.net/zllljf/article/details/79525245
今日推荐