
图像增强技术可提升您的计算机视觉模型性能
图片由 Editor | ChatGPT 提供
在本文中,您将学习到:
- 图像增强技术在计算机视觉中的目的和益处,以提高模型的泛化能力和多样性。
- 四种常见的图像增强策略(水平翻转、旋转、缩放、亮度调整)及其具体用例。
- 如何使用 Keras API 在 Python 中实现这些增强技术,包括将其集成到卷积神经网络(CNN)中的完整示例。
引言
图像增强技术,例如翻转、旋转图像等,在计算机视觉模型中很常用,因为它们能够增加用于训练和验证模型之原始数据集的多样性,并提高模型的泛化能力,使其表现得更好。
本文讨论了计算机视觉中的四种不同的图像增强技术——水平翻转、旋转、缩放和亮度调整,并概述了一些在 Python 中使用这些技术的示例,特别是借助 Keras API 来构建深度学习模型。
四种常见的图像增强策略
下面,我们将介绍并简要讨论四种重要的图像增强策略,重点介绍它们的目的、适用的用例以及如何在 Keras 中实现它们。它们旨在随机应用于图像数据集,从而获得各种图像设置,以帮助训练出更鲁棒的模型。

图像增强技术
图片由作者 | ChatGPT & 修改
水平翻转
水平翻转图像的目的是帮助模型对对象的左右方向不敏感。例如,考虑一个包含所有鸟类都朝左的鸟类图像训练数据集。在这样一个数据集上训练的鸟类物种分类模型,如果后来接收到鸟类朝右的新图像,可能会难以准确执行。这是因为它没有学会朝不同方向的鸟类的图像属性,也就是说,训练数据不够多样化。
因此,水平翻转对于分析自然场景、人脸或对称物体或可能出现镜像的物体的模型来说特别有用。
Keras 可以实现这种图像增强方法,如下所示——RandomFlip
类也支持垂直翻转。
1 2 |
from keras.layers import RandomFlip layer = RandomFlip("horizontal") |
旋转
旋转是另一种用于使模型对应该被分析或预测相似的图像之间的变化更加鲁棒的方法,从而增强其对方向变化的鲁棒性。
旋转有助于提高图像可能不总是完美对齐的模型的性能,例如卫星照片、无人机拍摄的农作物航拍快照或医学图像。
Keras 实现(factor=0.1
表示 [-36, 36] 度范围内的随机旋转)
1 2 |
from keras.layers import RandomRotation layer = RandomRotation(factor=0.1) |
缩放
在计算机视觉模型中缩放图像的目的是模拟图像中主要物体与相机之间距离的变化,以便模型能够识别相似或相同的物体,而无论它们看起来是近还是远。
缩放对于用于检测物体或对图像进行分类的计算机视觉模型特别有用,在这些模型中,物体的尺度可能会发生变化,例如在交通控制摄像头或自动驾驶汽车内部收集的图像中。
Keras 实现——缩放随机在高度和宽度上范围在原始尺寸的 80% 到 120% 之间
1 2 |
from keras.layers import RandomZoom layer = RandomZoom(height_factor=0.2, width_factor=0.2) |
亮度调整
这种增强策略提高了对光照水平变化的图像的鲁棒性,例如在一天不同时间或不同天气条件下拍摄的地点或物体图像。对于监控系统等应用来说,它极其有用。
我们首先要看的是 Keras 实现,它不是那么直接,因为它需要一个继承自 Keras 的 Layer
的手动定义的类,并且重要的是,需要使用 tf.image.random_brightness()
函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import tensorflow as tf from keras.layers import Layer class RandomBrightness(Layer): def __init__(self, max_delta, **kwargs): super().__init__(**kwargs) self.max_delta = max_delta def call(self, inputs): return tf.image.random_brightness(inputs, max_delta=self.max_delta) def get_config(self): config = super().get_config() config.update({"max_delta": self.max_delta}) return config # 实例化图层的示例 brightness_layer = RandomBrightness(max_delta=0.2) |
创建类后,就可以实例化一个对象。在这里,我们传递了一个 max_delta
值 0.2,表示将对图像应用高达 20% 的随机亮度变化。
虽然创建自定义图层是一种强大的技术,但值得注意的是,Keras 还提供了一个内置的 tf.keras.layers.RandomBrightness
图层,它可以更轻松地完成此操作。该图层通过将图像像素乘以一个随机因子来工作,使其成为大多数用例的方便且不易出错的替代方案。
以下是实现方法:
1 2 3 4 |
from keras.layers import RandomBrightness # 通过范围在 [0.8, 1.2] 内的随机因子调整亮度 layer = RandomBrightness(factor=0.2) |
将它们全部整合到神经网络中
最后,下面的代码块展示了一个简单的神经网络架构示例,该架构应用了前面讨论的所有四种图像增强技术。然后,此增强管道用作完整卷积神经网络(CNN)的第一部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import tensorflow as tf from keras.models import Sequential from keras.layers import ( Layer, Input, RandomFlip, RandomRotation, RandomZoom, Conv2D, MaxPooling2D, Flatten, Dense ) # 用于亮度增强的自定义图层(如前所述) class RandomBrightness(Layer): def __init__(self, max_delta, **kwargs): super().__init__(**kwargs) self.max_delta = max_delta def call(self, inputs): return tf.image.random_brightness(inputs, max_delta=self.max_delta) def get_config(self): config = super().get_config() config.update({"max_delta": self.max_delta}) return config # 定义数据增强流水线 data_augmentation = Sequential([ Input(shape=(128, 128, 3)), RandomFlip("horizontal"), RandomRotation(0.1), RandomZoom(height_factor=0.2, width_factor=0.2), RandomBrightness(max_delta=0.2) ], name="data_augmentation") # 包含数据增强图层的简单 CNN 模型 model = Sequential([ data_augmentation, Conv2D(32, (3, 3), activation='relu'), MaxPooling2D(), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D(), Flatten(), Dense(64, activation='relu'), Dense(10, activation='softmax') # 示例分类 CNN,具有 10 个类别 ]) model.summary() |

各种图像增强结果的简单示例
图片作者 | ChatGPT
请注意,上面的代码仅用于说明目的。在实践中,根据您的问题和需求,您可能不需要应用所有展示的增强技术;仅应用少数精选的可能就足够了。
总结
在可能存在图像数据变异性的计算机视觉模型中,图像增强技术可以帮助构建更鲁棒的模型,这些模型可以从各种数据条件中学习,从而使模型更具泛化能力。本文展示了几种图像增强策略,重点介绍了它们的使用方法和在 Keras 中的实现,并展示了如何定义一个包含这些增强步骤作为图层的 CNN 架构。
暂无评论。