2019 目标检测(object detection)指南

你好,这里有一份2019年目标检测指南

译者|Arno
来源|medium

目标检测(Object detection)是一种计算机视觉技术,旨在检测汽车、建筑物和人类等目标。这些目标通常可以通过图像或视频来识别。

目标检测在视频监控、自动驾驶汽车、人体跟踪等领域得到了广泛的应用。在本文中,我们将了解目标检测的基础知识,并回顾一些最常用的算法和一些全新的方法。

目标检测的原理

目标检测定位图像中目标的存在,并在该目标周围绘制一个边界框(bounding box)。这通常包括两个过程:预测目标的类型,然后在该目标周围绘制一个框。现在让我们来回顾一些用于目标检测的常见模型架构:
– R-CNN
– Fast R-CNN
– Faster R-CNN
– Mask R-CNN
– SSD (Single Shot MultiBox Defender)
– YOLO (You Only Look Once)
– Objects as Points
– Data Augmentation Strategies for Object Detection

R-CNN 模型

该技术结合了两种主要方法:使用一个高容量的卷积神经网络将候选区域(region-proposals)自底向上的传播,用来定位和分割目标;如果有标签的训练数据比较少,可以使用训练好的参数作为辅助,进行微调(fine tuning),能够得到非常好的识别效果提升。

论文链接: https://arxiv.org/abs/1311.2524?source=post_page—————————

进行特定领域的微调,从而获得高性能的提升。由于将候选区域(region-proposals)与卷积神经网络相结合,论文的作者将该算法命名为R-CNN(Regions with CNN features)。

该模型在对每张图片提取了约2000个自底向上的候选区域。然后,它使用一个大型CNN计算每个区域的特征。然后,利用专门针对类别数据的线性支持向量机(SVMs)对每个区域进行分类。该模型在PASCAL VOC 2010上的平均精度达到53.7%。

该模型中的目标检测系统由三个模块组成。第一个负责生成类别无关的候选区域,这些区域定义了一个候选检测区域的集合。第二个模块是一个大型卷积神经网络,负责从每个区域提取固定长度的特征向量。第三个模块由一个指定类别的支持向量机组成。

该模型采用选择性搜索(selective search)方法来生成区域类别,根据颜色、纹理、形状和大小选择搜索对相似的区域进行分组。在特征提取方面,该模型使用CNN的一个Caffe实现版本对每个候选区域抽取一个4096维度的特征向量。将227×227 RGB图像通过5个卷积层和2个完全连接层进行前向传播,计算特征。论文中所解释的模型与之前在PASCAL VOC 2012的结果相比,取得了30%的相对改进。

而R-CNN的一些缺点是:

  • 训练需要多阶段: 先用ConvNet进行微调,再用SVM进行分类,最后通过regression对 bounding box进行微调。
  • 训练空间喝时间成本大: 因为像VGG16这样的深度网络占用了大量的空间。
  • 目标检测慢: 因为其需要对每个目标候选进行前向计算。

Fast R-CNN

下面的论文中提出了一种名为Fast Region-based Convolutional Network(Fast R-CNN)目标检测方法。

https://arxiv.org/abs/1504.08083?source=post_page—————————

它是用Python和c++使用Caffe实现的。该模型在PASCAL VOC 2012上的平均精度为66%,而R-CNN的平均精度为62%。

与R-CNN相比,Fast R-CNN具有更高的平均精度、单阶段训练,训练更新所有网络层并且特征缓存不需要磁盘存储。

在其架构中, Fast R-CNN接收图像以及一组目标候选作为输入。然后通过卷积层和池化层对图像进行处理,生成卷积特征映射。然后,通过针对每个推荐区域,ROI池化层从每个特征映射中提取固定大小的特征向量。

然后将特征向量提供给完全连接层。然后这些分支成两个输出层。其中一个为多个目标类生成softmax概率估计,而另一个为每个目标类生成4个实数值。这4个数字表示每个目标的边界框的位置。

Faster R-CNN

论文链接: https://arxiv.org/abs/1506.01497?source=post_page—————————

论文提出了一种针对候选区域任务进行微调和针对目标检测进行微调的训练机制。

