【动手学深度学习笔记】13.计算机视觉-3GPT版

#pic_center

R 1 R_1 R1

R 2 R^2 R2

目录

知识框架

No.1 数据增广

一、数据增广

1、数据增广

  • 当谈到图像增强,又称数据增强时,意味着我们不仅仅处理图像,还可以涉及文本或语音。
  • 在这个领域,我们主要专注于图像处理技术。让我们来看一下这几张图。我们需要确定一张图上的对象是松鼠还是其他类型的老鼠,然后对这张图片进行各种不同的处理。
  • 例如,一种处理方式是去除部分像素,另一种是对其颜色进行变换,最后一种则是对其亮度进行多种不同的变化

在这里插入图片描述

2、CES上的真实故事

  • 从一个真实故事开始。这是两年前在CES(国际消费类电子展览会)上发生的事情。在CES上,有一家国内公司专门从事智能售货机的研发,这引起了广泛的关注。几年前,Amazon Go推出了无人售货概念,引起了巨大的轰动,因此许多公司都纷纷投入到智能售货机的研发和制造中。
  • 智能售货机的核心概念是:用户选购商品后,系统通过摄像头识别用户的脸部,确认购买的商品,并计算费用。然而,一家公司在CES上进行演示时,发现效果明显下降。在公司内部进行的演示效果良好,但一到CES会场,问题就出现了。工程师们不得不深入了解原因。后来,他们发现了两个主要原因:
  • 首先,CES会场位于美国的拉斯维加斯,而赌城的环境特点是灯光昏暗、带有明显的黄色调。这使得整个色温发生了变化,由正常的办公室环境的5000K降至会场内的3000K,导致了效果的明显下降。
  • 其次,他们在展示机器时将其放在一个明亮的桌子上,桌子的光线反射到摄像头上,影响了图像的色彩和拍摄角度。
  • 为解决这些问题,该公司采取了紧急措施。他们在展览前一天发现问题后,迅速采集了大量数据,将其发送回国内,然后工程师们连夜训练了一个新的模型,以应对不同色温环境的挑战。另外,他们购买了一块桌布,覆盖在桌子上,以消除反射问题。这两个问题的解决方法可能并不常见,但它们强调了一个重要的问题:在训练模型时,采集数据的场景与实际部署时的场景可能会有显著差异。这对于许多应用,尤其是移动应用中的摄像头和语音识别等应用来说,都是一个关键问题。不同的背景、声音反射和摄像头质量都可能导致问题的出现。因此,在训练模型时,模拟各种实际场景非常重要,以确保模型具有良好的泛化性能。

image-20231108164510649

3、数据增强

  • 在一个现有的数据集上,通过对数据进行变换,增加更多多样性。举例来说,对于语音数据,可以引入不同的背景噪音;对于图像数据,可以改变图像的形状和颜色。如下所示,这是原始数据集中的一张猫的图片。
  • 首先,将图像中的一个区域提取出来,因为在实际情况中,您可能只会捕捉到猫的部分而不是整个猫。尽管只能看到部分猫,您仍然应该能够识别出它是一只猫。
  • 其次,可以调整图像的亮度,使其可能更暗或更亮。
  • 最后,可以调整图像的色温,使其更蓝或更黄,或者增加一些红色。
  • 这些方法有助于增加数据的多样性,提高模型的性能。

在这里插入图片描述

4、使用增强数据训练

  • 在使用时,通常会采用在线生成的方式,而不是提前生成并存储图像数据集。典型的做法是从原始数据源读取图像,然后随机应用各种不同的数据增强方法,以生成多样化的图像。这个过程可以生成多个不同的图片,然后这些图片将用于模型的训练。因此,关键点在于每次都是在线生成的,且通常是随机的。
  • 值得注意的是,通常情况下,在模型的训练和测试阶段不会进行图像增强操作。这意味着图像增强主要应用在训练过程中,而在测试阶段不使用。这可以看作是一种正规化操作,主要用于训练过程中。

image-20231108164627426

5、翻转

  • 来看一下一些常见的数据增强技巧是如何实现的。首先,我们有左右翻转,即将一张图片进行左右翻转操作。其次,还可以进行上下翻转,即将图片进行垂直翻转。需要注意的是,并不是所有图片都适合上下翻转,因为翻转后可能出现奇怪的效果。比如,如果你有一张猫的图片,上下翻转后可能会让猫的头颠倒,显得非常奇怪。所以是否使用上下翻转取决于你的数据集的特点。以树叶分类为例,上下翻转可能是一个合适的数据增强方法。

image-20231108164651932

6、切割

  • 切割图片通常是一个常见的做法,它涉及将一张图片划分为一个固定形状的区域。这种固定形状通常由于卷积神经网络(CNN)的输入要求,例如通常使用 24x24 的输入。这一规格来源于 ImageNet 数据集,其常见形状为 224x224。
  • 切割的过程中,可以引入一些随机性。首先,可以随机生成一个高宽比,通常在 3/4 到 4/3 之间取一个随机数,用作切割区域的高宽比。其次,可以随机选择一个区域的大小,通常在 8% 到 100% 之间,表示切割区域相对于原始图片的百分比。80%可能表示切割的区域相对较小,而8%可能会导致切割一个较小的部分。最后,还可以随机选择一个切割位置,使切割区域出现在图片的不同位置。
  • 这些随机性操作使得每次切割生成的区域都具有不同的特征,从而增加数据的多样性。这种随机性在每次图像切割时都会产生变化。

image-20231108164745343

7、颜色

  • 有三个重要的颜色属性,分别是色调、饱和度和明亮度。色调描述了颜色的基本色调,比如黄色、红色或蓝色。饱和度表示颜色的鲜艳程度,可以理解为颜色的浓淡。明亮度则描述了颜色的亮度。
  • 通常情况下,我们会在当前颜色值的基础上引入一些随机性。比如,可以从0.5到1.5之间随机选择一个值,然后将其应用到当前颜色值上。如果当前值为1.0,那么可以将明亮度降低50%或增加50%。
  • 这些操作有助于增加图像的多样性和视觉效果,对于计算机视觉任务非常有用。

image-20231108164819584

8、其它方法

  • 有多种方法可以进行图像增强,一个例子是称为"image augmentation"的工具,提供了多达数十种不同的图像增强方法。这些方法包括高斯模糊、将图像的一些部分变为黑色、图像变形、以及锐化等。这类方法通常可以实现类似于Photoshop的各种滤镜和图像变换操作。
  • 然而,需要注意的是,并不是每种增强方法都适用于特定任务,而且效果因任务而异。你应该根据你的测试集和部署环境来考虑是否需要应用这些增强方法。如果你认为在测试集或实际部署中不太可能出现类似的情况,那么你可以不使用这些方法。因此,在选择图像增强方法时,通常是从最终部署的需求出发,思考数据在不同环境下可能会发生的变化,然后反向推导出所需的数据增强策略。

image-20231108164852412

9、总结

  • 总结一下,数据增强是通过对数据进行变形和处理,以获得更多多样性的数据。这有助于提高模型的泛化性能,因为你希望模型能够覆盖在测试数据中可能出现的各种情况。数据增强可以应用于各种数据类型,而在这里我们重点介绍了图像增强。图像增强包括翻转、切割和颜色变换等操作,这些是最常见和实际应用最广泛的方法。

image-20231108164908072

二、D2L代码注意点

三、QA

No.2 微调

一、微调

1、微调

  • 微调(Fine-tuning)在计算机视觉领域被认为是至关重要的技术,尤其在深度学习中。它是深度学习成功的一个关键因素。是一种重要的学习方法,它已经改变了整个计算机视觉的方式。即使之前的知识都可以被遗忘,微调仍然被认为是最为重要的技术之一。
  • 它在图像分类和细分领域等计算机视觉任务中得到广泛应用。而在自然语言处理领域,微调也是至关重要的技术之一。因此,深入理解微调技术对于计算机视觉和深度学习领域的从业者非常重要。

在这里插入图片描述

2、标注一个数据集很贵

  • 让我们来了解一下微调的含义。首先,回顾一下 ImageNet 数据集。在很多年前,ImageNet 数据集的标注成本相当昂贵,需要几百万美元。尽管如今标注成本已降低,但 ImageNet 数据集仍然包括超过一千万张图片,实际使用的则是其中的 120 万张图片。此外,它包含了 1,000 个不同的类别,这已经算是一个相对大的数据集。
  • 然而,在实际应用中,通常不会像 ImageNet 这样大规模标注数据。例如,一家卖商品的公司或者一个生产家电的公司可能只需要针对自家产品进行分类,而类别数量可能只有 100 个左右。每个类别可能需要标注大约 500 张图片,这也是相当大的工作量。这些图片需要从各个角度、不同光照条件下进行拍摄,以确保模型的稳健性。
  • 通常,希望能够在大规模数据集上训练好的模型,然后迁移到小规模数据集上,以提高模型在小规模数据集上的性能。这种方法可以通过微调一些细节来实现,例如在已经具备一定物体识别基础的情况下,只需很少的数据就能完成对新物体的识别。这是人工智能的核心目标之一,即在不需要大规模再教的情况下,可以将知识拓展到新领域。这也是人类学习的基本原理之一,人类在掌握某种技能后,能够将这种技能应用到不同的情境中。

在这里插入图片描述

3、网络架构

  • 当我们仔细观察神经网络时,可以将其分为两个主要部分。首先,一张图片经过网络的前半部分,这一部分主要负责特征提取。在特征提取阶段,网络将原始像素数据转化为容易进行线性分类的特征。最后一部分是全连接层,紧接着是 Softmax 层,用于进行分类。这个全连接层和 Softmax 层构成了一个简单的线性分类器,通常被称为 Softmax 回归。
  • 在计算机视觉中,大多数神经网络都包含了这两个主要部分。特别是,这个特征提取部分是关键,因为它负责将原始像素数据转换为可供分类的特征。最后的 Softmax 回归层则负责将提取出的特征用于分类。这种架构使神经网络能够自动学习特征,而不是手动提取特征。这是深度学习的一个关键突破,它允许网络自动学习如何更好地表示数据。
  • 所以,可以简单地将神经网络视为由两部分组成,其中特征提取是其中一部分,而信息分类是另一部分。特别是,特征提取的部分通过学习将原始数据转化为更容易分类的特征空间,这是深度学习在计算机视觉领域取得突破性进展的关键因素之一。

