Occlusion-aware R-CNN: Detecting Pedestrians in a Crowd 详解(遮挡下的行人检测)

本文介绍一种改进遮挡情况下人体检测的方法,通过Aggregation Loss优化RPN模块,提高proposal准确性,及Part Occlusion-aware RoI Pooling Unit增强特征提取,减少误检。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章地址:https://arxiv.org/pdf/1807.08407.pdf
暂时没有放出源代码,如果有小伙伴找到代码的话欢迎留言给我。

一、概述

依然是解决在遮挡的情况下对人的检测的文章,作者分别从loss和two stage detector中核心的ROI Pooling操作这两个角度出发改善遮挡物体的检测问题。在之后我会根据这两个方面对文章进行一个简单的总结。先简单的放个在2.2中我将会提到的网络结构图:
在这里插入图片描述
在这里插入图片描述

二、 Occlusion-aware R-CNN

为了让RPN module能够更好地、更精确地提取到proposal,作者设计了一种AggLoss来限制proposals能够更接近GT并且同一个object的proposals之间能够尽可能的靠的紧致。所以整体的RPN的Loss函数如下:
在这里插入图片描述
Note: i is the index of anchor in a mini-batch;
p i p_i pi是第i个anchor属于background/foreground的概率;
t i t_i ti是第i个anchor属于某个行人的bbox的坐标;
p i ∗ p_i^* pi是第i个anchor处于某个行人的label,即class label;
t i ∗ t_i^* ti是第i个anchor属于某个行人的bbox的GT;
α是个平衡两种loss的超参数;

其中:分类loss采用log loss:
在这里插入图片描述
在这里插入图片描述

2.1、Aggregation Loss(loss角度改善遮挡的问题)

为了减少对于紧邻行人的错检,作者强制使proposals能够靠近真正的GT,并且能够proposals之间能够紧密分布。所以作者提出了AggLoss在RPN和Fast-RCNN层。这个loss能够让不同的proposals能够接近各自的GT,并且让属于同一GT的proposals之间的距离能够最小。
在这里插入图片描述
(3)式中第一项是regression loss,目的是让每个proposal能够更接近其真实的GT,采用smooth L1损失,如下(4)式所示;第二项是compactness loss,目的是让属于同一GT的proposals能够分布紧致。
在这里插入图片描述
对于compactness term L c o m L_com Lcom目的是让属于同一GT的proposals之间能够尽可能的分布紧致,使得可以减少对于临近的两个人之间的错检问题。如下:

在这里插入图片描述

2.2 、 Part Occlusion-aware RoI Pooling Unit(ROI Pooling操作改善遮挡的问题)

在这里插入图片描述
在这里插入图片描述
正如上图Fig.1中所示,作者将新人分为5个区域,用RoI pooling层把feature map固定在HxW的尺寸。
在这里插入图片描述
在这里插入图片描述
作者分别对着5个局部区域分别进行了预测一个0到1的遮挡的score,用来表示着5个区域是否被遮挡,可以把这个部分认为是一个简单的mask信号,最后作者使用这5个score和其对应区域的feature相乘后相加,得到最终的RoI feature。
但是在这里将不通part的feature和全局feature直接相加不知带代表什么意思,但是直观上说不通,感觉不是很合理。
所以作者提出FRCNN中的loss如下:
在这里插入图片描述
最后作者在不同的数据集上进行了测试,这里就不再多做赘述了,有兴趣的可以直接去看原文。