Faster R-CNN模型由两个模块组成:负责提出区域的深度卷积网络和使用这些区域的Fast R-CNN探测器。候选区域网络(Region Proposal Network)以图像为输入,生成矩形目标候选的输出。每个矩形都有一个objectness score。

Mask R-CNN

论文链接: https://arxiv.org/abs/1703.06870?source=post_page—————————

论文提出的模型是上述Faster R-CNN架构的扩展。它还可以用于人体姿态估计。

在该模型中,使用边界框和对每个像素点进行分类的语义分割对目标进行分类和定位。该模型通过在每个感兴趣区域(ROI)添加分割掩码(segmentation mask)的预测,扩展了Faster R-CNNR-CNN。Mask R-CNN产生两个输出:类标签和边界框。

SSD: Single Shot MultiBox Detector

论文链接: https://arxiv.org/abs/1512.02325?source=post_page—————————

论文提出了一种利用单个深度神经网络对图像中目标进行预测的模型。该网络使用应用于特征映射的小卷积滤波器为每个目标类别生成分数。

这种方法使用了一个前馈卷积神经网络,针对那些方框里的目标类别实例,产生一个固定大小的边界框的集合和分数。增加了卷积特征层,允许多比例特征映射检测。在这个模型中,每个特征映射单元(feature map cell)都链接到一组默认的边界框(default box)。下图显示了SSD512在动物、车辆和家具上的性能。

You Only Look Once (YOLO)

论文提出了一种基于神经网络的图像边界框和类概率预测方法。

论文链接: https://arxiv.org/abs/1506.02640?source=post_page—————————

YOLO模型每秒实时处理45帧。YOLO将图像检测看作是一个回归问题,使得它的管道非常简单。因为这个简单的管道,它非常快。

它可以实时处理流视频,延迟小于25秒。在训练过程中,YOLO可以看到整个图像,因此能够在目标检测中包含上下文。

在YOLO中,每个边界框都由整个图像的特征来预测。每个边界框有5个预测:x, y, w, h,和置信度。(x, y)表示边界框的中心相对于网格单元格的边界。w和h是整个图像的预测宽度和高度。

该模型作为卷积神经网络实现,并在PASCAL VOC检测数据集上进行了评价。网络的卷积层负责提取特征,全连接层负责预测坐标和输出概率。

该模型的网络架构受到了用于图像分类的GoogLeNet模型的启发。该网络有24个卷积层和2个全连接层。该模型的主要挑战在于,它只能预测一个类,而且在鸟类等小目标上表现不佳。

该模型的平均精度达到52.7%,但有可能达到63.4%。

Objects as Points

论文提出将目标建模为单个点。它使用关键点估计来找到中心点,并回归到其他目标属性。

论文链接: https://arxiv.org/abs/1904.07850v2?source=post_page—————————

这些属性包括3D位置、姿态和尺寸。它使用了CenterNet,这是一种基于中心点的方法,比其他边界框探测器更快、更准确。

目标大小和姿态等属性是由图像中心位置的特征回归得到的。该模型将图像输入卷积神经网络,生成热力图。这些热力图中的峰值表示图像中目标的中心。为了估计人体姿态,该模型检测关节点(2D joint)位置,并在中心点位置对其进行回归。

在COCO上,该模型以每秒1.4帧的速度实现了45.1%的平均精度。下图显示了与其他研究论文的结果进行比较的结果。

Learning Data Augmentation Strategies for Object Detection

数据增广包括通过旋转和调整大小等操作原始图像来创建新图像数据的过程。

论文链接: https://arxiv.org/abs/1906.11172v1?source=post_page—————————

虽然这本身不是一个模型结构,但论文提出了可以应用于可以转移到其他目标检测数据集的目标检测数据集的变换的创建。转换通常在训练时应用。

该模型将增广策略定义为训练过程中随机选择的n个策略集合。该模型中应用的一些操作包括颜色变化、图像几何变化以及只变化bounding box annotations的像素内容。

在COCO数据集上的实验表明,优化数据增广策略可以使检测精度提高到+2.3以上的平均精度。这使得单个推理模型的平均精度达到50.7。

