anchor-based:这里基于fasterrcnn中选择anchor的方法
## RPN阶段(anchor target):
1. 计算所有样本点(w x h)与9个anchor拼在一起形成w x h x 9个框,得到all_anchors(以图像为单位)
- mesh_grid,featuremap中每个点为中心(乘以stride),与9个anchor为宽高,形成H x W x 9个框(以图像为单位)
- labels[...] = -1
2. 删除all_anchors中越界的框得到inside_anchors
3. 对于每个样本点9个anchor中,选择与targets重叠度最高的,如果重叠度低于阈值(RPN_NEGATIVE_OVERLAP = 0.3),则认为是负例 0
- Inside_Anchors(N, N <= HxWx9), targets(M) -> iou = NxM
- max_iou = Nx1
- HxWx9这个groundtruth的默认初始值是-1(忽略的)
- select_anchor_index = iou.max(dim=1) (Nx1) < RPN_NEGATIVE_OVERLAP
- labels[select_anchor_index] = 0
4. 对于每个样本点9个anchor中,选择与targets重叠度最高的,作为正例 1,注意,这里会覆盖第3条的结果
- iou = MxN Inside_Anchors(N, N <= HxWx9), targets(M)
- 以M为主,选N个中最大值对应的anchor,为正例, select_anchor = iou.argmax(dim=1) select_anchor = Mx1
- labels[select_anchor] = 1
- 如果gt匹配不到任何anchor(指,无法超过正例阈值的)
- 每个targets必须有最少一个anchor匹配
5. 对于每个样本点9个anchor中,选择与targets重叠度最高的,如果重叠度大于等于阈值(RPN_POSITIVE_OVERLAP = 0.7),则认为是正例 1
6. 选择50%正例(RPN_FG_FRACTION * RPN_BATCHSIZE = 0.5 * 256),如果正例数量超出,则随机忽略多出的 -1
7. 选择50%负例(RPN_BATCHSIZE - num_fg),如果负例数量超出,则随机忽略多出的
8. 统计所有label >= 0,即负例和正例总数,为num_examples
9. 正负例的样本点权重给予1 / num_examples
10. 计算RPN阶段的Loss
anchor free:基于yolov5中的理解
1. BPR(best precision recall)
- 对于N个框,和M个anchor,如果每个框最少匹配一个anchor,则为True,否则为False。统计其均值,得到的就是BPR
- 匹配的原则是:box与anchor的max(max(box宽/anchor宽,box宽/anchor宽), max(anchor宽/box宽, anchor高/box高)) < anchor_t(取4)
- 匹配原则可以转换为:min(min(box宽/anchor宽,box宽/anchor宽), min(anchor宽/box宽, anchor高/box高)) > 1 / anchor_t
2.fitness,适应度
- 对于N个框,和M个anchor,最佳匹配的比例系数,其实就是:(min(min(box宽/anchor宽,box宽/anchor宽), min(anchor宽/box宽, anchor高/box高)) * 匹配标志) 取平均值
- 用来遗传算法衡量效果的,获得最优anchor的
3.anchor的最优计算流程
- 计算默认anchor与数据集的bpr,如果小于0.99则需要重新计算anchor,否则直接使用默认anchor
- a. 计算时,对数据集的box的宽高,进行kmeans得到新的起始anchor,定义为K
- b. 计算K的适应度
- c. 计算变异系数v
- 只变异90%的元素
- 得到随机系数,范围是0.3 - 3.0。其中使用到了正态分布随机数
- d. 使用v变异K,得到变异后的anchor,定义为mutate_anchor
- e. 计算mutate_anchor的适应度(fitness),如果大于当前适应度,则保留,替换K为mutate_anchor
- f. 循环c步骤,总共循环1000次
- g. 最后计算K的bpr,如果K的bpr小于默认anchor的bpr,则不采纳,否则替换anchor为K