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
构建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筛选scores、bbox_pred
- bbox_pred + point_list中的采样点 => 还原成bboxes
- 之后一些小操作,进行nms。
- 得到det_bboxes, det_labels