Lesson 17.1 计算机视觉中的三种基本任务

在之前的课程中,我们对现代分类网络进行了较为全面的讲解:我们解读了AlexNet,VGG16、NiN、 GoogLeNet以及ResNet的原始论文,并对各个网络都进行了完整的代码复现,现在我们已经了解这些网 络的构建思路和具体代码,可以开始应用他们了。从本节开始,我们开始建立我们自己的卷积神经网络架构,这是将之前学习的内容应用到实际架构上的过程,也是构筑自己的计算机视觉项目的过程。过去的大部分时间中,我们一直围绕着算法和架构本身在进行讨论,这的确是整个卷积神经网络应用过程中最为关键的部分。然而,在将经典架构落地使用的过程中,数据和算力会带来重大影响,同时深度卷积 网络的训练过程和训练技巧也非常关键(在GoogLeNet和ResNet的论文详解后,相信你也已经意识到这一点)。不难理解,数据质量和数量会很大程度上影响我们的建模过程,算力则会对我们能够实现的训练程度进行限制,但不止如此,在训练过程中还存在大量初学者很难想象到的困难。

在这一章中,我们将学习如何构筑自己的计算机视觉项目,包括如何处理数据、如何利用好计算资源、 如何进行训练、最终如何产出优质的结果。我们可以将这一结果用于论文、汇报、或自我学习。在这堂课的结尾,我们还会提供数个深度视觉方向的案例,作为算法落地实践的具体例子。经过这一堂课,你将能够自由调用任意数据、任意卷积架构,实现较为恰当的训练并最终落地成自己的深度视觉案例。

在开始建立自己的深度视觉项目之前,你首先要明确自己希望算法执行的具体任务。在传统机器学习中,我们常常会区分有监督、无监督、分类、回归、聚类等等这些任务类别,因为不同的任务会指向不同形式的标签、不同的评估指标、不同的损失函数,因此会影响我们的训练和建模流程。在深度学习中也是一样。在深度视觉中,除了区分经典的“回归、分类”之外,我们还需要区分众多的、视觉应用类别。比如说,深度视觉中有着“图像识别”这样输入图像、输出类别的任务,也有“风格迁移”这样输入图像、输出图像的任务,还有“图像理解”这种输入图像、输出文字的任务。最基本地来说,如果只考虑对图像的内容进行判断情况,我们至少也有识别(recognition)、检测(detection)、分割(segmentation)三种最基本的任务。Lesson 17.1 计算机视觉中的三种基本任务_第1张图片
以上图为例,识别任务是以图像中的单一对象为核心、采集信息并做出判断的任务,任何超出单一对象的任务都不是单纯的图像识别。因为是对单个对象进行操作,用于图像识别的数据集往往都比较规整、比较简单,被识别物体基本都轮廓完整、拍摄清晰、是图像中最容易被人眼注意到的对象。也因此,图像识别适用于像机场人脸识别这样简单的应用场景。

检测任务和分割任务是针对图像中多个或单个对象进行判断的任务,因此分割和检测任务所使用的图像往往要复杂很多。在检测任务中,我们首先要使用边界框(bounding box,简写为bbox)对图像中的多个对象所在的位置进行判断,在一个边界框容纳一个对象的前提下,再对边界框中每一个单一对象进行图像识别。因此,检测任务的标签有两个:(1)以坐标方式确定的边界框的位置,(2)每个边界框中的物体的属性。检测任务的训练流程也分两步:第一步是定位,第二步是判断,检测任务的训练数据也都是带有边框的。我们可以只使用其中一个标签来进行训练,但在检测任务中同时训练两个标签才是更常见的情况。检测任务比较适用于大规模动态影像的识别,比如识别道路车辆、识别景区人群等。检测也是现在实际落地应用最为广泛的视觉任务。
分割任务是像素级别的密集任务,需要对图像中的每个像素进行分类,因此不需要定义边界框就能够找到每个对象的“精确边界”。分割任务的标签往往也只有一个,通常就是对象的定义或性质(比如,这个像素是猫,这个像素是蓝天),但是标签中的类别会非常多,对于复杂的图像,标签类别可能成百上千。分割任务是现在图像领域对“理解图像”探索的前沿部分,许多具体的困难还未解决,同时,在许多实际应用场景中并不需要分割任务这样“精确”的判断,因此分割的实际落地场景并不如检测来得多。比较知名的实际落地场景是美颜相机、抖音换脸特效等。

