【深度学习】目标检测的全面回顾

news2024/12/25 23:36:19

一、说明

        随着自动驾驶汽车、智能视频监控、面部检测和各种人数统计应用的兴起,对快速准确的物体检测系统的需求也在不断增长。这些系统不仅涉及识别和分类图像中的每个对象,还涉及通过在图像周围绘制适当的边界框来定位每个对象。这使得对象检测比其传统的计算机视觉前身图像分类更难完成。

        然而,幸运的是,目前最成功的对象检测方法是图像分类模型的扩展。几个月前,谷歌发布了一个新的Tensorflow对象检测API。此版本附带了一些特定模型的预构建架构和权重:

  • 带移动网络的单次多盒探测器 (SSD)
  • 带有 Inception V2 的固态硬盘
  • 采用 Resnet 101 的基于区域的全卷积网络 (R-FCN)
  • 更快的RCNN与Resnet 101
  • 更快的RCNN与Inception Resnet v2

        在我的上一篇博客文章中,我介绍了上面列出的三种基本网络架构背后的直觉:MobileNets,Inception和ResNet。这一次,我想对Tensorflow的对象检测模型做同样的事情:更快的R-CNN,R-FCN,和SSD。在这篇文章的最后,我们希望已经了解深度学习如何应用于对象检测,以及这些对象检测模型如何相互启发和发散。

二、更快的 R-CNN

        Faster R-CNN现在是基于深度学习的对象检测的规范模型。它帮助激发了之后的许多检测和分割模型,包括我们今天要研究的另外两个模型。不幸的是,如果不了解Faster R-CNN的前身R-CNN和Fast R-CNN,我们就无法真正开始理解它,所以让我们快速了解一下它的祖先。

2.1 R-CNN

        R-CNN是Faster R-CNN的祖父。换句话说,R-CNN真的启动了事情。

        R-CNN,或基于Region的Convolutional N eural Network,由3个简单的步骤组成:

  1. 使用称为选择性搜索的算法扫描输入图像以查找可能的对象,生成~2000个区域建议
  2. 在每个区域提案之上运行卷积神经网络 (CNN)
  3. 获取每个CNN的输出并将其馈送到a)SVM中以对区域进行分类,b)线性回归器以收紧对象的边界框(如果存在此类对象)。

下图说明了这 3 个步骤:

换句话说,我们首先提出区域,然后提取特征,然后根据其特征对这些区域进行分类。从本质上讲,我们已经将对象检测变成了图像分类问题。R-CNN非常直观,但非常慢。

2.2 fast R-CNN

        R-CNN的直系后代是Fast-R-CNN。Fast R-CNN在许多方面与原版相似,但通过两个主要增强提高了检测速度:

  1. 在提出区域之前对图像执行特征提取,因此在整个图像上只运行一个CNN,而不是2000个CNN的2000多个重叠区域
  2. 用softmax层替换SVM,从而扩展神经网络以进行预测,而不是创建新模型

新模型看起来像这样:

        正如我们从图像中看到的,我们现在基于网络的最后一个特征图生成区域建议,而不是从原始图像本身。因此,我们可以只为整个图像训练一个CNN。

        此外,与其训练许多不同的 SVM 来对每个对象类进行分类,不如使用单个 softmax 层直接输出类概率。现在我们只有一个神经网络需要训练,而不是一个神经网络和许多SVM。

        Fast R-CNN在速度方面表现得更好。只剩下一个大瓶颈:用于生成区域提案的选择性搜索算法。

2.3 faster R-CNN

        在这一点上,我们回到了最初的目标:更快的R-CNN。Faster R-CNN的主要见解是用快速神经网络取代慢速选择性搜索算法。具体而言,它引入了区域提案网络(RPN)。

