PyTorch学习笔记8——计算机视觉(CV)

由于本人需要快速上手图像识别方面内容,所以未按照参考书中内容进行学习,直接跳到了计算机视觉部分。

8.1 图像增广

图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模。 此外,应用图像增广的原因是,随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力。 例如,我们可以以不同的方式裁剪图像,使感兴趣的对象出现在不同的位置,减少模型对于对象出现位置的依赖。 我们还可以调整亮度、颜色等因素来降低模型对颜色的敏感度。
导入所用包

import torch
import time
from torch import nn, optim
from torch.utils.data import Dataset, DataLoader
import torchvision
from PIL import Image
import sys
sys.path.append("..")

device = torch.device('cuda' if torch.cuda.is_available() else
                      'cpu')

8.1.1 常用图像增广的办法

8.1.1.1 翻转和裁剪

左右翻转图像通常不会改变对象的类别。这是最早和最广泛使用的图像增广方法之一。 接下来,我们使用 transforms 模块来创建 RandomFlipLeftRight 实例,这样就各有50%的几率使图像向左或向右翻转。

 torchvision.transforms.RandomHorizontalFlip()

在这里插入图片描述

随机裁剪一个面积为原始面积10%到100%的区域,该区域的宽高比从0.5到2之间随机取值。 然后,区域的宽度和高度都被缩放到200像素。

torchvision.transforms.RandomResizedCrop(
    (200, 200), scale=(0.1, 1), ratio=(0.5, 2))

在这里插入图片描述

8.1.1.2 改变颜色

另一种增广方法是改变颜色。 我们可以改变图像颜色的四个方面:亮度、对比度、饱和度和色调。 在下面的示例中,我们将图像的亮度更改为原始图像的50%( 1−0.5 )到150%( 1+0.5 )之间的随机值。

torchvision.transforms.ColorJitter(brightness=0.5, contrast=0,
                                       saturation=0, hue=0)

在这里插入图片描述
我们还可以随机改变图像的色调。

torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0,
                                       hue=0.5)

在这里插入图片描述

8.1.1.3 结合多种图像增广方法

我们可以通过使用一个 Compose 实例来综合上面定义的不同的图像增广方法,并将它们应用到每个图像。

augs = torchvision.transforms.Compose([
    torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])

在这里插入图片描述

8.2 微调

在这里插入图片描述

微调包括以下四个步骤:

1.在源数据集(例如 ImageNet 数据集)上预训练神经网络模型,即 源模型。

2.创建一个新的神经网络模型,即 目标模型。这将复制源模型上的所有模型设计及其参数,但输出层除外。我们假定这些模型参数包含从源数据集中学到的知识,这些知识也将适用于目标数据集。我们还假设源模型的输出图层与源数据集的标签密切相关;因此不在目标模型中使用该图层。

3.向目标模型添加输出图层,其输出数量是目标数据集中的类别数。然后随机初始化该层的模型参数。

4.在目标数据集(如椅子数据集)上训练目标模型。输出图层将从头开始进行训练,而所有其他图层的参数将根据源模型的参数进行微调。

8.3 目标检测和边界框

先加载示例图片

mport torch
from torch import nn, optim
from torch.utils.data import Dataset, DataLoader
import torchvision
from PIL import Image
import sys
sys.path.append("..")
import matplotlib.pyplot as plt
device = torch.device('cuda' if torch.cuda.is_available() else
                      'cpu')
                  
img = Image.open('D:\\dogcatdata\\cnn_data\\cnn_data\\数据集\\training_data\\cats\\cat.0.jpg')

plt.imshow(img)
plt.show()

在这里插入图片描述

在目标检测中,我们通常使用边界框(bounding box)来描述目标位置。边界框是一个矩形框,可以由矩形左上角的x轴和y轴坐标来确定。
图中的坐标原点在图像的左下角,原点往右和往下分别为x轴和y轴的正方向

# 规定框(左上x, 左上y, 右下x, 右下y)
cat_bbox = [122, 69, 369, 216]

def bbox_to_rect(bbox, color):
# 将边界框转换成matplotlib格式:((左上x, 左上y), 宽, 高)
    return plt.Rectangle(xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1], fill=False, edgecolor=color, linewidth=2)
fig = plt.imshow(img)
fig = plt.show()
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'))

上述代码在本人电脑运行未显示理想效果,可能是axes的原因,后续有时间会在更新。

8.4 锚框

目标检测算法通常会在输入图像采样大量的区域,然后判断这些区域是否有我们感兴趣的目标,并调整区域边缘来准确预测目标的真实边界框。
不同模型使用的区域采样方法可能不同。
这里介绍一种方法,它以每个像素为中心生成多个大小和宽高比(aspect ratio)不同的边界框,这些框称之为锚框(anchor box)。

锚框的具体运用会在之后的论文研读方面进行研究,本篇文章还会不定期更新~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值