zoukankan      html  css  js  c++  java
  • 转:图像分类、物体检测、物体分割、实例分割、语义分割

    0001,常识1

    计算机视觉的任务很多,有图像分类、目标检测、语义分割、实例分割和全景分割等,那它们的区别是什么呢?
    1、Image Classification(图像分类)

    图像分类(下图左)就是对图像判断出所属的分类,比如在学习分类中数据集有人(person)、羊(sheep)、狗(dog)和猫(cat)四种,图像分类要求给定一个图片输出图片里含有哪些分类,比如下图的例子是含有person、sheep和dog三种。


    2、Object detection(目标检测)

    目标检测(上图右)简单来说就是图片里面有什么?分别在哪里?(把它们用矩形框框住)

    目前常用的目标检测算法有Faster R-CNN和基于YOLO的目标检测的算法
     
    3、semantic segmentation(语义分割)

    通常意义上的目标分割指的就是语义分割

    语义分割(下图左)就是需要区分到图中每一点像素点,而不仅仅是矩形框框住了。但是同一物体的不同实例不需要单独分割出来。对下图左,标注为人,羊,狗,草地。而不需要羊1,羊2,羊3,羊4,羊5等。



    4、Instance segmentation(实例分割)

    实例分割(上图右)其实就是目标检测和语义分割的结合。相对目标检测的边界框,实例分割可精确到物体的边缘;相对语义分割,实例分割需要标注出图上同一物体的不同个体(羊1,羊2,羊3...)

    目前常用的实例分割算法是Mask R-CNN。

    Mask R-CNN 通过向 Faster R-CNN 添加一个分支来进行像素级分割,该分支输出一个二进制掩码,该掩码表示给定像素是否为目标对象的一部分:该分支是基于卷积神经网络特征映射的全卷积网络。将给定的卷积神经网络特征映射作为输入,输出为一个矩阵,其中像素属于该对象的所有位置用 1 表示,其他位置则用 0 表示,这就是二进制掩码。

    一旦生成这些掩码, Mask R-CNN 将 RoIAlign 与来自 Faster R-CNN 的分类和边界框相结合,以便进行精确的分割:

     
    5、Panoramic segmentation(全景分割)

    全景分割是语义分割和实例分割的结合。跟实例分割不同的是:实例分割只对图像中的object进行检测,并对检测到的object进行分割,而全景分割是对图中的所有物体包括背景都要进行检测和分割。

     

    0002,常识2

    转自:https://blog.csdn.net/Gerwels_JI/article/details/82990189

    Directions in the CV

    • 物体分割(Object segment)属于图像理解范畴。那什么是图像理解?Image Understanding (IU) 领域包含众多sub-domains,如图像分类、物体检测、物体分割、实例分割等若干问题。每个问题研究的范畴是什么?每个问题中,各个approach对应的the result of processing是什么?
    • Image Understanding (IU) is an interdisciplinary approach which fuse computer science, mathematics, engineering science, physics, neurosciences, and cognitive science etc. together.
    • 一般我们将CV分为三个大方向:图像处理、图像分析、图像理解。其中图像理解分为以下三个部分
    • Image Classification:
      即是将图像结构化为某一类别的信息,用事先确定好的类别(string)或实例ID来描述图片。其中ImageNet是最权威的测评集,每年的ILSVRC催生大量优秀的深度网络结构,为其他任务提供基础,在应用领域,人脸、场景识别都可以视为分类任务。
    • Detection
      分类任务关心整体,给出的是整张图片的内容描述,而检测则关注特定的物体目标,要求获得这一目标的类别信息和位置信息。相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因而检测模型的输出是一个列表,列表的每一项使用一个数据组给出检出目标的类别和位置,常用矩形检测框的坐标表示。
    • Segmentation
      分割包括语义分割(semantic segmentation)和实例分割(instance segmentation),前者是对背景分离的拓展,要求分离开具有不同语义的图像部分,而后者是检测任务的拓展,要求描述出目标的轮廓(相比检测框更为精细)。分割是对图像的像素级描述,它赋予每个像素类别意义,适用于理解要求较高的场景,如无人驾驶中对道路和非道路的分割。

    后期我会写CV综述,此处留坑占位!
    也会对object segmentation的方法进行总结,占坑!

    Image Classification

    • The task of object classification requires binary labels indicating whether objects are present in an image.
    • Definition:Image Classification根据image中不同图像信息中不同的feature,把不同类别的object region进行分类。
    • 该任务需要我们对出现在某幅图像中的物体做标注。
    • 例如:一共有1000个物体类的image中,某个物体要么有,要么没有。可实现:输入一幅测试图片,输出该图片中物体类别的候选集。如下图所示,不同形状的图形,通过分类分成了8类
      在这里插入图片描述

    Object localization (目标定位)

    • 在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以边界框的(bounding box)形式。
    • 基本思路
    1. 多任务学习,网络带有两个输出分支。一个分支用于做图像分类,即全连接+softmax判断目标类别,和单纯图像分类区别在于这里还另外需要一个“背景”类。另一个分支用于判断目标位置,即完成回归任务输出四个数字标记bounding box位置(例如中心点横纵坐标和包围盒长宽),该分支输出结果只有在分类分支判断不为“背景”时才使用。
    2. 人体位姿定位/人脸定位
      目标定位的思路也可以用于人体位姿定位或人脸定位。这两者都需要我们对一系列的人体关节或人脸关键点进行回归。
    3. 弱监督定位
      由于目标定位是相对比较简单的任务,近期的研究热点是在只有标记信息的条件下进行目标定位。其基本思路是从卷积结果中找到一些较高响应的显著性区域,认为这个区域对应图像中的目标。

    Object detection(目标检测)

    • Detecting an object entails both stating that an object belonging to a specified class is present, and localizing it in the image. The location of an object is typically represented by a bounding box.
    • 理解:object detection=classification+localization
    • 定义:物体探测包含两个问题,一是判断属于某个特定类的物体是否出现在图中;二是对该物体定位,定位常用表征就是物体的边界框(bounding box)。
    • 可实现:输入测试图片,输出检测到的物体类别和位置。如下图,移动的皮卡丘和恐龙
    • 在这里插入图片描述
      在这里插入图片描述

    语义分割(Semantic Segmentation)

    • The task of labeling semantic objects in a scene requires that each pixel of an image be labeled as belonging to a category, such as sky, chair, floor, street, etc. In contrast to the detection task, individual instances of objects do not need to be segmented.
    • 语义标注(Semantic scene labeling)/分割(segmentation):该任务需要将图中每一点像素标注为某个物体类别。同一物体的不同实例不需要单独分割出来。

    Instance segmentation

    • instance segment = object detect +semantic segment
    • 相对物体检测的边界框,实例分割可精确到物体的边缘;相对语义分割,实例分割可以标注出图上同一物体的不同个体
    • 分类任务通常来说就是识别出包含单个对象的图像是什么,但在分割实例时,我们需要执行更复杂的任务。我们会看到多个重叠物体和不同背景的复杂景象,我们不仅需要将这些不同的对象进行分类,而且还要确定对象的边界、差异和彼此之间的关系!
    • 如下图所示,把不同的实例对象进行了分割,并用不同的颜色进行边缘标注(而不是边框标注
      在这里插入图片描述

    Some examples

    综述

    图像理解领域中的object segmentation方向包括了:image classification、object localization、object detection、semantic segmentation、instance-level segmentation。分类复杂度依次递增,分类详细程度依次递增。


    1.  
       
       

    0003,常识

    计算机视觉(CV)一直是目前深度学习领域最热的研究领域,其是一种交叉学科包括计算机科学(computer science / (Graphics, Algorithms, Theory, Systems, Architecture)、数学 (Information Retrieval, Machine Learning)、工程学(Robotics, Speech, NLP, Image Processing)、物理(Optics)、生物学 (Neuroscience), and 神经科学 (Cognitive Science),由于计算机视觉表示了对视觉环境的理解,加上其学科交叉性,众多科学家认为计算机视觉的发展可以为实现理想的人工智能铺路。

    对于问题:什么才是计算机视觉?以下有三个不同的教科书式计算机视觉定义:

    1. “the construction of explicit, meaningful descriptions of physical objects from images” (Ballard & Brown, 1982)

    2. “computing properties of the 3D world from one or more digital images” (Trucco & Verri, 1998)

    3. “to make useful decisions about real physical objects and scenes based on sensed images” (Sockman & Shapiro, 2001)

    那么为什么要研究计算机视觉呢?最简单的答案就是其可以将研究快速有效的应用到现实场景中,下面列举了几个CV应用的场景:

    • 人脸识别
    • 图像检索
    • 游戏和控制
    • 监控
    • 生物统计(指纹,虹膜,人脸匹配)
    • 智能驾驶

    笔者最近完成了斯坦福的CS231课程【1】,课程中将卷积神经网络用在视觉识别任务中,包括图像分类,定位和检测,尤其是深度学习技术的发展极大的提高了这些任务的精度,完成这个课程后,笔者想和大家分享5个最具影响力的计算机视觉技术。

    1--图像分类

     
     

    图像分类的问题是这样的:给定一组单一类别标注的图像,要求我们对一组新的测试集预测这些类别并且测试预测的准确率。关于这个任务有很多挑战,包括视点变化,尺度变换,类内变化,图像变形,图像遮挡,条件,以及杂乱的背景。

    我们如何来编写一个能将图像分成不同类别的算法?计算机视觉研究人员已经提出一种数据驱动的方法来解决这个问题。 他们不是试图直接在代码中指定每个感兴趣的图像类别,而是为计算机提供每张图像类的许多样本,然后开发学习算法,查看这些样本并了解每个类的视觉外观。换句话说,他们首先收集一个带标注图像的训练集,然后将它传给计算机去处理这个数据。

    鉴于这一事实,整个图像分类的过程可形式化如下:

    我们的输入是一个训练集,包括N 个图像,用K 个不同的类别给每个图像进行标注。

    然后,我们用这个训练集来训练分类器以了解每个类别像什么。

    最后,我们通过让这个分类器预测一组它之前没见过的新的图像集来评估分类器的效果。然后我们将这些图像的真实标签与分类器预测的标签进行比较。

    卷积神经网络(CNNs)是用于图像分类最流行的架构。CNNs一个典型的用例是你传给这个网络图像,然后网络对这些数据分类。CNNs往往从输入”扫描器“ 开始,它不打算一次解析所有的训练数据。比如,输入一张100×100像素的图像,你不需要具有10,000节点的图层。相反,你会创建一个10×10大小的扫描输入层,你可以为图像的前10×10像素提供图像。通过该输入后,通过将扫描器向右移动一个像素,可以输入下一个10×10像素。这个技术称为滑动窗口。

     
     

    然后,通过卷积层而不是正常层馈送输入数据。每个节点仅仅关注与自身相邻的部分。这些卷积层随着网络的变深也趋于收缩,主要是通过输入的易分解因素。除了卷积层,它们通常还具有特征池化层。 池化是一个过滤细节的方法:常见的池化技术是最大池化,我们采用2×2像素,并传递具有最大量特定属性的像素。

    目前大多数图像分类技术都是在ImageNet上面训练的,它是一个约120万个高分辨率的训练图像的数据集。测试图像不显示初始注释(没有分割或者标签),并且算法必须生成指定图像中存在的对象的标签。Oxford、INRIA、XRCE 等机构的领先计算机视觉小组用已有的最好计算机视觉方法应用于这个数据集。通常,计算机视觉系统是复杂的多级系统,往往需要在早期阶段通过手动调试优化参数。

    第一届ImageNet 竞赛的冠军 Alex Krizhevsky (NIPS 2012) 由 Yann LeCun 开创的深度卷积神经网络。其结构包括7个隐藏层,不包括一些最大池化层。前5层是卷积层,最后2层是全连接层。每个隐藏层的激活函数是ReLU。这些训练比逻辑单元更快更有表达力。除此之外,当相近的单元有更强的激活值,它还用竞争的归一化来抑制隐藏的活动。这有助于强度的变化。

     
     

    在硬件要求方面,Alex在2个Nvidia GTX 580 GPU(超过1000个快速小内核)上使用了非常有效的卷积网络实现。 GPU非常适合矩阵矩阵乘法,并且具有非常高的存储器带宽。 这使他能够在一周内训练网络,并在测试时快速组合10个补丁的结果。 如果我们能够足够快地传达状态,我们可以在多个核心上传播网络。 随着核心变得越来越便宜而数据集越来越大,大型神经网络的改进速度将超过老式的计算机视觉系统。 自AlexNet以来,已有多种新型号使用CNN作为其骨干架构,并在ImageNet中取得了出色的成果:ZFNet(2013),GoogLeNet(2014),VGGNet(2014),ResNet(2015),DenseNet(2016)等。

     2--目标检测

     
     

    在图像中定义目标的任务通常涉及单个目标的边界框和标签的输出。这与分类/定位任务的不同之处在于,它将分类和定位应用于许多目标,而不仅仅是一个主导目标。你只有2类目标分类,即目标边界框和非目标边界框。例如,在汽车检测中,您必须使用其边界框检测给定图像中的所有汽车。

    如果我们就像对图像进行分类和定位的方式使用滑动窗口技术,我们需要将CNN应用于图像的许多不同位置。因为CNN将每个位置分类为目标或背景,我们需要在CNN中应用许多的位置和不同比例,计算上是非常昂贵的!

     
     

    为了处理这种情况,神经网络研究人员已经提出使用区域来代替,在那里我们找到可能包含目标的“blobby”图像区域。这个区域运行起来相对较快。第一个引人注目的模型是  R-CNN(基于区域的卷积神经网络)。在R-CNN中,我们首先使用称为选择性搜索的算法扫描输入图像以寻找可能的目标,生成约2,000个候选区域。然后我们在每个区域框的基础上运行CNN。最后,我们获取每个CNN的输出并将其输入到SVM以对区域进行分类,并使用线性回归来收紧目标的边界框。

    基本上,我们将目标检测转变成了图像分类问题。但是,存在一些问题 - 训练缓慢,需要大量磁盘空间,推理也很慢。

    R-CNN的直接后代是快速R-CNN,它通过2次增强提高了检测速度:1)在侯选区域之前执行特征提取,因此在整个图像上仅运行一个CNN,以及2)用softmax层替换SVM ,从而扩展神经网络的预测,而不是创建一个新的模型。

     
     

    快速R-CNN在速度方面表现得更好,因为它只为整个图像训练一个CNN。但是,选择性搜索算法仍然需要花费大量时间来生成候选区域。

    因此,发现了更快的R-CNN,它现在是用于基于深度学习的目标检测的规范模型。通过插入区域生成网络(RPN)来预测来自特征的区域,它用快速神经网络取代慢的选择性搜索算法。RPN用于决定“在哪里”以减少整个推理过程的计算要求。RPN快速有效地扫描每个位置,以评估是否需要在给定区域中进行进一步处理。它通过输出k个边界框区域来做到这一点,  每个区域具有2个分数,表示每个位置处目标的概率。

     
     

    一旦我们获得了我们的候选区域,我们就会直接将它们提供给基本上是快速R-CNN的内容。我们添加了一个池化层,一些全连接层,最后是一个softmax分类层和边界框回归器。

    总而言之,更快的R-CNN实现了更好的速度和更高的精度。值得注意的是,尽管未来的模型在提高检测速度方面做了很多工作,但很少有模型能够以更高的优势超越更快的R-CNN。换句话说,更快的R-CNN可能不是最简单或最快的目标检测方法,但它仍然是表现最好的方法之一。

    近年来的主要目标检测趋势已转向更快,更有效的检测系统。这在诸如You Only Look Once(YOLO),Single Shot MultiBox Detector(SSD)和基于区域的完全卷积网络(R-FCN)等方法中可见,作为在整个图像上共享计算的一种方法。因此,这些方法将自己与3种R-CNN技术相关联的昂贵子网区分开来。这些趋势背后的主要原因是避免让单独的算法孤立地关注各自的子问题,因为这通常会增加训练时间并降低网络准确性。

     3--目标跟踪

     
     

    目标跟踪指的是在给定场景下跟踪特定感兴趣的一个或者多个目标 。传统上,它应用在视频和现实世界的交互中,它们在初始目标检测之后进行观察。现在,它对自动驾驶系统至关重要,例如优步和特斯拉等公司的自动驾驶车辆。

    目标跟踪方法可以根据观察模型分为两类:生成方法和判别方法。生成方法使用生成模型来描述表观特征并最小化重建误差以搜索目标,例如PCA。判别方法可用于区分目标和背景,其性能更加鲁棒,它逐渐成为跟踪的主要方法。判别方法也称为检测跟踪,深度学习属于这一类。为了通过检测实现跟踪,我们检测所有帧的候选目标,并使用深度学习从候选者中识别所需目标。可以使用两种基本网络模型:栈式自动编码器(SAE)和卷积神经网络(CNN)。

    使用SAE跟踪任务的最流行的深度网络是深度学习跟踪器,它提出了离线预训练和在线微调网络。这个过程是这样的:

    离线无监督预训练使用大规模自然图像数据集的栈式去噪自动编码器以获得一般目标表示。通过在输入图像中添加噪声并重建原始图像,栈式  去噪自动编码器可以获得更鲁棒的特征表达能力。

    将预训练网络的编码部分与分类器组合以获得分类网络,然后使用从初始帧获得的正样本和负样本来微调网络,这可以区分当前目标和背景。DLT使用粒子滤波器作为运动模型来产生当前帧的候选补丁。分类网络输出这些补丁的概率分数,表示其分类的置信度,然后选择这些补丁中最高的补丁作为目标。

    在模型更新中,DLT使用限制阈值的方式。

     
     

    由于其在图像分类和目标检测方面的优越性,CNN已成为计算机视觉和视觉跟踪的主流深度模型。一般而言,大规模CNN既可以作为分类器也可以作为跟踪器进行训练。2个代表性的基于CNN的跟踪算法是  完全卷积网络跟踪器(FCNT)和多域CNN  (MD Net)。

    FCNT成功分析并利用VGG模型的特征图,这是一个经过预先训练的ImageNet,并产生以下观察结果:

    CNN特征图可用于定位和跟踪。

    许多CNN特征图区分特定目标与其背景的任务是嘈杂的或不相关的。

    较高层捕获对象类别的语义概念,而较低层编码更多的判别特征以捕获类内变异。

    由于这些观察,FCNT设计了特征选择网络,以在VGG网络的conv4-3和conv5-3层上选择最相关的特征图。然后,为了避免在噪声上过拟合,它还分别为两个层的选定特征图设计了额外的两个通道(称为SNet和GNet)。GNet捕获目标的类别信息,而SNet将目标位置为中心的感兴趣区域(ROI)。最后,通过SNet和GNet,分类器获得两个预测热图,并且跟踪器根据是否存在干扰者来决定将使用哪个热图来生成最终跟踪结果。FCNT的流程如下所示。

     
     

    与FCNT的想法不同,MD Net使用视频的所有序列来跟踪其中的移动物体。上述网络使用不相关的图像数据来减少跟踪数据的训练需求,这种想法与跟踪有一些偏差。此视频中一个类的目标可以是另一个视频中的背景,因此MD Net提出了多域的概念,以独立区分每个域中的目标和背景。域表示包含相同类型目标的一组视频。

    如下所示,MD Net分为两部分:共享层和特定域层的K分支。每个分支包含一个具有softmax损失的二进制分类层,用于区分每个域中的目标和背景,以及共享层与所有域共享以确保一般性表示。

     
     

    近年来,深度学习研究人员尝试了不同的方法来适应视觉跟踪任务的特征。他们已经探索了许多方向:应用其他网络模型,如递归神经网络和深度置信网络,设计网络结构以适应视频处理和端到端学习,优化过程,结构和参数,或者甚至将深度学习与传统的计算机视觉方法或语言处理和语音识别等其他领域的方法相结合。

     4--语义分割

     
     

    计算机视觉的核心是分割过程  ,它将整个图像分成像素组,然后可以对其进行标记和分类。特别是,语义分割试图在语义上理解图像中每个像素的作用(例如,它是汽车,摩托车还是其它类型的类?)。例如,在上图中,除了识别人,道路,汽车,树木等之外,我们还必须描绘每个物体的边界。因此,与分类不同,我们需要从模型中进行密集的逐像素预测。

    与其他计算机视觉任务一样,CNN在分割问题上取得了巨大成功。其中一种流行的初始方法是通过滑动窗口进行补丁分类,其中每个像素使用其周围的图像分别分为类。然而,这在计算上是非常低效的,因为我们不重用重叠补丁之间的共享特征。

    相反,解决方案是加州大学伯克利分校的全卷积网络(FCN),它推广了端到端的CNN架构,用于密集预测而无需任何全连接层。这允许为任何大小的图像生成分割图,并且与补丁分类方法相比也快得多。几乎所有后续的语义分割方法都采用了这种范式。

     
     

    然而,仍然存在一个问题:原始图像分辨率下的卷积将非常昂贵。为了解决这个问题,FCN在网络内部使用下采样和上采样。下采样层称为条纹卷积,而上采样层称为反卷积。

    尽管采用了上采样/下采样层,但由于在池化期间信息丢失,FCN会生成粗分割图。 SegNet  是一种比使用最大池化和编码 - 解码器框架的FCN更高效的内存架构。在SegNet中,从更高分辨率的特征映射引入快捷/跳跃连接,以改善上采样/下采样的粗糙度。

     
     

    最近的语义分割研究在很大程度上依赖于全卷积网络,例如扩张卷积,DeepLab和RefineNet。 

     5--实例分割

     
     

    除了语义分割之外,实例分割将不同类的实例分段,例如用5种不同颜色标记5辆汽车。在分类中,通常有一个图像,其中一个目标作为焦点,任务是说这个图像是什么。但是为了分割实例,我们需要执行更复杂的任务。我们看到复杂的景点有多个重叠的物体和不同的背景,我们不仅要对这些不同的物体进行分类,还要确定它们之间的界限,差异和关系!  

     
     

    到目前为止,我们已经看到了如何以许多有趣的方式使用CNN特征来有效地定位带有边界框的图像中的不同目标。我们可以扩展这些技术来定位每个目标的精确像素而不仅仅是边界框吗?使用称为Mask R-CNN的架构在Facebook AI上探索该实例分割问题。

    就像Fast R-CNN和Faster R-CNN一样,Mask R-CNN的潜在原理很简单。鉴于 Faster  R-CNN在目标检测中运行得非常好,我们是否可以扩展它以进行像素级分割?

    Mask R-CNN通过向 Faster  R-CNN添加分支来完成此操作,该分支输出二进制掩码,该掩码表示给定像素是否是目标的一部分。该分支是基于CNN的特征图之上的全卷积网络。给定CNN特征图作为输入,网络在像素属于目标的用1s在所有位置输出矩阵,在其他地方输出0(这称为二进制掩码)。

     
     

    另外,当在原始Faster R-CNN架构上运行而没有修改时,由RoIPool(感兴趣区域池化)选择的特征图的区域与原始图像的区域略微不对准。由于图像分割需要像素级特异性,与边界框不同,这自然会导致不准确。Mask R-CNN通过使用称为RoIAlign(感兴趣区域对齐)的方法调整RoIPool以更精确地对齐来解决此问题。从本质上讲,RoIAlign使用双线性插值来避免舍入误差,从而导致检测和分割不准确。

    一旦生成了这些掩模,Mask R-CNN将它们与来自Faster R-CNN的分类和边界框组合在一起,以生成如此精确的分割:

     
     

     结论

    这5种主要的计算机视觉技术可以帮助计算机从一个或一系列图像中提取,分析和理解有用的信息。我还没有谈到许多其他先进技术,包括样式转移,着色,动作识别,3D对象,人体姿势估计等。事实上,计算机视觉领域的成本太高而无法深入探讨,我鼓励您进一步探索,无论是通过在线课程,博客教程还是正式文档。对于初学者,我强烈推荐CS231n课程,因为您将学习如何实现,训练和调试自己的神经网络。作为奖励,您可以从我的GitHub存储库获取所有演讲幻灯片和作业指南。我希望它能指导你改变对世界的看法!

    参考文献:

    【1】http://cs231n.stanford.edu/

     
  • 相关阅读:
    贝叶斯模型
    java的移位和异或运算
    windows下xgboost安装到python
    bagging and boosting
    SVM处理多分类问题
    GO语言语法入门
    [转自SA]浅谈nginx的工作原理和使用
    多线程编程-- part 9 信号量:Semaphore
    多线程编程-- part 8 CyclicBarrier
    多线程编程-- part 7 CountDownLatch
  • 原文地址:https://www.cnblogs.com/hanhao970620/p/12404515.html
Copyright © 2011-2022 走看看