总结

现在,我们应该对在各种上下文中进行目标检测的一些最常见的技术(以及一些最新的技术)有所了解。
上面的论文/摘要也包含它们的代码实现的链接。希望能看到你在测试这些模型后得到的结果。

使用自动编码器实现穿衣图像分割

~~时装业是人工智能领域很有前景的领域。研究人员可以开发具有一定实用价值的应用。我已经在这里展示了我对这个领域的兴趣,在那里我开发了一个来自Zalando在线商店的推荐和标记服装的解决方案。~~

在这篇文章中,我们会开发一个提取连衣裙的应用。它输入原始的图像(从网络上下载或用智能手机拍照),并提取图像中的连衣裙。分割的难点在于原始图像中存在了大量的噪声,但是我们会在预处理期间通过一个技巧来解决这个问题。

~~最后,您还可以尝试将此解决方案与之前引用的解决方案合并。这允许您通过外出和拍摄时拍摄的照片,开发一个实时推荐和标记服装的系统。~~

数据集

最近有一项关于服装视觉分析和分割的Kaggle比赛。这是一个非常有趣的比赛,但它并不适合我们。我们的目标是从图像中提取连衣裙,因此这个数据集不太适合我们,因为它包含了比较多的冗余。我们需要的是包含连衣裙的图像,因此最好自己来构建数据集。

我收集了网络上的一些图片,其中包含了在不同场景穿着不同类型的连衣裙的人。然后需要创建蒙版,它在每个对象分割任务中都是必要的。

下面是我们的数据样本。我从互联网上收集了一些原始图像,经过进一步剪切,将人与衣服分开。

图像分割示例

因为我们要将背景、皮肤和连衣裙进行分离,首先要将它们区分出来。背景和皮肤是本问题中最相关的噪声源,我们要尽量减少它们的干扰。

通过手动分割来创建蒙版,如下图所示,简单的对蒙版进行二值化。

蒙版示例

最后一步,我们将所有的蒙版图像合并为三维的单个图像。这张照片表示了原始图像的相关特征。我们的目的主要是分离背景,皮肤和连衣裙,因此这个图像非常适合!

最终蒙版

我们对数据集中的每个图像重复这个过程,为每个原始图像提供三维的对应蒙版。

模型

我们可以很容易的建立模型,过程非常简单:

我们需要训练这样一个模型,该模型输入原始图像,可以输出它的三维蒙版,即分离皮肤、背景和衣服。训练完成之后,当一个新的图像输入时,我们就可以将它分成三个不同的部分:背景、皮肤和衣服。我们只关注感兴趣区域(连衣裙),这样蒙版结合原始图像,就可以裁剪出我们需要的连衣裙。

我们使用UNet建立该模型,它经常用于类似的分割任务,而且很容易在Keras中实现。

在开始训练之前,要对所有的原始图像进行均值标准化。

结果和预测

在预测期间,当遇到高噪声的图像(背景或皮肤模糊等)时,模型开始动荡。这种问题可以简单地通过增加训练图像的数量进行解决。但我们也开发了一个巧妙的方法来避免这种问题。

我们使用 OpenCV 提供的 GrubCut 算法。该算法利用高斯混合模型分离前景和背景。通过它可以帮助我们找到图像中的人物。

我们只实现了简单的功能。假设感兴趣的人站在图像的中间。

def cut(img):
img = cv.resize(img,(224,224))

mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
height, width = img.shape[:2]
rect = (50,10,width-100,height-20)
cv.grabCut(img,mask,rect,bgdModel,fgdModel,5,
cv.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img2 = img*mask2[:,:,np.newaxis]
img2[mask2 == 0] = (255, 255, 255)

final = np.ones(img.shape,np.uint8)*0 + img2

return mask, final

执行GrubCut结果

下面是结合使用GrubCut和UNet之后的结果:

GrubCut与UNet相结合得到了优秀的结果。

总结

在这篇文章中,我们为连衣裙分割开发了一套解决方案。为了达到这个目的,我们使用了GrubCut和UNet。我们计划在真实照片中使用这个解决方案,并根据它构建一个视觉推荐系统。

文章

代码