image-20231108202600359

4、微调

  • 微调,指的是在一个源数据集上,通常是一个大型数据集,已经训练好的模型可以被用于目标数据集上。这里的源数据集通常指的是ImageNet,一个大规模的图像数据集,模型在这个数据集上进行特征提取和信息分类。在理论上,假设模型按照预期的方式训练,那么它在源数据集上学到的特征提取能力应该对目标数据集也有效,因此可以被重新使用,这对于提取特征是一个很好的起点,总好过从头开始。
  • 虽然随机初始化的方式也可以用于目标数据集,但相对而言,使用源数据集上训练好的模型作为起点通常更有优势。然而,需要注意的是,在目标数据集上进行微调后,模型的最后一层通常不能直接重用,因为目标数据集的标签可能不同于源数据集,所以通常需要重新训练模型的最后一层以适应新的标签。核心思想就是利用一个在源数据集上训练好的模型,将其特征提取能力迁移到目标数据集上,以提高模型在目标任务上的性能。

在这里插入图片描述

5、微调中的权重初始化

  • 实际上,微调是这样进行的:首先,在一个源数据集上训练好了一个模型,这个模型通常被称为预训练模型。在预训练模型训练完成后,你可以使用与预训练模型相同的架构来重新训练自己的数据,这个阶段通常称为微调。换句话说,如果你使用了一个ResNet-18的预训练模型,那么在微调阶段你也会使用ResNet-18,但在初始化模型时,不再使用随机初始化,而是从预训练模型中复制参数,以保留一些好的特征表示能力。然而,最后一层通常会随机初始化,因为目标数据集的标签与源数据集不同。因此,一开始的模型能够表达一些不错的特征,但最后一层需要重新学习以适应新的标签。
  • 在微调的过程中,通常会观察到底层收敛得更快,因为损失函数从底层往上传播,最后一层的更新通常更快。底层已经具备不错的特征表示能力,因此不需要太多的训练。然而,根据目标数据集的分布可能与源数据集不同,微调也可能需要进一步学习适应新数据集的特性。微调的核心思想是在源数据集上预训练模型,然后在目标数据集上微调以适应新任务。

image-20231108202709958

6、训练过程

  • 微调通常是将一个预训练的模型用于目标数据集上的训练任务。这个目标数据集上的任务通常与常规训练任务没有太大区别,但使用更小的学习率。这是因为预训练模型已经具有相对较好的特征表示,与目标任务接近,因此不需要太大的学习率。此外,也可以减少训练迭代的数量,以便更快地完成微调。通常,正常的训练可能需要几十个或上百个epochs,而微调可能只需要一个或几个epochs。
  • 关于更强的策略化,这意味着不需要在微调中完全改变模型的权重,因为模型已经具有不错的特征表示。通常只需微调一些层的权重即可,而不是完全随机初始化。这可以提高模型在新任务上的性能。
  • 在选择是否进行微调时,通常需要考虑目标数据集的复杂性。如果目标数据集与源数据集差异较大,例如类别数或样本数量差异较大,通常需要微调。微调可以显著提高性能。如果差异不大,重新训练也是一个选择,因为微调的性能提升可能会很有限。目前,工业界和学术界都在追求使用更大的数据集和更大的模型来提高性能,这也是像ImageNet竞赛等的趋势。

image-20231108202730104

7、重用分类器权重

  • 一个常用的技术是将预训练的模型的分类器层(通常是全连接层)替换为目标任务的新分类器。这意味着使用预训练模型的特征提取层,然后添加一个新的分类器来适应目标任务的类别。这个新的分类器将在目标数据集上进行训练,而预训练模型的权重保持不变。这种方法通常被称为“微调”。
  • 另一个常用的技术是将预训练模型的特征提取部分冻结,然后只微调部分层。这是因为低层次的特征提取层通常是更通用的特征,不太受目标任务的影响,因此可以在微调中保持不变。而高层的分类器层则通常需要适应目标任务,所以只微调这些层。
  • 此外,如果预训练的模型包含目标数据集中的类别,可以使用初始化来减少训练时间,这意味着将预训练模型的分类器权重初始化为目标数据集中的类别。这有助于模型更快地适应新任务。

在这里插入图片描述

8、固定一些层

  • 一般来说,神经网络的底层学习到的是一些底层细节特征,而随着层次向上逐渐升高,网络学到的特征变得更加语义化。例如,底层可能学到一些边缘、纹理等底层特征,而高层可能专注于更具语义的对象识别,如狗的种类。可以认为网络的底层特征更加通用,而高层特征与任务标签更相关。
  • 一种常见的做法是将底层的特征提取部分固定住,不进行参数优化。这意味着在微调过程中不改变底层的权重参数,这样做的结果是减少了模型的复杂性。固定底层参数的效果通常是减小模型的规模,因为这些参数不再参与更新。这个技巧在数据集相对较小的情况下很有用,以防止过拟合。
  • 总结来说,这是一种常用的技巧,可以通过固定神经网络底层的一些参数来控制模型的复杂性,特别在小数据集上有用以减少过拟合的风险。

image-20231108202834945

9、总结

  • 再总结一下微调的要点。微调是通过使用在大型数据集(如ImageNet)上预先训练的优质模型来初始化目标数据集上的模型,从而提高训练效率和性能。预训练模型的质量非常重要,因此通常使用在更大数据集上训练的预训练模型。微调通常能够更快地训练,提高模型的精度,这意味着在更短的时间内获得更好的性能。
  • 此外,利用来自大数据集的预训练知识可以显著提升性能。这也是深度学习在计算机视觉领域迅速应用于工业界的原因之一,因为它允许将先前的知识迁移到新的任务上,取得显著的性能改进。

在这里插入图片描述

二、D2L代码注意点

三、QA

No.3 第二次竞赛 树叶分类结果

No.4 实战 Kaggle 比赛:图像分类(CIFAR-10)

一、Kaggle Cifar10

二、QA

No.5 实战 Kaggle 比赛:狗的品种识别(ImageNet Dogs)

一、ImageNet Dogs

二、QA

No.6 物体检测和数据集

一、物体检测

1、目标检测

  • 目标检测,又称物体检测或对象检测,是计算机视觉领域中应用最广泛的技术之一。尽管一开始主要关注图片分类,但在实际的计算机应用中,图片分类相对来说并不是那么常见。因为对于用户而言,仅仅告诉他们一张图片中有猫或狗等信息并不十分有用。
  • 实际上,一张图片可能包含了丰富的信息,因此目标检测或物体检测就变得尤为重要。通过目标检测,我们可以简单而直观地了解一张图片中存在哪些物体。

image-20231109170033723

2、图片分类和目标检测的区别

  • 目标检测与图片分类有着明显的区别。在图片分类中,我们关注的是图像中的主体,试图将其找出并确定主要类别,比如左边的图片中有一只狗。与此不同,目标检测在右边的图片中,存在两只狗和一只猫,任务是识别所有感兴趣的物体,如猫和狗,并找出它们的位置。
  • 在目标检测中,不仅需要找出所有感兴趣的物体,还需要确定每个物体的具体位置。通过方框表示每个物体的位置,例如标注狗的方框、另一只狗的方框以及猫的方框。因此,目标检测不仅能进行多个物体的识别,还能精确定位它们在图像中的位置。
  • 当图像更加复杂时,目标检测体现出其优势,因为它不仅能识别多个物体,还能提供它们的位置信息。这使得目标检测在应用场景中更为广泛,因为我们通常需要了解一张图片中存在哪些主要物体。

image-20231109170114570

3、例子

  • 这个视频中展示了一项动画,主要应用在无人车领域。通过对视频进行处理,系统不断观察每辆车,识别每个车辆的边界框,标记每个行人的位置,还包括车灯、路标等信息。这就是目标检测在无人车技术中的一大应用。
  • 此外,在课程一开始的部分已经提到,目标检测在无人售货等场景中也有着广泛的应用。在无人售货中,系统需要识别抓取的具体物体,同时追踪物体的运动状态,确保准确地完成操作。

image-20231109170446592

4、边缘框

  • 接下来,我们要讲一个重要的概念,即边缘框(Bounding Box)。这个概念主要用来表示物体的位置,而物体的位置可以用多种方式来表示。在这里,我们介绍了一种用边框来表示的方法。具体来说,我们可以使用一个大致的边框将物体的位置框定,比如说,蓝框表示狗的位置,红框表示猫的位置。
  • 边框通常可以用四个数字来定义,有两种常见的定义方法。一种是使用左上角的x坐标和y坐标,即x=60,y=45,这里的坐标原点在左上角。另一种方法是使用左上角的x和y坐标,以及边框的宽度和高度,这里的坐标轴在左上角,x轴是60,y轴是45。右下角的坐标大致在x=378,y=516的位置。
  • 这种边框的定义方法是在物体识别和目标检测中常用的,它提供了一种简单而有效的方式来表示物体在图像中的位置。在具体的应用中,这样的边框可以用于定位并标识图像中的不同物体。
  • 在进行边框预测时,我们需要考虑边框的形状。从标注的角度来看,对于边框的形状标注,通常有一些灵活性。可以选择画一个稍微靠近目标的框,或者稍微动一下位置,都是可以的。在标注时,一般会找一些标注人员,使用鼠标拖动画框,尽量将物体框在内部。
  • 在标注时,一般会建议尽量将物体完整框在内部,但是如果物体的形状较为奇异,或者距离较远,有一些部分伸展较长,也可以容忍一些偏差。由于人为因素,不同标注人员可能会有一些主观差异,因此通常会找多个人一起标注,然后对这些标注框进行平均或其他处理。
  • 相对于图片分类,物体识别和目标识别的数据集通常要小很多,因为标注的成本较高。一张图片中平均有5个物体,至少需要5倍于图片分类的标注成本,因为需要标注每个物体的位置,并画出相应数量的框。这使得物体识别和目标识别的数据集相对较小。

