文章目录
36. Data augmentation
- 数据增广是深度学习中一项重要的技术,主要用于增加训练数据集的数量和多样性,从而提高模型的泛化能力和鲁棒性。
- 数据增广不仅用于处理图片,也可用于文本和语音
基本概念: 数据增广是指通过对原始数据集进行一系列的变换来增加数据集数量,这些变换可以是几何变换(如旋转、缩放、裁剪等)、颜色变换(如改变亮度、对比度等)或添加噪声等方式。通过数据增广,可以生成新的训练数据,使模型更好地适应各种变化,提高模型的性能。
- 随机裁剪:随机裁剪是一种常用的数据增广技术,它可以从原始图像中随机裁剪出一部分作为新的训练样本。这种技术可以增加图像的多样性,使模型更好地感知图像的不同部分。
- 旋转:通过对原始图像进行旋转操作,可以生成具有不同方向的训练样本。这有助于模型学习不同方向的特征,提高模型的泛化能力。
- 缩放:缩放操作可以改变图像的大小,生成具有不同尺寸的训练样本。这有助于模型学习不同尺度的特征,提高模型对目标大小的适应性。
- 颜色变换:通过改变图像的亮度、对比度、饱和度等颜色属性,可以增加图像的多样性。这种技术有助于模型学习颜色不变性特征,提高模型的鲁棒性。
- 增加噪声:在图像中添加噪声可以模拟真实场景中的噪声干扰,使模型更具抗噪性。常见的噪声类型包括高斯噪声、椒盐噪声等。
- 图像扭曲:通过改变图像的形状,如拉伸或挤压,可以增加数据集的多样性。这种技术有助于模型学习不同形状的物体特征,提高模型的泛化能力。
36.1 Training with enhanced data
-
采集数据得到的训练场景与实际部署场景不同是常见的问题,这种变化有时会显著影响模型表现。在训练集中尽可能模拟部署时可能遇到的场景对模型的泛化性十分重要。
-
数据增强是指在一个已有数据集上操作使其有更多的多样性。对语音来说可以加入不同的背景噪音,对图片而言可以改变其颜色,形状等。
一般来说不会先将数据集做增广后存下来再用于训练;而是直接在线生成,从原始数据中读图片并随机做数据增强,再进入模型训练。通常只在训练时做数据增强而测试时不用。可以将数据增强理解为一个正则项。
36.2 Enhancement measures
翻转
左右翻转,上下翻转
- 要注意不是所有增强策略都总是可行,如建筑图片上下翻转就不太合适,而之前的树叶分类竞赛中的树叶图片就没关系。
切割
- 从图片中切割一块然后变形到固定形状。一般做法是随机取一个高宽比,随机取图片大小(切下部分占原图的百分数),随机取位置。
颜色
- 改变色调,饱和度,明亮度。
其他
- 还可以有很多种不同的方法,如高斯模糊,部分像素变黑,图片变形,锐化等等。理论上讲Photoshop能做到的都可以用作图片数据增强,但效果好坏另当别论。如果测试集中有类似的效果那么相应的数据增广手段会更有效。
36.3 Data augmentation summary
- 数据增广通过变形数据来获取多样性从而使得模型泛化性能更好
- 常见图片增广包括翻转,切割,变色
37. Fine tuning
37.1 Fine tuning Introduce
问题引入:很多时候,例如我们想对家具进行分类,但是往往在努力收集数据得到的数据集也比较小假如我们想识别图片中不同类型的椅子,然后向用户推荐购买链接。
-
一种可能的方法是首先识别100把普通椅子,为每把椅子拍摄1000张不同角度的图像,然后在收集的图像数据集上训练一个分类模型。 尽管这个椅子数据集可能大于Fashion-MNIST数据集,但实例数量仍然不到ImageNet中的十分之一。
-
适合ImageNet的复杂模型可能会在这个椅子数据集上过拟合。 此外,由于训练样本数量有限,训练模型的准确性可能无法满足实际要求。为了避免这种情况,我们可以有两种方法:
-
显然的想法就是收集更多的数据,但是,收集和标记数据可能需要大量的时间和金钱。 例如,为了收集ImageNet数据集,研究人员花费了数百万美元的研究资金。 尽管目前的数据收集成本已大幅降低,但这一成本仍不能忽视。
-
我们可以考虑迁移学习将从源数据集学到的知识迁移到目标数据集。 例如,尽管ImageNet数据集中的大多数图像与椅子无关,但在此数据集上训练的模型可能会提取更通用的图像特征,这有助于识别边缘、纹理、形状和对象组合。 这些类似的特征也可能有效地识别椅子。
37.2 Fine tuning Step
- 如图所示,微调包括以下四个步骤:
-
在源数据集(例如ImageNet数据集)上预训练神经网络模型,即源模型。
-
创建一个新的神经网络模型,即目标模型。这将复制源模型上的所有模型设计及其参数(输出层除外)。我们假定这些模型参数包含从源数据集中学到的知识,这些知识也将适用于目标数据集。我们还假设源模型的输出层与源数据集的标签密切相关;因此不在目标模型中使用该层。
-
向目标模型添加输出层,其输出数是目标数据集中的类别数。然后随机初始化该层的模型参数。
-
在目标数据集(如椅子数据集)上训练目标模型。输出层将从头开始进行训练,而所有其他层的参数将根据源模型的参数进行微调。
-
通常来讲,微调速度更快,并且具有较强的正则性,一般学习率比较小,也不需要很多轮的数据迭代,对于不同的任务往往只需要改变最后输出层,这一层随机初始化即可。
37.3 Fine tuning summary
- 迁移学习将从源数据集中学到的知识“迁移”到目标数据集,微调是迁移学习的常见技巧。
- 除输出层外,目标模型从源模型中复制所有模型设计及其参数,并根据目标数据集对这些参数进行微调。但是,目标模型的输出层需要从头开始训练。
- 通常,微调参数使用较小的学习率,而从头开始训练输出层可以使用更大的学习率。
38. Object detection
38.1 Object detection
- 图片分类和目标检测在任务上的区别:图片分类已知有一个确定目标,任务是识别该目标属于何种分类,而目标检测不仅需要检测出图片中所有感兴趣的目标类别,并确定其位置,所以目标检测要比图片分类更复杂应用场景更广。
- 图片分类和目标检测在数据集上的区别:由于目标检测中每一张图片可能存在多个目标,每个目标我们不仅需要分类,还需要确定边缘框以给出目标位置信息,因此目标检测数据集的标注成本要显著高于图片分类,也就导致了目标检测数据集较小。
- 边缘框:用一个尽量小矩形框将目标物体大体框起来,边框的位置信息就可以表示目标位置在图片中的位置信息,常见的边缘框有两种表示方法:
- (左上x,左上y,右下x,右下y)
- (左上x,左上y,宽,高)
- 目标检测数据集的常见表示:每一行表示一个物体,对于每一个物体而言,用“图片文件名,物体类别,边缘框”表示,由于边缘框用4个数值表示,因此对于每一行的那一个物体而言,需要用6个数值表示。
- 目标检测领域常用数据集:COCO(80类物体,330K图片,所有图片共标注1.5M物体)
38.2 Edge box implementation
- 目标的位置
- 在图像分类任务中,我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。 然而,很多时候图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体位置。 在计算机视觉里,我们将这类任务称为目标检测(object detection)或*目标识别*(object recognition)。目标检测在多个领域中被广泛使用。 例如,在无人驾驶里,我们需要通过识别拍摄到的视频图像里的车辆、行人、道路和障碍物的位置来规划行进线路。 机器人也常通过该任务来检测感兴趣的目标。安防领域则需要检测异常目标,如歹徒或者炸弹。
- 边界框
-
在目标检测中,我们通常使用边界框(bounding box)来描述对象的空间位置。 边界框是矩形的,由矩形左上角的以及右下角的x和y坐标决定。 另一种常用的边界框表示方法是边界框中心的(x,y)轴坐标以及框的宽度和高度。
-
在这里,我们定义在这两种表示法之间进行转换的函数:
box_corner_to_center
从两角表示法转换为中心宽度表示法,而box_center_to_corner
反之亦然。 输入参数boxes
可以是长度为4的张量,也可以是形状为(n,4)的二维张量,其中n是边界框的数量。
#@save
def box_corner_to_center(boxes):
"""从(左上,右下)转换到(中间,宽度,高度)"""
x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
cx = (x1 + x2) / 2
cy = (y1 + y2) / 2
w = x2 - x1
h = y2 - y1
boxes = torch.stack((cx, cy, w, h), axis=-1)
return boxes
#@save
def box_center_to_corner(boxes):
"""从(中间,宽度,高度)转换到(左上,右下)"""
cx, cy, w, h = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
x1 = cx - 0.5 * w
y1 = cy - 0.5 * h
x2 = cx + 0.5 * w
y2 = cy + 0.5 * h
boxes = torch.stack((x1, y1, x2, y2), axis=-1)
return boxes
- 我们将根据坐标信息定义图像中狗和猫的边界框。 图像中坐标的原点是图像的左上角,向右的方向为x轴的正方向,向下的方向为y轴的正方向。
# bbox是边界框的英文缩写
dog_bbox, cat_bbox