【深度学习】一文搞懂 如何计算图像数据集的RGB均值和方差(超详细的哦~)

计算图像数据集的RGB均值和方差

  • 1、引言
  • 2、RGB均值和方差
    • 2.1 计算RGB均值和方差原因
    • 2.2 计算RGB均值和方差步骤
    • 2.3 代码实现
      • 2.3.1 TensorFlow计算RGB均值和方差
      • 2.3.2 PyTorch计算RGB均值和方差
  • 3、总结

1、引言

小屌丝:鱼哥,帮个忙呀
小鱼:在忙呀。
小屌丝:就帮个忙呗
小鱼:忙着呢…
在这里插入图片描述

小屌丝:哎呀,手滑了。
小鱼:这… 这是谁啊
小屌丝:不知道,
小鱼:…不知道你能发给我?
小屌丝:不知道,就是不知道
小鱼:… 咱俩重新来
小屌丝:重新来啥?
小鱼:你问我帮个忙
小屌丝:哦,你现在有时…
小鱼:有,有,有 ,现在有时间
小屌丝:昂,那你给我讲一讲…
小鱼:可以讲,可以讲,
小屌丝:我还没说让你帮我讲什么呢?
小鱼:什么都可以,你说吧
小屌丝:… 如何计算图像数据集的RGB均值和方差
小鱼:那个妹子是谁?
小屌丝:你再讨价还价?
小鱼:… 为了妹子,暂时忍一下,咱俩互换信息呗?
小屌丝:行
小鱼:妥

2、RGB均值和方差

2.1 计算RGB均值和方差原因

在深度学习中,模型的训练通常依赖于大量的数据。图像数据由于其固有的高维度特性,往往需要进行一定的预处理来降低计算复杂度并提高模型的收敛速度。计算RGB均值和方差并进行归一化是其中的一种重要方法。

归一化操作可以将图像的像素值映射到一个统一的范围内,通常是[0, 1]或[-1, 1]。这样做的好处在于:

  • 数值稳定性:归一化可以避免因像素值范围过大或过小而导致的数值不稳定问题。
  • 加速收敛:将像素值映射到统一范围后,模型的参数更新会更加平稳,从而加速训练过程。
  • 提升性能:归一化有助于模型更好地学习图像数据的内在特征,从而提升模型的性能。

2.2 计算RGB均值和方差步骤

计算图像数据集的RGB均值和方差通常包括以下步骤:

  • 读取图像数据:需要读取整个数据集的所有图像。这可以通过使用深度学习框架(如TensorFlow、PyTorch等)中的图像加载函数来实现。
  • 提取RGB通道:对于每张图像,提取其RGB三个通道的数据。在深度学习中,图像通常被表示为三维张量,其中前两个维度分别对应图像的高和宽,第三个维度对应颜色通道。
  • 计算均值:对于每个颜色通道,将所有图像的对应通道数据相加,然后除以图像的总数,得到该通道的均值。
  • 计算方差:方差是每个通道数据与均值之差的平方的平均值。首先,计算每张图像每个通道数据与对应均值之差的平方,然后将所有图像的结果相加并除以图像的总数,得到该通道的方差。

2.3 代码实现

2.3.1 TensorFlow计算RGB均值和方差

代码实战