在这里插入图片描述

5、目标检测数据集

  • 目标检测数据集的处理涉及到几个关键点。首先,由于一张图片可能包含多个类别,因此简单的文件夹方式就无法满足需求。通常情况下,目标检测数据集的标注是必要的,并且需要额外的存储。有多种方法可以处理这个问题,其中最常用的方法之一是将每个物体的信息记录在文本文件中。每一行表示一个物体,包括文件名、物体类别以及边界框的位置。由于一张图片可能包含多个物体,因此同一文件名可能在文件中出现多次,每次表示图片中的一个物体。
  • 具体而言,每一行的格式通常包括文件名、物体类别以及边界框的四个坐标值。以文本文件存储为例,每一行可能由六个值组成,分别是文件名、物体类别、边界框左上角的横坐标、纵坐标,以及右下角的横坐标、纵坐标。这样的记录方式能够清晰地表示每个物体在图片中的位置,为后续目标检测算法的训练提供了准确的标注信息。
  • 在目标检测领域,一个常见的数据集被称为Coco,可以通过该网址进行访问。类似于在图片分类中的ImageNet,Coco在目标检测领域有着重要的地位。相对来说,Coco规模较大,包含80个不同的物体类别,如伞、人、交通标识、飞机以及一些日常用品,例如电脑等。与ImageNet相比,Coco更贴近日常生活,主要包含常见的人造物体,而不涉及像猫狗等生物。尽管有一些猫狗等物体,但相对来说并没有太奇怪或特殊的类别。
  • Coco的类别数量远远少于ImageNet,仅有80个类别,而ImageNet则有1,000个类别。对于这80个常见物体的目标检测,Coco提供了约33万张图片,相对于ImageNet的120万张,规模较小。然而,Coco的独特之处在于每张图片中标注了多个物体,总计达到150万个物体。因此,Coco作为一个广泛应用于学术界的大型数据集,与ImageNet在规模上相当,并且在目标检测任务中发挥着重要作用。

image-20231109170604630

6、总结

  • 物体检测,又称为目标检测,是一种识别图片中多个物体的方法,包括确定它们的类别和位置。与图片分类不同的是,物体检测不仅能够找出图片中感兴趣的多个物体,还能准确确定它们的位置。为了表示物体的位置,通常使用一个边界框,即一个方框,用四个数字表示,可以是左上和右下坐标,或者是左上坐标和边界框的高度和宽度之和。这种方法的优势在于能够更精确地定位图片中的多个目标。
  • 总的来说,物体检测是一个新颖的应用,通过这种方法可以在图像中找到并定位多个感兴趣的物体。这种技术的简介表明,物体检测不仅仅是识别物体类别,还包括了对它们在图像中的具体位置进行准确描述的重要功能。

image-20231109170640307

二、边缘框实现

三、数据集

四、QA

No.7 锚框

一、锚框

1、锚框介绍

  • 好,接下来我们来探讨一下锚框。在目标检测中,需要预测边界框,而这一预测带来了相当大的挑战。在卷积神经网络中,当进行图片分类时,整个代码看起来可能非常简单,只需使用Softmax就能完成。然而,一旦引入了边界框,预测的复杂性就显著增加了。
  • 具体来说,锚框是一项计算机视觉领域的技术,它是由算法生成的一些框,用于预测边缘框。在目标检测任务中,引入锚框的概念是为了应对预测过程中的复杂性。在使用锚框的情境下,我们需要理解它是如何被计算机视觉算法生成的,以及在预测过程中如何使用这些锚框来更准确地定位目标。因此,锚框在目标检测领域中具有重要的作用。

2、锚框的过程

  • 目标检测算法中的一大类是使用锚框进行操作。虽然现在也有一些不需要锚框的算法,但主流趋势目前仍然倾向于使用锚框。那么,锚框究竟是什么呢?

  • 对于计算机视觉算法而言,它首先提出多个“锚框”,这其实也是一种框,通常称之为框(box)。因此,一般来说,边缘框被翻译为“bounding box”或者称为“边缘框”。这个术语通常用于描述物体在图像中的真实位置,即标注中的位置。

  • “锚框”其实就是算法对边框位置的一种猜测。由于一开始并不清楚物体的确切位置,直接预测四个数字是相对困难的。因此,算法采用了一种先提出多个框的策略。如果直接去预测边缘框的四个数字,实际上是比较复杂的,因为我们并不知道框在图像中的确切位置。

  • 他通常的做法是先提出多个框在图像中的不同位置,比如说,在一张图片中,他会提出多个框。等会我们会看到这张图片是如何被处理的。他所说的提出的框在这里指的是在图像上生成了5个框。这是通过算法生成的,它给出了这5个框的位置。因此,我们需要观察这5个框中是否包含我们感兴趣的物体。

  • 如果发现其中有我们感兴趣的物体,例如其中的一个框,可能你会认为没有,因为他可能只是在某个局部区域观察到了一块区域。或者你也可能认为没有,这取决于他的观察。然后,对于其中一个蓝色的框,你会发现它的位置基本上与真实的标注位置很接近。在这种情况下,可以说这个蓝色的框提出得非常好。

  • 如果一个锚框内包含我们关注的物体,首先需要进行分类,确定它是什么,或者属于哪一类物体。如果确认存在感兴趣的物体,接下来的步骤就是基于这个锚框进行预测,以了解真实边界框的移动方式。这意味着不再直接预测边缘框的四个坐标,而是建立在一系列步骤之上。

  • 具体而言,首先提出多个锚框,每个锚框都是一种猜测。然后,当这些锚框中的某一个与真实标注的位置相近时,会进一步调整,将这个锚框逐渐调整到真实边界框的位置。这个调整的过程并不是直接操作边缘框的四个坐标,而是通过逐步优化模块的位置来完成。

  • 这里需要进行两次预测:首先,是对于图像中的每一个区域(锚框)是否含有某一类物体的预测;其次,是对于这个位置的预测,与目标检测中需要预测物体的类别和位置相对应。这里我们涉及到两个方面的预测。

  • 在这个过程中,有一类算法被称为基于锚框的算法,通过提出一系列的边界框进行预测。另外一类算法则直接预测,无需生成这些边界框。虽然有两种不同的方法,但目前来看,基于锚框的方法相对更为主流。

image-20231111154000493

3、IoU-交并比

  • 要比较两个框之间的相似度;就说要两个框;说的要说这个锚框跟真实框之间的相似度有多少,我们通常使用一种称为"交并比"(IoU)的计算标准。IoU是指交集区域与并集区域之比。具体来说,IoU的取值范围在0到1之间,其中0表示两个框没有交集,1表示两个框完全重叠,而越接近1,表示相似度越高。

  • IoU的计算方法相对简单,给定两个边界框a和b,首先计算它们的交集区域,即两个框重叠的部分。然后,将交集区域的面积作为分子,将两个框的并集区域作为分母。

  • 所以,我们可以观察到,IoU(交并比)基本上肯定是大于等于零小于等于一的数字。如果两个框之间没有重叠,那么交集就是零,IoU就是零。如果完全重叠,那么交集和并集等于它们各自的面积,IoU就是一。

  • IoU可以被看作是一种常用的用于衡量两个几何形状相似度的指数,有时被称为Jaccard指数。它在计算机视觉领域被广泛使用。具体来说,给定两个集合,通过计算它们的交集和并集的大小,绝对地表示了它们的相似度。通过将IoU看作是Jaccard指数的等价形式,我们可以将两个边界框之间的相似度量化,特别是在处理像素级别的框时。

  • 综上所述,IoU是一个常用的、有效的相似度指标,特别适用于计算机视觉任务中目标检测等领域。

在这里插入图片描述

4、赋予锚框标号过程1

  • 要为锚框标号,这意味着使用基于锚框的算法进行目标检测。在这个算法中,首先会提出一定数量的锚框,比如在一张图片上提出1万个锚框。然后,对每个锚框进行预测,判断其中是否包含某个物体,并计算锚框与真实标注之间的边界框偏移。
  • 在训练过程中,每个锚框被视为一个训练样本。对于每个锚框,其标签有两种可能性:要么表示为背景,即框住了背景而没有包含任何物体;要么与某个真实边界框相关联,即该锚框框住的物体与真实边界框的标号一致,同时记录了锚框的偏移。
  • 因此,对锚框进行标号的过程就是为每个锚框分配标签。一个锚框可能是负类,表示它只包含背景,或者是正类,表示它与一个标注的边界框相关联。通常,算法会生成大量锚框,而真实边框相对较少。这导致了大量的负类样本,因为绝大部分锚框只包含背景。
  • 总体而言,在目标检测算法中,需要处理大量负类样本,因为它们主要包含背景信息。这也是目标检测算法在训练时面临的一个挑战。

image-20231111154215698

