计算机视觉CV-1

计算机视觉CV

参考:https://www.kaggle.com/learn/computer-vision

卷积神经网络(convnet,CNN)

一种深度学习神经网络架构,特别适用于处理具有网格结构(例如图像和视频)的数据。能够有效地捕捉图像中的局部特征,并具备平移不变性。

对抗网络(adversarial networks)

对抗网络(Adversarial Networks),通常指的是生成对抗网络(Generative Adversarial Networks,GANs),是一种深度学习模型框架,由两个神经网络模型组成,一个是生成器(Generator),另一个是判别器(Discriminator)。GANs 的核心思想通过对抗训练的方式来生成逼真的数据样本。

GANs的主要组成和工作原理:

  1. 生成器(Generator):生成器是一个神经网络模型,它的任务是生成与真实数据样本类似的合成数据样本。它接受一个随机噪声向量(通常称为潜在空间向量)作为输入,并将其映射到一个数据样本的空间。生成器尝试生成越来越逼真的数据样本,以欺骗判别器。

  2. 判别器(Discriminator):判别器是另一个神经网络模型,它的任务是评估给定的数据样本是真实数据还是生成器生成的合成数据。判别器的目标是区分真实数据和生成器生成的数据。它输出一个概率值,表示输入样本是真实数据的概率。

  3. 对抗过程:GANs 的训练过程是一个对抗过程。生成器和判别器相互竞争和对抗。生成器试图生成足够逼真的数据,以欺骗判别器,而判别器试图更好地区分真实数据和生成数据。这个过程通过最小化生成器和判别器之间的损失函数来进行,通常使用交替优化的方式。

  4. 损失函数:生成器和判别器都有各自的损失函数。生成器的损失函数衡量生成的数据与真实数据之间的差距判别器的损失函数衡量判别器的分类性能。GANs的优化目标是找到平衡点,使生成器生成逼真的数据,并且判别器无法准确地区分真伪。

  5. 生成逼真样本:一旦训练完成,生成器可以用来生成逼真的数据样本,这些样本在统计上类似于训练数据。这在图像生成、图像修复、超分辨率、生成艺术等应用中具有广泛的用途。

图像分割(image segmentation)

图像分割(Image Segmentation)是计算机视觉领域的一个重要任务,其目标是将图像分成若干个不同的区域或对象,使得每个区域内的像素具有相似的特征或语义。图像分割通常用于将图像中的每个像素分配到特定的类别或分割对象,从而识别和提取图像中的各种物体、边界和结构。

图像分割的主要类型和应用:

  1. 语义分割(Semantic Segmentation):在语义分割中,目标是将图像中的每个像素分配到预定义的语义类别,通常使用类别标签来表示不同的对象或区域。这种分割技术可用于实现图像中对象的精确识别和像素级别的分类。

  2. 实例分割(Instance Segmentation):实例分割不仅要求分割图像中的对象,还需要将相同类别的不同实例区分开来。这种分割技术对于多对象场景中的对象检测和跟踪非常有用。

  3. 边缘检测(Edge Detection):边缘检测是图像分割的一种形式,它旨在识别图像中的物体边界。通常通过检测像素值之间的梯度或差异来实现

  4. 实际应用:图像分割在各种实际应用中都有广泛的用途,包括医学图像分析(如肿瘤检测和器官分割)、自动驾驶(识别道路和障碍物)、计算机视觉系统中的对象识别和跟踪、图像编辑和合成、卫星图像分析等领域。

卷积分类器(Convolutional Classifier)

包含:a convolutional base and a dense head.

卷积基础convolutional base:用于从图像中提取特征,由卷积层和池化层组成。

密集头部dense head:用于分类的部分,通常由全连接层(Fully Connected Layers)组成。

  • 全连接层的主要特点是每个神经元都与前一层的每个神经元相连接。

The parts of a convnet: image, base, head, class; input, extract, classify, output.

特征提取的示例图:

The idea of feature extraction.

网络在训练过程中的目标是学习两件事:

  1. 从图像中提取哪些特征(基础);

  2. 哪个类别与哪些特征相匹配(头部)。

attaching a head of dense layers to a pretrained base

卷积网络很少从头开始训练。更常见的是,我们重用预训练模型的基础。然后我们在预训练的基础上附加一个未经训练的头部。换句话说,我们重用网络中已经学会执行 1. 提取特征,并附加一些新层来学习;2. 分类的部分。

Attaching a new head to a trained base.

头部包含较少的层,在已有的Base上加上一个new Head可以从相对较少的数据创建非常准确的分类器。

重用预训练模型是一种称为迁移学习的技术。它非常有效,以至于现在几乎每个图像分类器都会使用它。

分类模型结构:

  • 输入:预训练的 VGG16 模型输出的特征图。

  • 中间层:Flatten 层将特征图展平,接着是一个具有6个神经元的全连接层,用于学习特征的高级表示。

  • 输出层:具有一个神经元的全连接输出层,用于进行二分类,输出一个样本属于正类别的概率。

