Unsupervised Hard Example Mining from Videos for Improved Object Detection论文精读

解释一下什么叫HEM(Hard Example Mining困难样本挖掘):我们以2D检测为例,有些样本很容易学习,有些样本则很困难被网络学习,那么如果我们的模型只学习会了简单的目标,那精度也总会受到限制。因此,对于finetune阶段来说,困难样本有助于我们的模型去’突破‘,让他见识更广阔的世界。

优点:
In the context of class imbalance in training object detectors, online hard example mining (OHEM) [46] and the focal loss [33] were designed to emphasize hard examples
这篇文章还有个很重要的点就是无监督,文中也说到了和focal loss,ohem方法都不同,就是我不需要标签,该方法的效果也比较好,因此可以研究一下。


核心思想:

主要是用了一种追踪的思想,首先视频的帧是连续的,因此不会有目标突然地消失,当我们检测到第f帧时,我们会根据前后各五帧的检测目标进行联合的判断,如果某一帧漏检,或者误检了,那么漏检的这一帧就算就当做hard example。


我们举个例子:第一行的中间的红框是无缘无故出现的,前后两帧都没检测到这个样本,所以该检测是独立的,就判定为困难负样本FP。第二行也是一样的道理。
在这里插入图片描述

相关工作:主要是两个方面:负样本的质量和半监督学习。
1.滑动窗口滑过的背景比前景多很多,所以训练和检测会出现大量负样本,数量大到有时分类器只给出false就会得到不错的结果。很多现有方法(例如OHEM和focal loss)都是在标注数据的基础上进行改进。
2.简要地举了半监督学习的一个方法(不重要)

本文的详细方法

1.收集视频
2.预训练的faster-rcnn推理进行检测bbox。
3.最关键的一点:
首先设置检测置信度为0.8,很多结果被过滤,当推理到第X帧,取前五帧与后五帧作为相邻帧,作为模板匹配,进行联系判断。策略就是:对bounding box扩大100个像素以得到区域,在前后五帧中对这个区域使用归一化交叉相关(normalized cross correlation,NCC)搜索其最佳匹配(NCC阈值设置为0.5)。如果前后五帧搜索得到的结果与第X帧预测结果IoU小于0.2,则认为此检测结果是detector flicker,判断为困难负样本。
如果前后帧一致(没具体说是IOU大于多少,不过肯定大于0.2了)则认为是伪正pseudo-positive。

. For the purpose of creating the re-training set, we kept only those frames that had at least one pseudo-positive detection in addition to one or more hard negatives.
至少要保留一个hard negative 和一个pseudo-positive作为训练集进行finetune。

黄色为faster-rcnn检测的高阈值的目标,红色当然也是,前后帧绿色的虚线框表示这个范围,蓝色是追踪的框,前后帧并没有与红色框相匹配的样本,所以是hard negatives.。
在这里插入图片描述

hard-negative样本解释了,还有一种叫hard-positive样本。如图所示,漏检的正样本就是hard-positive。
在这里插入图片描述

————————————————————————————————
下面实验就不多说了,我也没仔细看,但是提升还是有的。

**

结论:

**
本文的trick利用了视频连续性来收集样本,可以在数据有限的前提下大大提高模型对“硬例”的检测效果。目前来看,有一定的工程应用价值。

参考博客:
https://blog.csdn.net/fish_like_apple/article/details/82856012
https://blog.csdn.net/leviopku/article/details/99564927

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用PyTorch实现DFF的示例代码。这里假设你已经定义了多个卷积神经网络进行特征提取,并且每个网络的输出为一个特征张量。我们将使用全局平均池化层将每个特征张量转换为一个特征向量,然后将这些特征向量拼接在一起,最终使用一个全连接层将全局特征向量映射到一个低维空间。 ```python import torch import torch.nn as nn import torch.nn.functional as F class DFF(nn.Module): def __init__(self, num_networks, input_dim, hidden_dim, output_dim): super(DFF, self).__init__() self.num_networks = num_networks self.input_dim = input_dim self.hidden_dim = hidden_dim self.output_dim = output_dim # 定义卷积神经网络和全局平均池化层 self.networks = nn.ModuleList([nn.Conv2d(in_channels=input_dim[i], out_channels=hidden_dim[i], kernel_size=3, padding=1) for i in range(num_networks)]) self.avg_pool = nn.AdaptiveAvgPool2d((1, 1)) # 全局平均池化层 # 定义全连接层 self.fc = nn.Linear(num_networks * hidden_dim[-1], output_dim) def forward(self, x): # 对每个卷积神经网络进行特征提取并全局平均池化 features = [] for i in range(self.num_networks): f = self.networks[i](x[i]) f = F.relu(f) f = self.avg_pool(f) f = f.view(f.size(0), -1) # 将特征张量转换为特征向量 features.append(f) # 将所有特征向量拼接在一起 global_feature = torch.cat(features, dim=1) # 使用全连接层将全局特征向量映射到一个低维空间 output = self.fc(global_feature) return output ``` 在上面的代码中,我们定义了一个DFF类,其中包含了多个卷积神经网络、全局平均池化层和全连接层。在forward函数中,我们对每个卷积神经网络进行特征提取并全局平均池化,然后将所有特征向量拼接在一起,最终使用全连接层将全局特征向量映射到一个低维空间。 需要注意的是,这里的代码仅供参考,实际实现可能会因为具体的输入数据形状、网络结构等因素而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值