5、赋予锚框标号过程2

  • 给定标号的一种方法。首先,有一个矩阵,其中的列代表四个标注好的边缘框,分别为1、2、3、4,表示真实图片中有四个物体,物体有四个框。对于锚框,如果生成了九个锚框,那么每个锚框都会与边缘框计算IOU值,将计算结果填充到矩阵中相应的位置。接下来,首先找到矩阵中的最大值,假设是边框3,那么将标号为边框3的真实框与锚框2关联,即将任务定位在预测边框3的位置和物体上,因为它们的重合度最高。然后,将对应行和列删除,继续在剩余的矩阵中找到最大值,例如边框7,将边框7与锚框1关联。依此类推,直到将所有真实边框关联到至少一个锚框为止。对于剩余的锚框,可以根据与其IOU值最大的真实边框关联,或者选择其他策略。
  • 接下来就是直到将所有的锚框与边框关联完毕,确保每个边框至少找到了一个锚框进行关联。对于剩下的锚框,有多种处理方式。一种简单的方法是将它们全部标记为负类样本。然而,这样做可能会导致样本数量过多,尤其在锚框数量较大的情况下(如100万个锚框),而真实边框数量较少(如5个边框)。在这种情况下,大部分样本都将是负类样本,而非负类样本的数量较少,这可能不是一个理想的情况。
  • 因此,一般的做法是对剩下的锚框进行进一步的筛选,看它们与哪个边框的IOU值较大,然后将其与IOU值最大的真实边框关联起来。这样可以更加准确地选择与每个锚框关联的真实边框,避免生成过多的负类样本。
  • 那么,即便已经过去了,这也是另外一种做法。另外,需要注意的两点是锚框和边缘框。通常来说,锚框要么是固定生成的,要么会根据输入的图片动态生成。而边缘框则是你已经标注好的,直接从硬盘中读取。将标号赋予锚框的过程是每次读入图片后都要执行的操作。例如,读入一张图片后,如果有9个锚框,就会生成9个训练样本。这与图像分类不同,因为在目标检测中,由于可能生成的训练样本较多,很可能需要逐张读取图片,因为内存可能放不下。
  • 另一点需要注意的是赋予标号的算法,有许多种方法可以实现。这里介绍的是一种常见的做法,但具体的模型和实现方式可能有所不同。这种复杂性导致了许多设计选择,而且可能因为细节差异而导致最终结果的多样性。因此,关于模型和实现的具体方法可能因人而异。虽然这里没有时间详细介绍所有方法,但可以为大家介绍几种常见的做法。

在这里插入图片描述

6、输出过程中:使用非极大值抑制(NMS)

  • 另外一个核心技术是NMS,即非极大值抑制(non-maximum suppression)。这个技术的主要目的是优化输出结果,因为在目标检测中,每个锚框都会预测一个边界框。在预测中,可能会生成多个相似的框,例如在一张图片中可能会有3个或4个相似的框。NMS的思想是需要去除这些相似预测框,使输出更加清晰和简洁,最终得到一个整洁的输出。
  • NMS的实现过程是对所有预测框进行排序,并按照其得分进行降序排列。然后,从得分最高的框开始,将其加入最终的输出结果,并移除与该框IoU(交并比)较高的其他框,确保最终的输出结果中不包含过多相似的框。
  • 这个过程能够有效减少输出中的冗余信息,使得输出结果更加精炼和可靠。这是目标检测算法中一个重要的步骤,有助于提高算法的性能和准确性。
  • NMS(非极大抑制)是目标检测中常用的一种去重方法。它的实现方式如下:
    • 首先,它会在所有的预测框中选择非背景类别中预测值最高的框。这个预测值是由Softmax函数得出的对应类别的概率值,值越接近1表示置信度越高。找出所有框中对应非背景类别预测值最高的框,例如,某个框对应狗的预测值为0.9,将其保留。
    • 接下来,它会移除所有与该最大预测值的框的IoU(交并比)大于某个阈值(例如0.5)的其他框。这一步是通过判断两个框的相似度来进行的。比如,如果某个框的预测值为0.5,而最大预测值为0.9,那么它与最大预测值对应的框的相似度较低,可以被保留。但如果另一个框的预测值也是0.9,那么就可能是相似的预测框,需要考虑是否移除。
    • 这个过程会一直重复,直到所有的预测框都经过处理,最终得到一个相对干净的输出结果,即经过NMS处理后的结果。NMS的核心思想是通过选择最大预测值的框以及移除与其相似度较高的其他框,来获得一个去重的、清晰的输出。

image-20231111154416347

7、总结

  • 这里涉及到锚框的概念,这是因为很多目标检测算法都是基于锚框来进行预测的。这些算法的主要步骤是生成大量的锚框,而不同的算法有不同的锚框生成方法。接下来,我将详细介绍一种具体的生成方法,该方法为每个锚框分配一个标号,可以使用多种方式,其中刚刚介绍的一种方法就是其中之一。
  • 生成完毕后,每个锚框都会有一个标号,并且会有一个对应的真实框。这样,我们就可以进行训练。在预测阶段,需要对每个锚框进行预测,然后通过一种叫做非极大值抑制(NMS)的技术来剔除一些冗余的预测结果。
  • 接下来,我们将讨论这些概念的代码实现。由于引入了锚框,目标检测算法的复杂度远高于图像分类,因为需要处理许多与框相关的细节。在接下来的讲解中,我将详细介绍这些细节。

image-20231111154441559

二、D2L代码注意点

三、QA

No.8 树叶分类竞赛技术总结

No.9 物体检测算法:R-CNN,SSD,YOLO

一、目标检测

  • RCNN是对每个锚框提取CNN特征,FRCNN是对整个图片提取CNN特征,再映射每个锚框到特征图中
  • 很多知识点的

二、R-CNN系列

1、区域卷积神经网络

  • 今天的主题是迅速概述目标检测领域中一些常用的算法。首先,让我们来看一下区域卷积神经网络,通常称为Region-based Convolutional Neural Network(R-CNN)。

2、R-CNN介绍

  • 好的,来看一下最早的目标检测模型,它被称为R-CNN,即Region-based Convolutional Neural Network,即基于区域的卷积神经网络。首先,让我们简要了解一下这个模型的基本结构。
  • R-CNN的工作流程如下:首先,它使用一种启发式搜索算法来选择感兴趣的区域(Region Proposal):锚框,这个算法被称为Selective Search。这个算法相对复杂,最初来自于在神经网络尚未广泛应用的时候的目标检测领域。在那个时候,人们使用的是一套独立的方法来选择区域,而不是使用神经网络。
  • 今天我们主要讨论的是关于锚框的选择算法,即锚框的算法。目前,我将集中讨论有关锚框的算法,而不深入涉及其他非锚框的算法,因为这一领域相对较新,相关工作相对较少。
  • 然后,在选出了很多锚框之后,将每一个锚框看作一张图片。使用一个预训练好的模型,来提取特征feature,比如使用VGG。抽取了特征之后,通过训练一个SVM对类别进行分类。在计算机视觉领域,神经网络兴起之前,主要使用SVM作为分类器。
  • 另外,他在这个过程中使用了一个线性回归模型,来预测边缘框的偏移,即从选出的锚框到真实的Bounding box之间的偏移。
  • 在讨论这个模型的时候,我们要了解一个重要的概念,即每次选到的锚框的大小是不一样的。例如,当选择这个地方和选择那个地方时,锚框的大小可能不同。在这种情况下,我们需要思考如何将这些锚框最终整合成一个批次(batch)。

在这里插入图片描述

3、兴趣区域(ROI)池化层

  • 叫做Region of Interest(兴趣区域)池化。它的思想是,在给定一个锚框的情况下,将其均匀切分成n乘以m块,然后输出每一块中的最大值。举个例子,如果有一个锚框,选取其中的三个区域,如果要进行一个二乘二的ROI Pooling,它会将其切分成一个二乘二的框。
  • 在进行切分的时候,由于是3*3的区域,可能无法均匀切分,因此会将其round到最近的边界,取整,变成块1、块2、块3和块4。然后在进行Pooling的时候,对于第一块,选择最大值为5,放到对应的位置;接下来的块选择最大值9、10、2和8,依次放到相应的位置,得到一个nm(n乘以m)的值。
  • ROI Pooling的优势在于,无论锚框的形状如何,只要给定了n和m,总是会输出一个nm(n乘以m)的值。
  • 这样的话,不同的锚框都会变成同样的一个大小,可以进行批处理,就可以处理一个小批量了。之后的话,处理起来比较方便了。所以,这个也是RCNN里面一个很关键的一个新的层,叫做ROI(池化层)。这个层的目的是让每个锚框都可以变成一个自己想要的形状。

在这里插入图片描述

4、Fast RCNN

  • ·使用CNN对图片抽取特征
    ·使用Rol池化层对每个锚框生成固定长度特征
  • 之后,他们又提出了一个算法,称为Fast R-CNN。Fast R-CNN的主要改进在于对之前的问题进行了优化。具体来说,之前的方法每次都需要对一张图片进行特征抽取,假设一张图片里面有100个锚框,如果增加到1,000个,那么就需要进行1,000次的卷积神经网络特征抽取,这样计算量就变得相当庞大。
  • Fast R-CNN在R-CNN的基础上进行了加速。其主要思想是首先对整张图片使用卷积神经网络(CNN)进行特征抽取,而不是对每个锚框进行抽取,省去了重复的计算。特征抽取完成后,对这个特征图进行锚框的选取,使用选择性搜索(selective search)等方法找到一些候选锚框。这些候选锚框在原始图片上的映射到CNN的输出上,形成一个较小的特征图,比如说是一个14*14的特征图。然后,将选取的模框在这个特征图中找出来,根据比例映射。
  • 在小尺寸下,存在两个锚框。然后,利用ROI Pooling对每个锚框进行特征抽取。这意味着,例如,这个锚框可能会变成一个2x2的矩阵,将其拉成一个长为4的向量,这样锚框就变成一个长为4的向量。同样的,黄色这一块也会变成一个长度为4的向量。因此,对于整个图片来说,最终会将其变换成一个矩阵,假设有100个锚框的话,那么它就会变成一个100x4的矩阵。当然,还有通道数这个维度,暂时先不考虑。
  • 变成这样之后,接下来进入全连接层。这样,就不再需要使用SVM,也不需要一个一个地进行处理。一次性地进入全连接层,然后对每一个锚框进行预测,共有100个样本,预测它属于哪一个类别以及其真实的边框。因此,它之所以比之前的方法更快,主要是因为这里的卷积神经网络(CNN)不再对每一个锚框单独抽取特征,而是对整个图片进行抽取,这当然有一定的优势。
  • 因为很多时候这些锚框实际上是重叠在一起的。如果对每一个锚框只抽取一次特征的话,那些重叠的锚框就不需要再次做N次特征抽取了。因此,Fast RCNN的主要思想是对RCNN进行增强,不再对每一个锚框进行卷积神经网络(CNN)的特征抽取,而是一次性地抽取完整个图片的特征。然后,在这些抽取的特征上,再去找出相应的锚框,进行特征抽取,并进行预测。这就是Fast R-CNN的实现方法。

