【mmdetection】代码对比
在这里主要对比一下solo的官方代码和复现版本。
官方代码 https://github.com/WXinlong/SOLO
复现版本 https://github.com/Epiphqny/SOLO
- config
img_norm_cfg = dict(
mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) # caffe的图片格式是BGR
img_norm_cfg = dict(
mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) # pytorch的图片格式是RGB
-
scale_ranges表示不同
官方代码表示((1, 96), (48, 192), (96, 384), (192, 768), (384, 2048))
复现版本表示((-1, 64), (64, 128), (128, 256), (256, 512), (512, INF)) INF = 1e8
-
cls branch不同
官方代码每层共享一个cls branch;复现版本每层都有一个cls branch;前者就会少一些参数 -
FPN设置
我自己在复现版本上改了FPN的采样率;而官方代码没有改FPN,直接把把输出的特征图插值 -
coord编码方式不同
官方代码的coord写法更为简略,复现版本没有该部分,我参考CoordConv
x_range = torch.linspace(-1, 1, ins_feat.shape[-1], device=ins_feat.device)
y_range = torch.linspace(-1, 1, ins_feat.shape[-2], device=ins_feat.device)
y, x = torch.meshgrid(y_range, x_range)
y = y.expand([ins_feat.shape[0], 1, -1, -1])
x = x.expand([ins_feat.shape[0], 1, -1, -1])
coord_feat = torch.cat([x, y], 1)
ins_feat = torch.cat([ins_feat, coord_feat], 1)
-
质心求法不同
官方代码通过scipy里的ndimage.measurements.center_of_mass
函数直接求得,复现版本没有该部分,我参考polarmask求质心的方法。 -
mask branch
官方代码与论文一致,每一层的mask经上采样2倍再计算loss,预测mask和target mask层层对应,s^2处于维度1。而复现版本将所有的正样本对应的mask都resize到原图的四分之一统一计算loss。 -
focal loss
官方代码中avg_factor
为总共实例个数+1,dice loss是对每一个层计算一下算平均;复现版本中是总共实例个数+batch数 -
label设置方式
官方代码巧用zip,实现列表维度的转换,官方代码以gt mask的重心为出发点,来分配label。而复现版本先求出特征图上点对应原图的坐标, 再计算这些点到重心点的距离,看是否在范围内,有点繁琐。
关于代码中zip部分可见【python】zip和*。
给一张图分配label的代码如下:
def solo_target_single(self,
gt_bboxes_raw,
gt_labels_raw,
gt_masks_raw,
featmap_sizes=None):
# featmap_sizes为5层mask输出的大小
device = gt_labels_raw[0].device
# ins
gt_areas = torch.sqrt((gt_bboxes_raw[:, 2] - gt_bboxes_raw[:, 0]) * (
gt_bboxes_raw[:, 3] - gt_bboxes_raw[:, 1])) # 边
ins_label_list = []
cate_label_list = []
ins_ind_label_list = []
for (lower_bound, upper_bound), stride, featmap_size, num_grid \
in zip(self.