这是在 python 中美白图像的正确方法吗?

2024-05-05

我在尝试着zero-center and whiten CIFAR10数据集,但我得到的结果看起来像随机噪声!
Cifar10数据集包含60,000尺寸的彩色图像32x32。训练集包含50,000和测试集包含10,000分别是图像。
以下代码片段显示了我使数据集变白的过程:

# zero-center
mean = np.mean(data_train, axis = (0,2,3)) 
for i in range(data_train.shape[0]):
    for j in range(data_train.shape[1]):
        data_train[i,j,:,:] -= mean[j]

first_dim = data_train.shape[0] #50,000
second_dim = data_train.shape[1] * data_train.shape[2] * data_train.shape[3] # 3*32*32
shape = (first_dim, second_dim) # (50000, 3072) 

# compute the covariance matrix
cov = np.dot(data_train.reshape(shape).T, data_train.reshape(shape)) / data_train.shape[0] 
# compute the SVD factorization of the data covariance matrix
U,S,V = np.linalg.svd(cov)

print 'cov.shape = ',cov.shape
print U.shape, S.shape, V.shape

Xrot = np.dot(data_train.reshape(shape), U) # decorrelate the data
Xwhite = Xrot / np.sqrt(S + 1e-5)

print Xwhite.shape
data_whitened = Xwhite.reshape(-1,32,32,3)
print data_whitened.shape

outputs:

cov.shape =  (3072L, 3072L)
(3072L, 3072L) (3072L,) (3072L, 3072L)
(50000L, 3072L)
(50000L, 32L, 32L, 3L)
(32L, 32L, 3L)

并尝试显示结果图像:

import matplotlib.pyplot as plt
%matplotlib inline
from scipy.misc import imshow
print data_whitened[0].shape
fig = plt.figure()
plt.subplot(221)
plt.imshow(data_whitened[0])
plt.subplot(222)
plt.imshow(data_whitened[100])
plt.show()

顺便说一下data_train[0].shape is (3,32,32), 但如果我根据我得到的重塑美白图像

TypeError: Invalid dimensions for image data

这可能只是一个可视化问题吗?如果是这样,我如何确定情况确实如此?

Update :
感谢@AndrasDeak,我以这种方式修复了可视化代码,但输出看起来仍然是随机的:

data_whitened = Xwhite.reshape(-1,3,32,32).transpose(0,2,3,1)
print data_whitened.shape
fig = plt.figure()
plt.subplot(221)
plt.imshow(data_whitened[0])

Update 2:
This is what I get when I run some of the commands given below : As it can be seen below, toimage can show the image just fine, but trying to reshape it, messes up the image. enter image description here

# output is of shape (N, 3, 32, 32)
X = X.reshape((-1,3,32,32))
# output is of shape (N, 32, 32, 3)
X = X.transpose(0,2,3,1)
# put data back into a design matrix (N, 3072)
X = X.reshape(-1, 3072)

plt.imshow(X[6].reshape(32,32,3))
plt.show()

for some wierd reason, this was what I got at first , but then after several tries, it changed to the previous image. enter image description here


让我们来看看这个。正如您所指出的,CIFAR 包含存储在矩阵中的图像;每个图像为一行,每行有 3072 列uint8数字(0-255)。图像为 32x32 像素,像素为 RGB(三通道颜色)。

# https://www.cs.toronto.edu/~kriz/cifar.html
# wget https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
# tar xf cifar-10-python.tar.gz
import numpy as np
import cPickle
with open('cifar-10-batches-py/data_batch_1') as input_file: 
    X = cPickle.load(input_file)
X = X['data']   # shape is (N, 3072)

事实证明,列的排序有点有趣:所有红色像素值首先出现,然后是所有绿色像素,然后是所有蓝色像素。这使得查看图像变得很棘手。这:

import matplotlib.pyplot as plt
plt.imshow(X[6].reshape(32,32,3))
plt.show()

给出这个:

因此,为了便于查看,让我们将矩阵的维度打乱reshape and transpose:

# output is of shape (N, 3, 32, 32)
X = X.reshape((-1,3,32,32))
# output is of shape (N, 32, 32, 3)
X = X.transpose(0,2,3,1)
# put data back into a design matrix (N, 3072)
X = X.reshape(-1, 3072)

Now:

plt.imshow(X[6].reshape(32,32,3))
plt.show()

gives:

好的,开始ZCA美白。我们经常被提醒,在白化数据之前对数据进行零中心化非常重要。此时,对您所包含的代码进行观察。据我所知,计算机视觉将颜色通道视为另一个特征维度;图像中单独的 RGB 值没有什么特别之处,就像单独的像素值没有什么特别之处一样。它们都只是数字特征。因此,当您计算平均像素值时,请考虑颜色通道(即您的mean是一个元组r,g,b值),我们只计算平均值image价值。注意X是一个N行3072列的大矩阵。我们将把每一列视为与其他每一列“相同类型的事物”。

# zero-centre the data (this calculates the mean separately across
# pixels and colour channels)
X = X - X.mean(axis=0)

