【深度学习】一文搞懂 如何计算图像数据集的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开发框架,它由多个模…

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…

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

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

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…

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

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

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

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

开启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 接收请…

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

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

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

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

【项目管理后台】Vue3+Ts+Sass实战框架搭建二

Vue3TsSass搭建 git cz的配置mock 数据配置viteMockServe 建立mock/user.ts文件夹测试一下mock是否配置成功 axios二次封装解决env报错问题,ImportMeta”上不存在属性“env” 统一管理相关接口新建api/index.js 路由的配置建立router/index.ts将路由进行集中封装&am…

GA遗传算法和ALNS算法的区别(我的APS项目七)

博主用最简单的方式告诉你遗传算法是什么,估计这是网上最简单的遗传算法入门教程了。首先我们先带入一个问题,我们要去9大城市旅游,想知道每个城市走一遍,总路程最短的出行顺序是什么? OK,题目我们已经明确…

Chrome 插件打包发布

插件打包发布 一、打包成 zip 包 最简单方便的一种其实就是打包成 zip 包,通过下载链接进行下载,在包里面通过设置版本号和数据库的版本号对比来提醒用户进行新包的下载。 二、发布到 Chrome 应用商店 1. 注册成为开发者 在发布到 chrome 应用商店之…

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一,在第七节中讲解了如何简洁的进行web程序部署和运行,这只是它的功能之一。在本节中,我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…

吴恩达深度学习笔记:神经网络的编程基础2.15-2.17

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第二周:神经网络的编程基础 (Basics of Neural Network programming)2.15 Python 中的广播(Broadcasting in Python)2.16 关于 python _ numpy 向量的说明&…

作为技术人员在日常工作中如何使用边界AICHAT工具

目录 1.1、解决日常问题1.2、编写日常程序1.3、优化日常工作中的代码1.4、边界AICHAT工具会员中心1.5、边界AICHAT工具普通用户的权益1.6、边界AICHAT工具超级永久会员的权益 有关边界AICHAT工具工具的介绍请参考之前的系列博文, 一款好用的AI工具——边界AICHAT&a…

【SpringSecurity】十六、OAuth2.0授权服务器、资源服务器的配置(理论部分)

文章目录 0、OAuth2服务端结构1、授权服务配置2、授权服务器 ⇒ 配置客户端详情3、授权服务器 ⇒ 管理令牌配置4、授权服务器:配置端点访问的安全约束5、资源服务器配置 相关📕: 【OAuth2授权服务器配置完整Demo】 0、OAuth2服务端结构 OAu…