# -*- coding:utf-8 -*-
# @Time   : 2024-03-21
# @Author : Carl_DJ'''
实现功能:TensorFlow计算图像数据集的RGB均值和方差'''import tensorflow as tf  
import numpy as np  # 设置数据集路径  
dataset_path = './data/image/dataset'  # 使用TensorFlow的tf.data API来加载图像数据集  
def load_and_preprocess_image(img_path):  image = tf.io.read_file(img_path)  image = tf.image.decode_jpeg(image, channels=3)  image = tf.image.convert_image_dtype(image, tf.float32)  image = tf.image.resize(image, [224, 224])  # 统一图像尺寸为224x224  return image  # 创建数据集  
image_paths = tf.data.Dataset.list_files(dataset_path + '/*.jpg')  # 图像都是jpg格式  
dataset = image_paths.map(load_and_preprocess_image, num_parallel_calls=tf.data.AUTOTUNE)  
dataset = dataset.batch(32)  # 批量处理图像以加速计算  # 初始化RGB均值和方差  
rgb_mean = tf.Variable([0.0, 0.0, 0.0], dtype=tf.float32)  
rgb_var = tf.Variable([0.0, 0.0, 0.0], dtype=tf.float32)  # 计算RGB均值和方差  
num_images = 0  
num_pixels = 0  
for images in dataset:  num_images += tf.shape(images)[0]  num_pixels += tf.reduce_prod(tf.shape(images))  total_pixels = tf.reduce_sum(images, axis=[0, 1, 2])  mean_update = total_pixels / num_pixels  rgb_mean.assign_sub((rgb_mean - mean_update) / num_images)  # 计算方差时需要用到之前的均值  variance_update = tf.reduce_mean((images - rgb_mean) ** 2, axis=[0, 1, 2])  rgb_var.assign_add(variance_update)  # 计算最终的方差(除以图像数量减1得到无偏估计)  
rgb_var.assign(rgb_var / (num_images - 1))  print("RGB Mean:", rgb_mean.numpy())  
print("RGB Variance:", rgb_var.numpy())

2.3.2 PyTorch计算RGB均值和方差

代码实战

# -*- coding:utf-8 -*-
# @Time   : 2024-03-21
# @Author : Carl_DJ'''
实现功能:PyTorch计算图像数据集的RGB均值和方差'''
import torch  
import torchvision.transforms as transforms  
from torchvision.datasets import ImageFolder  
from torch.utils.data import DataLoader  
from PIL import Image  # 设置数据集路径  
dataset_path = './data/image/dataset'  # 定义图像预处理变换  
transform = transforms.Compose([  transforms.Resize(224),  # 统一图像尺寸为224x224  transforms.ToTensor(),  transforms.Normalize(mean=[0.0, 0.0, 0.0], std=[1.0, 1.0, 1.0])  # 临时设置均值和标准差为0和1  
])  # 加载数据集  
dataset = ImageFolder(root=dataset_path, transform=transform)  
dataloader = DataLoader(dataset, batch_size=32, shuffle=False, num_workers=4)  # 初始化RGB均值和方差  
rgb_mean = torch.zeros(3)  
rgb_var = torch.zeros(3)  
num_pixels = 0  # 计算RGB均值和方差  
for images, _ in dataloader:  num_pixels += images.numel()  batch_mean = images.mean(dim=(0, 2, 3))  rgb_mean += batch_mean.sum(dim=0)  # 计算方差时需要用到之前的均值  batch_var = (images - batch_mean.view(3, 1, 1)).pow(2).mean(dim=(0, 2, 3))  rgb_var += batch_var.sum(dim=0)  # 计算最终的RGB均值  
rgb_mean /= num_pixels  # 计算最终的RGB方差(注意这里除以n-1,其中n是像素总数,用于无偏估计)  
rgb_var /= (num_pixels - 1)  # 将均值和方差转换回[0, 1]范围(如果后续需要用于归一化)  
rgb_mean = (rgb_mean + 1) / 2  print("RGB Mean:", rgb_mean.item())  
print("RGB Variance:", rgb_var.item())

在这里插入图片描述

3、总结

计算得到的RGB均值和方差可以用于图像数据的归一化。
在模型训练时,将每张图像的像素值减去均值并除以标准差(方差的平方根),即可得到归一化后的图像数据。同样地,在模型推理时,也需要对输入图像进行相同的归一化操作。

  • 敲黑板
    计算RGB均值和方差时应该使用整个训练集的数据,而不是验证集或测试集。
    这是因为归一化操作是为了让模型更好地学习训练数据的分布特性,如果使用验证集或测试集的数据进行归一化,可能会导致模型性能的下降。
    所以, 在实际应用中,需要针对具体的数据集和任务进行归一化操作,并通过实验验证其有效性。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,学习【机器学习】&【深度学习】领域的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解Spring:Java开发的利器

Spring是一款开源的轻量级Java开发框架,旨在提高开发人员的效率和系统的可维护性。本文将介绍Spring的基本概念、使用优势、设计模式以及与Spring MVC和Spring Boot的关联。 什么是Spring? Spring是一款开源的轻量级Java开发框架,它由多个模…

Flink中流式的各种聚合

11.1 MiniBatch 聚合 针对无界聚合算子,说简单点就是把一组输入的数据放到缓存里,减少吞吐的开销 默认情况下,对于无界聚合算子来说,mini-batch 优化是被禁用的。开启这项优化,需要设置选项 TableConfig configurat…

STM32之HAL开发——HAL库框架介绍

HAL库外设设计思想 HAL库借鉴面向对象的设计思想,将外设驱动封装为对象。 HAL库使用主线 HAL使用的主要用在俩个地方,无外乎外设初始化以及外设的使用。想用好这两个功能,我们首先得对外设的封装有一定的了解。 句柄结构体 xx_HandleTypeDef…

【吾爱破解】Android初级题(二)的解题思路 _

拿到apk,我们模拟器打开看一下 好好,抽卡模拟器是吧😀 jadx反编译看一下源码 找到生成flag的地方,大概逻辑就是 java signatureArr getPackageManager().getPackageInfo(getPackageName(), 64).signaturesfor (int i 0; i &l…

数据结构(C语言)代码实现(十一)——离散事件模拟

目录 参考资料 代码实现 有序链表头文件LinkList.h 链队列LinkQueue.h 银行业务模拟程序头文件 Bank_Simulation.h 具体函数实现以及主函数 实验中遇到的问题 参考资料 1、数据结构严蔚敏版 2、大佬已有的成套的作业。基本思路照搬大佬和课本,不过自己这些代…

Spring MVC面试简答题

简答题 简述Spring MVC的设计原理和主要组成部分。解答: Spring MVC的设计原理基于MVC(Model-View-Controller)设计模式,它将应用程序划分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。 Model:代表应用程序的数据和业务逻辑。View:负责渲染用户界…

批量高效剪辑视频,轻松调整视频时长,轻松打造完美节奏

在数字化时代,视频内容已成为我们生活中不可或缺的一部分。无论是社交媒体上的短视频,还是专业影视制作中的长片,视频剪辑都扮演着至关重要的角色。然而,面对大量视频素材,如何高效地进行剪辑调整,让每一帧…

Express:快速搭建Node.js应用的基石

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

华为OD机试 - 打印任务排序 - 队列(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题&a…

Rust 的 Vec 排序方法汇总

在 Rust 中,Vec 类型的排序可以通过使用 sort 方法来实现。sort 方法是 Vec 的一个成员方法,它会对向量中的元素进行就地排序(即不返回新的排序后的向量,而是直接修改原始向量)。此外,sort_by 和 sort_by_k…

机器人|逆运动学问题解决方法总结

如是我闻: 解决逆运动学(Inverse Kinematics, IK)问题的方法多样,各有特点。以下是一个综合概述: 1. 解析法(Analytical Solutions) 特点:直接使用数学公式计算关节角度&#xff0…

0基础 三个月掌握C语言(14)-上

自定义类型 其实C语言有内置类型 也有自定义的类型 内置类型(C语言本身支持的现成的类型) 如:char short int long float double.... 但仅仅有这些类型是不够的 比如说 我们想表示一个人(复杂对象) 对于人的描述那…

我们是如何测试人工智能的(八)包含大模型的企业级智能客服系统拆解与测试方法 -- 大模型 RAG

大模型的缺陷 -- 幻觉 接触过 GPT 这样的大模型产品的同学应该都知道大模型的强大之处, 很多人都应该调戏过 GPT,跟 GPT 聊很多的天。 作为一个面向大众的对话机器人,GPT 明显是鹤立鸡群,在世界范围内还没有看到有能跟 GPT 扳手腕…

探索AI大模型学习:理论基础、技术突破与未来挑战

在当今技术飞速发展的时代,人工智能(AI)大模型学习无疑是推动科技进步和创新的关键力量。AI大模型学习的核心在于通过训练大规模的数据集来提升模型的性能,使之能够更准确、更高效地完成各种任务,从而在多个领域中实现…

开启Safari手势支持

在使用Safari 的时候,大家有没有觉得不支持手势使用起来不是很方便, 触摸板只支持少量简单的手势,如缩放,滚动等。如果使用鼠标的用户,则完全无法使用手势。经过折腾研究,使用CirMenu应用可以完美解决这个要…

C++第十一弹---类与对象(八)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、友元 1.1、友元函数 1.2、友元类 2、内部类 3、匿名对象 4、拷贝对象时的一些编译器优化 总结 1、友元 友元提供了一种突破封装的方式&a…

深度解析:Elasticsearch写入请求处理流程

版本 Elasticsearch 8.x 原文链接:https://mp.weixin.qq.com/s/hZ_ZOLFUoRuWyqp47hqCgQ 今天来看下 Elasticsearch 中的写入流程。 不想看过程可以直接跳转文章末尾查看总结部分。最后附上个人理解的一个图。 从我们发出写入请求,到 Elasticsearch 接收请…

QT 常用模块介绍以及使用说明

当学习 QT 编程时&#xff0c;掌握以下几个关键模块是非常重要的。下面是每个模块的简要说明及示例程序&#xff1a; Qt Widgets 模块&#xff1a; 说明&#xff1a;Qt Widgets 模块包含用于创建传统桌面应用程序的 UI 控件。示例程序&#xff1a;#include <QApplication>…

单目深度估计基础理论和论文学习总结

单目深度估计基础理论和论文学习总结 一、背景知识&#xff1a; 三维刚体运动的数学表示&#xff1a;旋转平移矩阵、旋转向量、欧拉角、四元数、轴角模型、齐次坐标、各种变换等 照相机模型&#xff1a;单目/双目模型&#xff0c;单目中的世界坐标系/相机坐标系/图像坐标系的…

从零开始的 dbt 入门教程 (dbt cloud 自动化篇)

一、引 在前面的几篇文章中&#xff0c;我们从 dbt core 聊到了 dbt 项目工程化&#xff0c;我相信前几篇文章足够各位数据开发师从零快速入门 dbt 开发&#xff0c;那么到现在我们更迫切需要解决的是如何让数据更新做到定时化&#xff0c;毕竟作为开发我们肯定没有经历每天定…