STTran 源码解读(2):detector类

STTran 源码解读2:detector类


init部分

detector类主要用到的是faster-rcnn,初始化部分定义模型相关层。

1.定义RPN类:feature map输入RPN生成anchors,获得proposal作为分类的输入。
(1)定义proposalLayer类将估计的bbox应用于锚点,输出object detection proposals.其调用get_anchor函数直接生成anchor。
(2)定义anchorTargetLayer类生成锚点分类标签和边界框回归目标,为ground truth指定anchor。
2.定义proposalTargetLayer类:生成paoposal分类标签和bbox回归目标,为ground truth指定proposal。
3.定义ROI Pooling类:将不同尺寸的ROI池化到相同尺寸上。
4.定义ROI Align类:将不同特征大小的的输入区域输出相同大小输出特征。RoI Align 与 RoI Pooling的区别在于前者在计算过程中会用到所有数据,而后者则会丢失数据。具体执行步骤如下:
(1)遍历候选区域,保持浮点数边界不量化(即不对齐网格);
(2)将特征图的ROI等分成相同尺寸的bbox(如9,这里的9根据pooling层的尺寸决定。);
(3)在每个bbox选择四个采样点,根据双线性插值计算采样点的双线性差值;
(4)通过max pooling选择四个值中的最大值作为最终值。
5.fasterRCNN.load_state_dict(checkpoint[‘model’])用于将fasterRCNN在Action Genome数据集上训练得到的参数权重文件重加载到新的模型之中.


forward部分

模型输入:im_data,im_info,gt_boxes,num_boxes,gt_annotation,每个变量的相关含义及维度如下:

im_data(一段视频的所有向量化的图片表示)= (num of image,3,w,h)
im_info(一段视频所有图片的宽,高,缩放比例) = (num of image,3)
gt_boxes(初始化ground truth为零向量) = (num of image,1,5)
num_boxes = = (num of image,)
gt_annotation(一段视频所有图片的ground truth) = num of image

三种模式:
1)predcls通过bbox,class预测对象之间的relation
2)sgcls通过bbox预测class以及对象之间的relation
3)sgdet通过图片预测bbox,class,对象之间的关系

image(dim=颜色通道,w,h)——backbone(?是否是)——roi_align——head_to_tail——visual feature(对应论文中的V(dim=2048))

  1. 当模式为predcls时:
    分别获取两个bbox的最小坐标和最大坐标为union_boxes,union_boxes——RCNN_roi_align——union feature map(union_feat).
    返回值:
    boxes,labels来自数据集,feature(对应于visual feature,dim=2048)
    union_box(联合框), union_feat(联合框的特征图,dim=(256*4,7,7))

  1. 当模式为sgcls时:
    执行步骤及返回值与模式1基本相同,多一个预测标签pred_labels :
    visual feature——线性层——class distrubution(dim=37)

  1. 当模式为sgdet时:

<1> 通过fasterRCNN获得rois,base_feat, roi_feature,cls_prob,bbox_pred, 其中base_feat代表基础特征图,rois代表proposal,roi_feature代表proposal特征图,cls_prob代表proposal分类概率,bbox_pred代表bbox偏移量:

1)得到base_feat
图片im_data经过RCNN_base()操作得到大小为[batch_size, rpn_input_dim=1024,38,67]的基础特征图base_feat.

2)得到rois,即proposal
(1)base_feat经过RPN_Conv()操作,RPN_cls_score()操作和softmax得到大小为[batch_size, 122,38,67]的rpn_cls_prob(rpn分类分数).
(2)base_feat经过RPN_Conv()操作和RPN_bbox_pred()操作得到大小为[batch_size, 12
4,38,67]的rpn_bbox_pred(bbox的偏移量).
(3)rpn_cls_prob和rpn_bbox_pred经过RPN_proposal()操作得到rois,大小为[batch_size,num_rois, 5] ,其中5是由[img_num, x0, y0, x1, y1]组成。
上面操作都是卷积操作。

3)得到roi_feature,cls_prob,bbox_pred
(1)base_feat和rois经过RCNN_rois_align()操作得到大小为[batch_size100,2564,7,7]的pooled_feat,随后经过_head_to_tail()操作得到大小为[batch_size100,2048]的pooled_feat,即代码中的roi_feature.
(2)pooled_feat经过RCNN_bbox_pred()操作得到大小为[batch_size
100,分类数4]的bbox_pred,其中bbox_pred为bbox的偏移量
(3)pooled_feat经过RCNN_cls_score()操作和softmax得到大小为[batch_size
100,分类数]的cls_prob

<2> 原始bbox+bbox的offset,得到修正后的bbox,大小为[batch_size,100,分类数*4]:PRED_BOXES。

<3> 通过NMS获得预测的bbox,label以及feature.
(1) 针对每张图片获得其proposal的score和预测的bbox (PRED_BOXES),每张图片存在100个proposal
(2) 通过极大值抑制去除重叠较大的proposal.
(3)得到每张图片预测出来的:
FINAL_BOXES(object bbox)
FINAL_LABLES(object_label(对象分类标签))
FINAL_SCORES(object_score(对象标签分类概率))
FINAL_FEATURES(object特征)
FINAL_BASE_FEATURES(每张图片的最终特征)
(以上五个部分需要通过faster-rcnn进行预测得到,看怎么通过yolo获得. 以下部分代码需保留)。

<4> 通过assign_relations函数为每个bbox分配标签.
GT_RELATIONS, SUPPLY_RELATIONS
根据PRED_FINAL_BOXES和GT_FINAL_BOXES对比bbox_iou阈值将gt_annotation分为
GT_RELATIONS(检测到的gt_bbox), SUPPLY_RELATIONS(未检测到的gt_bbox),并将GT_RELATIONS分配标签和索引,如下所示:
DETECTOR_FOUND_IDX, assign_label
funcs.py中对比每张图片PRED_FINAL_BOXES和GT_FINAL_BOXES,通过bbox_iou对比矩阵,将iou阈值大于0.5的GT_FINAL_BOXES的gt_label分配给assign_label,即求出每个PRED_FINAL_BOXES对应的label,DETECTOR_FOUND_IDX为pred_bbox对应的索引.

<5> 针对未检测到的gt_bbox(SUPPLY_RELATIONS)的部分.

  1. 如果每张图片检测到全部gt_bbox,则预测的结果全部添加到输出中
  2. 如果每张图片存在未检测出来的gt_bbox,则有:
    (1)按照图片顺序将gt_annotation的bbox和class 分配给unfound_gt_class, bbox
    (2)分配检测pred_bbox检测索引DETECTOR_FOUND_IDX
    (3)神经网络计算unfound_gt_bbox的特征,并计算分类概率
    (4) 获得最终的预测结果——bbox,score, label和feature。

<6> 获得每个pred_bbox的分类分布.
pred_bbox通过RCNN_cls_score获得分类预测分布final_distribution。

<7> 最后分别获取两个bbox的最小坐标和最大坐标为union_boxes,union_boxes——RCNN_roi_align——union feature map(union_feat).

(如有错误,还请指正,谢谢)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值