如何使用 Keras API 加载、转换和保存图像

Keras 深度学习库提供了一个复杂的 API,用于加载、准备和增强图像数据。

API 中还包含一些未公开的函数,允许您快速轻松地加载、转换和保存图像文件。这些函数在开始计算机视觉深度学习项目时非常方便,让您能够最初使用相同的 Keras API 来检查和处理图像数据。

在本教程中,您将了解如何使用 Keras API 提供的基本图像处理函数。

完成本教程后,您将了解:

  • 如何使用 Keras API 加载和显示图像。
  • 如何使用 Keras API 将加载的图像转换为 NumPy 数组,然后再转换回 PIL 格式。
  • 如何使用 Keras API 将加载的图像转换为灰度并保存到新文件。

通过我的新书《深度学习计算机视觉》**启动您的项目**,其中包括**分步教程**和所有示例的 **Python 源代码**文件。

让我们开始吧。

教程概述

本教程分为五个部分;它们是:

  1. 测试图像
  2. Keras 图像处理 API
  3. 如何使用 Keras 加载图像
  4. 使用 Keras 转换图像
  5. 使用 Keras 保存图像

测试图像

第一步是选择一个用于本教程的测试图像。

我们将使用 Isabell Schulz 拍摄的悉尼邦迪海滩的照片,该照片在宽松的知识共享许可下发布。

Bondi Beach, Sydney

悉尼邦迪海滩

下载图像并将其放入您的当前工作目录,文件名为“bondi_beach.jpg”。

Keras 图像处理 API

Keras 深度学习库提供了用于处理图像数据的实用程序。

主要的 API 是 ImageDataGenerator 类,它结合了数据加载、准备和增强功能。

本教程将不涉及 ImageDataGenerator 类。相反,我们将仔细研究一些鲜为人知或未公开的函数,这些函数在处理图像数据和使用 Keras API 进行建模时可能很有用。

具体来说,Keras 提供了用于加载、转换和保存图像数据的函数。这些函数位于 utils.py 文件中,并通过 image.py 模块公开。

这些函数在启动新的深度学习计算机视觉项目或需要检查特定图像时可能很有用。

当在 API 文档的Applications(应用程序)部分中使用预训练模型时,会演示其中一些函数。

Keras 中所有的图像处理都需要安装 Pillow 库。如果未安装,您可以查阅安装说明

我们来依次仔细研究一下这些函数。

想通过深度学习实现计算机视觉成果吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

如何使用 Keras 加载图像

Keras 提供了 `load_img()` 函数,用于从文件加载图像作为 PIL 图像对象。

以下示例从文件加载邦迪海滩照片作为 PIL 图像,并报告加载图像的详细信息。

运行示例会加载图像并报告有关已加载图像的详细信息。

我们可以确认图像已作为 PIL 图像加载,格式为 JPEG,使用 RGB 通道,大小为 640 乘 427 像素。

然后,加载的图像将使用工作站上的默认应用程序显示,在本例中,macOS 上的“预览”应用程序。

Example of Displaying a PIL image using the Default Application

使用默认应用程序显示 PIL 图像的示例

“load_img()”函数提供了在加载图像时可能很有用的额外参数,例如“grayscale”允许图像以灰度加载(默认为 False),“color_mode”允许指定图像模式或通道格式(默认为 rgb),以及“target_size”允许指定一个(高度,宽度)元组,在加载后自动调整图像大小。

如何使用 Keras 转换图像

Keras 提供了 `img_to_array()` 函数,用于将 PIL 格式的加载图像转换为 NumPy 数组,以便与深度学习模型一起使用。

该 API 还提供了 `array_to_img()` 函数,可用于将像素数据的 NumPy 数组转换为 PIL 图像。如果像素数据在数组格式下被修改,然后可以保存或查看,这会很有用。

以下示例加载测试图像,将其转换为 NumPy 数组,然后将其转换回 PIL 图像。

运行示例首先加载 PIL 格式的照片,然后将图像转换为 NumPy 数组并报告数据类型和形状。

我们可以看到像素值从无符号整数转换为 32 位浮点值,并且在本例中转换为 [高度,宽度,通道] 的数组格式。最后,图像被转换回 PIL 格式。

如何使用 Keras 保存图像

Keras API 还提供了 `save_img()` 函数,用于将图像保存到文件。

该函数接受保存图像的路径和 NumPy 数组格式的图像数据。文件格式从文件名推断,但也可以通过“`file_format`”参数指定。

如果您已经操作了图像像素数据(例如缩放),并希望保存图像以备将来使用,这会很有用。

以下示例加载灰度格式的照片,将其转换为 NumPy 数组,然后保存到新的文件名。

运行示例首先加载图像并强制其格式为灰度。

然后,图像被转换为 NumPy 数组并保存到当前工作目录中名为“bondi_beach_grayscale.jpg”的新文件。

为了确认文件已正确保存,它再次作为 PIL 图像加载,并报告图像的详细信息。

加载的灰度图像随后使用工作站上的默认图像预览应用程序显示,在 macOS 中,该应用程序是“预览”。