以下是 RPN 的工作原理:

  • 在初始CNN的最后一层,一个3x3的滑动窗口在特征图上移动,并将其映射到较低的维度(例如256-d)。
  • 对于每个滑动窗口位置,它基于 k 个固定比率锚框(默认边界)生成多个可能的区域
  • 每个区域提案包括 a) 该区域的“客观性”分数和 b) 代表区域边界框的 4 个坐标

换句话说,我们查看上一个特征图中的每个位置,并考虑以它为中心的k个不同的框:一个高框,一个宽框,一个大框等。对于这些盒子中的每一个,我们输出我们是否认为它包含一个对象,以及该盒子的坐标是什么。这是它在一个滑动窗口位置的外观:

2 k 分数表示每个 k 边界框位于“对象”上的 softmax 概率。请注意,尽管 RPN 输出边界框坐标,但它不会尝试对任何潜在对象进行分类:它的唯一工作仍然是建议对象区域。如果锚框的“客观性”分数高于某个阈值,则该框的坐标将作为区域建议向前传递。

一旦我们有了我们的区域提案,我们就直接将它们输入到本质上是快速R-CNN的东西中。我们添加一个池化层,一些全连接层,最后添加一个softmax分类层和边界框回归器。从某种意义上说,更快的R-CNN = RPN + Fast R-CNN。

总而言之,Faster R-CNN实现了更好的速度和最先进的准确性。值得注意的是,尽管未来的模型在提高检测速度方面做了很多工作,但很少有模型能够显着优于Faster R-CNN。换句话说,Faster R-CNN可能不是最简单或最快的目标检测方法,但它仍然是性能最好的方法之一。举个例子,Tensorflow的Faster R-CNN和Inception ResNet是他们最慢但最准确的模型。

归根结底,Faster R-CNN 可能看起来很复杂,但其核心设计与原始 R-CNN 相同:假设对象区域,然后对其进行分类。现在,这是许多对象检测模型的主要管道,包括我们的下一个模型。

三、R-FCN里程碑

        还记得 Fast R-CNN 如何通过跨所有区域提案共享单个 CNN 计算来提高原始检测速度吗?这种想法也是R-FCN背后的动机:通过最大化共享计算来提高速度。

        R-FCN,或基于Region的Fully C卷积Net,在每个输出中共享100%的计算。由于是完全卷积的,它在模型设计中遇到了一个独特的问题。

        一方面,在对对象进行分类时,我们想学习模型中的位置不变性:无论猫出现在图像中的哪个位置,我们都想将其归类为猫。另一方面,在对物体进行检测时,我们要学习位置方差:如果猫在左上角,我们想在左上角画一个框。因此,如果我们试图在100%的网络中共享卷积计算,我们如何在位置不变性和位置方差之间做出妥协?

        R-FCN的解决方案:位置敏感的分数图

        每个位置敏感分数图表示一个对象类的一个相对位置。例如,一个分数地图可能会在检测到右上角时激活。另一个分数地图可能会激活它看到汽车下角的位置。你明白了。从本质上讲,这些分数图是卷积特征图,经过训练以识别每个对象的某些部分

