【论文笔记摘要】RON:Reverse connection with Objectness prior Networks

本文介绍了一种新的目标检测框架RON,该框架融合了基于区域(region-based)和不基于区域(region-free)的两种目标检测方法的优点,旨在解决多尺度对象定位和负空间挖掘等问题,以提高检测精度。

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

转载出处:http://www.sohu.com/a/156480214_473283

1新智元编译

来源:arxiv.org

作者:孔涛、孙富春等人

编译:熊笑

基于深度网络的目标对象检测可以分为 region-based 和 region-free 两种方法

目标对象检测领域正在取得重大进展,这主要得益于深度网络。当前最好的基于深度网络的目标检测框架可以分为两个主要方法流派:基于区域的方法(region-based)和不基于区域(region-free)的方法。

基于区域的方法将对象检测任务分为两个子问题:第一阶段,将一个专用的候选区域生成网络(region proposal generation network)嫁接到可以生成高质量候选框的深度卷积神经网络(CNN)上;然后,在第二阶段,一个区域性的子网(region-wise subnetwork)被设计来分类和改进这些候选框。使用非常深的 CNN ,Fast R-CNN 工作流程最近在主流对象检测基准上显示出了高精度。

region proposal 阶段可以拒绝大多数背景样本,因此对象检测的搜索空间大大减少。多阶段训练过程一般是开发用于区域候选生成和后检测的联合优化。在 Fast R-CNN 中,区域性子网反复评估成千上万个 region proposal,以给出检测分数。在 Fast R-CNN 工作流程下,Faster R-CNN 与检测网络共享全图像卷积特征,实现几乎零成本的 region proposal。最近,R-FCN 试图通过添加敏感位置的分数图,使 Faster R-CNN 的 unshared per RoI 计算可共享。然而,R-FCN 仍然需要区域候选网络产生的 region proposal。为了确保检测精度,所有方法都将图像的大小调整到足够大的尺寸。在训练和推理时间内,将图像投喂给深度网络时,会有资源和时间的消耗。例如,使用 Faster R-CNN 预测(将约 5GB GPU 内存用于 VGG-16 网络)每个图像通常需要 0.2 s。

另一个解决方案是不基于区域(region-free)的方法。这些方法将对象检测视为一次性(a single shot)问题,使用全卷积网络(FCN),从图像像素一直处理到边界框坐标。这些检测器的主要优点是效率高。从 YOLO 开始,SSD 试图用多层深度 CNN 处理物体检测问题。使用低分辨率输入,SSD 检测器可以获得最先进的检测结果。然而,这些方法的检测精度仍有改进的余地:(a)没有 region proposal,检测器必须在检测模块就要抑制所有的负候选框。这将增加对检测模块进行训练的难度;(b)YOLO 用最顶端的CNN 层检测物体,没有深入探索不同层的检测能力。 SSD 尝试通过添加前一层的结果来提高检测性能。然而,SSD 仍然受困于 small instance 的问题,主要是由于中间层的信息有限。这两个主要瓶颈影响了方法的检测准确性。

是否能够结合两种方法的优势,并消除其缺点?

这两个解决方案的成功,也引出了一个关键问题:是否可能开发一个能够巧妙地结合两种方法的优势并消除其主要缺点的良好框架?通过弥合基于区域的和不基于区域的方法之间的 gap,研究者对这一问题进行了回答。为了实现这一目标,研究者关注两个基本问题:

(a)多尺度对象定位。各种尺度的物体可能出现在图像的任何位置,因此应考虑成千上万个具有不同位置/尺度/方位的区域。先前的研究表明,多尺度表征将显著改善各种尺度的物体检测。然而,这些方法总是在网络的一层检测到各种尺度的对象。利用研究者提出的反向连接,对象将在其相应的网络尺度上被检测到,这更容易优化;(b)负空间挖掘(Negative space mining)。对象和非对象样本之间的比例严重不平衡。因此,对象检测器应该具有有效的负挖掘策略。为了减少对象搜索空间,研究者在卷积特征图上创建了 objectness prior,并在训练阶段用检测器联合优化。

因此,研究者提出了 RON(Reverse connection with Objectness prior Networks)对象检测框架,将基于区域和不基于区域的方法的优点联系起来。

上图是 RON 对象检测总览。给定一张输入图像,网络首先计算骨干网络的特征。然后,(a)添加反向连接;(b)生成 objectness prior;(c)在相应的 CNN 尺度和位置上检测物体。



### std::reverse 报错的原因分析 `std::reverse` 是 C++ 标准库中的一个算法,用于反转容器或范围内的元素顺序。其定义位于头文件 `<algorithm>` 中[^1]。 #### 可能的报错原因 1. **迭代器类型不匹配** `std::reverse` 需要两个双向迭代器作为参数。如果传递的是输入迭代器或其他不符合要求的迭代器,则会导致编译错误[^4]。 2. **未包含必要的头文件** 如果程序中没有包含 `<algorithm>` 头文件,也会导致编译失败,因为编译器无法识别 `std::reverse` 函数。 3. **隐式类型转换问题** 当传入的对象可能涉及隐式类型转换时(例如某些自定义类型的对象),可能会引发编译期错误。这通常发生在模板推导过程中未能正确解析类型的情况。 4. **容器为空** 虽然 `std::reverse` 对空范围的操作是安全的,但如果调用方式不当(如手动计算迭代器位置出错),可能导致运行时错误或未定义行为[^2]。 --- ### 解决方案 以下是针对上述常见问题的具体解决方法: #### 方法一:确认迭代器类型 确保传递给 `std::reverse` 的是支持双向操作的迭代器。对于标准容器(如 `vector`, `deque`, 或者数组),它们默认提供符合要求的迭代器。 示例代码如下: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用 begin 和 end 迭代器 std::reverse(vec.begin(), vec.end()); for (const auto& elem : vec) { std::cout << elem << " "; } } ``` #### 方法二:检查头文件是否引入 确保在源文件顶部包含了 `<algorithm>` 头文件。缺少该头文件会导致编译器找不到 `std::reverse` 定义。 #### 方法三:避免隐式类型转换 如果遇到因类型推导引起的错误,可以显式指定模板参数来消除歧义。例如: ```cpp std::reverse<std::vector<int>::iterator>(vec.begin(), vec.end()); ``` #### 方法四:验证容器状态 在调用前检查容器是否为空并非必要条件,但可以通过调试工具打印日志以排查潜在逻辑错误。例如: ```cpp if (!vec.empty()) { std::reverse(vec.begin(), vec.end()); } else { std::cerr << "Container is empty." << std::endl; } ``` --- ### 总结 `std::reverse` 报错的主要原因是由于迭代器类型不符、缺失头文件或者模板参数推导失败等原因引起。通过仔细核对以上几个方面即可有效解决问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值