在这里插入图片描述

5、Faster R-CNN

  • 有一个被称为Faster R-CNN的算法,就是说仍然不够快。它对R-CNN和Fast R-CNN的改进使速度稍有提升。在改进中,它引入了选择性搜索的替代方案,使用一种启发式算法,通过一系列代码根据特征进行推测,决定每个区域应该如何处理。Faster R-CNN采用神经网络,具体而言是一个称为RPN(Region Proposal Network)的网络,来替代选择性搜索算法。RPN产生一系列高质量的候选框,这些框进一步用于物体检测。虽然Faster R-CNN在速度上有所改进/。
  • 在目标检测中,这部分与之前的R-CNN相似,主要区别在于先前的选择性搜索部分的改变。我们首先将图像输入卷积神经网络(CNN)中,然后通过卷积层产生CNN的输出,这一部分涉及到使用ROI()的Pooling来获取CNN输出的特征。需要注意的是,ROI的Pooling需要考虑CNN输出的特征以及相应的锚框。RPN(Region Proposal Network)负责将CNN的特征引入,其输出是一系列高质量的候选框,实际上是在进行一种粗糙的目标检测。具体而言,RPN接收CNN的输出,再经过卷积层处理,产生一系列锚框。这些锚框可以采用选择性设置或者之前提到的其他方式,生成初始的一系列锚框。在这些锚框中,我们进行了一个二分类问题的训练,即预测每个锚框的质量,检查它是否成功框住真实物体,并预测与真实边界框的偏移。
  • 这个网络的主要任务是通过对许多锚框进行预测,尽管其结果并不理想。它的目标是输出一些质量较高的锚框,供后续大型网络使用。具体而言,该网络尝试预测每个框的好坏,即它是否成功捕捉感兴趣的物体。如果捕捉成功,还需要调整边界框,使得它更加精确。在这个预测过程中,根据预测值和偏移值,使用了非极大值抑制(NMS),这在上周有过介绍。NMS的作用是减少相似的框,使得最终的输出中保留下质量较高的框。这些预测良好的锚框最终被送入ROI层进行进一步处理,进行每个类的最终预测。这个整体的过程涉及了多次层叠的预测和调整,使得网络能够更准确地定位感兴趣的物体。
  • 可以认为RPN(Region Proposal Network)是一种相对较小但超越传统目标检测算法的方法。它产生了一系列候选框的预测,并将这些预测引入主网络进行进一步处理。这个网络通常被称为two-stage网络,因为它分为两个阶段。第一阶段是一个小型网络,进行初始的、较为粗糙的预测;第二阶段是一个大型网络,进行更为精准的预测。faster RCNN是当前比较流行的算法之一,其准确性相对较高。尽管被称为"faster",但实际上它仍然相对较慢。

在这里插入图片描述

6、Mask R-CNN

  • 另外一个方法是Mask R-CNN,与Fast R-CNN相比,它的基本思想基本相同。Mask R-CNN在Fast R-CNN的基础上进行了扩展,引入了一个新的组件——Mask Prediction。该组件通过对每个像素进行预测,提供了更多的标注信息,特别适用于一些数据集,如COCO,其中包含一些语义实例的变化。这些实例变化通常被称为语义组合。最终,这个组件能够在ROI(感兴趣区域)中生成更好的预测。
  • 另一个值得关注的改进是ROI Align。在以前的版本中,称为ROI Pooling。ROI Pooling存在一个问题,当要池化的区域的大小不能整除时,会导致边界像素的偏移,进而影响像素级别的标注。为了解决这个问题,ROI Align的思想是不再进行切割,而是直接在中间划分区域,将每个像素的值视为整个区域的贡献。这样,计算时每个像素都能得到正确的值,避免了边界像素的累积误差。ROI Align主要应用于像素级别的预测,旨在提高精度,减少边界偏移带来的错误。

在这里插入图片描述

7、对比

  • 这个图展示了一些模型在精度和每秒处理样本数(速度)之间的权衡。在图中,x轴表示每秒处理的样本数,y轴表示mAP(均值平均精度),即边界框预测的准确性。越高的点表示模型在速度和精度上的表现越好。
  • 从图中可以看出,Fast R-CNN的变体在精度上相对较高,但计算成本也相对较高,因此处理速度较慢。而在工业界,Faster R-CNN更为常见,因为它在速度和精度之间取得了一种平衡,适用于很多实际场景。Fast R-CNN主要在对处理速度要求不那么严格、更注重精度的场景中被使用,例如一些需要更高精度的研究、竞赛或特定数据集的排名。
  • 对于实际应用,Fast R-CNN通常用于对精度要求较高的场景,而Faster R-CNN则更适用于工业界,因为它在速度和精度上都有不错的表现。

在这里插入图片描述

8、总结

  • 总结来看,RCNN(Region-based Convolutional Network)是最早也是最著名的一类基于模框和卷积网络的目标检测算法。它可以被视为将神经网络引入目标检测领域的重要工作之一。随后,研究人员不断对RCNN进行改进,推出了一系列的改进版本,如Fast、Faster、和Mask系列。
  • Fast系列以及Mask系列是在RCNN基础上的一系列改进,由一些在目标检测领域取得显著成就的研究团队贡献。这些改进主要集中在提高性能、加速处理速度以及在更复杂场景下的适用性。
  • Fast、Faster和Mask等算法主要用于高精度场景,其性能在提高准确性方面表现出色。而Mask系列因其需要像素级别的标注,在无人车领域等需要详细像素标注的应用中得到了广泛应用。
  • 总的来说,RCNN系列为目标检测领域奠定了基础,后续的改进版本在精度和速度等方面做了平衡,以适应不同应用场景的需求。

在这里插入图片描述

三、SSD(Single Shot Detection)

1、单发多框检测(SSD)

  • Single Shot Detection (SSD) 是另一个目标检测的系列,其核心思想是通过一次前向计算完成目标检测,而不需要像 RCNN系列那样进行两次预测。这个“single shot”就表示在单次计算中完成。相对于 RCNN 系列的两个阶段,SSD 只有一个阶段,因此被称为 single stage。
  • 在 RCNN 系列中,通常需要经过 Region Proposal Network(RPN)和主网络两个阶段,而 SSD 则简化为一次前向计算。这种设计的目标是提高处理速度,减少计算负担。SSD 这个名字也有可能让人产生歧义,因为在某些上下文中,“SSD”还可能指代“Solid State Drive(固态硬盘)”。
  • 需要注意的是,虽然 SSD 这个名字可能在过去会与固态硬盘混淆,但现在由于上下文的明晰,人们更容易理解其指代的是 Single Shot Detection 这一目标检测方法,而不是硬盘类型。

2、生成锚框

  • SSD 的主要思想是在每个像素点生成多个以该像素为中心的锚框。通过给定 n 个尺寸(大小)和 m 个高宽比例(ratio),SSD 会为每个像素生成 n+m-1 个锚框。这些锚框的尺寸和比例分别由给定的尺寸和比例确定。
  • 相较于 R-CNN 系列,SSD 的锚框生成相对简单。总体来说,SSD 通过在每个像素点处生成多尺寸、多比例的锚框,来尽可能全面地捕捉目标的不同大小和形状。这样的设计使得 SSD 在单次前向计算中完成目标检测,避免了两个阶段的设计,有助于提高处理速度。

在这里插入图片描述

3、SSD模型

  • 然后,在给定如此多锚框的情况下,SSD 直接对这些锚框进行了预测,省略了传统两阶段目标检测的需求。具体来说,当一张图片传入时,首先进行特征抽取。这里有一个基础的网络,它负责从图片中提取特征。这个网络的设计相对简单,主要是一个卷积神经网络(CNN),负责对图像进行初步的特征学习。
  • 抽取完特征后,对于每个特征点,使用了一个 n x n 的网络,该网络对每个像素生成了锚框。这里的锚框包括多种尺寸和宽高比例,以确保对不同大小和形状的目标都有良好的覆盖。每个生成的锚框都被视为一个样本,需要进行分类预测和位置回归。
  • 而后,模型通过对每个锚框进行预测,即对每个锚框进行分类和位置预测,来判断它是否包含物体,以及是否正确地框住了目标。这个过程中,每个锚框都会得到一个类别的概率分布,表示它可能包含的物体类别,同时还会有位置信息的回归,用于更精准地定位目标。
  • 在这一系列操作中,SSD 省略了传统两阶段目标检测的第二个阶段,直接在一个阶段内完成了对目标的检测与定位,大大简化了模型的结构,提高了计算效率。
  • 为什么说Fast RCNN 系列要进行两次预测,而 SSD 只需一次呢?原因在于 SSD 通过多个层次的检测,即在多个分辨率下进行检测,以提升模型效果。接下来,我们看一下这个网络,相对而言,它是一个较低层次的网络。它从图像中提取的特征叫做特征图(Feature Map),相对较大。在网络的上一层,通过不断的卷积,我们通常会将特征图尺寸减半,再减半,以此类推。
  • 这样处理之后,得到的特征图尺寸可能就会变得很小,比如说是 44,1616 或者 64*64。在这个尺寸下,我们可以在特征图上标注物体的框。对于不同尺寸的特征图,我们会检测不同大小的物体。在底层,模型更容易检测小物体,因为相对于整个图片来说,这里的特征对应的区域较小。
  • 随着网络向上层逐渐推进,处理的区域变得越来越大。这也就意味着在这些高层次的特征图上,物体的边界框相对来说会更大。在这个过程中,我们不希望边界框变得太小,以确保对目标的有效检测。因此,模型在底层主要用于检测小物体,而在上层则逐渐过渡到检测较大的物体。
  • 总体而言,SSD 通过在不同层次的特征图上进行目标检测,实现了对不同大小物体的有效检测,避免了单一尺度的局限性。
  • 所以,SSD 的一个主要思想在于,它会在多个不同分辨率下进行目标检测。随着层次的逐渐提高,它会更加关注一些小物体,而在顶层则会关注一些较大的物体。这体现了 SSD 主要的设计理念。
  • 另外一个与之前方法的主要区别在于,SSD 不再使用 RPN 网络,而是直接考虑所有的 Anchor Box。它可能会使用大约 100 万个 Anchor Box,这可能导致生成较大的样本集。在每个样本上,模型直接进行目标预测,判断是否存在物体,以及如果存在的话,它是如何与真实的边界框相匹配的。这就是 SSD 算法的基本原理。