现在,R-FCN的工作原理如下:

  1. 在输入图像上运行CNN(在本例中为ResNet)
  2. 添加一个完全卷积层以生成上述“位置敏感分数图”的分数库。应该有 k²(C+1) 分数图,其中 k² 表示划分对象的相对位置数(例如 3² 表示 3 x 3 网格),C+1 表示类数加上背景。
  3. 运行完全卷积区域建议网络 (RPN) 以生成感兴趣区域 (RoI)
  4. 对于每个投资回报率,将其划分为与分数图相同的k²“箱”或子区域
  5. 对于每个箱,检查记分库以查看该箱是否与某个对象的相应位置匹配。例如,如果我在“左上”箱上,我将抓取与对象的“左上角”对应的分数图,并在 RoI 区域中平均这些值。对每个类重复此过程。
  6. 一旦每个 k² 条柱都有每个类的“对象匹配”值,平均箱以获得每个类的单个分数。
  7. 在剩余的 C+1 维向量上使用软最大值对 RoI 进行分类

        总的来说,R-FCN看起来像这样,RPN生成了RoI:

        即使有解释和图像,您可能仍然对此模型的工作原理感到有些困惑。老实说,当您可以可视化R-FCN正在做什么时,它更容易理解。以下是R-FCN在实践中检测婴儿的一个这样的例子:

        简单地说,R-FCN考虑每个区域提案,将其划分为子区域,并迭代子区域,询问:“这看起来像婴儿的左上角吗?”,“这看起来像婴儿的顶部中心吗?“这看起来像婴儿的右上角吗?”等。它对所有可能的类重复此操作。如果有足够多的子区域说“是的,我与婴儿的那部分相匹配!”,那么在所有类别的softmax之后,RoI将被归类为婴儿。

        通过此设置,R-FCN能够通过提出不同的对象区域来同时解决位置方差问题,并通过让每个区域提案引用相同的分数图库来同时解决位置不变性问题。这些分数图应该学会将猫归类为猫,无论猫出现在哪里。最重要的是,它是完全卷积的,这意味着所有的计算都在整个网络中共享。

        因此,R-FCN比Faster R-CNN快几倍,并且达到了相当的精度。

四、SSD里程碑

        我们的最终型号是SSD,代表S ingle-S hot Detector。与R-FCN一样,它比Faster R-CNN提供了巨大的速度提升,但方式明显不同。

        我们的前两个模型分两个单独的步骤执行区域建议和区域分类。首先,他们使用区域提案网络来生成感兴趣的区域;接下来,他们使用全连接层或位置敏感的卷积层对这些区域进行分类。SSD 在“单次拍摄”中完成这两个操作,在处理图像时同时预测边界框和类。

具体来说,给定一个输入图像和一组真实标签,SSD 执行以下操作:

  1. 将图像通过一系列卷积层,产生几组不同比例的特征图(例如 10x10,然后是 6x6,然后是 3x3 等)
  2. 对于每个特征映射中的每个位置,请使用 3x3 卷积筛选器来评估一小组默认边界框。这些默认边界框基本上等同于 Faster R-CNN 的锚框。
  3. 对于每个框,同时预测 a) 边界框偏移量和 b) 类概率
  4. 在训练期间,将地面实况框与基于 IoU 的这些预测框进行匹配。最佳预测框将与所有其他具有 IoU 且真值为 >0.5 的框一起标记为“正数”。

        SSD听起来很简单,但训练它有一个独特的挑战。使用前两个模型,区域提案网络确保我们试图分类的所有内容都具有成为“对象”的最小概率。但是,对于SSD,我们跳过了该过滤步骤。我们从图像中的每个位置对边界框进行分类和绘制,使用多个不同的形状,在几个不同的比例下。因此,我们生成的边界框数量比其他模型多得多,而且几乎所有边界框都是否定示例。

        为了解决这种不平衡,SSD做了两件事。首先,它使用非极大值抑制将高度重叠的盒子组合成一个盒子。换句话说,如果四个形状、大小等相似的盒子。包含同一只狗,NMS 将保留置信度最高的那只并丢弃其余的狗。其次,该模型使用一种称为硬负挖掘的技术来平衡训练期间的类。在硬负挖掘中,每次训练迭代中仅使用具有最高训练损失(即误报)的负示例的子集。SSD 保持 3:1 的负负与正之比。

        它的架构如下所示:

        正如我上面提到的,最后有“额外的要素图层”可以缩小大小。这些不同大小的特征图有助于捕获不同大小的对象。例如,以下是 SSD 的实际应用:

        在较小的特征图(例如4x4)中,每个单元格覆盖图像的较大区域,使它们能够检测较大的物体。区域建议和分类同时执行:给定 p 个对象类,每个边界框都与一个 (4+p) 维向量相关联,该向量输出 4 个框偏移坐标和 p 类概率。在最后一步中,softmax再次用于对对象进行分类。

        最终,SSD与前两种型号没有太大区别。它只是跳过“区域建议”步骤,而是同时考虑图像每个位置的每个边界框及其分类。由于SSD可以一次性完成所有操作,因此它是三种型号中最快的,并且性能仍然相当可比。

