图像增广
对训练图像做一系列随即改变,产生相似却不同的训练样本,增大训练数据集的规模。也可降低模型对某些属性的依赖,从而提高模型的泛化能力。
show_images函数进行图片缩放,figsize相应改变,而新图片的每个像素都相应的改变。
图像数据集读取后规格为[image,label]。
翻转
图像增广指运用在训练样本中,左右翻转不改变物体类别,比上下翻转更适合训练。
裁剪
池化层能降低卷积层对目标位置的敏感度,也可通过图片随机裁剪使物体出现在图像不同的位置,降低模型对目标位置的敏感性。
属性
可改变要素有亮度、对比度、饱和度、色调。
叠加
用Compose实例将上面定义的图像增广方法叠加。
为了在预测时得到确定的结果,通常只将图像增广应用在训练样本上,而不在预测时使用含随机操作的图像增广。
微调
训练新的模型,方法1:手机更多数据;方法2:迁移学习。
由于训练集样本有限,在原有大数据集训练得到的模型进行迁移学习,得到新的模型。
迁移学习:将从源数据集学到的知识迁移到目标数据集上。
其中一种常用技术:微调(fine tuning)。目标模型复制了源模型上除了输出层外所有模型设计及其参数,并基于目标数据集微调这些参数,而输出层从头训练。
微调参数使用较低学习率,而输出层可用较大学习率。
步骤
- 在源数据集训练一个源模型
- 创建目标模型,复制(pretrained=True)源模型除输出层外所有设计和参数
- 设计输出大小为目标数据集类别个数的输出层,随机初始化该层模型参数
- 在目标数据集上训练目标模型
当目标数据集远小于源数据集时,微调有助于体会僧模型泛化能力。
训练时,图像随机剪裁,然后缩放为224像素的输入;测试时,将图像缩放为256像素,然后采集裁剪中心的224像素。彩色图像三通道的数值各自标准化。
使用预训练模型时注意看对应模型的源码,查看输出层的定义形式,进行相应的更改。
map函数
map(function, iterable, …)会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
训练时对源模型部分进行微调,输出层需要加大学习率进行调整。(优化函数,weight_decay为权重衰减参数(L2惩罚项))
目标检测和边界框
目标检测:不仅知道图像类别,而且找到图像中的位置。
边界框
左上角与右下角的xy坐标唯一确定边界框的位置。图像坐标原点位于左上角,原点往右和往下分别为xy轴的正方向。
boundingbox格式(x1,y1,x2,y2)
matplotlib格式(x1,x2,w,h)
锚框
目标检测算法通常在输入图像中大量采样,判断区域中好似否有感兴趣的目标,调整区域边缘,找到真实边界框。
以每个像素为中心生成多个大小和宽高比不同的边界框,进行匹配,这些边界框成为锚框。
大小(size)为$s \in (0,1]$,宽高比(ratio)为r>0,锚框的宽为ws*sqrt(r)锚框的高为$hs/\sqrt{r}$。size指代的是相对(图像的宽、高)比例。
每一个(s_i,r_j)均对应着w*h个中心点形成的锚框,故由w*h*n*m个锚框。此时计算复杂度过高,只取包含s_1和r_1的组合。此时每一个像素对应锚框数量为n+m-1,共有w*h*(n+m-1)个锚框。
生成锚框的函数的输出为(1,num_anchors,4),由于batch里每个都一样,所以第一维为1,4代表着锚框的四个坐标点。
交并比
Jaccard系数:衡量两个集合的相似度=两者交集大小/两者并集大小。
交并比,IoU,两个边界框橡胶面积与相并面积之比。
1 | def compute_intersection(set_1, set_2): |
标注训练集的锚框
在训练集中,为每个锚框标注两类标签:一是锚框所含目标的类别;二是真实边界框相对锚框的偏移量。
在目标检测时,首先生成多个锚框,然后为每个锚框预测类别以及偏移量,接着根据预测的偏移量调整锚框位置从而得到预测边界框,最后筛选需要输出的预测边界框。
定义矩阵,元素为锚框与真实边界框的交并比,找出其中最大元素,删去同行同列其他元素;再寻找最大元素,仿照上继续,最后一步,在剩余的一列中找除去已找到元素行外其余锚框;用阈值判断法分配真实的边界框。
若锚框A被分配了真实边界框B,则将A的类别设置为B的类别,偏移量的标注用f(两框的中心坐标相对位置,两框的相对大小)。为了让偏移量分布更均匀以拟合,需要进行特殊变换。
负类锚框:类别为背景的锚框
正类锚框:其余的锚框
1 | # 以下函数已保存在d2lzh_pytorch包中方便以后使用 |
返回的第一项是为每个锚框标注的四个偏移量,其中负类锚框的偏移量标注为0。
返回值的第二项为掩码(mask)变量,形状为(批量大小, 锚框个数的四倍)。掩码变量中的元素与每个锚框的4个偏移量一一对应。 有关负类的偏移量不应影响目标函数,通过按元素乘法,掩码变量中的0可以在计算目标函数之前过滤掉负类的偏移量。
第三项表示为锚框标注的类别。0:background,1:dog,2:cat.
输出预测边界框
模型预测:生成多个锚框,一一预测类别和偏移量,随后通过锚框和预测偏移量得到预测边界框。移除相似的预测边界框–>非极大值抑制(non-maximum suppression,NMS)
非极大值抑制:
对于预测边界框B,计算各个类别的预测概率,其中最大的p即为其类别和置信度。
同一图像的预测类别为非背景的预测边界框置信度降序排列,得到列表L;最高B1,将与其IoU超过一个阈值参数的的边界框删去;次高B2,重复前一步,直到所有边界框均作为基准。此时L中全为预测边界框。
全程类似冒泡排序???
将置信度较低的预测边界框移除,从而减小非极大值抑制的计算量,还可以筛选非极大值抑制的输出,从而令结果简洁。
多尺度目标检测
针对锚框数量过多问题:均匀采样一小部分像素,进行生成锚框。
较小目标比较大目标在图像上出现位置的可能性更多。锚框大,则采样少;锚框小,则采样多。
卷积神经网络的二维数组输出称为特征图。特征图的形状能确定任一图像上均匀采样的锚框中心。
函数中fmap_w,fmap_h分别代表检测框中心的分布,fmap_h行fmap_w列个。
在多个尺度下生成不同数量和不同大小的锚框,从而在多个尺度下检测不同大小的目标。
基于卷积神经网络的方法???:
依据c_i张形状为h×w的特征图生成h×w组不同中心的锚框,且每组的锚框个数为a。依据真实边界框的类别和位置,每个锚框将被标注类别和偏移量。
在当前的尺度下,目标检测模型需要根据输入图像预测h×w组不同中心的锚框的类别和偏移量。
当不同层的特征图在输入图像上分别拥有不同大小的感受野时,它们将分别用来检测不同大小的目标。
图像检测数据集
permute(dims)
将tensor的维度换位。参数是一系列的整数,代表原来张量的维度。
a=rand(2,3,4); %这是一个三维数组,各维的长度分别为:2,3,4
permute(A,[2,1,3]) %变成324的矩阵,按次序调转
区域卷积神经网络
region based CNN/R-CNN,将深度模型应用于目标检测。
R-CNN
对图像进行选择提议区域,标注类别和边界框,用卷积神经网络做前向计算抽取特征。然后用提议区域的特征预测类别和边界框。
步骤:
- 对输入图像使用选择性搜索(selective search)来选取多个高质量的提议区域 。多个尺度选取,提议区域将被标注类别和真实边界框。
- 选取一个预训练的卷积神经网络,并将其在输出层之前截断。将每个提议区域变形为网络需要的输入尺寸,并通过前向计算输出抽取的提议区域特征。
- 将每个提议区域的特征连同其标注的类别作为一个样本,训练多个支持向量机对目标分类。每个支持向量机用来判断样本是否属于某一个类别。
- 将每个提议区域的特征连同其标注的边界框作为一个样本,训练线性回归模型来预测真实边界框。
有效抽取了图像特征,性能瓶颈在于需要对每个提议区域独立抽取特征,速度慢。
快速的R-CNN(Fast R-CNN)
独立的特征抽取会导致大量的重复计算。Fast R-CNN改进在于只对整个图像做卷积神经网络的前向计算。
步骤:
- 提取特征的卷积神经网络的输入是整个图像,卷积神经网络的输出的形状1xcx h_1 x w_1.
- 提议区域在卷积神经网络的输出上分别标出形状各异的兴趣区域,兴趣区域需要抽取出形状相同的特征,Fast R-CNN引入兴趣区域池化(Region of Interest Pooling,RoI池化)层,将卷积神经网络的输出和提议区域作为输入,输出连结后的各个提议区域抽取的特征.
- 全连接层将输出形状变换为n x d.
- 预测类别时,将全连接层的输出的形状再变换为n×q并使用softmax回归(q为类别个数)。预测边界框时,将全连接层的输出的形状变换为n×4。
普通池化层需要通过设置池化窗口、填充和步幅来控制输出形状,而兴趣区域池化层对输出形状可以指定。
对于[0,1,2;4,5,6;8,9,10],用2x2的兴趣区域池化层。0、1、4、5(5最大),2、6(6最大),8、9(9最大),10。
更快的R-CNN(Faster R-CNN)
Fast R-CNN通常需要在选择性搜索中生成较多的提议区域,以获得较精确的目标检测结果。Faster R-CNN提出将选择性搜索替换成区域提议网络(region proposal network),从而减少提议区域的生成数量,并保证目标检测的精度。
区域提议网络的计算步骤如下:
- 使用填充为1的3×3卷积层变换卷积神经网络的输出,并将输出通道数记为c。这样,卷积神经网络为图像抽取的特征图中的每个单元均得到一个长度为c的新特征。
- 以特征图每个单元为中心,生成多个不同大小和宽高比的锚框并标注它们。
- 用锚框中心单元长度为c的特征分别预测该锚框的二元类别(含目标还是背景)和边界框。
- 使用非极大值抑制,从预测类别为目标的预测边界框中移除相似的结果。最终输出的预测边界框即兴趣区域池化层所需要的提议区域。
Faster R-CNN的目标函数既包括目标检测中的类别和边界框预测,又包括区域提议网络中锚框的二元类别和边界框预测。
掩码R-CNN(Mask R-CNN)
如果训练数据还标注了每个目标在图像上的像素级位置,那么Mask R-CNN能有效利用这些详尽的标注信息进一步提升目标检测的精度。
Mask R-CNN在Faster R-CNN的基础上做了修改。Mask R-CNN将兴趣区域池化层替换成了兴趣区域对齐层,即通过双线性插值(bilinear interpolation)来保留特征图上的空间信息,从而更适于像素级预测。兴趣区域对齐层的输出包含了所有兴趣区域的形状相同的特征图。它们既用来预测兴趣区域的类别和边界框,又通过额外的全卷积网络预测目标的像素级位置。
语义分割和数据集
普通的目标检测:方形边界框来标注和预测图像中的目标。
语义分割semantic segmentation:将图像分割成属于不同语义类别的区域,标注和预测都是像素级的。
图像分割image segmentation:利用图像中像素之间的相关性。在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区域具有希望得到的语义。
实例分割instance segmentation:同时检测并分割(simultaneous detection and segmentation)。研究如何识别图像中各个目标实例的像素级区域。与语义分割有所不同,实例分割不仅需要区分语义,还要区分不同的目标实例。
图像要缩放以符合模型的输入形状,语义分割因为需要再原图做精准定位,所以使用裁剪方法:使用图像增广里的随机裁剪,并对输入图像和标签裁剪相同区域。
语义分割的一个重要数据集叫作Pascal VOC2012。
样式迁移
一个滤镜通常只能改变照片的某个方面。如果要照片达到理想中的样式,经常需要尝试大量不同的组合。
样式迁移:将某图片的样式应用到另一图片上。
内容图像
样式图像
损失函数:样式迁移的损失函数即内容损失、样式损失和总变差损失的加权和。
内容损失:在内容特征上接近
样式损失:在样式特征上接近
总变差损失:减少合成图像的噪点->总变差降噪
假设$x_{i,j}$表示坐标为(i,j)的像素值,降低总变差损失能够尽可能使邻近的像素值相似。
$$min \sum_{i,j} |x_{i,j}-x_{i+1,j}|+|x_{i,j}-x_{i,j+1}|$$
预处理图像:更改输入图像尺寸,将图像更改为可输入格式,RGB通道标准化
后处理图像:将输出图像反标准化
一般来说,模型中间层,越靠近输入层的输出越容易抽取图像的细节信息,反之则越容易抽取图像的全局信息。
可以通过预训练的卷积神经网络来抽取图像的内容和样式特征,在选取的样式层和内容层之间进行迁移学习。
格拉姆矩阵表达样式层输出的样式。