三种任务在输出的结果及标签上有所不同,但它们可以一定程度上共享训练数据,这主要是因为图像中的“对象”概念是可以人为定义的。用于图像识别的训练数据只要有适当的标签,也可以被用于检测和分割。例如,对于只含有一张人脸的图像而言,我们可以执行普通的图像识别,单张脸的“人脸检测”,或一张人脸上不同五官的“特征检测”(landmark detection),只要训练数据中存在边界框,那标签中就可以进行检测。相对的,用于检测和分割的数据如果含有大量的对象,可以被标注为“人群”这样的标签,来进行识别(不过,用于检测、分割的数据拥有可以作为识别数据的标签的情况非常少,因为检测分割数据集往往都是多对象的)。Lesson 17.1 计算机视觉中的三种基本任务_第2张图片
在单个任务之中,我们也可能遭遇不同的“标签”。例如,对人脸数据,我们可以进行“属性识别” (attribute recognition)、“个体识别”(identity recognition)、“情绪识别"(emotion
recoginition)等等不同的任务,对于同一张图像,我们的识别结果可能完全不同:Lesson 17.1 计算机视觉中的三种基本任务_第3张图片
在情绪识别中,我们只拥有“情绪”这一个标签,但标签类别中包含不同的情绪。在属性识别中,我们可以执行属性有限的多分类任务,也可以让每一种属性都可以是一个单独的标签,针对一个标签来完成二分类任务。而个体识别则是经典的人脸识别,在CelebA数据集中我们使用人名作为标签来进行判断。

同样的,在场景识别、物体识别数据集下(比如大规模场景识别数据LSUN),我们可能无法使用全部的数据集,因为全数据集可能会非常巨大并且包含许多我们不需要的信息。在这种情况下,标签可能是分层的,例如,场景可能分为室内和室外两种,而室内又分为卧室、客厅、厨房,室外则分为自然风光、教堂、其他建筑等,在这种情况下,室内和室外就是“上层标签”,具体的房间或景色则被认为是“下层标签”。我们通常会选择某个下层标签下的数据集进行学习,例如,在LSUN中选择“教堂”或“卧室”标签来进行学习:Lesson 17.1 计算机视觉中的三种基本任务_第4张图片
对检测任务,我们也可能会检测不同的对象,例如,检测车牌号和检测车辆就是完全不同的标签,我们也需要从可以选择的标签中进行挑选。对于分割,则有更多的选项,我们可以执行将不同性质的物体分割开来的“语义分割”,也可以执行将每个独立对象都分割开来的“实例分割”,还可以执行使用多边形或颜色进行分割的分割方法。同时,根据分割的“细致程度”,还可以分为粗粒度分割(Coarse)和细粒度分割(Fine-grained),具体的分割程度由训练图像而定:Lesson 17.1 计算机视觉中的三种基本任务_第5张图片
Lesson 17.1 计算机视觉中的三种基本任务_第6张图片
因此,在图像数据集的读取过程中,你可能发现一个图像数据集中会带有很多个指向不同任务的标签、甚至很多个指向不同任务的训练集。遗憾的是,数据集本身并不会向你说明数据集所指向的任务,因此你必须从中辨别出你需要的部分。torchvision.datasets模块中自带的CelebA人脸数据集就是这种情况。如下图所示,类datasets.CelebA下没有任何文字说明,只有一个指向数据源的链接,光看PyTorch官方页面你并不能判断这个数据集是什么样的数据集。不过,这个类有参数“target_type”,这个参数可以控制标签的类型,四种标签类型分别是属性(attr)、个体(identity)、边界框(bbox)和特征(landmarks)。根据参数说明,可以看出属性是40个二分类标签,你可以从中选择一个进行分类,个体是判断这个人脸是哪个具体人物,这两个标签指向的是识别任务。边界框和特征都以坐标形式表示,这两个标签则指向检测任务。Lesson 17.1 计算机视觉中的三种基本任务_第7张图片
同样情况的还有Cityscapes,这个数据集的类datasets.Cityscapes下也没有任何说明,但它含有参数mode和target_type,其中mode有两个模式:fine以及coarse,这两个模式表示Cityscape是一个用于分割任务的数据集。同时,target_type下面还有instance(实例分割)、semantic(语义分割)、polygon(多边形分割)、color(颜色分割)四种选项,你必须清晰了解自己的需求以及每种分割的含义,你才可能正确填写这些参数。同时,我们可以一次性训练导入多个标签进行使用,如何混用这些标签来达成训练目标也是难点之一。

你可能感兴趣的:(深度学习——PyTorch,计算机视觉)