本文概述
- 图像分类与目标检测
- 通用对象检测框架
- 区域提案
- 特征提取
- Tensorflow检测API
- 总结
与我在不同的图像分类架构上撰写的博文类似, 我将介绍两种对象检测架构。我将讨论Tensorflow Detection API中目前都可用的SSD和Faster RCNN。
首先, 我将介绍对象检测中的一些关键概念, 然后说明如何在SSD和Faster RCNN中实现这些概念。
图像分类与目标检测 人们经常将图像分类和物体检测场景混淆。通常, 如果要将图像分类为特定类别, 请使用图像分类。另一方面, 如果要确定图像中对象的位置, 例如, 计算对象的实例数, 则可以使用对象检测。
![物体检测入门权威指南](http://img.readke.com/220514/204S113M-0.jpg)
文章图片
说明分类和对象检测之间的区别。
但是, 这两种情况之间有些重叠。如果要将图像分类为某个类别, 则可能会发生执行分类所需的对象或特征相对于完整图像而言太小的情况。在这种情况下, 即使你对对象的确切位置或数量不感兴趣, 也可以通过对象检测而不是图像分类来获得更好的性能。
想象一下, 你需要检查电路板并将其分类为缺陷或正确。虽然本质上是分类问题, 但缺陷可能太小而无法用图像分类模型注意到。构造对象检测数据集将花费更多时间, 但很可能会导致模型更好。
![物体检测入门权威指南](http://img.readke.com/220514/204S12D0-1.jpg)
文章图片
带有缺陷的IC板的示例。
使用图像分类模型, 可以生成完整图像的图像特征(通过传统或深度学习方法)。这些功能是图像的集合。使用对象检测, 你可以在图像的更细粒度, 更细粒度的区域级别上执行此操作。在前一种情况下, 你可能无法跟踪分类信号, 而在后一种情况下, 可能会以更适合用例的方式保存信号。
资料需求
为了训练自定义模型, 你需要标记的数据。在对象检测中标记的数据是具有相应边界框坐标和标签的图像。也就是说, 左下角和右上角(x, y)坐标+类。
![物体检测入门权威指南](http://img.readke.com/220514/204S15323-2.jpg)
文章图片
图像中狗的归一化边界框坐标为[0.1, 0.44, 0.34, 0.56]和[0.72, 0.57, 0.87, 0.77]
经常要问的一个问题是:为了对问题X进行物体检测, 我需要多少张图片?相反, 更重要的是正确地了解将在哪种方案中部署模型。每个类都必须有大量(例如> 100, 甚至可能> 1000)代表性图像, 这一点至关重要。在这种情况下, 具有代表性的意思是它们应与使用模型的场景范围相对应。如果要构建将在汽车中运行的交通标志检测模型, 则必须在适当的环境下使用在不同天气, 光照和摄像头条件下拍摄的图像。对象检测模型并不是魔术, 而是愚蠢的。如果该模型没有足够的数据来学习常规模式, 那么它将在生产中表现不佳。
![物体检测入门权威指南](http://img.readke.com/220514/204S14D5-3.jpg)
文章图片
尽管左侧的图像清晰且易于检测, 但最终, 你应该训练能更好地反映用例的数据。
通用对象检测框架 通常, 对象检测框架中包含三个步骤。
- 首先, 使用模型或算法来生成感兴趣的区域或区域建议。这些区域提议是跨越整个图像(即对象定位组件)的一大套边界框。
- 在第二步中, 为每个边界框提取视觉特征, 对其进行评估, 并基于视觉特征(即, 对象分类组件)确定提案中是否存在以及存在哪些对象。
- 在最后的后处理步骤中, 将重叠的框合并为一个边界框(即非最大抑制)。
![物体检测入门权威指南](http://img.readke.com/220514/204S14159-4.jpg)
文章图片
选择性搜索应用于图像的示例。可以在SS算法中调整阈值以生成更多或更少的建议。
其他方法使用从图像中提取的更复杂的视觉特征来生成区域(例如, 基于来自深度学习模型的特征)或采用蛮力方法进行区域生成。这些强力方法类似于在多个比例和比例上应用于图像的滑动窗口。这些区域是自动生成的, 无需考虑图像特征。
![物体检测入门权威指南](http://img.readke.com/220514/204S12602-5.gif)
文章图片
滑动窗口方法的一个示例。每个边界框都将用作关注区域(ROI)。
生成区域提议所要做出的重要权衡是区域数量与计算复杂性。生成的区域越多, 找到对象的可能性就越大。另一方面, 例如, 如果你详尽地生成所有可能的建议, 则不可能实时运行对象检测器。在某些情况下, 可以使用特定于问题的信息来减少ROI的数量。例如, 行人的比例通常约为1.5, 因此生成0.25的ROI并没有用。
特征提取 特征提取的目的是将可变大小的图像缩小为固定的视觉特征集。图像分类模型通常使用强大的视觉特征提取方法构建。无论它们是基于传统的计算机视觉方法(例如基于过滤器的方法, 直方图方法等)还是深度学习方法, 它们都具有完全相同的目标:从输入图像中提取代表任务的特征并使用这些功能确定图像的类别。在对象检测框架中, 人们通常使用预训练的图像分类模型来提取视觉特征, 因为这些特征往往可以很好地概括。例如, 在MS CoCo数据集上训练的模型能够提取相当通用的特征。为了改善模型, 建议尝试不同的方法。我在转移学习方面的博客文章清楚地区分了不同类型的转移学习及其优缺点。
非最大抑制
非最大抑制的一般思想是将帧中的检测次数减少到实际存在的对象数。如果框架中的对象相当大, 并且已生成2000个以上的对象建议, 则其中的某些对象很可能彼此之间以及对象之间存在明显的重叠。在Coursera上观看此视频, 以了解有关NMS的更多信息。 NMS技术通常是跨不同检测框架的标准配置, 但这是重要的一步, 可能需要根据场景进行超参数调整。
![物体检测入门权威指南](http://img.readke.com/220514/204S13644-6.jpg)
文章图片
人脸检测方面的NMS示例。
评估指标
在对象识别任务中最常用的评估指标是” mAP” , 代表” 平均平均精度” 。它是一个介于0到100之间的数字, 通常值越高越好, 但是该值与分类中的准确性指标不同。
【物体检测入门权威指南】每个边界框都有一个相关的分数(包含对象的框的可能性)。根据预测, 通过改变得分阈值, 为每个类别计算精确召回曲线(PR曲线)。平均精度(AP)是PR曲线下的面积。首先为每个类别计算AP, 然后对不同类别进行平均。最终结果是mAP。
请注意, 如果检测结果具有” 结合处的交集” (IoU或重叠), 且真相框大于某个阈值(通常为0.5), 则该检测结果为真阳性。通常不使用mAP, 而是使用mAP@0.5或mAP@0.25来引用所使用的IoU。
![物体检测入门权威指南](http://img.readke.com/220514/204S13612-7.png)
文章图片
IoU定义的可视化。
Tensorflow检测API Tensorflow Detection API在一个软件包中汇集了许多上述想法, 使你可以使用Tensorflow后端快速迭代不同的配置。使用该API, 你可以使用配置文件定义对象检测模型, 而Tensorflow Detection API负责一起构造所有必要的元素。
原始人
为了更好地了解支持的不同组件是什么, 请查看包含函数定义的” protos文件夹” 。特别是, 在微调模型时, train, eval, ssd, faster_rcnn和预处理原型很重要。
SSD(单发多盒检测器)
总览 SSD架构由Google研究人员于2016年发布。它使用结合区域建议和特征提取的单个深度神经网络提出了一种对象检测模型。
使用了一组不同纵横比和比例的默认框, 并将它们应用于功能图。由于这些特征图是通过使图像经过图像分类网络来计算的, 因此可以在单个步骤中提取边界框的特征。在每个默认边界框中为每个对象类别生成分数。为了更好地拟合地面实况框, 为每个框计算调整偏移量。
![物体检测入门权威指南](http://img.readke.com/220514/204S13362-8.png)
文章图片
利用VGG-16提供的SSD网络功能映射
卷积网络中的不同特征图对应于不同的接收场, 并用于自然地处理不同尺度的对象。由于所有计算都封装在单个网络中, 因此可以实现相当高的计算速度(例如, 对于300×300输入59 FPS)。
用法 对于用法, 我们将研究SSD的不同示例配置文件。利用SSD架构时, 有几个参数很重要, 我们将一一介绍。
首先, 不同的分类网络具有不同的优点和缺点(有关概述, 请参见此博客文章)。例如, 对Inceptionv3网络进行了培训, 可以很好地检测不同比例的物体, 而ResNet体系结构总体上可达到很高的准确性。另一方面, Mobilenet是经过培训以最小化所需计算资源的网络。 ImageNet上特征提取网络的性能, 参数的数量以及对其进行训练的原始数据集都是性能/速度折衷的良好代理。功能提取器在” feature_extractor” 部分中定义。
第二组显而易见的参数是默认框和纵横比的设置。根据问题的类型, 值得分析标记数据的边框的各种纵横比和比例。设置纵横比和比例将确保网络不会进行不必要的计算。你可以在” ssd_anchor_generator” 部分中进行调整。请注意, 添加更多的比例和长宽比将导致更好的性能, 但通常会降低收益。
第三, 训练模型时, 重要的是在” data_augmentation_options” 和” image_resizer” 部分中设置图像大小和数据增强选项。较大的图像尺寸会更好地执行, 因为通常很难检测到较小的物体, 但是它将具有可观的计算成本。数据增强在SSD的环境中尤其重要, 以便能够以不同的比例(甚至可能在训练数据中不存在的比例)检测物体。
最后, 调整” train_config” , 设置学习速率和批处理大小对于减少过度拟合很重要, 这在很大程度上取决于你拥有的数据集的大小。
更快的R-CNN
总览 Faster R-CNN由Microsoft的研究人员开发。它基于R-CNN, 后者使用多阶段方法进行对象检测。 R-CNN使用选择性搜索来确定区域建议, 将其通过分类网络推送, 然后使用SVM对不同区域进行分类。
![物体检测入门权威指南](http://img.readke.com/220514/204S1N21-9.png)
文章图片
R-CNN架构概述。 NMS阶段未显示。
类似于SSD, 更快的R-CNN是一种端到端的方法。代替使用默认的边界框, Faster R-CNN具有区域提议网络(RPN)来生成固定的区域集。 RPN使用图像分类网络中的卷积特征, 从而实现了几乎免费的区域提议。 RPN被实现为完全卷积网络, 可预测每个位置的对象范围和对象得分。
![物体检测入门权威指南](http://img.readke.com/220514/204S144Q-10.png)
文章图片
Faster-RCNN概述
请注意, RPN的设置与SSD网络类似(即, 它不会凭空预测边界框)。 RPN网络可与跨要素地图的滑动窗口一起使用。在每个滑动窗口位置或锚点, 都会使用不同的比例和纵横比来计算一组建议。与SSD相似, RPN的结果是基于锚点的” 调整后” 边界框。
不同的组件在单个设置中组合在一起, 并接受了端到端或多个阶段的培训(以提高稳定性)。 RPN的另一种解释是, 它可以引导网络” 关注” 到有趣的地区。
用法 Faster R-CNN的大多数用法细节与SSD相似。就原始mAP而言, 更快的R-CNN通常胜过SSD, 但它需要大量的计算能力。
Fast-RCNN检测器的一个重要部分是” first_stage_anchor_generator” , 它定义了RPN生成的锚。本节中的跨步定义了滑动窗口的步骤。请注意, 尤其是在尝试检测小物体时(如果跨度太大, 你可能会错过它们)。
尽管Faster-RCNN论文的作者没有使用广泛的数据增强功能, 但仍建议在处理较小的数据集时使用它。
总结 还有其他几种物体检测架构, 我没有涉及。特别是在查看实时应用程序时, Yolov2通常被认为是一种重要的体系结构(与SSD非常相似)。每当将此博客文章添加到Tensorflow Detection API中时, 我都会对其进行更新。
如有任何疑问, 我们很乐意在评论中阅读。如果你想接收我的博客文章的更新, 请在Medium或Twitter上关注我!
推荐阅读
- Python面向对象编程(OOP)(教程)
- Tidyverse入门开发(教程)
- R教程中的逻辑回归
- GFLASSO(R中的图形引导融合LASSO)
- 在Python教程中读写文件
- 在Mac OS X上安装Anaconda
- 文字中单词的绝对频率和加权频率
- 如何安装和使用Homebrew
- Windows 8系统更改区域信息之后导致应用无法打开怎样办【图文】