训练的分离loss设计

(03-16) 21d
这个方法本身可能不起效

实验方法

资源:
192@pengxk/TOV_mmdetection/

1、按实例分离loss

  • \color{blue}{目标: 改loss,实现不同size的目标实例用不同loss}
    --> algorithm: 根据dr修改bboxes_weight、labels_weight
  • \color{red}{Bug: mAP只有2}
    理论分析:原算法bboxes_gt, lables = filter(bboxes_gt, lables)导致大量漏检。因scale被滤掉的gt,导致其区域原本的正例被匹配为负例。
    \color{blue}{新算法: } 1)gt_valid = filter(bboxes_gt, lables)2)filter(sampling_result, gt_valid)
def get_targets(gt_inds_valid_list=None,):
        ### add by fei ##
        if gt_inds_valid_list is None:
            gt_inds_valid_list = [None for i in range(num_imgs)]
        ### add by fei ##

def _point_target_single(gt_inds_valid=None,):
        ### filter code here ##

RepPointsHead Pipline: loss() --invoke->get_target()--invoke-> _point_target_single()

  • \color{red}{Bug: mAP只有10}
    实验分析:将filter(dr=[0.25, 0.33, 0.5])的保留区间都设为全部(即不过滤),性能与之前一致。说明代码实现应该正确,可能是算法策略本身的问题。
    解决:尝试区间调参(按数量划分>>直接按\frac{1}{2}scale划分),性能上升至20+。

改进:filter改为soft方式(weight[filtered] = 0>>weight[filtered] = soft

2、按图片分离loss

原则:图片不同dr对应loss的权值,与图里目标的尺度分布有关。
要求:一张图片里的所有目标的权值处理一致,最终效果相当于给loss加了权值(pos_ins与neg_ins对应的权值都要同步修改)。\color{blue}{[TODO]}\ \color{red}{no}
Bug注意:由于两个stage(initrefine)assigner不同、匹配策略不同,造成它们输出的匹配上的(matched)proposals数量不同。


细节proposal: valid_flagsunmap_outputs==True:由于生成的anchor可能不在图片里(inside_flag==False),因此匹配前先去掉这些proposal,匹配完返回前再映射回最初的proposals。

  • mmAP 提升惊喜
  • 疑问:效果!=给loss加权值 \color{red}{???}
  • \color{red}{Bug: 区间外\ losses\_pts\_refine\ 全0},在跟loss的过程发现
    FocalLoss
    origin

    weight: 0.7098
  • 区间外losses_pts_refine全0 [Bug]

用什么区间、mean or median、什么soft_weight函数形式、...都是消融实验的问题,首先能肯定是:这是有性能提升的
而现在最需要验证的是:分离loss与FPN分层相结合,是否有效

3、FPN assigned by layers

[\color{blue}{TODO:} Here]

4、Predictor

卡住没啥进展,就会感觉抑郁


实验记录 (倒序)

Separate-instance
0.01\_2b8g epoch
1

2
...
9

10

11

12
mmAP mmAP_{s} mmAP_{m} mmAP_{l}
soft(258.5)_{(wrong)} 23.2 23.3 ... 27.9 28.1 28.0 28.5 29.6
soft(258.5)_{(3e-1)} 23.4 23.5 ... 27.9 28.2 28.2 28.6
FPN 29.4
FPN+wrong 24.0 24.3 ... 27.9 28.2 28.1 28.7 29.3

说明:1)instance:对soft_weight敏感,0.3优于0.9
2)似乎FPN与soft此消彼长 1+1<1

Separate-image
0.01\_2b8g epoch
1
2 3 4 5 6 7 8 9 10 11 12 上界
median_{(95)} 25.0 24.8 25.0 23.7 24.4 23.5 23.3 23.9 28.4 29.0
median_{(258.5)} 24.9
24.8
24.6
25.4
24.9
25.2
24.6
23.8
24.7
24.6
24.5
23.9
23.6
23.8
24.2
23.7
28.2
27.4
28.0
27.4
28.1
27.4
28.4
-
29.0
median_{(258.5)}+0.25 28.4 29.0

说明:image:对soft_weight不敏感

0.01\_2b\color{blue}{4g} epoch
1
2 3 4 5 6 7 8 9 10 11 12
\color{brown}{median_{(258.5)}} 21.7 21.7 21.7 21.1 22.2 22.0 21.4 21.7 27.0 27.3 27.3 28.0
\color{brown}{median_{(95.084)}} 21.0 21.6 21.5 21.2 21.5 24.6 24.1 23.7 27.5 27.6 27.7 28.0
mean_{(258.5)}
mean_{(114.951)} 21.1 21.1 20.7 - - - - - - - - -
min_{(258.5)}

说明:区间95比258将样本集合划分地更松散,区间95对应小目标(dr=0.5)的范围更小,猜测具有更好的区分度

AP:PR面积
mAP:某iou_thr下所有类别的AP
mmAP:所有iou_thr
\color{blue}{GPU越多,学习率设置越大}

  • 修改pth文件的epoch

  • 按图片分开算loss

  • env对了 0.5h

  • 首次功能实现 24h

  • debug 24h *n
    \color{red}{爆显存} --> 新建多个不必要的高维tensor
    \color{red}{loss\ nan} --> loss\_cls, loss\_pts\_refine同步异常变大--> num_total_samples_refine=0?
    训几轮后出\color{red}{bug} --> if None: pass

  • \color{red}{Bug: mAP只有5,依旧低的离谱}
    分析:评测代码有bug?No 依赖的模型正确导入?算法本身bug(一张图多个实例共享一个dr)?

  • 算法:

input: dr in [0.25, 0.33, 0.5]

key: 根据dr,选出对应的proposals
    [x] 从backbone传dr至head.loss
        or 计算f_map得dr
    [] label,gt_weights = filter_weights(dr, label_weights: (b, w, h), bbox_weights: (???))

key1: 算dr
    # 传dr
    # AnchorFreeHead :: BaseDenseHead.forward_train()
    # ResNet_DR.forward(x, dr) ??? dr from who
key2: for layer in 多层:



参考:
[1] 多尺度训练 web
[2] python区间 interval(1,2)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容