此时,我们还可以进行全局对比度标准化,这通常应用于图像数据。我将使用 L2 范数,这使得每个图像的矢量大小为 1:

X = X / np.sqrt((X ** 2).sum(axis=1))[:,None]

人们可以轻松地使用其他东西,例如标准差(X = X / np.std(X, axis=0)) 或最小-最大缩放到某个区间,例如 [-1,1]。

就快到了。此时,我们还没有对数据进行很大的修改,因为我们只是对其进行了移动和缩放(线性变换)。为了显示它,我们需要将图像数据恢复到 [0,1] 范围内,所以让我们使用一个辅助函数:

def show(i):
    i = i.reshape((32,32,3))
    m,M = i.min(), i.max()
    plt.imshow((i - m) / (M - m))
    plt.show()

show(X[6])

孔雀在这里看起来稍微亮一些,但这只是因为我们拉伸了它的像素值以填充区间 [0,1]:

ZCA美白:

# compute the covariance of the image data
cov = np.cov(X, rowvar=True)   # cov is (N, N)
# singular value decomposition
U,S,V = np.linalg.svd(cov)     # U is (N, N), S is (N,)
# build the ZCA matrix
epsilon = 1e-5
zca_matrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T))
# transform the image data       zca_matrix is (N,N)
zca = np.dot(zca_matrix, X)    # zca is (N, 3072)

看看(show(zca[6])):

现在孔雀看起来肯定不一样了。您可以看到 ZCA 通过色彩空间旋转了图像,因此它看起来就像旧电视上的图片,但色调设置不正常。不过还是能认出来。

大概是因为epsilon我使用的值,转换后的数据的协方差并不完全是恒等式,但它相当接近:

>>> (np.cov(zca, rowvar=True).argmax(axis=1) == np.arange(zca.shape[0])).all()
True

1 月 29 日更新

我不完全确定如何解决您遇到的问题;您目前的问题似乎在于原始数据的形状,因此我建议您在尝试继续进行零中心化和 ZCA 之前先解决这个问题。

一方面,更新中四个图的第一个图看起来不错,这表明您已以正确的方式加载了 CIFAR 数据。第二个情节是由toimage,我认为,这将自动找出哪个维度有颜色数据,这是一个很好的技巧。另一方面,之后的事情看起来很奇怪,所以似乎某个地方出了问题。我承认我不能完全理解你的脚本的状态,因为我怀疑你正在交互地工作(笔记本),当事情不起作用时重试(稍后会详细介绍),并且你正在使用代码你没有在你的问题中显示出来。特别是,我不确定你如何加载 CIFAR 数据;你的屏幕截图显示了一些输出print陈述(Reading training data...等),然后当您复制时train_data into X并打印shape of X,形状已经被重塑为(N, 3, 32, 32)。就像我说的,更新图 1 往往表明重塑已经正确发生。从图 3 和图 4 中,我认为你在某个地方混淆了矩阵维度,所以我不确定你是如何进行重塑和转置的。

请注意,由于以下原因,请务必小心重塑和转置。这X = X.reshape(...) and X = X.transpose(...)代码正在修改矩阵in place。如果您多次执行此操作(就像在 jupyter 笔记本中偶然发生的那样),您将一遍又一遍地打乱矩阵的轴,并且绘制数据将开始看起来非常奇怪。此图显示了我们迭代重塑和转置操作时的进展:

这种进展不会循环回来,或者至少不会快速循环。由于数据中的周期性规律(例如图像的 32 像素行结构),您往往会在这些不正确的重塑转置图像中出现条带。我想知道这是否是您更新中四个图中的第三个图中发生的情况,它看起来比问题原始版本中的图像随机性要低得多。

您更新的第四个图是孔雀的彩色负片。我不确定你是如何得到的,但我可以通过以下方式重现你的输出:

plt.imshow(255 - X[6].reshape(32,32,3))
plt.show()

这使:

你可以得到这个的一种方法是如果你使用我的show辅助函数,你混淆了m and M, 像这样:

def show(i):
    i = i.reshape((32,32,3))
    m,M = i.min(), i.max()
    plt.imshow((i - M) / (m - M))  # this will produce a negative img
    plt.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是在 python 中美白图像的正确方法吗? 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • Django 的内联管理:一个“预填充”字段

    我正在开发我的第一个 Django 项目 我希望用户能够在管理中创建自定义表单 并向其中添加字段当他或她需要它们时 为此 我在我的项目中添加了一个可重用的应用程序 可在 github 上找到 https github com stephen
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

    我正在尝试在 MQL5 中设置一个 PUB 套接字 并在 Python 中设置一个 SUB 套接字来接收消息 我在 MQL5 中有这个 include
  • 立体太阳图 matplotlib 极坐标图 python

    我正在尝试创建一个与以下类似的简单的立体太阳路径图 http wiki naturalfrequent com wiki Sun Path Diagram http wiki naturalfrequency com wiki Sun Pa
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • Python ImportError:无法导入名称 __init__.py

    我收到此错误 ImportError cannot import name life table from cdc life tables C Users tony OneDrive Documents Retirement retirem
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重

随机推荐