五、结论

        更快的 R-CNN、R-FCN 和 SSD 是目前最好和最广泛使用的三种对象检测模型。其他流行的模型往往与这三个模型非常相似,都依赖于深度CNN(阅读:ResNet,Inception等)来完成最初的繁重工作,并且在很大程度上遵循相同的提案/分类管道。

        在这一点上,使用这些模型只需要了解Tensorflow的API。Tensorflow在这里有一个关于使用这些模型的入门教程。试一试,祝黑客愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

凸包检测、直线检测、点集拟合、二维码检测

目录 1、凸包检测 2、直线检测 3、点集拟合 4、二维码检测 1、凸包检测 //凸包检测 int test1() {Mat img imread("F:/testMap/hand.png");if (img.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}// 二值化Mat gray,…

Splashtop 亮相上安会,助力企业安全远程办公

2023年7月5-7日&#xff0c;2023第二届上海网络安全博览会暨高峰论坛在上海新国际博览中心举办。 本届上安会由上海市信息网络安全管理协会等单位主办&#xff0c;上海科学院、上海汽车集团等机构联合协办。大会围绕数字发展主题&#xff0c;多方位展示了网络安全行业的最新发…

SQL性能规范

一、随聊 记录一下吧&#xff0c;2023年7月13日00:11:11&#xff0c;现在的状态真的很&#xff0c;忙&#xff0c;干不完的活&#xff0c;希望巨大的压力&#xff0c;能够让自己快速成长&#xff0c;回想我这一路&#xff0c;21年大专毕业&#xff0c;用一年时间熟悉软件&…

JDK的安装与配置

所有的开发&#xff0c;第一步必然是准备环境&#xff0c;而JDK提供了一套完整的工具和环境&#xff0c;使开发人员能够编写、编译和运行Java应用程序。是Java开发的基础&#xff0c;为开发者提供了丰富的功能和工具&#xff0c;简化了Java应用程序开发的过程。所以这里就记录一…

C++教程——vector容器、deque容器、stack容器、queue容器、list容器、set容器、map容器

vector容器 基本概念 vector赋值操作 vector容量和大小 vector插入与删除 vector数据存取 vector互换容器 vector预留空间&#xff1a;减少开辟内存空间的次数 deque容器 deque构造函数 deque赋值方式 deque大小操作 deque插入和删除 deque数据存取 deque排序 stack容器 stack…

iOS开发 - 系统自带框架实现扫一扫功能

iOS 扫一扫 利用系统自带框架实现扫一扫功能 一 项目配置 扫一扫功能相机和相册权限&#xff0c;在info.plist中设置询问用户是否允许访问的权限。 info.plist加入NSCameraUsageDescription、NSPhotoLibraryUsageDescription、NSPhotoLibraryAddUsageDescription <key&g…

java.lang.UnsatisfiedLinkError: Could not load SWT library.

java.lang.UnsatisfiedLinkError: Could not load SWT library. https://download.eclipse.org/windowbuilder/lastgoodbuild

力扣206. 反转链表

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 题解 方法一&#xff1a;类似头插法 设置3个指针cur、next、newhead&#xff0c;其中cur和next指向当前链表头…

Kubernetes基础知识点

k8s可以看做是一个集群操作系统&#xff0c;能够对容器进行调度和编排。 Kubernetes中的基本对象 pod 是k8s中的最小单位&#xff0c;一个pod封装一个或者多个容器&#xff0c;存储资源。 deployment 是对pod的服务化封装&#xff0c;可以包含一个或多个pod statefulset 为…

ArcGIS处理nc数据步骤