<think>我们被要求实现一个遮挡感知损失(Occlusion-Aware Loss)在YOLOv7中。首先,我们需要理解什么是遮挡感知损失。 根据引用[2]中的内容,遮挡是一个重要的问题,特别是在线条检测中,线段可能被部分遮挡。同样,在目标检测中,遮挡会导致目标的部分不可见,从而影响检测的准确性。 遮挡感知损失通常是指那些能够考虑到目标被遮挡程度,从而调整损失权重的损失函数。例如,对于被遮挡的部分,我们可能希望降低其损失权重,因为遮挡部分难以准确预测;或者我们可以通过一些先验知识(如遮挡区域的位置)来调整损失。 在YOLOv7中,损失函数通常包括三个部分:定位损失(如CIoU损失)、置信度损失(如二元交叉熵)和分类损失(如交叉熵)。我们可以考虑在这些损失中引入遮挡感知。 实现思路: 1. 获取遮挡信息:这通常需要额外的标注(如遮挡掩码)或者通过算法估计遮挡区域(例如,使用光流、深度信息或专门的遮挡估计网络)。在训练时,我们可以获得每个目标实例的遮挡情况(例如,每个边界框的遮挡比例或每个像素的遮挡掩码)。 2. 修改损失函数:根据遮挡信息调整损失权重。例如,对于被遮挡严重的区域,降低其损失权重;对于未被遮挡的区域,保持原有的损失权重。 具体实现步骤(以YOLOv7为例): 假设我们有一个遮挡掩码(occlusion mask)M,其中M[i,j]表示在特征图位置(i,j)处的遮挡程度(0表示完全遮挡,1表示完全可见)。这个掩码可以通过标注的遮挡信息生成,或者通过其他方法估计(例如,使用两个连续帧的光流来估计遮挡,但这里我们假设有标注)。 在YOLOv7中,损失计算是在三个不同尺度的特征图上进行的。对于每个特征图,我们可以将遮挡掩码下采样到相应的尺寸,然后用于调整损失。 以定位损失为例(如CIoU损失): 原始的定位损失是每个预测框与目标框之间的CIoU损失。我们可以根据预测框对应的目标框的遮挡程度来调整损失权重。 更具体地,我们可以为每个目标框计算一个遮挡因子(例如,目标框内可见区域的比例),然后用这个因子来加权该目标框的定位损失。 同样,对于置信度损失,我们可以根据目标框的遮挡情况调整正样本的权重:被遮挡的目标可能更难检测,因此我们可能希望降低其正样本的权重,以避免网络过度关注被遮挡的目标;或者相反,增加权重以强调学习被遮挡目标。这需要根据具体任务来定。 一种常见的做法是:对于被遮挡的目标,我们降低其置信度损失的权重,因为被遮挡的目标的置信度学习可能更困难。同时,对于定位损失,我们也可以根据遮挡因子进行加权。 实现步骤: 1. 在数据加载时,我们需要加载遮挡信息(如果有的话)。如果没有现成的遮挡标注,我们可以考虑使用一些启发式的方法生成,例如,通过目标之间的重叠关系(如目标A被目标B遮挡,则计算目标A被遮挡的比例)。 2. 在计算损失时,对于每个目标,计算其遮挡因子(例如,目标框内未被遮挡的像素比例,或者目标框被其他目标覆盖的比例等)。假设我们有一个函数f(occlusion_factor)来生成权重,例如:weight = 1 - occlusion_factor * alpha (其中alpha是一个超参数,用于控制降低的程度)。 3. 将计算得到的权重应用到损失项上。 代码修改示例(以YOLOv7的损失计算为例): 在YOLOv7中,损失计算通常位于`loss.py`文件中。我们需要定位到计算损失的地方(如`compute_loss`函数),然后进行修改。 假设我们已经在数据加载时,为每个目标计算了一个遮挡因子(occlusion_factor),并存储在targets中(例如,每个target的第6个维度存储了遮挡因子,前面5个维度是class, x, y, w, h)。 那么,在计算定位损失时,我们可以这样修改: 原始代码: loss_ciou = 1.0 - bbox_iou(pbox, tbox[i], CIoU=True) # 计算CIoU损失 lbox += loss_ciou.mean() # 平均 修改后: loss_ciou = 1.0 - bbox_iou(pbox, tbox[i], CIoU=True) # 计算CIoU损失 # 获取该目标对应的遮挡因子 occlusion_factor = tbox[i][:, 5] # 假设tbox[i]是一个n×6的矩阵,第6列是遮挡因子 # 计算权重:这里我们使用线性加权,权重为1 - beta * occlusion_factor,其中beta是一个超参数(0~1) weight = 1.0 - beta * occlusion_factor loss_ciou_weighted = loss_ciou * weight lbox += loss_ciou_weighted.mean() 同样,对于置信度损失(obj_loss)和分类损失(cls_loss),也可以进行类似的加权。 注意:遮挡因子如何定义和获取是关键。如果没有标注遮挡信息,我们可以采用以下启发式方法: - 对于每个目标,计算其与其他目标框的重叠区域(使用IoU),然后取最大的IoU作为遮挡因子(或者取重叠面积占目标框面积的比例)。 - 但是这种方法只能处理目标之间的遮挡,无法处理被图像边缘裁剪或场景中静态物体遮挡的情况。 另外,我们也可以利用分割掩码(如果有的话)来计算每个目标框内的可见像素比例。 总结:实现遮挡感知损失需要两个关键点:遮挡信息的获取和损失权重的设计。 由于YOLOv7原始代码中并没有提供遮挡信息,因此我们需要在数据加载部分进行扩展,将遮挡信息(无论是来自标注还是计算)传递给损失函数。 相关问题: 1. 如何获取目标检测中的遮挡标注信息? 2. 除了使用遮挡因子加权损失,还有哪些方法可以实现遮挡感知的检测? 3. 在YOLOv7中,如何修改数据加载器以支持遮挡信息的加载? 4. 遮挡感知损失在哪些数据集上特别有效? 注意:以上实现是一个基本思路,具体实现需要根据数据集和任务进行调整。</think>### 在YOLOv7中实现遮挡感知损失(Occlusion-Aware Loss) 遮挡感知损失的核心思想是**降低被遮挡目标的损失权重**,使模型更关注可见区域的特征。在YOLOv7中实现需修改损失函数和数据处理流程,步骤如下: #### 1. **遮挡信息获取** - **数据标注要求**:训练数据需提供遮挡标注(如目标可见性比例或遮挡掩码),参考格式: ```python # 标注示例:[class_id, x_center, y_center, width, height, visibility] # visibility &isin; [0,1]:0=完全遮挡,1=完全可见 annotation = [0, 0.45, 0.32, 0.1, 0.2, 0.7] # 目标70%可见 ``` - **自动估计(若无标注)**:通过目标重叠度计算遮挡因子: ```python def compute_occlusion(bbox1, bbox2): iou = calculate_iou(bbox1, bbox2) # 计算IoU return min(iou / (bbox1_area + 1e-7), 1.0) # 遮挡比例 ``` #### 2. **损失函数修改** 在YOLOv7的损失计算文件(`loss.py`)中增加遮挡权重: ```python class OALoss(ComputeLoss): def __init__(self, model, autobalance=False): super().__init__(model, autobalance) # 新增遮挡权重系数 self.occlusion_weight = 1.0 # 超参数,控制遮挡敏感度 def __call__(self, p, targets): # 原始损失计算 loss, loss_items = super().__call__(p, targets) # 添加遮挡感知修正 oa_loss = 0 for i, target in enumerate(targets): visibility = target[:, 5] # 提取可见性标注 # 降低被遮挡目标的分类+定位损失权重 weight = torch.exp(-self.occlusion_weight * (1 - visibility)) oa_loss += (self.bbox_loss(i) + self.cls_loss(i)) * weight.mean() total_loss = loss + oa_loss return total_loss, loss_items ``` #### 3. **关键实现细节** - **梯度控制**:通过指数衰减`exp(-λ(1-visibility))`平滑权重,避免梯度突变 - **多任务平衡**:仅调整分类和定位损失,置信度损失保持原权重 - **超参数调优**:`occlusion_weight`建议从0.5开始,按验证集结果调整 - **特征层适配**:在不同尺度的预测层(P3-P5)统一应用权重 #### 4. **效果验证** - **评估指标**:重点关注遮挡目标(如`AP_S`/`AP_M`)的精度提升 - **可视化工具**:使用Grad-CAM观察被遮挡目标的特征响应变化 - **消融实验**:对比基线模型在遮挡场景下的性能差异 > **理论依据**:遮挡感知损失通过降低低可见目标的损失贡献,使模型更关注可靠特征。这与人类视觉系统处理遮挡的策略一致——优先利用可见部分进行推断[^2]。 --- ### 相关问题 1. **如何为遮挡感知损失生成训练所需的遮挡标注?** > 需使用目标分割掩码或3D位置信息计算可见性比例,复杂场景可借助运动估计或深度传感器[^3]。 2. **遮挡感知损失与注意力机制结合有哪些方案?** > 可在Backbone后添加遮挡感知模块(如Occlusion-Attention Block),动态生成特征权重图。 3. **无遮挡标注时如何实现半监督遮挡学习?** > 通过光流一致性或时序差分生成伪遮挡标签,结合Mean-Teacher框架迭代优化。 4. **遮挡处理在实时检测系统中的计算开销如何平衡?** > 建议采用轻量级遮挡估计子网络(如MobileNet-V3结构),耗时控制在总推理时间10%内。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值