Example of Saved Grayscale Image Shown Using the Default Image Viewing Application

使用默认图像查看应用程序显示保存的灰度图像示例

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

文章

API

总结

在本教程中,您了解了如何使用 Keras API 提供的基本图像处理函数。

具体来说,你学到了:

  • 如何使用 Keras API 加载和显示图像。
  • 如何使用 Keras API 将加载的图像转换为 NumPy 数组,然后再转换回 PIL 格式。
  • 如何使用 Keras API 将加载的图像转换为灰度并保存到新文件。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发用于视觉的深度学习模型!

Deep Learning for Computer Vision

在几分钟内开发您自己的视觉模型

...只需几行python代码

在我的新电子书中探索如何实现
用于计算机视觉的深度学习

它提供关于以下主题的自学教程
分类物体检测(YOLO和R-CNN)人脸识别(VGGFace和FaceNet)数据准备等等……

最终将深度学习引入您的视觉项目

跳过学术理论。只看结果。

查看内容

24 条关于《如何使用 Keras API 加载、转换和保存图像》的回复

  1. jessy 2019年4月17日 晚上8:38 #

    先生,
    如何查看 save.model.h5 中的数据..如何打开..告诉我

    • Jason Brownlee 2019年4月18日 上午8:26 #

      您可以使用 load_model() 函数加载它,然后通过 get_weights() 检查权重

  2. sasi 2019年8月7日 晚上8:36 #

    旋转图像需要做什么?

  3. Ferdinand 2019年10月30日 上午6:48 #

    先生您好,感谢您的解释。我有一个问题:我有一张 RGB 图像 (nChannels=3),其模式值为 16。图像大小为 470*430(宽度*高度),当我使用 img_to_array 时,我得到一个形状为 (430,470,3) 的数组。您知道如何将其转换为形状为 (3,470,430) 的数组吗?
    背景如下:我已经在 Spark 中导入了相同的图像,Spark 可以通过新支持的“图像”格式读取我的图像。但是,数据被导入到一个大的数组中,我想知道如何才能理解这个大数组的结构。例如,raw[469] 给出的结果与 x[0][0][469] 相同,但 raw[470] 与 x[0][1][0] 不同,其中 raw 是使用 Spark 图像数据格式导入的图像,X 是 img_to_array 的结果。如果您能提供帮助,提前感谢!
    此致

  4. Dire 2020年1月23日 晚上8:02 #

    先生您好,感谢您的信息。

    我对在 Python Keras 中加载许多数据集进行训练感到困惑,您能否解释一下如何从磁盘加载我自己的数据集进行训练的步骤。

  5. JG 2020年6月3日 晚上9:48 #

    嗨,Jason,

    谢谢。

    我如何将只有一个通道的图像(比如它是灰度图像,只有一个通道,甚至只有一个二维数组-矩阵)转换为具有 3 个通道(或 RGB 或 3D 数组-张量,始终 3 个通道)的图像?有没有相关的参考资料或教程?

    我提出这个问题是为了能够应用需要图像或 3D 数组-张量(始终为 3 个通道)的 Keras 应用程序。

    • Jason Brownlee 2020年6月4日 上午6:20 #

      您可以将一个通道复制到每个颜色通道。

  6. JG 2020年6月5日 上午2:07 #

    好的。谢谢,我就是这么做的。

    但由于 Keras 图像函数,我以为会有更优雅、快速和高效的方法来实现!

  7. Nirbhay 2020年7月27日 晚上10:43 #

    先生,在图像处理过程中如何加载“.zip”文件格式?

  8. Azri 2020年10月21日 晚上10:23 #

    你好,是否可以使用 img_to_array 函数为多张图像生成一个数组?

  9. MS 2020年10月29日 晚上10:05 #

    如何将整个图像数据集(即所有图像)一起转换为 CNN?

  10. M P SRI KAMAL TEJA 2021年3月1日 上午3:36 #

    嗨,Jason,

    如何使用 Keras API 增强图像(模糊图像)?

    • Jason Brownlee 2021年3月1日 上午5:39 #

      也许你可以将这个问题建模为一个使用 pix2pix GAN 的图像翻译问题?

      • M P SRI KAMAL TEJA 2021年3月1日 上午6:04 #

        不确定,我是 Python 新手。我将对此进行探索。顺便问一下,您能给我提供任何关于图像超分辨率的参考资料吗?

  11. Kautuk Dwivedi 2021年9月18日 上午12:40 #

    我正在尝试实现 cycle-gangs,但我无法理解数据集的结构。
    根据文章,数据集要加载为 2 个 NumPy 数组。在迭代了 2 个训练集之后,我创建了 2 个 NumPy 数组并将它们作为数据集传递。但是后来我卡在了 randint 函数上,因为它接受 2 个参数,但您给了它 3 个参数,所以我删除了其中一个,但现在我卡住了。

    • Adrian Tam
      Adrian Tam 2021年9月19日 上午6:18 #

      您指的是哪个代码?我在这里没看到 randint。

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。