在这里插入图片描述

4、对比

  • 这个算法,我们可以观察到在这个图中,SSD 是绿色的点。相对来说,它的运行速度是比较快的。与之相比,Faster R-CNN 在这个方面相对较慢。但是,需要注意的是,尽管 SSD 速度较快,但在精度上并不如 Faster R-CNN 出色。这个绿色的部分表示 SSD 的性能。
  • SSD 作为一种目标检测算法,相对较早就被提出,但自作者退出后,它并没有得到持续的更新。由于在过去几年里,目标检测领域涌现了许多新的技术和细节,SSD 的性能相对而言有所滞后。例如,诸如 batch normalization 和其他一些技巧,这些技术在目前已经变得普遍可用。
  • 虽然 SSD 在当前进度上可能不如其他算法,但它的一个重要贡献在于将之前的模型进行了大量简化。作者的离开导致了 SSD 的进一步优化的滞后,但这个算法启发了后续许多工作。
  • SSD 的实现相对简单,相比之下,Faster R-CNN 系列的实现非常复杂。如果你对 SSD 的具体实现感兴趣,可以查看相关代码,因为相对而言,它比较容易理解和实现。

5、总结

  • 在总结之前,简要回顾一下。SSD(Single Shot Multibox Detector)通过单个神经网络来检测物体,因此被称为“single shot”或“single stage”,与之前需要两个阶段的方法进行了区分。它的核心思想在于为每个像素点生成锚框,并在不同的阶段上输出,以进行多尺度检测,就说下面的检测小物体;上面的检测大物体;这是他的三个核心思想;
  • 如果不太理解其中的细节,这是因为目标检测与之前的图像分类等任务有很大不同,因此需要更深入地探讨代码实现。由于目标检测算法相对复杂,现在不可能把整个 RCNN 系列都讲清楚,

在这里插入图片描述

四、YOLO系列

1、YOLO

  • 最后一个模型,即 YOLO(You Only Look Once)。YOLO 本身其实是一个口头禅,表示“you only live once”(你只活一次),暗示着不要让生活过于焦虑,要冷静面对,珍惜每一刻。作者采用了一种巧妙的转换,将“live”改为“look”,形成了“you only look once”(你只看一遍),强调了对图像只进行一次全局检测的思想。
  • YOLO 的主要设计思想是要实现极速的目标检测,强调速度的优势。

2、YOLO(你只看一次)

  • 比如说 YOLO(You Only Look Once),其意思是只看一次。实际上,它的设计灵感来源于 SSD(Single Shot Multibox Detector)。与 SSD 类似,YOLO 也是一种单阶段(single stage)的目标检测算法,它仅通过一个单一神经网络进行预测。YOLO 需要生成 锚框。
  • 然而,在生成 锚框 方面,YOLO 采用了一种独特的方式。YOLO 在每个像素为中心生成 锚框的同时,考虑到了相邻像素的情况,导致相邻像素之间的 锚框重叠率非常高。这种高重叠率会导致大量的计算负担,因为每个 锚框都需要进行分类和计算。
  • 为了解决这个问题,YOLO 引入了一种名为“”的方法,即尽量让生成的 锚框之间不重叠。这样的设计旨在减小计算量,提高效率。

  • 他的做法是将一张图片均匀地切分成若干块,例如在这里均匀地分成了4行6列,形成了一个网格。每个网格区域被视为一个锚框,如此便形成了均匀分布的锚框。这里以不同颜色表示每个锚框,每个区域内都包含一个锚框,确保锚框之间不会重叠。这样的设计不仅保证了不重叠,还减少了计算量的浪费。
  • 具体来说,对于整个图片,它被均匀分成了4x6的块,但实际上这些块被划分成了一个 s 乘以 s 的锚框,即达到了分块的精度,这个 s 是一个常数。相较于 SSD 中的几百万,这个数量级较小。
  • 接下来,对于每一个锚框,算法会进行 b 个边界框的预测。这是因为,如果一个锚框仅仅预测一个边界框,当区域内存在两个物体时就会出现问题。因此,通过预测多个边界框,可以更好地捕捉到复杂场景中的物体。
  • 假设某个区域内有多个物体,而这个物体的真实边界框恰好被某个锚框包围,如果只预测一个边界框,那就会漏掉这个物体。因此,为了确保能够准确捕捉到所有物体,对于每个锚框,算法会预测 b 个边界框。这样,即使有多个物体靠近同一个锚框,也能更好地进行检测。
  • 具体来说,对每个锚框,会进行 b 个边界框的预测。这个 b 值通常取5或更多,而 s 是一个常数,可能是几百。因此,每次预测的样本数约为 s 的平方乘以 b,数量级相对较小,可能是几百或一千个样本。与 SSD 中的几百万相比,虽然每次预测成本较低,但在数量级上的改变使得 YOLO 在速度上更为迅捷。
  • 然而,需要注意的是,虽然每次预测成本较低,但实际上在这种量级上的改变确实能够实现更快的检测速度。这是 YOLO 最初的设计思想,后续还经历了一系列改进,如 V2、V3、V4 等版本。

在这里插入图片描述

3、对比

  • 看一下 YOLOv3 的性能,即 YOLOv3,可以从这个点来看。这个点实际上是在论文中的,作者在论文中提到了 YOLOv3 的性能。然而,需要注意的是,如果使用作者提供的实现,即 doc connect,发现其精度实际上并不高。作者在后来的讨论中指出,通过引入一些来自其他领域的技巧,比如图片分类和 RCN 中的一些技巧,可以显著提高性能。对于 V3 而言,将这些 trick 迁移到其上,性能可以达到与 V4 相当,V4 则在 V3 的基础上进行了一些细节的改进。
  • 所以,现在的这篇论文并不是 YOLOv3 最初论文的原始结果,而是在对其进行一些改进之后,其精度在保持性能不变的情况下得到了提升。在这方面,基本上可以看到,YOLOv3 将 SSD 甩在了身后,这个绿色点代表的是 SSD 的性能。此外,可以看到,在相同精度的情况下,相较于 fast RCN 系列,它确实是更具性价比的。
  • 具体来说,在达到相同精度的情况下,性能提升是数量级的变化,大致是 10 倍。在这个地方,可能是处理 16 个样本的速度,而 YOLOv3 可以处理大约 100 个样本,因此在速度上提升了 5 倍。因此,YOLOv3 以及之后的版本,如 V4,确实是一个相当快速且性能良好的算法,在工业界得到了广泛应用。
  • 总的来说,最后想提一下基于非锚筐的方法,其中有一个例子叫做 CenterNet。CenterNet 在性能和精度上都表现不错,近期在这个领域的研究也在持续进行。虽然我们没有详细涉及这方面的内容,但可以注意到,该领域的研究进展是相当迅速的。一直以来,许多论文都在不断地发表,希望未来能够有更多创新,甚至超越基于锚框的算法。这方面的优势在于算法相对简单,不需要太多复杂的处理。

在这里插入图片描述

二、QA

No.10 SSD实现

一、多尺度锚框

二、SSD

三、QA

No.11 语义分割和数据集

一、语义分割

1、语义分割

  • 今天的是语义分割。在进行了图片分类和目标识别之后,现在来探讨另一个略有不同的应用。

2、语义分割解释

  • 在图片分类中,主要任务是给定一张图片,将其中的主体物体识别出来。之前我们一直在讨论目标检测,也称为物体检测。在一张图片中可能存在多个感兴趣的物体,目标检测的目标就是找出每个物体,并告诉你它们具体在什么地方。这是通过使用边界框(Bounding Box)来实现的,即在图中用一个框框出物体。
  • 然而,这个方法存在一个问题,即这个框有时候过于粗糙,你大概知道物体的位置,但无法告诉狗的耳朵在图中的具体位置,也无法描述物体与背景的边界是什么样的。
  • 如果你对图像中每个像素的具体归属感兴趣,想要知道哪个像素属于哪个物体,这就涉及到语义分割。在计算机视觉领域,这是一个历史比较久远的应用,最初用于图片分割。图片分割的过程涉及到通过聚类或其他方法将在语义上相似的像素放在一起。然而,通常情况下,你可能无法准确指定这一块像素究竟代表什么,只能通过颜色或样式的相似性进行大致的类别划分。
  • 与一般的分割不同,语义分割会告诉你每个像素的具体标签。例如,在语义分割中,你可以得知某个像素属于狗,而另一个像素可能属于猫,同时还会告诉你这个像素所对应的标签是“狗”或“猫”。此外,还能确定某个像素属于背景。因此,语义分割与一般的分割方法相比最大的不同在于,它真实地为每个像素提供了标签信息。
  • 这个问题涉及到有监督学习,通常用于语义分割。与一般的分割方法不同,语义分割要求对每个像素进行详细的标注,因此属于有监督学习的范畴。相比较而言,一般的分割方法可以采用无监督学习,通过聚类等方式进行操作。
  • 在目标检测和图片分类等任务中,语义分割使得处理更加细致。因为对于每一个像素,都需要明确其所属的类别。与传统的分类任务不同,语义分割不仅仅关注是狗还是猫,而是要为每个像素赋予一个具体的标签,指明它属于图像中的哪个物体。对于每个物体,都会生成一个包围盒(Bounding Box),需要涉及到四个像素。在实际操作中,对于一张图像,可能需要为每个像素生成一个唯一的标号,当图像中有100万个像素时,就需要生成100万个标号,这使得任务变得相对更为复杂和精细。