降水温度蒸散发等气象数据通常以NC格式存储&#xff0c;可以用Matlab和ArcGIS读取数据。常为逐年逐月逐日数据。在用GIS进行数据分析时&#xff0c;需要将其转换为栅格数据。 &#xff08;1&#xff09;打开nc数据。打开GIS, ArcToolbox-Multidimension Tools-Make NetCDF Rast…

多线程高频知识点—2023

多线程高频知识点—2023 多线程的基本概念什么是线程/进程为什么在进程中还需要线程呢&#xff1f;同步与异步的区别程序计数器多线程的应用场景多线程的创建方式手写一个异步日志框架多线程线程安全问题 多线程的基本概念 什么是cpu CPU的中文名称是中央处理器&#xff0c;是…

【优选算法】—— 滑动窗口类问题

本期&#xff0c;我给大家带来的是关于滑动窗口类算法的介绍&#xff0c;并通过具体的题目帮助大家思考理解。 目录 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;题目讲解 1、难度&#xff1a;medium 1️⃣长度最小的子数组 2️⃣找到字符串中所有字⺟…

Xcode 更新后 Version 14.3.1报错

File not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a Xode版本和pod版本不一致导致&#xff0c;改成一致就可以了 放在podfile文件里,最后一个pod,和最后一个end中间 Showing Recent …

将字符串转换为字典json.loads(字符串)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将字符串转换为字典 json.loads(字符串) [太阳]选择题 关于以下代码说法错误的是? import json myStr{"name":"xiaobai","age":30} print(【显示】mySt…

【论文阅读】TransCAM: Transformer Attention-based CAM Refinement for WSSS

分享一篇阅读的用于弱监督分割的论文 论文标题&#xff1a; TransCAM: Transformer Attention-based CAM Refinement for Weakly Supervised Semantic Segmentation 作者信息&#xff1a; 代码地址&#xff1a; https://github.com/liruiwen/TransCAM Abstract 大多数现有…

java判断某个字符串是否在字符串数组中的方法(4种)

1.效率最高&#xff08;最原始&#xff09; 代码如下&#xff08;示例&#xff09;&#xff1a; public class Demo { public static boolean useLoop(String[] arr, String targetValue) { for (String s : arr) { if (s.equals(targetValue)) return true; } return false; }…

图像分类——模型微调

目录 微调热狗识别获取数据集模型构建与训练 微调 热狗识别 获取数据集 import tensorflow as tf import pathlibtraindirhotdog/train testdirhotdog/test image_gentf.keras.preprocessing.image.ImageDataGenerator(rescale1/255) train_data_genimage_gen.flow_from_direc…

2023年Q2空调行业品牌数据榜单(京东商品数据)

随着夏季的来临&#xff0c;高温天气也带动部分家电行业的销售&#xff0c;以空调为代表的家电市场正逐步恢复活力。结合鲸参谋电商数据分析平台的相关数据&#xff0c;我们来分析一下2023年Q2空调市场的具体销售表现。 根据鲸参谋平台的数据显示&#xff0c;2023年4-6月份&am…

TypeScript学习(2)- ts基本类型

类型声明式Ts非常重要的一个特点&#xff0c;通过类型声明可以指定TS中变量&#xff08;参数&#xff0c;形参&#xff09;的类型。指定类型后&#xff0c;当为变量赋值时&#xff0c;ts编译器会自动检查值是否符合类型声明&#xff0c;符合则赋值&#xff0c;否则报错。 目录 …

从VAE到Diffusion生成模型详解(1):VAE

文章目录 1. 生成式模型简介2. PixelRNN/CNN3. VAE3.1 自编码器AE3.2 VAE基本原理3.3 VAE公式推导 4. 参考 1. 生成式模型简介 什么是生成式模型 给定训练集&#xff0c;产生与训练集同分布的新样本。如下图所示&#xff0c;希望学习到一个模型 p m o d e l ( x ) p_{model}(…