如何使用OpenCV对物体进行搜索检测与识别

在本教程中,我们将了解对象检测中称为“选择性搜索”的重要概念 。我们还将用C ++和共享代码 。
物体检测与物体识别
对象识别算法识别图像中存在哪些对象 。它将整个图像作为输入,并输出该图像中存在的对象的类标签和类概率 。例如,类标签可以是“狗”,相关的类概率可以是97% 。
另一方面,对象检测算法不仅告诉您图像中存在哪些对象,还输出边界框(x,y,宽度,高度)以指示图像内对象的位置 。
所有物体检测算法的核心是物体识别算法 。假设我们训练了一个物体识别模型,该模型识别图像斑块中的狗 。该模型将判断图像中是否有狗 。它不会告诉对象的位置 。
为了本地化对象,我们必须选择图像的子区域(块),然后将对象识别算法应用于这些图像块 。对象的位置由图像块的位置给出,其中对象识别算法返回的类概率高 。
生成较小子区域(补丁)的最直接方法称为滑动窗口方法 。然而,滑动窗口方法有几个局限性 。一类称为“区域提议”算法的算法克服了这些限制 。选择性搜索是最受欢迎的区域提案算法之一 。
滑动窗口算法
在滑动窗口方法中,我们在图像上滑动框或窗口以选择补丁,并使用对象识别模型对窗口覆盖的每个图像补丁进行分类 。它是对整个图像上的对象的详尽搜索 。我们不仅需要搜索图像中的所有可能位置,还必须搜索不同的比例 。这是因为对象识别模型通常以特定尺度(或尺度范围)进行训练 。这导致对数万个图像块进行分类 。
问题并没有在这里结束 。滑动窗口方法适用于固定宽高比的物体,如面部或行人 。图像是3D对象的2D投影 。宽高比和形状等对象特征会根据拍摄图像的角度而有很大差异 。滑动窗口方法,因为当我们搜索多个宽高比时,计算上非常昂贵 。
【如何使用OpenCV对物体进行搜索检测与识别】区域提案算法
到目前为止我们讨论的问题可以使用区域提议算法来解决 。这些方法将图像作为输入和输出边界框,对应于图像中最可能是对象的所有面片 。这些区域提议可能是嘈杂的,重叠的并且可能不完全包含对象,但是在这些区域提议中,将有一个非常接近图像中的实际对象的提议 。然后我们可以使用对象识别模型对这些提议进行分类 。具有高概率得分的区域提议是对象的位置 。
区域提议算法使用分段识别图像中的预期对象 。在分割中,我们基于一些标准(例如颜色,纹理等)将相邻区域彼此相似地分组 。与我们在所有像素位置和所有尺度上寻找对象的滑动窗口方法不同,区域建议算法通过以下方式工作:将像素分组为较少数量的段 。因此,生成的最终提案数量比滑动窗口方法少很多倍 。这减少了我们必须分类的图像补丁的数量 。这些生成的区域提议具有不同的比例和宽高比 。
区域提案方法的一个重要特性是具有非常高的召回率 。这只是一种奇特的说法,即包含我们正在寻找的对象的区域必须在我们的区域提案列表中 。为了实现这一点,我们的区域提议列表最终可能会包含许多不包含任何对象的区域 。换句话说,区域提议算法可以产生大量的误报,只要它能够捕获所有真正的正数 。大多数这些误报将被物体识别算法拒绝 。当我们有更多的误报并且精度受到轻微影响时,检测所需的时间就会增加 。但是,召回率高仍然是一个好主意,因为错过包含实际对象的区域的替代方案会严重影响检测率 。
已经提出了几种区域提议方法,例如
在所有这些区域提议方法中,选择性搜索是最常用的,因为它速度快且召回率很高 。