image-20231112114508788

3、应用:背景虚化

  • 这个应用相对比较简单,主要是视频会议中常见。现在视频会议一般都支持背景虚化,这使得用户可以模糊背景,提高视觉效果。例如,在直播或视频会议中,你可以选择虚化背景,使画面更加专业。在过去,一些传统的方法采用绿布后期处理,将绿色像素设置为透明,这是一种简单却有效的方式。
  • 然而,现在的技术更加先进,很多视频会议软件或手机相机提供了语义分割技术,可以智能地识别人物和背景。这种技术可以实现更加自然的背景虚化,而不需要用户准备绿布。手机相机在人像模式下也经常使用背景虚化,它们可能采用语义分割技术或者其他算法。手机相机由于光圈受限,相对于传统相机,通常通过语义分割等技术实现更好的分割效果。
  • 总的来说,语义分割在视频会议、直播和手机拍摄中的应用变得越来越普遍,为用户提供了更加灵活和高效的背景处理选项。

在这里插入图片描述

4、应用:路面分割

  • 第二个应用是图片分割,具体来说是路面分割。在自动驾驶场景中,需要准确地识别道路、行人、树木和背景建筑物等元素。通过路面分割,系统能够明确区分不同区域,例如将灰色区域识别为道路,绿色区域为草地,粉色区域为人行道,以及其他区域表示行人、树木和背景建筑物等。
  • 这个技术的一个重要应用是确保自动驾驶车辆在行驶过程中能够准确地辨别道路,避免误入不应行驶的区域。通过路面分割,系统可以精准地定位车辆所在位置,同时识别行人和其他障碍物,确保行车安全。
  • 总的来说,路面分割在无人车技术中扮演着重要的角色,它通过对图像进行智能分析,帮助车辆理解周围环境,实现更加安全和可靠的自动驾驶。

在这里插入图片描述

5、VS实例分割

  • 在语义分割领域,还有一个与之相似但更为复杂的任务,称为实例分割,即instance segmentation。它与语义分割的最大不同在于,语义分割只关心像素属于哪一类,而实例分割会进一步观察每个物体的像素。例如,如果图像中包含两只狗,实例分割会明确告诉你第一只狗的像素属于它,第二只狗的像素则属于第二只狗。实例分割可以视为目标检测的进化版本,它不仅检测出每个物体,还精确描绘出物体的边缘。
  • 关键区别在于实例分割需要对每个类别的实例进行识别和区分。与目标检测关注的是检测物体的存在不同,实例分割更加注重对每个实际物体的细致划分。在技术上,这主要表现为对标签的更为详细的区分,不仅识别出相似物体,还要为每个实例分配独特的标号。因此,实例分割在算法和应用上对于语义分割的进一步拓展,尤其在处理物体标号方面有着更高的要求。

在这里插入图片描述

二、语义分割和数据集

三、QA

No.12 转置卷积

一、转置卷积

1、转置卷积

  • 在讲述进行语义分割之前的模型时,需要先介绍另外一个新的操作子,即转置卷积。

2、转置卷积思想

  • 什么意思呢?就是说在卷积中,通常情况下不会增大输入的高和宽。卷积操作通常有两种选择,要么保持高宽不变,要么将高宽减半。很少有卷积能够使高宽增大。当然,你可以尝试这个操作,通过使用填充(padding)。但是要注意,如果填充太多,你所用的填充值都是0,结果可能会全部变成0。所以,通过填充来有效地增加高宽是有一些限制的。
  • 但是语义分割面临一个问题,即在每个像素级别输出。卷积操作会不断减小输入的高和宽,最终降低到一个7x7的高宽。在这种情况下,如何生成每个像素级别的输出呢?为了解决这个问题,我们需要使用另一种卷积操作,即转置卷积,它可以将输入的小高宽变大。转置卷积正是为了解决这个问题而存在的。
  • 这转置卷积用于增大输入的高和宽。现在我们来看一下它的工作原理。它的逻辑很简单,与卷积操作相似。假设有一个2x2的输入矩阵和一个2x2的卷积核,我们经常在之前的卷积操作中使用这个核。现在来看看它是如何操作的。
  • 首先,卷积核会滑动,看第一个元素0与输入矩阵中的每个元素做按元素乘法,并逐个写入相应的位置。这样,0乘以输入矩阵的每个元素,然后写回对应的位置。同样的操作会在每个位置上进行。在这个过程中,输出的位置也会随之滑动,这与卷积操作的工作方式相似。
  • 转置卷积也是类似的。它在输入的每个位置进行操作,将卷积核重复写入相应的位置。最后,将这些小矩阵相加,得到输出矩阵。这就是转置卷积的基本工作原理。
  • 所以,他与卷积操作有点相反。与卷积不同,卷积操作是将一个框与输入按元素相乘,然后相加,最后写回相应的位置。而转置卷积是对输入的每个单个元素与核进行按元素乘法,但不相加,保持和的大小,然后将结果按元素写回原始位置。因此,可以看到输出会变大,因为每个元素都会生成一个对应和大小的东西,并写回原处。按照公式写的话,每个输出元素 ( y ) 等于 ( i ) 加上核的高,再加上 ( j ) 加上核的宽。这就是转置卷积的基本操作。
  • 当然,要进行填充(padding)的操作。填充实际上是在输出上进行的,模拟的是相反的过程,稍后会在代码中详细说明。关于步幅(stride)的操作也很容易。如果步幅为1,输出将按原样排列。如果步幅为2,输出将每两列跳一次。步幅更大的话,可以跳得更远,因此通过调整步幅,可以倍增输出的高和宽。

在这里插入图片描述

3、为什么称之为“转置”

  • 可以知道,对于卷积操作来说,( y ) 等于 ( x ) 跟 ( w ) 做卷积。这里的新号是卷积的意思。你可以对 ( w ) 构造出一个 ( v ),构造出一个比较大的矩阵。然后,把你的 ( x ) 拉成一条向量,把你的 ( y ) 拉成一条向量,称为 ( x ) 一撇和 ( y ) 一撇。那么,这个卷积操作就等价于这个矩阵乘法,即 ( y’ = v *x’ )。这就是卷积可以等价于矩阵乘法。
  • 在早期的深度学习框架中,卷积是通过这样的方式实现的。因为卷积操作相对手写矩阵乘法来说效率不高,直接通过变化形状,然后做矩阵乘法,再变回原来的形状。同样的原理,现在这种 Atrous Convolution(AC)也是通过变化形状,将卷积变成矩阵乘法。
  • 那么,转置卷积是做什么呢?转置卷积是说,同样可以构造出 ( w ) 的一个 ( v ),用同样的方式构造成 ( v )。但是,等价的时候,不再是 ( y’ = y, v * y’ = v* x’ ),而是 ( y’ = v^T * x’ )。这里的 ( T ) 表示转置。所以,转置卷积就是将 ( v ) 从原来的形状变成了 ( v ) 的转置,因此被称为转置卷积。当然,如果 ( v ) 的形状是一个长为 ( n ) 的向量,而 ( w ) 是一个 ( m ) 的向量,那么 ( v ) 就是一个 ( n \times m ) 的矩阵。因此,在这里,( v’ ) 的转置就是一个 ( m × n ) 的矩阵。而你的 ( x’ ) 就会变成一个 ( m ) 的向量,你的 ( y’ ) 会变成一个 ( n )。基本上,( x’ ) 和 ( y’ ) 的形状被交换了。
  • 所以,如果一个卷积能够将输入从 ( h × w ) 变成 ( H’ × W’ ) 的话,那么使用同样的超参数的转置卷积,就会从 ( W’ × H’ ) 变回 ( w × h )。假设一个卷积将一个高宽从 ( 2 × 2 ) 变成了 ( 4 × 4 ) 的话,那么使用同样的超参数的转置卷积,就会把 ( 4 \times 4 ) 变成 ( 2 × 2 )。这就是转置卷积的直观理解。

在这里插入图片描述

二、D2L代码注意点

三、QA

No.13 转置卷积是一种卷积

一、转置卷积

  • 有必要从另外一个角度再来解释一下什么是转置卷积。

二、转置卷积是一种卷积

  • 它其实是一种卷积操作;不同之处在于,它对输入和卷积核进行了重新排列。与卷积相比,卷积通常执行下采样,即将输入的高度和宽度变得更小;而转置卷积通常执行上采样,即将输入的高度和宽度变大。
  • 如果卷积将输入的高度和宽度从h、w变成了H1撇w撇,使用相同超参数的转置卷积将把它从H1撇w撇变回h和w。因此,可以认为在相同的超参数下,形状上,转置卷积和卷积是一种逆变换。
  • 接下来,我们将详细讲解如何将转置卷积转换为卷积。首先,让我们看一个最简单的情况。

在这里插入图片描述

三、重新排列输入和核

  • 当填充为0且步幅为1时,让我们以一个2x2的输入为例,卷积核也是一个2x2,这是前面课程中用过的例子。从另一个角度解释它的计算方式。
  • 首先,如果想将其转换成卷积,应该怎么做呢?对输入的上下左右都填充k-1行或者列,这里核等于2,所以需要在上面填充一行、下面填充一行、左边填充一列、右边填充一列。填充的区域即为蓝色的0区域。
  • 对核矩阵进行上下左右的翻转,这时从0123变成了3210。经过这个变换后,对其进行正常的卷积操作,即填充为0,步幅为1,将4x4的输入和2x2的核矩阵进行卷积,得到一个3x3的输出。这个输出等价于转置卷积的输出,这个输出的值是在前面课程中讲过的。接下来看一个稍微复杂一点的例子。

在这里插入图片描述

