本篇文章8740字,读完约22分钟

雷锋。(公开号码:雷锋。新闻:地平线丹尼尔演讲厅的算法工程师入门第三阶段受到了重创!在本期Horizon Deep Learning中,算法工程师黄将分享与对象检测相关的内容。全文约8000字。建议阅读20分钟。请转发或收集它。

干货 | 算法工程师入门第三期——黄李超讲物体检测

门户前:

干货|第一期算法工程师-罗恒谈深度学习

干货|算法工程导论第二阶段-穆利森谈加强学习(一)

干货|算法工程导论第二阶段-穆利森谈加强学习(二)

这种分享主要是为一些对深度学习和物体检测感兴趣的学生。内容主要包括:

首先,什么是对象检测以及如何评估对象中的系统。

第二,目标检测的整体框架是什么?它通常包括图像的分类和目标检测的位置。

再次,介绍了目标检测的历史发展,从传统的人工设计一些图像特征和分类器到现在的深度学习。

ψ1

什么是计算机视觉

在介绍物体检测之前,我们必须首先知道什么是计算机视觉。计算机视觉是计算机科学的一个分支,旨在构建智能算法和程序来“观察”世界。例如,如果一个机器人手里拿着一样东西,它就可以知道自己手里拿着一个魔方。这个问题对人来说很简单,但对电脑来说就不那么容易了。由于计算机获得的信息是一系列描述每个像素颜色强度的二进制数据,计算机本身很难将这些信息抽象成更高级的语义表达,以对应现实生活中的名词概念。

干货 | 算法工程师入门第三期——黄李超讲物体检测

因此,我们通常所说的“看见”实际上包括视觉信息的处理和与现实世界的关系的映射。那么在计算机视觉领域,我们如何定义“看”的概念,这与我们人类的理解是一致的?这里我们将其分为三个层次:

干货 | 算法工程师入门第三期——黄李超讲物体检测

第一个层次,也是最经典的解释,被大卫·马尔(著名的生物神经科学家,计算机视觉理论的创始人)在1982年总结为“通过观察知道什么在哪里”。中文的意思是知道那里有什么,在哪里。这是“看”的一个基本概念。它对应于计算机视觉中的几个基本问题:一个是图像识别,即解决什么,另一个是物体定位,即在哪里。在这里,我们还需要提到“图像语义分割”的概念,这是一个像素级的对象识别,也就是说,每个像素必须判断其类别。它与检测的区别在于,对象检测是对象级的,它只需要一个框架来框定对象的位置,但通常分割是一个比检测更困难的问题。

干货 | 算法工程师入门第三期——黄李超讲物体检测

在更高的层次上,除了知道图像像素/二维平面中的每个像素所表示的信息之外,我们可能还需要知道这个对象在现实世界中的3d信息。例如,给定一张卧室照片、一些相机参数和一些环境假设,我们需要知道这张3D 空中床的真实位置,包括它的长度、宽度和高度。在这个层次上,一个重要的话题是slam,这是我们经常提到的,即同时定位和绘图。这个方向在机器人学领域起着非常重要的作用。

干货 | 算法工程师入门第三期——黄李超讲物体检测

第三个层次是更高层次的视觉问题。例如,给定一幅图片或视频,我们需要知道在这个场景中发生了什么。如果是更先进的系统,我们甚至希望电脑能根据图片或视频回答一些问题。这是过去两年中非常流行的视觉问答方向。

干货 | 算法工程师入门第三期——黄李超讲物体检测

现在我们得到了物体探测的回报。目标检测是视觉感知的第一步,也是计算机视觉的一个重要分支。目标检测的目的是用一个框架来标记目标的位置,并给出目标的类别。目标检测不同于图像分类。检测侧重于目标搜索,目标检测目标必须具有固定的形状和轮廓。图像分类可以是一个任意的目标,它可以是一个对象,或者是一些属性或场景。

干货 | 算法工程师入门第三期——黄李超讲物体检测

目标检测评估

给定一个物体检测系统,我们如何评估它的质量?目标检测的输出是一系列帧,加上它们属于某个类别的置信度得分。在评估时,我们需要将它们与基本事实相匹配。一个好的检测帧应该与标记帧有很大的重叠率,同时不能重复检测同一物体。我们将重叠率高的盒子定义为真阳性,将重叠率低(甚至没有重叠)且重复检测的盒子定义为假阳性。

干货 | 算法工程师入门第三期——黄李超讲物体检测

我们还需要定义两个描述性指标:精确度和召回率。精度是真阳性量除以真阳性和假阳性的比率,即所有检测结果中的正确比例。回忆是所有true正数的数量与注释框的数量之比,即系统检测到的所有目标的比例。

干货 | 算法工程师入门第三期——黄李超讲物体检测

接下来,我们可以根据置信度对检测结果进行排序,设置一个阈值,然后在这种情况下计算精度和召回率。通过设置不同的阈值,我们可以获得多组精度和召回率。如果我们在一张图上画出所有的精度和召回率,x轴代表召回率,y轴代表精度,那么我们得到的图就叫做pr(精度-召回率)曲线。我们可以用这条曲线在X轴上的积分来描述物体检测的质量。这个指数被称为平均精度(ap)。ap的高值意味着系统可以在高召回率的情况下保持高精度。现在,在一些成熟的人脸检测系统中,ap超过90%。如果我们直接用标签来计算ap,它必须是100%。

干货 | 算法工程师入门第三期——黄李超讲物体检测

如何检测物体

让我们来谈谈如何进行对象检测。事实上,这很简单。一个典型的想法是我搜索所有可能的位置。然后分类所有可能的位置,看看它是否包含这个对象。因此,我们将这个问题分解为两个步骤。第一步是找到目标的位置,第二步是做置信度分类。

干货 | 算法工程师入门第三期——黄李超讲物体检测

一般来说,搜索目标位置的方法可以分为两类:

第一个是列出所有可能的位置和大小:我可以通过扫描窗口扫描,从图像的左上角开始,从左到右,从上到下,一直到右下角,然后我们改变图像的大小,保持扫描窗口的大小不变,继续扫描。对于每个位置和大小,我们可以通过后续处理得到一个置信度得分,这是图像模板匹配最典型的例子。在模板匹配的经典例子中,扫描窗口中使用的模板是图像块,置信度的计算方法是相关性。如果当前位置与模板匹配,得分越高。所以我们可以用这种方法得到物体的位置。

干货 | 算法工程师入门第三期——黄李超讲物体检测

遍历所有可能的位置太耗时了。我们可以用一些启发式方法快速得到一些区域建议吗?这种方法通常称为区域建议法。这种方法可以是有监督的,也可以是无监督的。选择性搜索是一种常用的无监督区域建议方法。其原理是根据像素的相似性逐层合并。当它们被合并时,可以获得区域的边界,然后这些区域可以被转换成区域建议的盒子。

干货 | 算法工程师入门第三期——黄李超讲物体检测

识别历史(检测)

有了目标的候选区域,我们如何得到目标的分类分数?这是一个分类问题。事实上,图像识别领域已经有半个多世纪的历史了。图像识别,或模式识别,最早是在20世纪60年代提出的。当时,麻省理工学院的计算机教授为本科生组织了一个为期两个月的暑期项目。本项目的目的是设计一个系统,该系统能够智能地识别场景中的物体并区分类别。显然,当时他们低估了这个问题的难度,而结果是可以想象的。

干货 | 算法工程师入门第三期——黄李超讲物体检测

事实上,自1966年以来,这个问题一直没有完全解决。但是在一定程度上,经过深入学习,这个问题已经在很大程度上解决了。事实上,识别问题本身并不是一件容易的事情。为什么?首先,我们看到的这个物体的外观只是它在特定背景和特定光线条件下以特定角度的投影。另一个角度可能是完全不同的外观。即使是同一个物体,比如一个人,也有许多不同的姿势,所以它的外观也会不同。例如,他可能躺着或站着,有不同的形状。

干货 | 算法工程师入门第三期——黄李超讲物体检测

假设我们事先知道物体的三维形状,识别物体就不会那么困难了。此时,识别问题变成了匹配问题。我们可以预先构造物体的形状,然后搜索可能的透视投影来匹配要识别的图像。如果找到最合适的匹配,则认为识别成功。从20世纪60年代初到90年代,每个人都试图这样做。例如,我们可以定义一些基本的几何形状,然后将对象表示为基本几何形状的组合,然后匹配图像。

干货 | 算法工程师入门第三期——黄李超讲物体检测

但这不是很有效。为什么?首先,许多物体很难用所谓的基本几何来描述,尤其是一些非刚体,如动物。第二,对于一类物体,即使同一物体在不同的姿态下有所不同,也可能有丰富的类内差异。我们需要预先为每个姿势创建一个三维模型模板吗?最后,即使前面的问题都解决了,我们怎样才能准确地从图像中提取这些几何形状呢?因此,虽然这种方法在当时理论上很漂亮,但很难实施。

干货 | 算法工程师入门第三期——黄李超讲物体检测

20世纪90年代以后,主流的方法是只考虑图像本身,而不考虑物体的原始三维形状。这种方法被称为基于外观的技术。当从模式识别的角度描述时,外观是图像特征,它是图像的抽象描述。有了图像特征,我们可以在这个特征内匹配或分类空.最经典的例子之一是“特征脸”方法,这也是20世纪90年代最重要的人脸识别方法之一。其主要思想是利用主成分分析(pca)对人脸数据集进行分解,得到特征向量,然后将每个人脸图像表示为特征向量的组合。这些组合系数构成了面部图像的抽象描述,即特征。最后,我们可以利用样本在特征空中的距离来判断样本是否属于同一张人脸:样本空中同一张人脸之间的距离很小,但是不同人脸之间的距离相对较大。

干货 | 算法工程师入门第三期——黄李超讲物体检测

然而,这种方法仍然存在许多问题。首先,它要求我们对齐所有的图片,比如人脸图像,这就要求每张图片中的五官基本上处于一个固定的位置。然而,在许多应用场景中,目标不像人脸那样规则,这使得很难统一对齐。此外,这种基于全局特征和简单欧氏距离的检索方法不适用于复杂背景、遮挡、几何变化等情况。

干货 | 算法工程师入门第三期——黄李超讲物体检测

2000年后,认可领域取得了长足的进步。首先,在图像特征层面上,人们设计了各种图像特征,如sift、hog、lbp等,这些特征比简单的图像边缘和角点特征更加稳健。同时,机器学习方法的发展也为模式识别提供了各种强大的分类器,如支持向量机、boosting等。在此期间,第一个具有实际应用价值的人脸检测出现了:viola和jones提出的实时人脸检测。在此之前,有些方法要么不是非常有效和快速,要么是缓慢和有同等或更好的结果。因此,作者在cvpr上用摄像机展示了该算法的实时演示,这让观众大吃一惊。该方法的关键是使用基于积分图像和级联分类器的简单图像特征。前者可以在恒定的时间复杂度内计算出任意区域的特征,使得特征提取速度非常快。后者可以在一些简单的背景样本上实现早期投影,大大减少了整幅图像中所有图像块分类的计算量。

干货 | 算法工程师入门第三期——黄李超讲物体检测

另一种方法是dalaland triggs在2005年完成的行人检测工作,通常是用强分类器人工设计图像特征。他们使用hog(基于图像梯度直方图的局部统计特征)作为图像特征,并使用支持向量机(svm)作为分类器以扫描窗口的形式遍历图像的所有位置。

干货 | 算法工程师入门第三期——黄李超讲物体检测

后来,人们在对象建模方面做了一些工作,旨在用更灵活的模型而不是单一的模板来定义对象。事实上,这个想法当时并没有提出。早在1973年,fischler & elschlager就提出了一种基于组件的模型,称为图形结构。它的核心思想有两点:

干货 | 算法工程师入门第三期——黄李超讲物体检测

1.一个物体由特定相对位置的不同部分组成。

2.在不同的对象示例中,可以允许组件的位置在某种程度上不同。我们通常称这种模型为弹簧模型,因为部件之间的连接可以看作是由弹簧连接的。虽然近似位置是固定的,但仍允许有一定的变形自由度。

干货 | 算法工程师入门第三期——黄李超讲物体检测

如果我们把图像结构和上面提到的用于行人检测的hog检测器结合起来,不是更好吗?实际上,这项工作是一个可变形的基于部分的模型(dpm),这是众所周知的领域中的目标检测深入学习变得流行。在这种方法中,使用整个模板和多个组件的模板来描述一个对象,并且组件的位置可以改变。因此,它可以很好地处理复杂的对象。这种方法已经统治帕斯卡voc数据集好几年了。通过引入越来越复杂的图像特征,检测的平均准确率从2007年的17%提高到2012年的41%。正是因为这种方法对数据集的贡献,他的作者之一罗斯·吉尔希克获得了帕斯卡voc数据集终身成就奖。

干货 | 算法工程师入门第三期——黄李超讲物体检测

通过深度学习进行目标检测

我们从第二部分开始,主要讨论深度学习给目标检测领域带来的变化。

首先,关于深度学习的概念,我们只需要记住,深度学习实际上是一种神经网络,是一种特征学习方法。它可以在图像识别、语音识别、自然语言处理等领域取得很好的效果,因为这些领域中的许多问题可以分解为两个步骤:特征提取和模式分类。那么,为什么深度学习可以在许多领域大大超越传统方法呢?本质仍然是“特征”这个词。

干货 | 算法工程师入门第三期——黄李超讲物体检测

以图像分类为例,传统方法需要根据场景和目标人工设计合适的图像特征。例如,当您需要对对象的外观进行建模时,您可能需要基于渐变的特征来描述轮廓。您还需要找到一种方法来过滤和量化梯度信息,并获得相对稳定的表达式。所有这些任务都需要有一定的领域知识来设计和优化。从pascal voc数据集中对象检测方法的发展来看,更好的特征对最终结果起着决定性的作用。

干货 | 算法工程师入门第三期——黄李超讲物体检测

然而,深度学习擅长的是特征学习。它将相关场景和目标的特征学习转化为网络结构的定义和参数的学习,从而消除了领域专家设计特征的需要。我们不需要绞尽脑汁为你的目标设计合适的功能。您只需要向网络提供原始图片和标签,并定义网络结构,这样他就可以从头到尾自动学习多级特征表达式和分类器。深度学习也有很好的扩展性。

干货 | 算法工程师入门第三期——黄李超讲物体检测

你可以设计一个大的模型,用服务器gpu在1000种图像分类数据集上达到80%以上的准确率,或者对一种数据比如人脸做检测,用一个小的模型在手机上达到好的效果。由于深度学习的可扩展性,当数据规模足够大时,我们可以通过增加模型的容量和复杂度轻松获得更好的结果,而许多传统方法在大数据下难以升级。

干货 | 算法工程师入门第三期——黄李超讲物体检测

深度学习如此强大,这是一个全新的概念吗?它和二三十年前的神经网络一样吗?我们需要辩证地看待这个问题。首先,我们的深度学习实际上是对传统神经网络的发展,它的一些基本要素没有改变。例如,深度神经网络的学习方法仍然是反向传播,这是在1986年首次提出的。从1998年开始,现在非常流行的Convnet (Convnet)被应用到字符识别系统中。

干货 | 算法工程师入门第三期——黄李超讲物体检测

现在,由于更快的计算能力和更多的数据,神经网络以模型规模的形式复活了,这在以前是不可想象的。二三十年前,神经网络一般只有两三层,每层最多有几十到几百个神经元。目前,主流的网络结构,如googlenet、resnet,有数百万个参数。除了计算和数据之外,近年来提出的一些神经网络优化技术也在如此大量的训练中起着决定性的作用。例如,relu激活函数的应用使得神经网络比使用tanh、sigmoid和其他激活函数的网络更容易训练和更快收敛。此外,一些更好的神经网络权值初始化方法,一些其他的技巧,如退出,和新的网络结构(resnet等。)与以前相比也大大提高了神经网络的实用性。

干货 | 算法工程师入门第三期——黄李超讲物体检测

这里我们不详细讨论神经网络的基本内容。除了经典的密集连接网络,我们还需要知道卷积和汇集这两种运算,它们是主流神经网络中最常用和最基本的单元。我们继续回到物体探测的问题。众所周知,如果将神经网络用于图像分类,我们可以直接发送图像并直接输出分类结果。那么如何进行物体检测呢?回顾前面提到的目标检测过程,目标检测只不过是搜索和分类。所以,我们可以:1 .用神经网络代替传统的分类器?2.神经网络能做区域搜索吗?3.甚至使用神经网络直接通过输入图像输出目标检测的结果?答案是肯定的。

干货 | 算法工程师入门第三期——黄李超讲物体检测

检测为区域建议+分类

事实上,这三个问题代表了用神经网络进行目标检测的三个基本思想。假设我们直接用卷积神经网络(cnn)代替传统的基于人工设计的特殊分类步骤,它实际上是著名的r-cnn。这个方法的想法很简单。首先,我们需要生成对象可能位置的候选区域,然后将该区域发送给cnn进行分类和检测。任何方法都可以用来生成候选区域,这不是该方法的重点。r-cnn的贡献是用cnn代替了原来的特征提取和分类器。虽然r-cnn的方法很简单,也不是2013年深度学习之火后第一个尝试用cnn解决目标检测的方法,但它是当时最好的方法:在pascal voc检测数据集上比传统的最好方法好得多。

干货 | 算法工程师入门第三期——黄李超讲物体检测

这种方法简单有效,原因如下:1 .将检测问题分解为两个子任务:候选区域搜索和分类,分别进行优化和求解,从而简化了检测任务的学习难度。2.后一种分类可以使用在较大数据集上预先训练的模型,例如imagenet,它提供了非常丰富的图像特征和强大的分类器。如前所述,图像特征在物体识别和检测中起着非常重要的作用。一般来说,特征越强,分类效果越好。因此,在r-cnn的方法中,由imagenet训练的高精度分类模型是“巨人的肩膀”。

干货 | 算法工程师入门第三期——黄李超讲物体检测

虽然r-cnn很简单,但它的实用性受到其速度慢的严重限制。在实验中,检测一幅图像需要40多秒。这次仍然使用当时最好的图形处理器速度。如果使用cpu,速度会慢几倍。这一时间成本主要花费在美国有线电视新闻网的图像分类上。为了获得良好的效果,一幅图像可能会产生数千个候选区域。该分类器需要剪切掉所有近千个候选区域,将它们统一缩放到224*224的大小,然后分别通过cnn。因此,在该方法中,每个区域中分类器的计算是独立的。

干货 | 算法工程师入门第三期——黄李超讲物体检测

事实上,同一图片中的检测候选区域可能是高度相关的,特别是当有许多候选区域时,它们重叠的概率非常高,因此许多计算应该被共享。在此之前,给定检测候选区域,我们对原始图像进行切割和缩放,以获得固定大小的输入图像,并将其发送给分类器。我们可以直接在要素地图上这样做吗?这样,不同的候选区域可以共享特征计算,从而避免从同一区域重复提取特征。改进的方法被称为快速r-cnn。

干货 | 算法工程师入门第三期——黄李超讲物体检测

我们可以通过简单的计算来分析改进后的理想加速比:假设两种方法使用相同的网络结构,原始图像的大小为600*1000,如果我们使用r-cnn,则累积2000个候选区域,输入像素的数量为224 * 224 * 2000;如果使用快速r-cnn,输入像素的数量只有600*1000,这比以前快了大约100倍!

干货 | 算法工程师入门第三期——黄李超讲物体检测

现在让我们看看快速r-cnn在实际操作中的速度。这也是一张帕斯卡voc数据集的图片,它只需要0.2秒就能检测到网络,而r-cnn需要40多秒才能达到同样的精度!现在,候选区域提取已经成为一个瓶颈,通常需要数百毫秒到数秒,并且这一步的计算是独立的。后来,改进的faster-CNN方法引入了一种称为区域提议网络(rpn)的结构来解决这个问题。所谓的rpn是一个cnn,用来预测哪里可能有物体,并通过Return告诉物体的位置。此外,rpn和分类网络共享图像特征,这进一步避免了重复计算。因此,fast RR-CNN实际上是rpn加fast r-cnn,整个系统可以进行端到端的训练。与以前的fastr-cnn相比,fastr-CNN将检测时间从2秒缩短到0.2秒,使得实时检测系统成为可能。

干货 | 算法工程师入门第三期——黄李超讲物体检测

一次性检测

刚才提到的一系列方法将检测问题分为两个步骤:首先,生成区域建议,然后进行分类和返回。另一种方法是希望神经网络可以一步直接定位物体。在快速r-cnn中,rpn是一个弱分类器,不需要精确定位和分类。如果我们要求rpn得到非常准确的结果,我们可以省去分类和定位的步骤,整个过程变得更简单。事实上,这种方法早在r-cnn系列之前就存在了。例如,在2013年,一种叫做“过量进食”的方法就做到了这一点,但是它没有着火,因为它的性能不够好。早些时候,在20世纪90年代,cnn被用来做一些人脸识别工作,这实际上是一个类似的过程。虽然这种方法过程简单,但模型的学习难度比两阶段法更大。为了取得好的效果,有必要在网络设计和学习目标上做出一些努力。

干货 | 算法工程师入门第三期——黄李超讲物体检测

一步到位的方法一些代表现在在yolo,ssd工作。目前,公司使用的densebox也是与ssd类似的方法,这是我2014年末在百度实习时使用的方法。它应该早于ssd和yolo。这里我们主要讨论ssd,它可以实现对pascal voc数据集的实时检测速度,其效果类似于更快的r-cnn。Ssd可以被视为一个增强的rpn,输出层中的每个像素代表一个检测帧。与rpn的一个输出层不同,固态硬盘有几个输出层:浅输出层有较高的分辨率,用于检测较小的物体,而较深的层检测较大的物体。最后,所有层的检测结果被组合作为最终输出。

干货 | 算法工程师入门第三期——黄李超讲物体检测

这样做还需要考虑:由于深层的上下文信息太多,小对象可能会失去它们的有效表达,并且高级特征的分辨率相对较低,这使得难以处理一个区域中的多个对象。本质上,如果要做好目标检测,仍然需要解决目标和模板之间的配准和对齐,包括位置和比例的对齐。R-cnn系列将配准和对准问题交给了regional proposition,但是像ssd这样的一步检测器只能依靠模型本身的感受野来进行配准和对准。因此,如果我们讨论的方法,前者更容易学习,效果会更好。

干货 | 算法工程师入门第三期——黄李超讲物体检测

摘要

使用有线电视新闻网解决检测问题的想法基本上就是这些例行程序。事实上,还有一个方向我们没有讨论过,那就是利用神经网络来学习如何做检测的后处理,比如非最大值抑制。这种工作关注的人相对较少,所以相关的工作也不多。然而,在上述基本框架下仍有许多细节可以研究,例如如何处理对象的大小问题、对象的变形问题、如何使用多任务学习来提高对象检测的性能以及如何在上下文和细节之间取得最佳平衡。

干货 | 算法工程师入门第三期——黄李超讲物体检测

综上所述,今天主要介绍目标检测领域,包括目标检测的概念和评价方法。然后,回顾了近50年来图像识别和检测的发展。在模式识别领域,深度学习是提取图像特征的最佳途径。除非硬件有限,否则只能使用传统方法,否则,最好的深度学习模型可以直接用于实验。我们没有讨论太多实现的细节。事实上,在目标检测领域,细节的处理直接影响模型的最终结果。如果你对它感兴趣,我建议你在特定的数据集上试试,调整参数,慢慢地你就会有自己的理解。

干货 | 算法工程师入门第三期——黄李超讲物体检测

事实上,近二十年来,目标检测的方法框架没有太大变化。为什么以前的方法在那时失败了?当时,人们没有太多的数据和计算资源,所以深度学习,一种数据驱动、计算密集型的方法,在当时完全没有用。此外,当数据非常小时,许多根据数据集的特征专门调整的方法比数据驱动的方法更有效。此外,当时的机器学习工具不像现在这样丰富和方便。即使有,许多使用计算机视觉的人还没有学会使用它们。

干货 | 算法工程师入门第三期——黄李超讲物体检测

历史总是交替发展的。作为一名优秀的研究员,你需要在过去找到一些好的工作。解决问题的具体方法不一定相同,但人们解决问题的总体思路总是相似的。我们需要找出为什么有些方法在那时不起作用,哪些方法现在仍然有应用潜力,我们需要用当前的方法重新检查它们。

干货 | 算法工程师入门第三期——黄李超讲物体检测

-结束-

雷锋的特别贡献。严禁擅自转载。详情请参考转载说明。

标题:干货 | 算法工程师入门第三期——黄李超讲物体检测

地址:http://www.hcsbodzyz.com/hcxw/5284.html