当前位置: 首页 > news >正文

【Keras图像处理入门:图像加载与预处理全解析】

在这里插入图片描述

本文将全面讲解如何使用Keras进行图像加载、预处理和数据增强,为深度学习模型准备高质量的图像数据。

一、单张图像处理基础

1. 图像加载与尺寸调整

from keras.preprocessing import image# 加载图像并调整尺寸
img = image.load_img('example.jpg', target_size=(150, 150))
img.show()  # 显示原始图像

关键参数说明:

target_size: 统一图像尺寸 (高度, 宽度)

color_mode: 支持"grayscale", “rgb”, “rgba”

2. 图像转数组与维度扩展

# 转换为NumPy数组
img_array = image.img_to_array(img)
print("原始数组形状:", img_array.shape)  # (150, 150, 3)# 扩展批次维度
img_batch = np.expand_dims(img_array, axis=0)
print("批次数组形状:", img_batch.shape)  # (1, 150, 150, 3)

原始数组形状: (150, 150, 3)
批次数组形状: (1, 150, 150, 3)

3. 图像归一化处理

# 像素值归一化到[0,1]
normalized_img = img_array / 255.0# 标准化(零均值单位方差)
mean = img_array.mean()
std = img_array.std()
standardized_img = (img_array - mean) / std
print(standardized_img[0][0:10])

[[-0.1323349 -0.30142814 -0.51663774]
[-0.02473011 -0.31680027 -0.4551493 ]
[ 0.02138623 -0.20919548 -0.43977717]
[ 0.03675834 -0.17845124 -0.3475445 ]
[ 0.05213045 -0.1323349 -0.31680027]
[ 0.08287468 -0.08621857 -0.30142814]
[ 0.12899102 -0.04010222 -0.30142814]
[ 0.15973525 -0.02473011 -0.20919548]
[ 0.19047947 0.02138623 -0.16307913]
[ 0.23659581 0.02138623 -0.14770702]]

二、批量图像处理与增强

1. ImageDataGenerator核心功能

from keras.preprocessing.image import ImageDataGeneratortrain_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest'
)

数据增强参数解析:

参数功能典型值
rotation_range随机旋转角度0-180
width_shift_range水平平移比例0.0-1.0
zoom_range随机缩放范围0.0-1.0
horizontal_flip水平翻转布尔值

2. 目录批量加载实战

使用flow_from_directory方法,可以通过指定目录中的子目录来加载图像数据。每个子目录代表一个类别,子目录中的文件(图像)会自动被分配到该类别。这种方式适用于具有结构化文件夹格式的数据集,其中每个类别都存放在不同的文件夹中。

适用场景:

适用于图像数据已经按类别分好文件夹的情况。
适用于类别清晰、文件夹中每个类别文件数目较为均衡的情况。

