gluoncv rpn 正负样本

RPN目标采样器详解

https://github.com/dmlc/gluon-cv/blob/master/gluoncv/model_zoo/rpn/rpn_target.py

    def forward(self, ious):
        """RPNTargetSampler is only used in data transform with no batch dimension.
        Parameters
        ----------
        ious: (N, M) i.e. (num_anchors, num_gt).
        Returns
        -------
        samples: (num_anchors,) value 1: pos, -1: neg, 0: ignore.
        matches: (num_anchors,) value [0, M).
        """
        matches = mx.nd.argmax(ious, axis=1)

        # samples init with 0 (ignore)
        ious_max_per_anchor = mx.nd.max(ious, axis=1)
        samples = mx.nd.zeros_like(ious_max_per_anchor)

        # set argmax (1, num_gt)
        ious_max_per_gt = mx.nd.max(ious, axis=0, keepdims=True)
        # ious (num_anchor, num_gt) >= argmax (1, num_gt) -> mark row as positive
        mask = mx.nd.broadcast_greater(ious + self._eps, ious_max_per_gt)
        # reduce column (num_anchor, num_gt) -> (num_anchor)
        mask = mx.nd.sum(mask, axis=1)
        # row maybe sampled by 2 columns but still only matches to most overlapping gt
        samples = mx.nd.where(mask, mx.nd.ones_like(samples), samples)

        # set positive overlap to 1
        samples = mx.nd.where(ious_max_per_anchor >= self._pos_iou_thresh,
                              mx.nd.ones_like(samples), samples)
        # set negative overlap to -1
        tmp = (ious_max_per_anchor < self._neg_iou_thresh) * (ious_max_per_anchor >= 0)
        samples = mx.nd.where(tmp, mx.nd.ones_like(samples) * -1, samples)

        # subsample fg labels
        samples = samples.asnumpy()
        num_pos = int((samples > 0).sum())
        if num_pos > self._max_pos:
            disable_indices = np.random.choice(
                np.where(samples > 0)[0], size=(num_pos - self._max_pos), replace=False)
            samples[disable_indices] = 0  # use 0 to ignore

        # subsample bg labels
        num_neg = int((samples < 0).sum())
        # if pos_sample is less than quota, we can have negative samples filling the gap
        max_neg = self._num_sample - min(num_pos, self._max_pos)
        if num_neg > max_neg:
            disable_indices = np.random.choice(
                np.where(samples < 0)[0], size=(num_neg - max_neg), replace=False)
            samples[disable_indices] = 0

        # convert to ndarray
        samples = mx.nd.array(samples, ctx=matches.context)
        return samples, matches

 

转载于:https://www.cnblogs.com/TreeDream/p/10192410.html

### 解决YOLOv8中正负样本不平衡的方法 针对YOLOv8中的正负样本不平衡问题,可以采用多种策略来优化损失函数。以下是几种有效的解决方案: #### 1. 使用Focal Loss Focal Loss 是一种专门为了解决不平衡分类问题而设计的损失函数。它通过对交叉熵损失加入一个调节因子 \((1-p_t)^{\gamma}\),使得模型更加关注难分类的样本,减少了易分类样本的影响。 ```python import torch.nn.functional as F def focal_loss(input, target, gamma=2.0, alpha=0.25): ce_loss = F.cross_entropy(input, target, reduction='none') pt = torch.exp(- pt)**gamma * ce_loss).mean() return loss ``` 这种损失函数特别适合于目标检测任务,在此类任务中背景类别的数量远多于前景类别[^1]。 #### 2. 引入NWD(Normalized Wasserstein Distance) 对于基于锚框的目标检测器而言,使用NWD替代传统的IoU作为标签分配标准能显著提升训练样本质量。具体来说,在RPN阶段利用NWD来进行正负样本划分,可使网络学习到更为精确的位置信息,进而缓解由样本分布倾斜带来的负面影响。 #### 3. 应用EIOU_Loss 考虑到不同尺度物体之间的比例差异可能会影响定位精度,因此可以在原有CIoU基础上进一步细分长宽比因素,转而采用EIOU_Loss。此方法不仅保留了原版的优点——即考虑中心点距离、边界重叠程度以及形状相似度;还额外增加了对宽度高度差别的考量,有助于改善小尺寸物品检测效果的同时也间接减轻了数据集内部固有的偏斜状况[^2]。 通过上述措施之一或组合应用,能够在一定程度上解决YOLOv8中存在的正负样本失衡现象,并最终达到提高整体性能的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值