TensorFlow弃用ImageDataGenerator后的图像数据增强方法
由于 ImageDataGenerator 类已被弃用,一些教程中使用的这种传统方法在TensorFlow 2.17及以上的版本中不再可使用。
出于此,这里列举两种现在仍然可用的方法来增强图像:
- 使用
tf.keras.layers模块。 - 使用
tf.image模块。
为了编写更简洁的代码,使用层可以让我们的代码更加集成化。
我们可以将图像处理层封装成一个模块,然后将其插入到模型中以解决实际问题。
所以,我首先整理使用层增强图像的一些方法,有时间再整理使用 tf.image 模块增强图像的一些方法。
tf.keras.Layers
这里列出的所有类都位于 tf.keras.layers 之下,我简要介绍一下具体的参数使用(在介绍第一个时会详细一点,因为其它的层都比较类似):
RandomBrightness(factor, value_range=(0, 255), seed=None):随机调整图像亮度。value_range:图像的像素值范围。对于RGB或者灰度图这种uint8图像而言,未处理的像素值范围是。 但是,在训练模型时,我们通常将图像像素值归一化到之间。 所以如果你先对图像进行归一化,那么需要将value_range设置为(0.0, 1.0)。factor:调整范围,实际的调整因子delta会从这个范围内随机产生。factor可以是一个标量或者二元组,用以表示的范围。- 如果是一个标量,那么调整因子会从中随机选择。
- 如果是一个二元组,那么就是从手动确定范围的上下界中随机选择。
seed:随机数种子,用于复现随机性,方便调试。- 调整公式:。
RandomContrast(factor, seed=None):随机调整图像对比度。RandomCrop(height, width, seed=None):随机裁剪图像。height:裁剪后的图像高度。width:裁剪后的图像宽度。
RandomFlip(mode, seed=None):随机翻转图像。mode:翻转模式。可选值有:"horizontal":水平翻转。"vertical":垂直翻转。"horizontal_and_vertical":水平和垂直翻转。
RandomHeight(height_range, interpolation="bilinear", seed=None):随机调整图像高度。height_range:高度调整范围。interpolation:插值方法。可选值有:"nearest":最近邻插值。速度最快,直接复制最近像素值,可能导致锯齿状边缘,适合低计算资源场景。"bilinear":双线性插值。默认方法,计算速度快,适用于大多数场景,但可能会略微模糊图像边缘。"bicubic":双三次插值。计算复杂度较高,生成更平滑的图像,适合高质量需求。"lanczos3":Lanczos-3 插值。使用 Lanczos 核(a=3)插值,保留细节较好,适用于高分辨率图像调整。"lanczos5":Lanczos-5 兰索斯插值。使用 Lanczos 核(a=5)插值,计算成本更高,但细节保留更优。"gaussian":高斯插值。基于高斯分布的插值,平滑效果较强,可能模糊高频细节。"mitchellcubic": Mitchellcubic 插值。使用 Mitchell-Netravali 滤波器,平衡平滑和锐化,常用于图像放大。
RandomWidth(width_range, interpolation="bilinear", seed=None):随机调整图像宽度。RandomRotation(factor, fill_mode="nearest", interpolation="bilinear", seed=None, fill_value=0.0, value_range=(0, 255)):随机旋转图像。fill_mode:填充模式。可选值有:"constant":填充常数。"reflect":镜像填充。"wrap":环绕填充。"nearest":最近邻填充。
interpolation:插值方法。可选值有:"nearest":最近邻插值。"bilinear":双线性插值。
fill_value:填充值。当fill_mode为"constant"时,使用此值填充。
RandomZoom(height_factor, width_factor, fill_mode="nearest", interpolation="bilinear", seed=None):随机缩放图像。
tf.image
@TODO 待补充。