目录结构示例:
data/train/cats/cat1.jpgcat2.jpg...dogs/dog1.jpgdog2.jpg...
代码
train_generator = train_datagen.flow_from_directory('data/train',target_size=(150, 150),batch_size=32,class_mode='categorical'
)# 获取批次数据样例
x_batch, y_batch = next(train_generator)
print("图像批次形状:", x_batch.shape)  # (32, 150, 150, 3)
print("标签批次形状:", y_batch.shape)  # (32, n_classes)
加载过程:
  • train_generator 从 data/train 目录加载图像数据。
  • target_size=(150, 150) 表示将每张图像调整为 150x150 的大小。
  • batch_size=32 每次加载 32 张图像。
  • class_mode=‘categorical’ 选择多类分类模式,生成 one-hot 编码标签。(这个很重要,如果不是采用这种方式加载图片,一定要自己手动对标签进行独热编码

3. DataFrame数据加载

flow_from_dataframe 方法用于从 pandas DataFrame 中加载图像数据。它适用于图像文件路径和标签信息存储在一个 CSV 文件中的情况。DataFrame 中包含了图像的文件名和对应的标签,图像数据的路径可以通过文件夹路径与文件名结合得到。

适用场景:

适用于图像路径和标签信息存储在 CSV 文件中的情况。
适用于较为灵活的场景,如图像路径和标签可能并非按文件夹结构组织。

示例 CSV 文件内容:
filename,class
cat1.jpg,cats
cat2.jpg,cats
dog1.jpg,dogs
dog2.jpg,dogs
代码
import pandas as pddf = pd.read_csv('image_labels.csv')
generator = train_datagen.flow_from_dataframe(dataframe=df,directory='images/',x_col='filename',y_col='class',target_size=(150, 150),class_mode='categorical'
)
加载过程:
  • df 是通过 pandas.read_csv() 加载的 CSV 文件,包含图像文件的路径和标签。
  • train_datagen.flow_from_dataframe() 方法通过x_col='filename'y_col='class' 指定了从 CSV 文件中读取文件名和标签。
  • directory='images/' 表示图像文件存放的根目录。
  • target_size=(150, 150) 表示图像尺寸为 150x150。
  • class_mode='categorical' 表示多类分类。
两种打开方式对比
特性flow_from_directoryflow_from_dataframe
数据格式按文件夹组织,每个文件夹为一个类别通过 CSV 文件指定图像路径和标签
适用场景图像按类别存放在不同文件夹中图像文件和标签信息存储在 CSV 文件中
灵活性结构化较强,适合标准化数据集灵活,适合自定义数据集,文件路径和标签可自由配置
CSV 文件不需要需要一个包含图像路径和标签的 CSV 文件

三、高级应用技巧

1. 迁移学习预处理

from keras.applications.vgg16 import preprocess_input# 加载预训练模型专用预处理
img = image.load_img('example.jpg', target_size=(224, 224))
img_array = image.img_to_array(img)
img_array = preprocess_input(img_array)  # VGG16专用预处理

2. 实时数据增强可视化

import matplotlib.pyplot as pltaugmented_images = [train_datagen.random_transform(img_array) for _ in range(9)]plt.figure(figsize=(10, 10))
for i, aug_img in enumerate(augmented_images):plt.subplot(3, 3, i+1)plt.imshow(aug_img.astype('uint8'))plt.axis('off')
plt.show()

在这里插入图片描述

四、最佳实践建议

内存优化策略:

使用flow_from_directory流式处理大数据集

设置合适的batch_size(通常32-256)

启用多进程加速(workers=4)

格式兼容指南:

统一转换为RGB格式

处理透明通道:image.load_img(…, color_mode=‘rgb’)

灰度图处理:添加通道维度np.expand_dims(img, axis=-1)

性能优化技巧:

# 启用多线程预处理
generator = train_datagen.flow_from_directory(...,workers=4,use_multiprocessing=True
)

五、完整处理流程示例

# 完整训练流程
from keras.models import Sequential
from keras.layers import Dense, Flatten# 构建模型
model = Sequential([Flatten(input_shape=(150, 150, 3)),Dense(128, activation='relu'),Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])# 训练模型
history = model.fit(train_generator,steps_per_epoch=2000 // 32,epochs=50
)

相关文章:

【Keras图像处理入门:图像加载与预处理全解析】

本文将全面讲解如何使用Keras进行图像加载、预处理和数据增强,为深度学习模型准备高质量的图像数据。 一、单张图像处理基础 1. 图像加载与尺寸调整 from keras.preprocessing import image# 加载图像并调整尺寸 img image.load_img(example.jpg, target_size(1…...

企业级AI办公落地实践:基于钉钉/飞书的标准产品解决方案

一、平台化AI的崛起:开箱即用的智能革命 2024年企业AI应用调研数据显示: 73%的中型企业选择平台标准产品而非自研头部SaaS平台AI功能渗透率达89%典型ROI周期从18个月缩短至3-6个月 核心优势对比: 维度自研方案平台标准产品部署周期6-12个…...

对于邮箱地址而言,短中划线(Hyphen, -)和长中划线(Em dash, —)有区别吗

对于邮箱地址而言,**短中划线(Hyphen, -)和长中划线(Em dash, —)**有明确的区别: 短中划线(Hyphen, -): 在邮箱地址中,短中划线是可以使用的,通常…...

C++ STL(三)list

目录 list是什么 构造函数 元素访问 容量操作 修改 迭代器 code实例 实现简单的list forward_list是什么 构造函数 元素访问 容量 修改 迭代器 code实例 实现一个简单的forward_list list是什么 std::list 是 C 标准模板库(STL)中的一个…...

Vue3+TypeScript 封装一个好用的防抖节流自定义指令

一、前言:为什么需要防抖节流? 在前端开发中,高频触发的事件(如滚动、输入、点击等)容易导致性能问题。防抖(debounce) 和 节流(throttle) 是两种常用的优化手段&#x…...

HarmonyOS+Django实现图片上传

话不多说,直接看代码: HarmonyOS部分代码 import { router } from "kit.ArkUI" import PreferencesUtil from "../utils/PreferencesUtil" import { photoAccessHelper } from "kit.MediaLibraryKit" import fs from oh…...

vscode 版本

vscode官网 Visual Studio Code - Code Editing. Redefined 但是官网只提供最新 在之前的版本就要去github找了 https://github.com/microsoft/vscode/releases 获取旧版本vscode安装包的方法_vscode 老版本-CSDN博客...

Python 爬虫实战案例 - 获取拉勾网招聘职位信息

引言 拉勾网,作为互联网招聘领域的佼佼者,汇聚了海量且多样的职位招聘信息。这些信息涵盖了从新兴科技领域到传统行业转型所需的各类岗位,无论是初出茅庐的应届生,还是经验丰富的职场老手,都能在其中探寻到机遇。 对…...

结构型模式---外观模式

概念 外观模式是一种结构型设计模式,它的核心思想是为复杂的子系统提供一个统一的接口,简化客户端与子系统的交互。外观模式通过引入一个高层接口,隐藏子系统的复杂性,使客户端更容易使用。 适用场景 用于客户端无需具体操作子…...

Docker数据卷操作实战

什么是数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷 可以在容器之间共享和享用对 数据卷 的修改立马生效对 数据卷 的更新,不会影响镜像数据卷 默认会一直存在,即时容器被…...

技术速递|Copilot Usage Advanced Dashboard 教程

作者:Xuefeng Yin 排版:Alan Wang Copilot Usage Advanced Dashboard 是为了充分利用 GitHub Copilot API 中的几乎所有数据,用到的 API 有: List teams of an onganization Get a summary of Copilot metrics for a team Get C…...

【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…...

Shell学习(1/6) 教程-变量

一、教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Shell…...

《Qt窗口动画实战:Qt实现呼吸灯效果》

Qt窗口动画实战:Qt实现呼吸灯效果 在嵌入式设备或桌面应用中,呼吸灯效果是一种常见且优雅的UI动画,常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。 一、实现原理 利用Qt自带的动画框架来实现&…...

RabbitMQ系列(六)基本概念之Routing Key

在 RabbitMQ 中,Routing Key(路由键) 是用于将消息从交换机(Exchange)路由到指定队列(Queue)的关键参数。其核心作用是通过特定规则匹配绑定关系,确保消息被正确分发。以下是其核心机…...

Spring Boot 集成 Kafka

在现代软件开发中,分布式系统和微服务架构越来越受到关注。为了实现系统之间的异步通信和解耦,消息队列成为了一种重要的技术手段。Kafka 作为一种高性能、分布式的消息队列系统,被广泛应用于各种场景。而 Spring Boot 作为一种流行的 Java 开…...

CentOS中shell脚本对多台机器执行下载安装

1.建立免密ssh连接 详情见这篇: CentOS建立ssh免密连接(含流程剖析)-CSDN博客 2.脚本编写 我这里只是简单写了个demo进行演示,如果服务器很多可以先暂存成文件再逐行读取host进行连接并执行命令 用node1去ssh连接node2和node…...

浅析eBPF

目录 一、eBPF 原理 二、eBPF 已可投入使用的场景 三、eBPF 与 Jaeger/Zipkin 的区别及先进性 四、使用 eBPF 的开源软件 五、开源软件的局限性或待实现功能 猫哥说 一、eBPF 原理 eBPF (extended Berkeley Packet Filter) 是一种内核技术,允许用户在内核空间…...

HTML 基础 (快速入门)详细步骤和示例

目录 创建基本的 HTML 文件 添加内容到页面 页面布局与链接 HTML(超文本标记语言)是构建网页的基础技术,以下是 HTML 基础的详细步骤和示例: 创建基本的 HTML 文件 步骤一:新建文件 在本地计算机上选择一个合适的…...

力扣-动态规划-139 单词拆分

思路 dp数组定义:用wordDict数组可以完成不超过j的字符串的可能为dp[j]递推公式: tmp s.substr(j - wordDict[i].size(), wordDict[i].size()); dp[j] (dp[j - wordDict[i].size()] && wordDict[i] tmp) || dp[j]; dp数组初始化:…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​,覆盖应用全生命周期测试需求,主要提供五大核心能力: ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Python如何给视频添加音频和字幕

在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

浅谈不同二分算法的查找情况

二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况&#xf…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...