17、卷积神经网络计算机视觉实践指南

卷积神经网络计算机视觉实践指南

1. 数据拟合与图像增强

在计算机视觉领域,卷积神经网络(CNN)是一种强大的工具。在完成数据准备后,最后一步是对创建的数据进行拟合。以下是实现此操作的代码:

classifier.fit_generator(training_set,
steps_per_epoch = 5000,
epochs = 25,
validation_data = test_set,
validation_steps = 1000)

这里, steps_per_epoch 是训练图像的数量, validation_steps 是测试图像的数量。

图像增强是处理图像的重要部分。“增强”意味着增大尺寸或数量的动作或过程。图像或数据增强的工作方式类似,它会创建图像的多个批次,然后对批次内的随机图像应用随机变换,如旋转、平移、翻转等。通过这种变换,我们可以在批次内获得更多样化的图像,并且数据量也比原始数据多得多。例如,一个圆柱体可以从不同角度旋转并呈现出不同的样子,从单个圆柱体图像可以通过不同角度的观察有效地创建出五个不同的图像。

以下是图像增强的示例代码:

from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./100,
                                   shear_range = 0.3,
                                   zoom_range = 0.3,
                                   horizontal_flip = False)
test_datagen = ImageDataGenerator(rescale = 1./100)

图像增强具有以下优点:
- 减少过拟合 :通过从各个角度对同一图像进行切片和分割,创建多个版本的图像,有助于减少过拟合。
- 增加图像数量 :单个图像可以充当多个图像,本质上数据集的图像数量较少,但通过图像增强可以将每个图像转换为多个图像,并且算法会对每个图像进行不同的处理。
- 易于预测新图像 :想象一个足球的单个图像从不同角度观察,每个角度都被视为一个独特的图像,这意味着算法在预测新图像时会更准确。

2. 构建 CNN 识别猫狗图像

下面我们通过一个具体的例子来展示如何使用 CNN 识别猫狗图像。

步骤如下:
  1. 导入库和类
#Import the Libraries 
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPool2D
from keras.layers import Flatten
from keras.layers import Dense
  1. 初始化模型
#Initiate the classifier
classifier=Sequential()
  1. 添加 CNN 的第一层
classifier.add(Conv2D(32,3,3,input_shape=(64,64,3),activation='relu'))

这里的 32,3,3 表示有 32 个 3x3 大小的特征检测器。
4. 添加池化层

classifier.add(MaxPool2D(2,2))
  1. 扁平化 CNN
classifier.add(Flatten())
  1. 添加 ANN 的第一个全连接层
classifier.add(Dense(128,activation='relu')) 

这里 128 是节点的输出数量,作为最佳实践,以 2 的幂次方开始是不错的选择。
7. 添加 ANN 的输出层

classifier.add(Dense(1,activation='sigmoid')) 

这是一个二分类问题,所以输出为 1,激活函数为 sigmoid。
8. 编译网络

#Compile the network
classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
  1. 缩放和转换图像
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
  1. 创建训练集
