【代码】FoveaBox代码解读

0. FoveaBox

论文: https://arxiv.org/abs/1904.03797
代码;mmdetection版本

1. _init_layers

网络结构:
reg_convs:4个卷积层
cls_convs:4个卷积层,如果有deformable卷积。则有2个卷积,一个deform

2. loss

  • 获得各layer中feature_map的shape,featmap_sizes:[(100, 100), (50, 50), …]:
 featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores]
  • 获得各层的基准点(通过meshgrid),points:[(100x100, 100x100), (50x50, 50x50), …]:
points = self.get_points(featmap_sizes, bbox_preds[0].dtype,
                         bbox_preds[0].device)
  • flatten_cls_scores: Mx80(所有img,所有level),先将各个img的cat到一起,再将各个level的cat到一起。
  • flatten_bbox_preds: Mx4
  • flatten_labels: M
  • flatten_bbox_targets:Mx4
  • loss_cls: focal loss
  • pos_inds: label>0的部分
  • loss_bbox:smooth_l1, 只有pos的进行计算

3. fovea_target_single

input:图片中的gt
output:list,包含一张图片中各个layer的target,形状与各个layer的feature map相同

  • gt_bboxes_raw, gt_labels_raw中只含有单个bbox以及label,代码是按照多个写的?
  • gt_areas: 面积
  • base_edge_list:(16, 32, 64, 128, 256):base_len
  • scale_ranges=((8, 32), (16, 64), (32, 128), (64, 256), (128,512))::(lower_bound, upper_bound)
  • strides=(8, 16, 32, 64, 128):stride
  • 对于每一个层:
  • labels:HxW, zero
  • bbox_targets:HxWx4, 均为1,加上了一些随机噪声。
  • hit_indices:判断是否为area是否在**[lower_bound, upper_bound]**, 是一个索引。按照area从大到小排序,得到新的 hit_indices
gt_bboxes = gt_bboxes_raw[hit_indices, :] / stride
  • 对bbox进行缩放
  • half_w:gt的w/2

构建valid fovea area

   pos_left = torch.ceil(
       gt_bboxes[:, 0] + (1 - self.sigma) * half_w - 0.5).long().\
       clamp(0, featmap_size[1] - 1)
  • sigma=0.4
  • gt_bboxes[:, 0]为x1,首先加上(0.6*w - 1)/ 2的取整,之后向上取整,并限制在feature_map的范围内。如果是右边,会做上取整,保证区域大于0。
  bbox_targets[py1:py2 + 1, px1:px2 + 1, 0] = \
      (stride * x[py1:py2 + 1, px1:px2 + 1] - gt_x1) / base_len
  • 对于区域内的每个点,label就是label,而bbox_target则是计算点与gt的差(这个差是真实值的差)(左、上、右、下),再除以base_len =(stride * 2)
  • 最终bbox_target还要截断在(1/16, 16),并且经过log

4. get_bboxes

input:
cls_scores:[80x100x152, 80x50x76, …]
bbox_preds:[4x100x152, 4x50x76, …]
featmap_sizes:[(100, 152), (50, 76), …]
point_list:[(x(M=152*100), y), …]:采样点
img_shape:(800, 1199, 3)
scale_factor:1.87235,表示原图缩放多少

对于每个level,

  • scores:经过sigmoid,reshape成M x 1
  • bbox_pred:进过exp,reshape成M x 4
  • topk筛选scoresbbox_pred
  • bbox_pred + point_list中的采样点 => 还原成bboxes
  • 之后一些小操作,进行nms。
  • 得到det_bboxes, det_labels

你可能感兴趣的:(代码)