Simple-Faster-RCNN源码学习笔记

本文围绕Simple-Faster-RCNN源码展开学习。介绍了多个源文件及其中的方法和类,如bbox_tools.py中的loc2bbox等方法,可进行边界框转换、IoU计算等;region_proposal_network.py中的方法用于生成Anchors;creator_tool.py中的类用于生成RoIs和处理正负样本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Simple-Faster-RCNN 源码学习

项目github地址: https://github.com/chenyuntc/simple-faster-rcnn-pytorch

源码


源文件: model/utils/bbox_tools.py

方法: loc2bbox(src_bbox, loc)

参数含义:

  1. src_bbox描述的是bbox的坐标.
  2. loc表示的偏移(offsets)和缩放尺度(scales).

给出边界框的偏移及缩放尺寸,该函数将表示转换为2D的图像坐标.
即通过对原边界框src_bbox附加上loc对应的变换,从而得到新的边界框.

先将坐标表示法src_bbox转换成中心表示法 p x , p y , p w , p h p_x,p_y,p_w,p_h px,py,pw,ph
再结合loc数组中的偏移和缩放 d x , d y , d w , d h d_x,d_y,d_w,d_h dx,dy,dw,dh
根据如下公式,做转换并得到 g x , g y , g h , g w g_x,g_y,g_h,g_w gx,gy,gh,gw:
g y = d y p h + p y g_y = d_yp_h+p_y gy=dyph+py
g x = d x p w + p x g_x = d_xp_w+p_x gx=dxpw+px
g h = d h e x p ( p h ) g_h = d_hexp({p_h}) gh=dhexp(ph)
g w = d w e x p ( p w ) g_w = d_wexp({p_w}) gw=dwexp(pw)
得到中心表示法 g x , g y , g h , g w g_x,g_y,g_h,g_w gx,gy,gh,gw,以后,再经过一步转换得到坐标表示法dst_bbox.
d s t x 1 = g x − 0.5 g w dst_{x1} = g_x-0.5g_w dstx1=gx0.5gw
d s t x 2 = g x + 0.5 g w dst_{x2} = g_x+0.5g_w dstx2=gx+0.5gw
d s t y 1 = g y − 0.5 g h dst_{y1} = g_y-0.5g_h dsty1=gy0.5gh
d s t y 2 = g y + 0.5 g h dst_{y2} = g_y+0.5g_h dsty2=gy+0.5gh

方法: bbox2loc(src_bbox, dst_bbox)

参数含义:

  1. src_bbox描述的是第一个bbox的坐标.
  2. dst_bbox描述的是第二个bbox的坐标.

返回值: 返回从src_bbox变换到dst_bbox所需要的偏移和缩放信息.

方法: bbox_iou(bbox_a, bbox_b)

计算二者的IoU的值,即 A r e a ( A ∩ B ) A r e a ( A ∪ B ) \frac{Area(A∩B)}{Area(A∪B)} Area(AB)Area(AB).
如果参数 a a a的维度是 ( N , 4 ) (N,4) (N,4),参数 b b b的维度是 ( K , 4 ) (K,4) (K,4),那么返回值的维度就是 ( N , K ) (N,K) (N,K)

方法: generate_anchor_base(base_size=16, ratios=[0.5, 1, 2],anchor_scales=[8, 16, 32])

生成多种(样例是3种)不同面积(面积即为base_size*anchor_scales)的Anchor, 每一种Anchor又会生成多种(样例中是3种)具有不同长宽比的Anchor.(样例中总Anchors数目是9种)

最后将生成的Anchor全部都统一到图像坐标表示法返回.


源文件: model/region_proposal_network.py

方法: _enumerate_shifted_anchor(anchor_base, feat_stride, height, width)

用于生成所有的Anchors,传入anchor_base,对于特征图的每一个像素点位置,都生成A个Anchors,总共就是 K ∗ A K*A KA个Anchors,其中K是像素点的数量.

返回值的形状是 ( K ∗ A , 4 ) (K*A,4) (KA,4)

方法:RegionProposalNetwork.forward(self, x, img_size, scale=1.)

经过1层 3 ∗ 3 3*3 33的卷积层,做一下语义变换,从而得到 h h h作为特征响应图.
在这里插入图片描述
再后面特征响应图 h h h经过2个分支,分别产生Anchor的前景得分以及中心表示法坐标.
在这里插入图片描述
其中rpn_fg_scores即Anchor的前景得分,rpn_scores是同时包含前景背景的得分,rpn_locs表示的是Anchor的中心表示法的坐标.
在这里插入图片描述
上述代码的意思是:对于Batch中的每一个样本,把用RPN预测的Anchor坐标,前景得分,图像大小,以及所有Anchor坐标,图片大小等信息传入proposal_layer中去,可以得到一些Anchor.
最后,该方法返回:rpn_locs,rpn_scores,rois,roi_indices,anchor等信息.
值得注意的是,训练时仅返回2000个roi,测试时仅返回300个.


源文件: creator_tool.py

类: ProposalCreator

该类是可调用的,它接收RPN预测的一些Anchor的坐标,前景分数,以及特征图所生成的所有Anchor等信息,并且用于生成RoIs.
在这里插入图片描述
为了生成Proposal,先将anchor的中心表示法转换为图像坐标表示法.
为了防止生成的Proposal越界,我们需做一个clip操作,使得最小值为0,最大值为对应维度的最大值.
在这里插入图片描述
随后将宽度和高度小于阈值的proposal丢掉.
在这里插入图片描述
对所有proposal,按照其前景分进行排序,并且一开始只取前n_pre_nms个.
随后再进行non_maximum_supression非最大值抑制,就是说交叉度大的几个Anchors只保留前景分最大的,返回的时候,只返回n_post_nms个框,训练时这个值为2000,测试时这个值为300…

类: ProposalTargetCreator

在这里插入图片描述
对于给定的RoIs,对于每一个RoI,将其与所有的GT(Ground Truth)进行比对,求其 I o U IoU IoU,随后选择最大的 I o U IoU IoU的索引作为gt_assigment,这个值设置为max_iou.并且计算出前景框的索引pos_index,从中随机选取大概64个正样本.

同理,从中选取相等数量的作为负样本.
在这里插入图片描述
将正负样本叠加在一起,返回与之对应的样本roi,gt框,gt框索引.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值