预训练的 VGG16设置为不可训练,保证其权重不变

1
2
3
4
5
6
model = keras.Sequential([
pretrained_base,
layers.Flatten(),
layers.Dense(6, activation='relu'),
layers.Dense(1, activation='sigmoid'),
])

模型训练过程分析

训练数据的loss与验证数据的loss 更多操作训练数据的accuracy与验证数据的accuracy
img img

可以发现,随着训练epoch次数的增加,训练数据集的loss和accuracy逐渐增加。

而验证数据集的loss先减少再回升,这可能是因为训练次数的增加导致的过拟合;验证数据集的accuracy也在epoch=20左右的时候达到最大值之后下降。

交叉熵(Cross-Entropy)

它用于衡量两个概率分布之间的相似性或差异性。交叉熵常被用于分类问题中,特别是在深度学习中,用作损失函数来衡量模型的性能和优化模型的参数。

在机器学习和深度学习中,交叉熵的定义如下:

假设有两个概率分布 P 和 Q,其中 P 表示真实分布(ground truth)Q 表示模型的预测分布。交叉熵损失用于衡量 Q 预测与 P 真实分布之间的差异。其一般形式为:

H(P,Q)=iP(i)log(Q(i))H(P, Q) = -\sum_{i} P(i) \cdot \log(Q(i))

在二分类问题中,可以简化为:

H(P,Q)=[Plog(Q)+(1P)log(1Q)]H(P, Q) = -[P \cdot \log(Q) + (1 - P) \cdot \log(1 - Q)]

其中,P 表示真实标签(0或1),Q 表示模型的预测值(0到1之间的概率值)。

要理解交叉熵的含义,可以将其视为衡量两个概率分布之间的“距离”。当模型的预测分布 Q 与真实分布 P 完全匹配时,交叉熵达到最小值为零。但是,如果 Q 的预测与 P 不匹配,交叉熵将增大,表明模型的预测与真实情况之间存在差异。

在分类问题中,通常使用交叉熵作为损失函数来训练模型,目标是最小化交叉熵,使模型的预测尽可能接近真实标签的分布。这有助于模型学习正确分类样本的能力。

交叉熵是用于衡量概率分布之间差异的一种常用度量,特别在分类问题中广泛应用。它是深度学习中常见的损失函数之一,用于模型的训练和优化。

典型代码

加载训练和验证集:
1
2
3
4
5
6
7
8
9
ds_train_ = image_dataset_from_directory(
'../input/car-or-truck/train',
labels='inferred',
label_mode='binary',
image_size=[128, 128],
interpolation='nearest',
batch_size=64,
shuffle=True,
)
数据管道Data Pipeline(也就是对数据进行各种处理的函数集):
1
2
3
def convert_to_float(image, label):
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
return image, label
对训练集和验证集的处理:
1
2
3
4
5
6
7
AUTOTUNE = tf.data.experimental.AUTOTUNE
ds_train = (
ds_train_
.map(convert_to_float)
.cache()
.prefetch(buffer_size=AUTOTUNE)
)
  1. AUTOTUNE = tf.data.experimental.AUTOTUNEAUTOTUNE 是一个特殊的常量,它允许 TensorFlow 自动选择最佳的参数值,以优化数据加载和处理性能。它通常用于设置数据集的缓存和预取参数,以使数据加载和模型训练尽可能快速。

  2. ds_trainds_valid 分别是训练集和验证集的数据集对象

  3. .map(convert_to_float):这是使用 .map 操作来对数据集中的每个样本应用 convert_to_float 函数,即将图像数据从整数类型转换为浮点数类型。这是数据预处理的一部分,确保输入数据与深度学习模型的期望数据类型一致。

  4. .cache():这个操作将数据集缓存到内存中,以便在训练过程中更快地访问数据。这对于小型数据集或可以适应内存的数据集而言非常有用,因为它可以减少数据加载的时间。

  5. .prefetch(buffer_size=AUTOTUNE):这个操作是为了加速数据加载。它允许模型在训练时异步地从数据集中预取(预加载)样本到内存中,以便在训练过程中无需等待数据加载完成。buffer_size 参数设置为 AUTOTUNE 表示让 TensorFlow 自动选择合适的缓冲区大小以优化性能。

模型的训练:
1
2
3
4
5
6
7
8
9
10
11
12
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['binary_accuracy'],
)

history = model.fit(
ds_train,
validation_data=ds_valid,
epochs=30,
verbose=0,
)

epochs=30 指定了训练的时代数,即模型将遍历整个训练数据集的次数

在每个 epoch 中,训练数据集会被分成多个 batch,每个 batch 包含 batch_size 个样本。模型通过处理这些 batch 来学习数据集。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2024 Guijie Wang
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信