四、重新排列输入和核

  • 填充为p,对于卷积来说,加填充会使输入输出变大。然而,对于转置卷积来说,加了填充会使输出变小。因此,当填充为p时,对于输入来说,填充后的尺寸将变为k - p - 1。如果k等于2,且p等于1,那么填充后的尺寸等于0,即输入不会被填充。
  • 然后,对核矩阵进行上下左右的翻转,最后进行卷积操作,得到一个为4的输出,这是在前面课程中已经讲过的代码实现的例子。需要注意的是,无论转置卷积的填充是多少,最后在卷积上一层时,卷积操作仍然是正常的,即填充为0,步幅为1,与前面的填充和步幅无关。接下来考虑一个一般情况。

在这里插入图片描述

五、重新排列输入和核

  • 称为p的步幅为s。在卷积中,加入步幅会使高宽减小成倍数。对于转置卷积来说,它会使高宽成倍增加。
  • 具体情况如下:假设输入是一个2✖2的矩阵,在行和列之间有两个空隙,若步幅s等于2,那么会在行或列之间插入一行或一列。因此,行和列之间的空隙变成了这一行或一列,由于s变成r,就插入了。接下来是填充,边框p等于0,这个例子里p等于0。因此,k减p减一等于1,填充的是边上的这些列。然后,对核矩阵进行反转,再进行正常的卷积,即填充为0,步幅为1,得到一个44的输出。
  • 因此,基本上这就是上节课讲过的那个例子,将输入2✖2变成了两倍大小的4✖4。

在这里插入图片描述

六、形状换算

  • 怎么换算呢?假设输入的高或宽为n的情况下,核的大小为k,填充和步幅分别为p和s。
  • 对于转置卷积,它对于新的高或者宽,它的换算是N1撇等于s乘以n加上k减去2P减去s。这里的p讲的是上填充或者下填充的总和,不仅仅是上填充。如果考虑同样的超参数的卷积的话,那么卷积的输出n1撇就是n减去k减去2P加上s,然后除以s再取一个下取整。所以可以看到,如果n不能被s整除,那么将n增加一点点是不会影响输出的。
  • 因此,卷积其实是当你增加n的时候,可能会导致n1撇不会变换。如果你要进行尺寸变换的话,需要特别考虑。就是说,你能推导出输入的卷积n要大于等于s乘以n1撇加上k减去2P减去s。如果这个地方刚好是整除的话,那就是整所谓的整除,就是你使得最小的数n能达到同样的n1撇的话,那么这个地方是可以画等号的。如果你画了等号的话,你会发现它跟上面这个公式,这两个公式就是个逆公式了,就是把n和n1撇做了交换,别的都是一样的,因为k减去2P减去s这一项是一样的。
  • 所以为什么说转置卷积和卷积在同样的超参数情况下其实是个逆变化。在形状上来说,唯一要考虑的是当你在卷积不能整除的时候,那么你换过来时你取的那个输出n是对应的卷积那个最小的n,使它能整除另外一块。如果想让转置卷积让高宽成倍增加的情况下,那么就要使得这项要等于0。那么等于0就意味着k等于2P加上s。回顾一下,在全卷积神经网络讲过是怎么样取P的,增大32倍的,知道的窗口大小是64的话,不符合取的是32。所以这样子可以算取了的P,就应该是等于16了。这也是在FCN里面,为什么P等于16的由来。

在这里插入图片描述

七、同反卷积的关系

  • 提到反卷积,其实在数学上有一个反卷积的概念,称为deconvolution。它指的是卷积的逆运算,类似于复利和复利的逆变换是一种逆运算一样。
  • 所谓的逆运算就是,假设对输入x和核k做卷积得到y,那么反卷积就是给定y的值,给定核,会得出输入x。这里x和y是相互相等的关系。但是转置卷积不同,转置卷积在形状上是一个逆运算,但是从元素值上并不相等。因为转置卷积本质上还是一种卷积。
  • 反卷积很少被用在深度学习中间,所以经常说的反卷积神经网络或者讲反卷积的情况下,其实是有一点误解在里面。所谓的反卷积神经网络其实是指使用了转置卷积的神经网络,而并不是指数学上的反卷积操作。

在这里插入图片描述

八、总结

  • 从一个新的角度来看,转置卷积其实就是一种卷积,但是它通过改变输入和核的排列方式,通常通过在中间插入很多零来实现上采样,即将输出的高宽变得更大。
  • 同时,核经过了反转。需要注意的是,转置卷积并不等同于数学上的反卷积操作。即使在卷积神经网络中,如果有人提到“反卷积神经网络”,实际上可能在使用转置卷积,而不是数学上的反卷积操作。需要明白,转置卷积本质上仍然是一个卷积神经网络,只是对输入和核进行了变换。

在这里插入图片描述

No.14 全连接卷积神经网络 FCN

一、FCN

这里是语义分割的算法了

1、FCN

  • 全连接神经网络,也叫做全连接卷积神经网络,简称为FCN。

在这里插入图片描述

2、FCN架构

  • 首先,全连接神经网络,也称为FCN,是深度学习中用于图像分割的奠基性工作,可以说是最早的工作之一。尽管目前使用较少,但它在思想上相对简单,是一个开创性的工作。我们将介绍它的基本思想,主要是通过一个简单的转置卷积层来实现所需的分割结果。当然,现代的网络可能会更加复杂,但今天我们主要讨论的是这个FCN网络。
  • 首先,这个网络实际上相当简单,通过一张幻灯片就能详细讲解。我们仔细来看它的实现方式。它使用了一个转置卷积层来替代传统卷积神经网络(CNN)中最后的全连接层,从而实现对每个像素的预测。现在,我们来详细了解一下它的工作原理。
  • 首先,我们有一张图片,可以是以前的图像,然后我们有一个CNN模型,你可以把它想象成在ImageNet上经过预训练的CNN模型,比如ResNet等。通常,CNN模型的最后两层要么是全连接层,以获取标签的语义信息,要么是全局平均池化层。对于全局平均池化层,它会将图像(比如,我是一个24x24的图像)转换为一个7x7的高宽,通过全局平均池化,将7x7变为1x1。无论如何,它都是对整个通道进行平均化。
  • 对于图片分类,当然没问题。但是对于需要考虑空间信息的任务,情况就不那么简单了。因此,FCN在设计上去掉了最后的全连接层和全局平均池化层。如果输入是ImageNet的一张24x24的图片,那么输出就是一个大小为7x7的矩阵,通道数可能是512或其他。接着,两个新增的层是1x1的卷积层,其作用主要在于不改变空间信息,而是用来降低通道数,减少后续计算量。在后续的代码中,我们将更详细地了解这一点。
  • 接下来介绍的是一个转置卷积层。我们昨天已经讨论过卷积,而转置卷积层则可以实现图像的放大。假设原卷积层将图像缩小,比如在ImageNet中通常是缩小32倍,那么转置卷积层将图像放大,将24x24的图像还原成224x224。这个转置卷积层的通道数(k)与类别数相关,每个像素对每个类别的预测存储在通道中。这种通道存储预测值的方式在后续的网络中也被应用,例如目标检测。因此,对于一张图片,无论其高度是多少,都将得到一个通道数等于类别数的预测图,其高度保持一致。这样,我们就能为每个像素进行标注和预测。这就是FCN的核心思想。

在这里插入图片描述

二、D2L代码注意点

三、QA

No.15 样式迁移

一、样式迁移

1、样式迁移

  • 好的,接下来我们要讨论计算机视觉领域中的最后一个应用,即样式迁移。这是一个非常有趣的应用,我们将展示蒙娜丽莎这幅图在不同风格下的表现。

在这里插入图片描述

2、样式迁移应用

  • 这个应用的目的是什么呢?我们可以想象,假设我有一张图片,现在,我想要保持这张图片原本的内容,但是想要将它的风格替换成一张油画风格的图片,从而得到一张合成的图片。这个合成的图片可以被看作是一种滤镜效果。
  • 在这里,滤镜的概念很重要。类似于Photoshop或手机上的图片编辑软件,它们都提供了各种各样的滤镜效果。通常情况下,滤镜的样式是固定的,比如小清新风格或者夏日风格。而这个应用则提供了更多的灵活性,你可以根据自己的喜好选择图片的风格,比如油画风格、动漫风格等。这就是这个应用的优势所在。

在这里插入图片描述

3、基于CNN的样式迁移

  • 今天我们要讲的是这个应用领域中最基础、最早期的一个工作,即基于卷积神经网络(CNN)的样式迁移。我们来看一下,它到底是在做什么。
  • 首先,要介绍的是这个应用领域内基于CNN的样式迁移的工作。在这个工作中,我们有一张包含内容的图片和一张样式的图片,这两者是输入。然后,使用一个剪辑神经网络,可以看作是有三层的神经网络,实际上是一个神经网络模型。这个模型会被复制,就是说有两个一模一样的模型。任务是训练出一张合成的图片,使得合成图片的内容和样式都与输入的内容图片和样式图片相似。
  • 训练的方法如下:对于一个CNN,它的每一层都会产生一些特征。我们想训练一张图片 x,使得当这张图片 x 和内容图片分别输入相同的CNN时,在某一层的输出上能够匹配内容,即形成内容损失。同时,当这张图片 x 和样式图片输入相同的CNN时,在某些层的输出上能够匹配样式,即形成样式损失。如果我们能够训练出一张图片 x 同时满足这两个需求,那么我们就达到了既保留内容又保留样式的效果。最后,我们希望图片 x 的噪点较低,即图像自身的损失也要考虑进来。
  • 总体来说,我们的目标是通过训练得到一张图片 x,使得在CNN的特定层上,它的特征与样式图片相似,在另一些层上,它的特征与内容图片相似。有趣的地方在于如何定义内容相似和样式相似。此外,这个模型的训练不是针对卷积网络权重的训练,而是训练这张图片 x,也就是我们要得到的东西。

在这里插入图片描述

二、D2L代码注意点

三、QA

No.16 课程竞赛:牛仔行头检测

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值