training_set = train_datagen.flow_from_directory('../dataset/training_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
  1. 创建测试集
test_set = test_datagen.flow_from_directory('../dataset/test_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
  1. 拟合数据
classifier.fit_generator(training_set,
steps_per_epoch = 10000,
epochs = 2,
validation_data = test_set,
validation_steps = 2500)

该模型在验证集上的准确率为 77.19%。需要注意的是,为了获得更准确的结果,可以尝试将 epoch 数量增加到约 25,但这会增加数据处理时间,总时间取决于机器的配置。

这个代码对于计算机视觉中的任何二分类问题都是健壮的,即使图像数据发生变化,代码也保持不变。

3. 模型改进与优化

我们可以通过多种方式改进模型的性能,例如添加更多的 CNN 层、添加更多的 ANN 层、更改优化器函数和更改激活函数。

活动 13:使用多层和 SoftMax 改进模型

步骤如下:
1. 导入构建 CNN 所需的库和类,包括 Conv2D MaxPool2D Flatten Dense
2. 构建 CNN 架构,在添加第一层后,再添加两个额外的层。
3. 添加池化和扁平化层,作为 ANN 的输入。
4. 构建全连接的 ANN,其输入为 CNN 的输出。在添加 ANN 的第一层后,再添加三个额外的层,并在输出层使用 SoftMax 激活函数。
5. 执行图像增强以处理和转换数据。
6. 创建训练和测试集数据,最后拟合创建的数据。

练习 20:恢复使用 Sigmoid 激活函数

步骤如下:
1. 导入相关库和类。
2. 初始化模型。
3. 添加 CNN 的第一层。
4. 添加池化层。
5. 再添加一个 Conv2D 和池化层。
6. 扁平化 CNN。
7. 添加 ANN 的多个全连接层。
8. 添加 ANN 的输出层,激活函数为 sigmoid。
9. 编译网络。
10. 缩放和转换图像。
11. 创建训练集和测试集。
12. 拟合数据。

该模型的准确率超过 85%,明显高于上一个练习的准确率。这表明激活函数的重要性,仅仅将输出激活函数从 SoftMax 改为 sigmoid 就将准确率从 50% 提高到了 85%。在二分类问题中,使用 sigmoid 作为输出层的激活函数通常更好。

练习 21:将优化器从 Adam 改为 SGD

步骤如下:
1. 导入相关库和类。
2. 初始化模型。
3. 添加 CNN 的第一层。
4. 添加池化层。
5. 再添加一个 Conv2D 和池化层。
6. 添加扁平化层。
7. 添加 ANN 的第一个全连接层。
8. 添加三个更多的全连接层。
9. 添加 ANN 的输出层,激活函数为 softmax。
10. 编译网络,优化器为 SGD。
11. 缩放和转换图像。
12. 创建训练集和测试集。
13. 拟合数据。

该模型的准确率为 83.90%。

通过对模型进行不同的排列组合,我们发现对于这个数据集,最佳准确率可以通过以下方式获得:
1. 添加多个 CNN 层。
2. 添加多个 ANN 层。
3. 使用 sigmoid 作为激活函数。
4. 使用 adam 作为优化器。
5. 将 epoch 大小增加到约 25(这需要大量的计算时间,确保有 GPU 来执行此操作),这将提高预测的准确性。

4. 分类新图像

最后,我们可以使用训练好的模型对新的未知图像进行分类。

练习 22:分类新图像

步骤如下:
1. 加载图像

new_image = image.load_img('../test/test_image_1.jpg', target_size = (64, 64))

请将路径更改为你在系统中保存数据集的位置。
2. 处理图像

new_image = image.img_to_array(new_image)
new_image = np.expand_dims(new_image, axis = 0)
  1. 预测新图像
result = classifier.predict(new_image)
  1. 映射预测结果
training_set.class_indices
if result[0][0] == 1:
    prediction = 'It is a Dog'
else:
    prediction = 'It is a Cat'
print(prediction)

测试图像是一张狗的图像,模型正确地将其预测为狗。通过相同的过程,你可以使用任何类型的图像训练模型,例如使用肺部感染和健康肺部的扫描图像训练模型,模型将能够对新的扫描图像进行分类。

活动 14:分类新图像

步骤如下:
1. 运行本章中的任何一个算法(最好是准确率最高的算法)。
2. 从你的目录中加载图像(test_image_2)。
3. 使用算法处理图像。
4. 预测新图像的类别,你可以自己查看图像以检查预测是否正确。

综上所述,我们通过一系列的练习和活动,展示了如何使用卷积神经网络进行图像分类,并通过不同的方法改进模型的性能,最后对新的未知图像进行分类。这些方法可以应用于各种二分类的计算机视觉问题。

以下是整个流程的 mermaid 流程图:

graph LR
    A[数据准备] --> B[图像增强]
    B --> C[构建 CNN 模型]
    C --> D[编译模型]
    D --> E[创建训练集和测试集]
    E --> F[拟合数据]
    F --> G[模型优化]
    G --> H[分类新图像]

通过这个流程图,我们可以清晰地看到整个图像分类的流程,从数据准备到最终的新图像分类,每个步骤都紧密相连,共同构成了一个完整的图像分类系统。

卷积神经网络计算机视觉实践指南(续)

5. 不同模型配置的对比分析

为了更直观地了解不同模型配置对性能的影响,我们可以通过表格来对比不同练习和活动中的模型参数和准确率。

练习/活动 CNN 层数 ANN 层数 激活函数 优化器 准确率
基础 CNN 识别猫狗图像 1 1(输出层前) relu(隐藏层),sigmoid(输出层) adam 77.19%
活动 13(多层 + SoftMax) 3 4(输出层前) relu(隐藏层),SoftMax(输出层) 未提及 未提及
练习 20(恢复 Sigmoid) 3 3(输出层前) relu(隐藏层),sigmoid(输出层) adam 超过 85%
练习 21(优化器改为 SGD) 2 4(输出层前) relu(隐藏层),softmax(输出层) SGD 83.90%

从表格中可以看出,增加 CNN 和 ANN 层数、合理选择激活函数和优化器对模型准确率有显著影响。特别是在二分类问题中,sigmoid 作为输出层激活函数通常能带来更好的效果。

6. 图像增强的深入理解

图像增强是提高模型性能的重要手段,下面我们进一步分析其原理和作用。

图像增强的原理

图像增强通过对原始图像进行随机变换,如旋转、平移、缩放、翻转等,生成多个不同版本的图像。这些变换可以模拟现实世界中图像的多样性,使模型能够学习到更丰富的特征。例如,一个物体可能从不同角度被观察到,通过旋转图像可以让模型学习到物体在不同角度下的特征。

图像增强的代码实现
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)

在这段代码中, rescale 用于将图像像素值缩放到 0 - 1 之间, shear_range 控制图像的错切变换, zoom_range 控制图像的缩放范围, horizontal_flip 控制是否进行水平翻转。

图像增强的优势
  • 减少过拟合 :通过生成更多不同的图像,模型可以学习到更广泛的特征,避免对训练数据的过度拟合。
  • 增加数据多样性 :即使原始数据集较小,通过图像增强也可以生成大量不同的图像,从而增加数据的多样性。
  • 提高模型泛化能力 :模型在训练过程中接触到更多不同的图像,能够更好地适应新的未知图像,提高泛化能力。
7. 模型优化的策略总结

在前面的练习和活动中,我们尝试了多种模型优化策略,下面对这些策略进行总结。

增加网络层数
  • CNN 层 :增加 CNN 层可以提取更高级的图像特征。每一层 CNN 可以学习到不同层次的特征,从简单的边缘和纹理到复杂的物体形状和结构。
  • ANN 层 :增加 ANN 层可以提高模型的非线性拟合能力。ANN 层可以对 CNN 提取的特征进行进一步的处理和组合,从而更好地进行分类。
选择合适的激活函数
  • 隐藏层 :通常使用 relu 激活函数,因为它可以有效地解决梯度消失问题,加快模型的训练速度。
  • 输出层 :在二分类问题中,sigmoid 激活函数通常是一个不错的选择,因为它可以将输出值映射到 0 - 1 之间,方便进行二分类判断。
选择合适的优化器
  • Adam :Adam 优化器结合了 AdaGrad 和 RMSProp 的优点,能够自适应地调整学习率,通常在大多数情况下都能取得较好的效果。
  • SGD :SGD 是一种简单而经典的优化器,通过调整学习率和动量等参数,可以在某些情况下获得较好的性能。
8. 新图像分类的注意事项

在进行新图像分类时,有一些注意事项需要我们关注。

图像预处理

在将新图像输入到模型之前,需要对图像进行预处理,确保图像的尺寸和像素值与训练时的图像一致。例如,在前面的练习中,我们将图像的尺寸调整为 64x64,并将像素值缩放到 0 - 1 之间。

new_image = image.load_img('../test/test_image_1.jpg', target_size = (64, 64))
new_image = image.img_to_array(new_image)
new_image = np.expand_dims(new_image, axis = 0)
new_image = new_image / 255.0  # 缩放像素值
模型选择

选择准确率较高的模型进行新图像分类。在前面的练习中,我们发现增加 CNN 和 ANN 层数、使用 sigmoid 作为输出层激活函数和 adam 作为优化器的模型准确率较高。

结果解释

模型的预测结果通常是一个概率值或类别标签。在二分类问题中,我们可以根据概率值或类别标签来判断图像的类别。例如,在猫狗图像分类中,如果预测结果为 1,则表示图像为狗;如果预测结果为 0,则表示图像为猫。

result = classifier.predict(new_image)
if result[0][0] == 1:
    prediction = 'It is a Dog'
else:
    prediction = 'It is a Cat'
print(prediction)
9. 总结与展望

通过一系列的练习和活动,我们深入学习了如何使用卷积神经网络进行图像分类。从基础的 CNN 模型构建到模型的优化和新图像分类,我们掌握了多种技术和方法。

在实际应用中,这些方法可以应用于各种二分类的计算机视觉问题,如识别不同类型的植物、区分正常和异常的医学图像等。同时,我们也了解到图像增强、增加网络层数、选择合适的激活函数和优化器等方法可以有效提高模型的性能。

未来,我们可以进一步探索更复杂的模型架构和优化算法,以提高图像分类的准确率和效率。例如,尝试使用更先进的卷积神经网络架构,如 ResNet、Inception 等,或者使用更高效的优化算法,如 AdaDelta、Nadam 等。

以下是不同模型优化步骤的 mermaid 流程图:

graph LR
    A[选择基础模型] --> B[增加 CNN 层数]
    B --> C[增加 ANN 层数]
    C --> D[选择激活函数]
    D --> E[选择优化器]
    E --> F[图像增强]
    F --> G[训练模型]
    G --> H[评估准确率]
    H --> I{准确率是否满足要求}
    I -- 是 --> J[用于新图像分类]
    I -- 否 --> B

这个流程图展示了一个迭代优化模型的过程,通过不断调整模型参数和进行图像增强,直到模型的准确率满足要求,然后将模型应用于新图像分类。通过这种方式,我们可以不断提高模型的性能,解决各种实际的计算机视觉问题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值