卷积神经网络在计算机视觉中的应用
1. 数据拟合与图像增强
1.1 数据拟合
在处理好数据后,需要对创建的数据进行拟合,代码如下:
classifier.fit_generator(training_set,
steps_per_epoch = 5000,
epochs = 25,
validation_data = test_set,
validation_steps = 1000)
这里的 steps_per_epoch 表示训练图像的数量, validation_steps 表示测试图像的数量。
1.2 图像增强
图像增强是一种重要的图像处理技术。“增强”意味着增大尺寸或数量,图像增强通过创建图像批次,并对批次内的随机图像进行随机变换,如旋转、平移、翻转等,从而得到更多样化的图像,增加数据量。例如,一个圆柱体从不同角度观察会呈现不同的样子,通过这种方式可以从一张图像有效地创建出多张不同的图像。
以下是图像增强的示例代码:
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)进行猫狗图像识别
2.1 准备工作
所有的练习和活动都将在 Jupyter Notebook 中进行。请从 GitHub 仓库 下载所有准备好的模板,并将图像数据集下载到自己的工作目录中。需要一个 training_set 文件夹来训练模型,一个 test_set 文件夹来测试模型,每个文件夹中包含一个 cats 文件夹和一个 dogs 文件夹,分别存放猫和狗的图像。
2.2 构建步骤
- 导入库和类
#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
- 初始化模型
#Initiate the classifier
classifier=Sequential()
- 添加 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))
- 扁平化操作
classifier.add(Flatten())
- 添加 ANN 的第一个全连接层
classifier.add(Dense(128,activation='relu'))
通常,以 128 作为节点数开始是一个不错的选择,并且激活函数使用 relu ,最好选择 2 的幂次方。
7. 添加 ANN 的输出层
classifier.add(Dense(1,activation='sigmoid'))
这是一个二分类问题,输出为 1,激活函数使用 sigmoid 。
8. 编译网络
#Compile the network
classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
- 图像缩放和转换
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)
- 创建训练集
training_set = train_datagen.flow_from_directory('../dataset/training_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
- 创建测试集
test_set = test_datagen.flow_from_directory('../dataset/test_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
- 拟合数据
classifier.fit_generator(training_set,
steps_per_epoch = 10000,
epochs = 2,
validation_data = test_set,
validation_steps = 2500)
验证集的准确率为 77.19%。若要获得更准确的结果,可以尝试将 epochs 增加到 25,但这会增加数据处理时间,具体时间取决于机器配置。
2.3 流程总结
graph TD;
A[导入库和类] --> B[初始化模型];
B --> C[添加 CNN 第一层];
C --> D[添加池化层];
D --> E[扁平化操作];
E --> F[添加 ANN 第一个全连接层];
F --> G[添加 ANN 输出层];
G --> H[编译网络];
H --> I[图像缩放和转换];
I --> J[创建训练集];
J --> K[创建测试集];
K --> L[拟合数据];
3. 改进模型
3.1 使用多层和 SoftMax 激活函数改进模型
为了提高算法性能,可以添加多个 ANN 模型,并将激活函数从 sigmoid 改为 SoftMax 。具体步骤如下:
1. 导入构建 CNN 所需的库,包括 Conv2D 、 MaxPool2D 、 Flatten 和 Dense 。
2. 构建 CNN 架构,在添加第一层后,再添加两个额外的层。
3. 添加池化和扁平化层,作为 ANN 的输入。
4. 构建全连接的 ANN,输入为 CNN 的输出。在添加 ANN 的第一层后,再添加三个额外的层,并在输出层使用 SoftMax 激活函数。
5. 进行图像增强,使用 ImageDataGenerator 类进行处理,通过 shear_range 、 zoom_range 和 horizontal_flip 对图像进行转换。
6. 创建训练集和测试集数据,最后拟合数据。
3.2 恢复使用 Sigmoid 激活函数
将激活函数从 SoftMax 恢复为 sigmoid 来重建模型,并与之前的模型进行准确率比较。具体步骤如下:
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
- 初始化模型
#Initiate the classifier
classifier=Sequential()
- 添加 CNN 层
classifier.add(Conv2D(32,3,3,input_shape=(64,64,3),activation='relu'))
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
- 添加池化层
classifier.add(MaxPool2D(2,2))
- 添加额外的卷积和池化层
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPool2D(pool_size = (2, 2)))
- 扁平化操作
classifier.add(Flatten())
- 添加 ANN 层
classifier.add(Dense(128,activation='relu'))
classifier.add(Dense(128,activation='relu'))
classifier.add(Dense(128,activation='relu'))
- 添加 ANN 输出层
classifier.add(Dense(1,activation='sigmoid'))
- 编译网络
classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
- 图像缩放和转换
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)
- 创建训练集
training_set = train_datagen.flow_from_directory('../dataset/training_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
- 创建测试集
test_set = test_datagen.flow_from_directory('../dataset/test_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
- 拟合数据
classifier.fit_generator(training_set,
steps_per_epoch = 10000,
epochs = 2,
validation_data = test_set,
validation_steps = 2500)
模型的准确率超过 85%,明显高于上一个练习的准确率,这表明激活函数的选择非常重要。在二分类问题(如猫狗分类)中,输出层使用 sigmoid 激活函数通常更好。
3.3 将优化器从 Adam 改为 SGD
将优化器改为 SGD 来修改模型,并与之前的模型进行准确率比较。具体步骤如下:
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
- 初始化模型
#Initiate the classifier
classifier=Sequential()
- 添加 CNN 第一层
classifier.add(Conv2D(32,3,3,input_shape=(64,64,3),activation='relu'))
- 添加池化层
classifier.add(MaxPool2D(2,2))
- 添加额外的卷积和池化层
classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
- 添加扁平化层
classifier.add(Flatten())
- 添加 ANN 第一个全连接层
classifier.add(Dense(128,activation='relu'))
- 添加三个额外的全连接层
classifier.add(Dense(128,activation='relu'))
classifier.add(Dense(128,activation='relu'))
classifier.add(Dense(128,activation='relu'))
- 添加 ANN 输出层
classifier.add(Dense(1,activation='softmax'))
- 编译网络
classifier.compile(optimizer='SGD',loss='categorical_crossentropy',metrics=['accuracy'])
- 图像缩放和转换
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)
- 创建训练集
training_set = train_datagen.flow_from_directory('../dataset/training_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
- 创建测试集
test_set = test_datagen.flow_from_directory('../dataset/test_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
- 拟合数据
classifier.fit_generator(training_set,
steps_per_epoch = 10000,
epochs = 2,
validation_data = test_set,
validation_steps = 2500)
使用多个 ANN 并将优化器设置为 SGD 时,准确率为 83.90%。
3.4 最佳模型配置总结
通过对模型进行多种排列组合的实验,发现对于该数据集,以下配置可以获得最佳准确率:
1. 添加多个 CNN 层。
2. 添加多个 ANN 层。
3. 使用 sigmoid 作为激活函数。
4. 使用 adam 作为优化器。
5. 将 epoch 大小增加到 25(这需要大量计算时间,确保有 GPU 支持),可以提高预测的准确率。
4. 对新图像进行分类
4.1 分类新图像的步骤
可以使用本章中准确率最高的算法对新图像进行分类。具体步骤如下:
1. 从 GitHub 仓库 下载 test_image_1 到自己的工作目录。
2. 加载图像
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)
- 预测新图像
result = classifier.predict(new_image)
- 映射预测结果
training_set.class_indices
if result[0][0] == 1:
prediction = 'It is a Dog'
else:
prediction = 'It is a Cat'
print(prediction)
测试图像是一张狗的图像,模型正确地将其预测为狗。通过相同的过程可以对任何类型的图像进行训练,例如使用肺部感染和健康肺部的扫描图像进行训练,模型将能够对新的扫描图像进行分类。
4.2 另一个新图像分类活动
可以按照以下步骤对另一个新图像( test_image_2 )进行分类:
1. 运行本章中的任何一个算法。
2. 从目录中加载图像( test_image_2 )。
3. 使用算法处理图像。
4. 预测新图像的内容,并通过查看图像本身来检查预测是否正确。
总之,通过卷积神经网络和图像增强技术,可以有效地解决计算机视觉中的二分类问题,并且可以通过调整模型结构、激活函数和优化器等参数来提高模型性能。
5. 不同模型配置的效果对比
5.1 配置对比表格
| 模型配置 | 激活函数 | 优化器 | 准确率 | 特点 |
|---|---|---|---|---|
| 简单 CNN | sigmoid | adam | 77.19% | 基础模型,结构简单,训练速度相对较快,但准确率有待提高 |
| 多层 + SoftMax | SoftMax | adam | - | 尝试增加 ANN 层和改变激活函数,可能需要更多计算资源 |
| 恢复 Sigmoid | sigmoid | adam | 超过 85% | 通过增加 CNN 和 ANN 层,恢复 sigmoid 激活函数,准确率显著提高 |
| 优化器 SGD | SoftMax | SGD | 83.90% | 使用 SGD 优化器和多层 ANN,准确率较高,但可能在收敛速度上有差异 |
5.2 效果分析
从上述表格可以看出,激活函数和优化器的选择对模型准确率有重要影响。在二分类问题中, sigmoid 激活函数通常表现更好,而 adam 优化器在该数据集上与 sigmoid 配合能取得较高的准确率。当增加 CNN 和 ANN 层时,模型能够学习到更复杂的特征,从而提高分类能力。
6. 图像增强的重要性
6.1 图像增强的作用总结
| 作用 | 说明 |
|---|---|
| 减少过拟合 | 通过对图像进行切片和多角度变换,创建多个版本的同一图像,使模型能够学习到更广泛的特征,减少对特定特征的依赖,从而降低过拟合的风险 |
| 增加图像数量 | 单个图像可以通过图像增强技术转换为多个不同的图像,在数据集图像数量有限的情况下,有效增加了训练数据的多样性 |
| 提高预测准确性 | 让模型从不同角度观察图像,使其在面对新图像时能够更准确地进行分类,增强了模型的泛化能力 |
6.2 图像增强代码示例回顾
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 用于对图像进行缩放, shear_range 控制图像的错切变换, zoom_range 实现图像的缩放, horizontal_flip 允许图像进行水平翻转。通过这些变换,能够生成多样化的图像数据。
7. 模型应用拓展
7.1 多领域应用
卷积神经网络和图像增强技术不仅可以用于猫狗图像分类,还可以应用于许多其他领域的二分类问题,例如:
- 医学影像 :区分健康组织和病变组织,如肺部感染和健康肺部的扫描图像分类,帮助医生更准确地进行诊断。
- 安防监控 :识别安全区域和危险区域,或者区分正常人员和可疑人员,提高监控系统的智能化水平。
- 农业领域 :判断农作物是否健康,区分健康作物和受病虫害影响的作物,为精准农业提供支持。
7.2 应用流程
graph TD;
A[数据收集] --> B[数据预处理(图像增强)];
B --> C[模型构建(CNN + ANN)];
C --> D[模型训练];
D --> E[模型评估];
E --> F{准确率是否满足要求};
F -- 是 --> G[应用于实际场景];
F -- 否 --> H[调整模型配置];
H --> C;
在实际应用中,首先需要收集相关的图像数据,然后进行数据预处理,包括图像增强。接着构建合适的 CNN 和 ANN 模型进行训练,训练完成后对模型进行评估。如果准确率不满足要求,则调整模型配置,如增加层数、改变激活函数或优化器等,直到达到满意的准确率后再应用于实际场景。
8. 总结与展望
8.1 总结
通过本文的学习,我们了解了卷积神经网络在计算机视觉中的应用,特别是在二分类问题上的解决方法。掌握了图像增强技术的原理和实现方法,以及如何通过调整模型结构、激活函数和优化器来提高模型性能。同时,我们还看到了这些技术在多个领域的广泛应用前景。
8.2 展望
未来,随着计算机硬件性能的不断提升和算法的不断优化,卷积神经网络在计算机视觉领域将有更出色的表现。可以进一步探索更复杂的模型结构和更先进的图像增强技术,以应对更具挑战性的图像分类问题。此外,结合其他技术,如深度学习中的注意力机制、生成对抗网络等,有望进一步提高模型的准确率和泛化能力,为计算机视觉的发展带来更多的可能性。
超级会员免费看

被折叠的 条评论
为什么被折叠?



