《动手学深度学习2.0》学习笔记(四)
《动手学深度学习2.0》电子书的链接地址为https://zh.d2l.ai/index.html
本文记录了我在学习本书第13章节(计算机视觉)过程中的理解和收获。
笔记首次发布于我的博客https://valoray.github.io/,排版比CSDN稍好看一些,但内容是一致的。
计算机视觉
计算机视觉任务包括图像分类(Image classification)、目标检测(object detection)、语义分割(semantic segmentation)和样式迁移(style transfer)等。
改进泛化的方法
改进模型泛化的方法包括图像增广和微调
图像增广
为什么要进行图像增广?
- **扩大训练集的规模:**大型数据集是成功应用深度神经网络的先决条件。 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模。
- 提高模型的泛化能力:随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力。
如何进行图像增广?
- 翻转和裁剪
- 改变颜色
- 混合应用1和2
微调
迁移学习(transfer learning)指将从源数据集学到的知识迁移到目标数据集,其中的常见技巧:微调(fine-tuning)。
**应用条件:**当目标数据集比源数据集小得多时,微调有助于提高模型的泛化能力。
实现步骤:
- 在源数据集(例如ImageNet数据集)上预训练神经网络模型,即源模型。
- 创建一个新的神经网络模型,即目标模型。它将复制源模型上的所有模型设计及其参数(输出层除外)。
- 假设1:这些模型参数包含从源数据集中学到的知识,这些知识也将适用于目标数据集。
- 假设2:源模型的输出层与源数据集的标签密切相关,因此不在目标模型中使用该层。
- 向目标模型添加输出层,其输出数是目标数据集中的类别数。然后随机初始化该层的模型参数。
- 在目标数据集(如椅子数据集)上训练目标模型。
- 输出层将从头开始进行训练
- 所有其他层的参数将根据源模型的参数进行微调
特点:
- 除输出层外,目标模型从源模型中复制所有模型设计及其参数,并根据目标数据集对这些参数进行微调。但是,目标模型的输出层需要从头开始训练。
- 通常,微调参数使用较小的学习率,而从头开始训练输出层可以使用更大的学习率。
目标检测和边界框
目标检测
图像分类和目标检测的区别
- 在图像分类任务中:我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。
- 在目标检测任务中:图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体位置。
边界框
在目标检测中,我们通常使用边界框 (bounding box) 来描述对象的空间位置。边界框是矩形的。表示方式有2种:
由矩形左上角的以及右下角的 x x x和 y y y坐标
边界框中心的 ( x , y ) (x,y) (x,y)轴坐标以及框的宽度和高度
锚框
目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。 不同的模型使用的区域采样方法可能不同。
这里介绍其中一种方法:以每个像素为中心,生成多个缩放比和宽高比(aspect ratio)不同的边界框。 这些边界框被称为锚框(anchor box)。
!!!这里介绍的锚框是在原始的输入图像上生成的,然而到了后面的【多尺度目标检测】,我们的锚框就是在特征图上生成的。!!!
生成多个锚框
假设输入图像的高度为 h h h, 宽度为 w w w。我们以图像的每个像素为中心生成不同形状的锚框:缩放比为 s ∈ ( 0 , 1 ] s\in(0,1] s∈(0,1],宽高比为 r > 0 r>0 r>0。那么锚框的宽度和高度分别是 w s r ws\sqrt{r} wsr和 h s / r hs/\sqrt{r} hs/r。
缩放比 (Scale) 在这里是指生成锚框的大小与原始图像大小的比例。例如,如果图像的高度为 h h h, 缩放比为 s s s,那么生成的锚框的高度就是 h s hs hs, 在这里 s ∈ ( 0 , 1 ] s\in(0,1] s∈(0,1]。这样可以确保生成的锚框的大小都在图像的范围内。
锚框的宽度和高度是怎么计算的?
尺度(即宽度和高度)有预设的缩放比s( s = 锚框高度 / 图像高度 h s=锚框高度/图像高度h s=锚框高度/图像高度h or s = 锚框宽度 / 图像宽度 w s=锚框宽度/图像宽度w s=锚框宽度/图像宽度w) =》 因此锚框高度变为hs,宽度变为ws
宽高比 r r r 定义为宽度和高度的比值 r = w i d t h h e i g h t r=\frac{width}{height} r=heightwidth,要想按照特定的宽高比来调整锚框的尺寸,需要分别对原始宽度和高度进行适当的调整。
为何宽度需要乘以 r \sqrt{r} r 呢?
- 因为如果按照宽高比 r r r (宽度/高度) 直接调整锚框可能会导致宽度或高度的变化过大或过小,而影响到目标检测的精度。
- 通过使用 r \sqrt{r} r和 1 / r 1/\sqrt{r} 1/r来分别调整宽度和高度,我们可以更平稳地改变宽度和高度,同时保持宽高比为 r r r 。
因此,锚框的宽度和高度分别是 w s r ws\sqrt{r} wsr和 h s / r hs/\sqrt{r} hs/r。
要生成多个不同形状的锚框,让我们设置许多缩放比 (scale) 取值 s 1 , … , s n s_1,\ldots,s_n s1,…,sn和许多宽高比 (aspect ratio) 取值 r 1 , … , r m r_1,\ldots,r_m r1,…,rm。当使用这些比例和长宽比的所有组合以每个像素为中心时,输入图像将总共有 w h n m whnm whnm个锚框。
尽管这些锚框可能会覆盖所有真实边界框,但计算复杂性很容易过高。在实践中,我们只考虑包含
s
1
s_{1}
s1或
r
1
r_{1}
r1的组合:
(
s
1
,
r
1
)
,
(
s
1
,
r
2
)
,
…
,
(
s
1
,
r
m
)
,
(
s
2
,
r
1
)
,
(
s
3
,
r
1
)
,
…
,
(
s
n
,
r
1
)
.
(s_1,r_1),(s_1,r_2),\ldots,(s_1,r_m),(s_2,r_1),(s_3,r_1),\ldots,(s_n,r_1).
(s1,r1),(s1,r2),…,(s1,rm),(s2,r1),(s3,r1),…,(sn,r1).
也就是说,以同一像素为中心的锚框的数量是
n
+
m
−
1
n+m-1
n+m−1。对于整个输入图像,将共生成
w
h
(
n
+
m
−
1
)
wh(n+m-1)
wh(n+m−1)个锚框。
交并比
在训练数据中标注锚框
- 在训练集中,我们将每个锚框视为一个训练样本。 为了训练目标检测模型,我们需要每个锚框的类别(class)和偏移量(offset)标签,其中前者是与锚框相关的对象的类别,后者是真实边界框相对于锚框的偏移量。
- 在预测时,我们为每个图像生成多个锚框,预测所有锚框的类别和偏移量,根据预测的偏移量调整它们的位置以获得预测的边界框,最后只输出符合特定条件的预测边界框。
现有条件:目标检测训练集有真实边界框的位置及其包围物体类别的标签。
目的:为生成的每个锚框标注其类别(class)和偏移量(offset),其中前者是与锚框相关的对象的类别,后者是真实边界框相对于锚框的偏移量。
思路:为锚框分配最接近它的真实边界框的位置和类别标签
(1)将真实边界框分配给锚框
给定图像,假设锚框是 A 1 , A 2 , … , A n a A_1,A_2,\ldots,A_{n_a} A1,A2,…,Ana, 真实边界框是 B 1 , B 2 , … , B n b B_1,B_2,\ldots,B_{n_b} B1,B2,…,Bnb,其中 n a ≥ n b n_a\geq n_b na≥nb。让我们定义一个矩阵 X ∈ R n a × n b \mathbf{X}\in\mathbb{R}^{n_a\times n_b} X∈Rna×nb,其中第 i i i行、第 j j j列的元素 x i j x_{ij} xij是锚框 A i A_i Ai和真实边界框 B j B_j Bj的loU。该算法包含以下步骤。
-
在矩阵 X \mathbf{X} X中找到最大的元素,并将它的行索引和列索引分别表示为 i 1 i_{1} i1和 j 1 j_{1} j1。然后将真实边界框 B j 1 B_{j_1} Bj1分配给锚框 A i 1 A_{i_1} Ai1。这很直观,因为 A i 1 A_{i_1} Ai1和 B j 1 B_{j_1} Bj1是所有锚框和真实边界框配对中最相近的。在第一个分配完成后,丢弃矩阵中 i 1 t h i_{1}^\mathrm{th} i1th行和 j 1 t h j_{1}^\mathrm{th} j1th列中的所有元素 o _{\mathrm{o}} o
-
在矩阵 X \mathbf{X} X中找到剩余元素中最大的元素,并将它的行索引和列索引分别表示为 i 2 i_{2} i2和 j 2 j_{2} j2。我们将真实边界框 B j 2 B_{j_2} Bj2分配给锚框 A i 2 A_{i_2} Ai2,并丢弃矩阵中 i 2 t h i_2^\mathrm{th} i2th行和 j 2 t h j_2^\mathrm{th} j2th列中的所有元素。
-
此时,矩阵 X \mathbf{X} X中两行和两列中的元素已被丢弃。我们继续,直到丢弃掉矩阵 X \mathbf{X} X中 n b n_b nb列中的所有元素。此时已经为这 n b n_b nb个锚框各自分配了一个真实边界框。
-
只遍历剩下的 n a − n b n_a-n_b na−nb个锚框。例如,给定任何锚框 A i A_i Ai, 在矩阵 X \mathbf{X} X的第 i t h i^\mathrm{th} ith行中找到与 A i A_i Ai的IoU 最大的真实边界框 B j B_j Bj,只有当此loU大于预定义的阈值时,才将 B j B_j Bj分配给 A i A_{i} Ai
下面举例说明上述算法。如下图(左)所示,假设矩阵 X \mathbf{X} X中的最大值为 x 23 x_{23} x23,我们将真实边界框 B 3 B_{3} B3分配给锚框 A 2 A_{2} A2。 然后,我们丢弃矩阵第2行和第3列中的所有元素,在剩余元素(阴影区域) 中找到最大的 x 71 x_{71} x71,然后将真实边界框 B 1 B_{1} B1分配给锚框 A 7 A_{7} A7。接下来,如下图中) 所示,丢弃矩阵第7行和第1列中的所有元素,在剩余元素 (阴影区域) 中找到最大的 x 54 x_{54} x54,然后将真实边界框 B 4 B_{4} B4分配给锚框 A 5 A_{5} A5。 最后,如下图(右)所示,丢弃矩阵第5行和第4列中的所有元素,在剩余元素 (阴影区域) 中找到最大的 x 92 x_{92} x92,然后将真实边界框 B 2 B_{2} B2分配给锚框 A 9 A_{9} A9。之后,我们只需要遍历剩余的锚框 A 1 , A 3 , A 4 , A 6 , A 8 A_1,A_3,A_4,A_6,A_8 A1,A3,A4,A6,A8,然后根据阈值确定是否为它们分配真实边界框。
(2)标记类别和偏移量
现在我们可以为每个锚框标记类别和偏移量了。假设一个锚框 A A A被分配了一个真实边界框 B B B。
- 锚框 A A A的类别将被标记为与 B B B相同
- 锚框 A A A的偏移量将根据 B B B和 A A A中心坐标的相对位置以及这两个框的相对大小进行标记
鉴于数据集内不同的框的位置和大小不同,我们可以**对这些相对位置和大小应用变换,使其获得分布更均匀且易于拟合的偏移量。**
这里介绍一种常见的变换。
给定框 A A A和 B B B,中心坐标分别为 ( x a , y a ) (x_a,y_a) (xa,ya)和 ( x b , y b ) (x_b,y_b) (xb,yb),宽度分别为 w a w_a wa和 w b w_b wb, 高度分别为 h a h_a ha和 h b h_b hb, 可以将 A A A的偏移量标记为:
( x b − x a w a − μ x σ x , y b − y a h a − μ y σ y , log w b w a − μ w σ w , log h b h a − μ h σ h ) , \left(\frac{\frac{x_b-x_a}{w_a}-\mu_x}{\sigma_x},\frac{\frac{y_b-y_a}{h_a}-\mu_y}{\sigma_y},\frac{\log\frac{w_b}{w_a}-\mu_w}{\sigma_w},\frac{\log\frac{h_b}{h_a}-\mu_h}{\sigma_h}\right), (σxwaxb−xa−μx,σyhayb−ya−μy,σwlogwawb−μw,σhloghahb−μh),
其中常量的默认值为 μ x = μ y = μ w = μ h = 0 , σ x = σ y = 0.1 , σ w = σ h = 0.2 \mu_x=\mu_y=\mu_w=\mu_h=0,\sigma_x=\sigma_y=0.1,\quad\sigma_w=\sigma_h=0.2 μx=μy=μw=μh=0,σx=σy=0.1,σw=σh=0.2。
如果一个锚框没有被分配真实边界框,我们只需将锚框的类别标记为背景 (background)。背景类别的锚框通常被称为负类锚框,其余的被称为正类锚框。
使用非极大值抑制预测边界框
当有许多锚框时,可能会围绕着同一目标、输出许多相似的具有明显重叠的预测边界框。为了简化输出,我们可以使用非极大值抑制 (non-maximum suppression, NMS) 合并属于同一目标的类似的预测边界框。
工作原理:
对于一个预测边界框 B B B, 目标检测模型会计算每个类别的预测概率。假设最大的预测概率为 p p p, 则该概率所对应的类别 B B B即为预测的类别。具体来说,我们将 p p p称为预测边界框 B B B的置信度(confidence)。在同一张图像中,所有预测的非背景边界框都按置信度降序排序,以生成列表 L L L。然后我们通过以下步骤操作排序列表 L L L。
-
从 L L L中选取置信度最高的预测边界框 B 1 B_{1} B1作为基准,然后将所有与 B 1 B_{1} B1的loU超过预定阈值 ϵ \epsilon ϵ的非基准预测边界框从 L L L中移除。这时, L L L保留了置信度最高的预测边界框,去除了与其太过相似的其他预测边界框。简而言之,那些具有 非极大值置信度的边界框被抑制了。
-
从 L L L中选取置信度第二高的预测边界框 B 2 B_{2} B2作为又一个基准,然后将所有与 B 2 B_{2} B2的loU大于 ϵ \epsilon ϵ的非基准预测边界框从 L L L中移除。
-
重复上述过程,直到 L L L中的所有预测边界框都曾被用作基准。此时, L L L中任意一对预测边界框的loU都小于阈值 ϵ \epsilon ϵ,因此,没有一对边界框过于相似。
-
输出列表 L L L中的所有预测边界框。
多尺度目标检测
注意这里的尺度有两种不同的含义
- 对于每个中心点要生成的锚框来说,它有不同的缩放比(scales),不同的缩放比意味着不同尺度的锚框。
- 对于不同层次的特征图来说,特征图上的一个空间位置在输入图像上分别拥有大小不同的感受野,即时对于相同缩放比的锚框来说,它在不同层的特征图上也具有不同大小的感受野,可以用于检测不同大小的目标。因此我们可以认为特征图也是多尺度的。
多尺度锚框
(1)思路
在上一节【锚框】中,我们以输入图像的每个像素为中心,生成了多个锚框,这些锚框代表了图像不同区域的样本。 然而,如果为每个像素都生成的锚框,我们最终可能会得到太多需要计算的锚框。 因此接下来的思路就是要减少图像上的锚框数量=》我们可以在输入图像中均匀采样一小部分像素,并以它们为中心生成锚框.
(2)具体操作
我们在特征图 (fmap) 上生成锚框 (anchors) ,每个单位(像素) 作为锚框的中心。
- 由于锚框中的 ( x , y ) (x,y) (x,y)轴坐标值 (anchors) 已经被除以特征图 (fmap) 的宽度和高度,因此这些值介于0和1之间,表示特征图中锚框的相对位置。
- 给定特征图的宽度和高度fmap_w和fmap_h, 我们将均匀地对任何输入图像中fmap_h行和fmap_w列中的像素进行采样。以这些均匀采样的像素为中心,将会生成尺度为s 且宽高比 (ratios) 不同的锚框。
多尺度检测
(1)内容
假设CNN基于输入图像的正向传播算法获得有c张形状为ℎ×w的特征图的中间输出,既然每张特征图上都有ℎw个不同的空间位置,那么相同空间位置可以看作含有c个单元。
我们可以将特征图在同一空间位置的c个单元变换为使用此空间位置生成的a个锚框类别和偏移量。 本质上,我们用输入图像在某个感受野区域内的信息,来预测输入图像上与该区域位置相近的锚框类别和偏移量。
(2)特点
- 不同层的特征图在输入图像上分别拥有不同大小的感受野,可以用于检测不同大小的目标。简言之,我们可以利用深层神经网络在多个层次上对图像进行分层表示,从而实现多尺度目标检测。
单发多框检测(SSD)
单发多框检测(SSD)是一个多尺度目标检测模型。
模型
单发多框检测模型的结构如上图所示,主要由基础网络块+几个多尺度特征块(也叫高宽减半块)组成。
- 基础网络块:用于从输入图像中提取特征,如在分类层之前截断的VGG或ResNet。
- 多尺度特征块:将上一层提供的特征图的高和宽缩小 (如减半) , 使得特征图中每个单元在输入图像上的感受野变得更广阔。
设计思路:
- 首先要让基础网络块输出的高和宽较大,这样基于该特征图生成的锚框数量较多,可以用来检测尺寸较小的目标。
- 之后的每个多尺度特征块将上一层提供的特征图的高和宽缩小 (如减半) , 使得特征图中每个单元在输入图像上的感受野变得更广阔。
- 通过多尺度特征块,单发多框检测模型可以生成不同大小的锚框,并通过预测边界框的类别和偏移量来检测大小不同的目标,因此这是一个多尺度目标检测模型。
- 顶部的多尺度特征图较小,但具有较大的感受野,适合检测较少但较大的物体
类别预测层
设目标类别的数量为 q q q。这样一来,锚框有 q + 1 q+1 q+1个类别,其中0类是背景。在某个尺度下,设特征图的高和宽分别为 h h h和 w w w。如果以其中每个单元为中心生成 a a a个锚框,那么我们需要对 h w a hwa hwa个锚框进行分类。如果使用全连接层作为输出,很容易导致模型参数过多。因此单发多框检测模型(SSD)使用卷积层的通道来输出类别预测,从而降低模型复杂度。
具体来说,类别预测层使用一个保持输入高和宽的卷积层。这样,输出和输入在特征图宽和高上的空间坐标一一对应。也就是说,输出特征图上的(x、y)就包含了以输入特征图(x、y)为中心的所有锚框的类别预测,只不过这众多类别是通过增加通道数来保存的。
边界框预测层
边界框预测层的设计与类别预测层的设计类似。 唯一不同的是,这里需要为每个锚框预测4个偏移量,而不是q+1个类别。
完整模型
完整的单发多框检测模型(SSD)由五个模块组成。每个块生成的特征图既用于生成锚框,又用于预测这些锚框的类别和偏移量。
-
模块一:基本网络块
-
模块二~模块四:高和宽减半块
-
模块五:使用全局最大池将高度和宽度都降到1
其中,第二到第五个模块都是模型架构图中的多尺度特征块。
与图像分类任务不同,此处的输出包括:CNN特征图Y
;在当前尺度下根据Y
生成的锚框;预测的这些锚框的类别和偏移量(基于Y
)。
损失函数
目标检测有两种类型的损失。
- 有关锚框类别的损失:复用图像分类问题种的交叉熵损失函数;
- 有关正类锚框偏移量的损失:预测偏移量是一个回归问题。 但是,对于这个回归问题,我们在这里不使用平方损失(即L2范数),而是使用L1范数损失,即预测值和真实值之差的绝对值。 掩码变量
bbox_masks
令负类锚框和填充锚框不参与损失的计算。 - 最后,我们将锚框类别和偏移量的损失相加,以获得模型的最终损失函数。
评价函数
预测锚框类别:沿用准确率来评价分类结果。
预测边界框:由于偏移量使用了L1范数损失,我们使用平均绝对误差来评价边界框的预测结果。
区域卷积神经网络(R-CNN系列)
R-CNN
步骤
- 对输入图像使用选择性搜索来选取多个高质量的提议区域。
- 提议区域通常是在多个尺度下选取的,并具有不同的形状和大小
- 每个提议区域都将被标注类别和真实边界框
- 选择一个预训练的卷积神经网络,并将其在输出层之前截断。
- 将每个提议区域变形为网络需要的输入尺寸,并通过前向传播输出抽取的提议区域特征。
- 将每个提议区域的特征连同其标注的类别作为一个样本。
- 训练多个支持向量机对目标分类,其中每个支持向量机用来判断样本是否属于某一个类别;
- 训练线性回归模型来预测真实边界框。
优缺点
优点:R-CNN模型通过预训练的卷积神经网络有效地抽取了图像特征
缺点:速度很慢。 网络需要从一张图像中选出上千个提议区域,对每个提议区域都要进行一次前向传播来执行目标检测,计算量庞大。
Fast R-CNN
R-CNN的主要性能瓶颈在于,对每个提议区域,卷积神经网络的前向传播是独立的,而没有共享计算。 由于这些区域通常有重叠,独立的特征抽取会导致重复的计算。 Fast R-CNN对R-CNN的主要改进之一,是仅在整张图象上执行卷积神经网络的前向传播。
步骤
-
**与R-CNN相比,Fast R-CNN用来提取特征的卷积神经网络的输入是整个图像,而不是各个提议区域。**此外,这个网络通常会参与训练。设输入为一张图像,将卷积神经网络的输出的形状记为 1 × c × h 1 × w 1 ; 1\times c\times h_1\times w_1; 1×c×h1×w1;
-
假设选择性搜索生成了 n n n个提议区域。
- 首先,这些形状各异的提议区域在卷积神经网络的输出上分别标出了形状各异的兴趣区域。
- 然后,这些感兴趣的区域需要进一步抽取出形状相同的特征 (比如指定高度 h 2 h_{2} h2和宽度 w 2 ) w_{2}) w2) ,以便于连结后输出。为了实现这一目标,Fast R-CNN引入了兴趣区域汇聚层 (Rol pooling) : 将卷积神经网络的输出和提议区域作为输入,输出连结后的各个提议区域抽取的特征,形状为 n × c × h 2 × w 2 ; n\times c\times h_2\times w_2; n×c×h2×w2;
-
通过全连接层将输出形状变换为 n × d n\times d n×d, 其中超参数 d d d取决于模型设计;
-
预测 n n n个提议区域中每个区域的类别和边界框。
- 在预测类别时,将全连接层的输出转换为形状为 n × q n\times q n×q( q q q是类别的数量) 的输出,然后使用softmax回归。
- 在预测边界框时,将全连接层的输出转换为形状为 n × 4 n\times4 n×4的输出。
主要特色
在Fast R-CNN中提出的兴趣区域汇聚层与普通的汇聚层有所不同。
-
在普通汇聚层中,我们通过设置汇聚窗口、填充和步幅的大小来间接控制输出形状。
-
而兴趣区域汇聚层对每个区域的输出形状是可以直接指定的。
例如,指定每个区域输出的高和宽分别为 h 2 h_{2} h2和 w 2 w_{2} w2。对于任何形状为 h × w h\times w h×w的兴趣区域窗口,该窗口将被划分为 h 2 × w 2 h_2\times w_2 h2×w2子窗口网格,其中每个子窗口的大小约为 ( h / h 2 ) × ( w / w 2 ) (h/h_2)\times(w/w_2) (h/h2)×(w/w2)。在实践中,任何子窗口的高度和宽度都应向上取整,其中的最大元素作为该子窗口的输出。因此,兴趣区域汇聚层可从形状各异的兴趣区域中均抽取出形状相同的特征。
以下图为例,在 4 × 4 4\times4 4×4的输入中,我们选取了左上角 3 × 3 3\times3 3×3的兴趣区域。对于该兴趣区域,我们通过 2 × 2 2\times2 2×2的兴趣区域汇聚层得到一个 2 × 2 2\times2 2×2的输出。请注意,四个划分后的子窗口中分别含有元素0、1、4、5(5最大);2、6(6最大);8、9(9最大);以及10。
- 兴趣区域窗口的形状 h ∗ w = ( 3 ∗ 3 ) h*w=(3*3) h∗w=(3∗3)
- 经兴趣区域汇聚后输出窗口的形状为 h 2 ∗ w 2 = ( 2 ∗ 2 ) h_2*w_2=(2*2) h2∗w2=(2∗2)
- 由上述两个形状推导出的池化窗口的形状(向上取整)为 ( h / h 2 ) ∗ ( w / w 2 ) = ( 3 / 2 ) ∗ ( 3 / 2 ) = ( 2 ∗ 2 ) (h/h_2)*(w/w_2)=(3/2)*(3/2)=(2*2) (h/h2)∗(w/w2)=(3/2)∗(3/2)=(2∗2)
Faster R-CNN
为了较精确地检测目标结果,Fast R-CNN模型通常需要在选择性搜索中生成大量的提议区域。 Faster R-CNN 提出将选择性搜索替换为区域提议网络(region proposal network),从而减少提议区域的生成数量,并保证目标检测的精度。
步骤
**与Fast R-CNN相比,Faster R-CNN只将生成提议区域的方法从选择性搜索改为了区域提议网络,模型的其余部分保持不变。**模型步骤如下:
- 使用填充为1的 3 × 3 3\times3 3×3的卷积层变换卷积神经网络的输出,并将输出通道数记为 c c c。这样,卷积神经网络为图像抽取的特征图中的每个单元均得到一个长度为 c c c的新特征。
- 以特征图的每个像素为中心,生成多个不同大小和宽高比的锚框并标注它们。
- 使用锚框中心单元长度为 c c c的特征,分别预测该锚框的二元类别 (含目标还是背景) 和边界框。
- 使用非极大值抑制,从预测类别为目标的预测边界框中移除相似的结果。最终输出的预测边界框即是兴趣区域汇聚层所需的提议区域。
优点
区域提议网络(region proposal network)作为Faster R-CNN模型的一部分,是和整个模型一起训练得到的。
换句话说,Faster R-CNN的目标函数不仅包括目标检测中的类别和边界框预测,还包括区域提议网络中锚框的二元类别和边界框预测。
作为端到端训练的结果,区域提议网络能够学习到如何生成高质量的提议区域,从而在减少了从数据中学习的提议区域的数量的情况下,仍保持目标检测的精度。
Mask-RCNN
如果在训练集中还标注了每个目标在图像上的像素级位置,那么Mask R-CNN 能够有效地利用这些详尽的标注信息进一步提升目标检测的精度。
Mask R-CNN是基于Faster R-CNN修改而来的。
具体来说,Mask R-CNN将兴趣区域汇聚层替换为了 兴趣区域对齐 层,使用双线性插值(bilinear interpolation)来保留特征图上的空间信息,从而更适于像素级预测。
- 兴趣区域对齐层的输出包含了所有与兴趣区域的形状相同的特征图。 它们不仅被用于预测每个兴趣区域的类别和边界框,还通过额外的全卷积网络预测目标的像素级位置。
总结
- R-CNN对图像选取若干提议区域,使用卷积神经网络对每个提议区域执行前向传播以抽取其特征,然后再用这些特征来预测提议区域的类别和边界框。
- Fast R-CNN对R-CNN的一个主要改进:只对整个图像做卷积神经网络的前向传播。
- 它还引入了兴趣区域汇聚层,从而为具有不同形状的兴趣区域抽取相同形状的特征。
- Faster R-CNN将Fast R-CNN中使用的选择性搜索替换为参与训练的区域提议网络,这样后者可以在减少提议区域数量的情况下仍保证目标检测的精度。
- Mask R-CNN在Faster R-CNN的基础上引入了一个全卷积网络,从而借助目标的像素级位置进一步提升目标检测的精度。
语义分割和数据集
语义分割(semantic segmentation)问题重点关注如何将图像分割成属于不同语义类别的区域。
- 与目标检测不同,语义分割可以识别并理解图像中每一个像素的内容:其语义区域的标注和预测是像素级的。
- 与目标检测相比,语义分割标注的像素级的边框显然更加精细。
下图展示了语义分割中图像有关狗、猫和背景的标签。
概念区分
图像分割
将图像划分为若干组成区域,这类问题的方法通常利用图像中像素之间的相关性。它在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区域具有我们希望得到的语义。以上图中的图像作为输入,图像分割可能会将狗分为两个区域:一个覆盖以黑色为主的嘴和眼睛,另一个覆盖以黄色为主的其余部分身体。
语义分割
实例分割
实例分割也叫同时检测并分割(simultaneous detection and segmentation),它研究如何识别图像中各个目标实例的像素级区域。与语义分割不同,实例分割不仅需要区分语义,还要区分不同的目标实例。例如,如果图像中有两条狗,则实例分割需要区分像素属于的两条狗中的哪一条。
由图像分割、到语义分割,再到实例分割,对分割任务的要求越来越高。
数据集
最重要的语义分割数据集之一是Pascal VOC2012。
预处理数据
为了使输入图像符合模型的输入形状,我们可以对原始图像做一些预处理——缩放图像 or 裁剪图像。
在语义分割任务中,如果采用缩放原始图像的方式,在预测时需要将预测的像素类别重新映射回原始尺寸的输入图像。这样的映射可能不够精确,尤其在不同语义的分割区域。
为了避免这个问题,我们将图像裁剪为固定尺寸,而不是缩放。具体来说,我们使用图像增广中的随机裁剪,裁剪输入图像和标签的相同区域。
自定义语义分割数据集类
通过继承高级API提供的Dataset
类,自定义了一个语义分割数据集类VOCSegDataset
。 通过实现__getitem__
函数,我们可以任意访问数据集中索引为idx
的输入图像及其每个像素的类别索引。 由于数据集中有些图像的尺寸可能小于随机裁剪所指定的输出尺寸,这些样本可以通过自定义的filter
函数移除掉。 此外,我们还定义了normalize_image
函数,从而对输入图像的RGB三个通道的值分别做标准化。
读取数据集
转置卷积
补充一些基础:
下采样:
- 定义:指在进行一些操作时(如卷积操作或汇聚操作)降低图像的空间分辨率(高和宽)。
- 目的:减少计算量和模型参数的数量,也有助于将低层细节特征抽象为高层语义特征。
- 典型例子:卷积神经网络中的最大池化(Max pooling)。
上采样:
- 定义:指进行一些操作时(如转置卷积)增大图像的空间分辨率。
- 目的:在一些需要更精细处理图像的任务中,对中间层或低层的特征图进行上采样操作,以获得更多的空间信息或恢复部分丢失的空间信息。
- 主要用于语义分割、超分辨率等任务。
基本操作
到目前为止,我们所见到的卷积神经网络层,例如卷积层和汇聚层,通常会减少下采样输入图像的空间维度(高和宽)。然而如果输入和输出图像的空间维度相同,在以像素级分类的语义分割中将会很方便。 例如,输出像素所处的通道维可以保有输入像素在同一位置上的分类结果。
为了实现这一点,尤其是在空间维度被卷积神经网络层缩小后,我们可以使用另一种类型的卷积神经网络层,它可以增加上采样中间层特征图的空间维度。
转置卷积(transposed convolution)可以将较小的特征图上采样为较大的尺寸,从而逆转下采样操作导致的空间尺寸减小。
下图解释了如何为2×2的输入张量计算卷积核为2×2的转置卷积,设步幅为1且没有填充。
与通过卷积核“减少”输入元素的常规卷积相比,转置卷积通过卷积核“广播”输入元素,从而产生大于输入的输出。
填充、步幅和多通道
填充
与常规卷积不同,在转置卷积中,填充被应用于的输出(常规卷积将填充应用于输入)。
- 例如,当将高和宽两侧的填充数指定为1时,转置卷积的输出中将删除第一和最后的行与列。
步幅
在转置卷积中,步幅被指定为中间结果(输出),而不是输入。
使用上图中相同输入和卷积核张量,将步幅从1更改为2会增加中间张量的高和权重,因此输出张量如下图所示
多通道
对于多个输入和输出通道,转置卷积与常规卷积以相同方式运作。假设输入有 c i c_i ci个通道,且转置卷积为每个输入通道分配了一个 k h × k w k_h\times k_w kh×kw的卷积核张量。当指定多个输出通道时,每个输出通道将有一个 c i × k h × k w c_i\times k_h\times k_w ci×kh×kw的卷积核。
全卷积网络
语义分割是对图像中的每个像素分类。
全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换。
与我们之前在图像分类或目标检测部分介绍的卷积神经网络不同,全卷积网络将中间层特征图的高和宽变换回输入图像的尺寸:这是通过引入转置卷积(transposed convolution)实现的。
因此,输出的类别预测与输入图像在像素级别上具有一一对应关系:通道维的输出即该位置对应像素的类别预测。
全卷积网络模型如下图所示:
-
首先使用卷积神经网络抽取图像特征
-
然后通过1×1卷积层将通道数变换为类别个数
-
最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸
因此,模型输出与输入图像的高和宽相同,且最终输出通道包含了该空间位置像素的类别预测。
初始化转置卷积层
应用双线性插值
为了解释双线性插值,假设给定输入图像,我们想要计算上采样输出图像上的每个像素。
-
将输出图像的坐标 ( x , y ) (x,y) (x,y)映射到输入图像的坐标 ( x ′ , y ′ ) (x^{\prime},y^{\prime}) (x′,y′)上。例如,根据输入与输出的尺寸之比来映射。请注意,映射后的 x ′ x\prime x′和 y ′ y\prime y′是实数。
-
在输入图像上找到离坐标 ( x ′ , y ′ ) (x^{\prime},y^{\prime}) (x′,y′)最近的4个像素。
-
输出图像在坐标 ( x , y ) (x,y) (x,y)上的像素依据输入图像上这4个像素及其与 ( x ′ , y ′ ) (x^{\prime},y^{\prime}) (x′,y′)的相对距离来计算。
风格迁移
(需要用到再学习)