查看: 2535|回复: 3

图像去均值:image mean 和 pixel mean

[复制链接]

665

主题

1234

帖子

6568

积分

xdtech

Rank: 5Rank: 5

积分
6568
发表于 2019-1-2 11:15:34 | 显示全部楼层 |阅读模式
1.什么是均值?

对于每帧图像来说,均值分为两种:image mean 和 pixel mean。

image mean:
简单的说,读入一张彩色图像,假设是(N*N*3),这时候,求出image mean的话,就也是N*N*3,相当于把所有训练集在同一个空间位置上的像素的对应通道求了均值,也就是caffe里生成的mean.binaryproto文件,

pixel mean:
而pixel mean的话,其实是把训练集里面所有图片的所有R通道像素,求了均值,G,B通道类似,也就是不考虑空间位置了。所以求出来就是三个数值(R_mean,G_mean,B_mean),所以其实就是把image mean再求了一次均值。1
2.为什么要去均值?
2.1.从主成分分析(PCA)入手解释

说白了就是数据特征标准化。

特征标准化指的是(独立地)使得数据的每一个维度具有零均值和单位方差。这是归一化中最常见的方法并被广泛地使用(例如,在使用支持向量机(SVM)时,特征标准化常被建议用作预处理的一部分)。在实际应用中,特征标准化的具体做法是:首先计算每一个维度上数据的均值(使用全体数据计算),之后在每一个维度上都减去该均值。下一步便是在数据的每一维度上除以该维度上数据的标准差。

对于自然图像,更多的是做图像零均值化,并不需要估计样本的方差。这是因为在自然图像上进行训练时,对每一个像素单独估计均值和方差意义不大,因为(理论上)图像任一部分的统计性质都应该和其它部分相同,图像的这种特性被称作平稳性(stationarity)。

对于图像,这种归一化可以移除图像的平均亮度值 (intensity)。很多情况下我们对图像的照度并不感兴趣,而更多地关注其内容,比如在对象识别任务中,图像的整体明亮程度并不会影响图像中存在的是什么物体。这时对每个数据点移除像素的均值是有意义的。 2
2.2.从深度学习反向传播计算入手

了解到基本在deep learning中只要你是使用gradient descent来训练模型的话都要在数据预处理步骤进行数据归一化。当然这也是有一定原因的。

如果输入层 x 很大,在反向传播时候传递到输入层的梯度就会变得很大。梯度大,学习率就得非常小,否则会越过最优。在这种情况下,学习率的选择需要参考输入层数值大小,而直接将数据归一化操作,能很方便的选择学习率。而且受 x 和 w 的影响,各个梯度的数量级不相同,因此,它们需要的学习率数量级也就不相同。对 w1 适合的学习率,可能相对于 w2 来说会太小,如果仍使用适合 w1 的学习率,会导致在 w2 方向上走的非常慢,会消耗非常多的时间,而使用适合 w2 的学习率,对 w1 来说又太大,搜索不到适合 w1 的解。3

3.代码
.图像去均值(image mean)

# Normalize the data: subtract the mean image
X_train = sum_img
print ("减去均值之前,X_train的第一幅图像的RGB通道的第一个通道的图像数值32*32:")
print (X_train[0][0])
mean_image = np.mean(X_train, axis=0)   
#shape=(3,32, 32) 这里axis=0表示按照列算均值,在这里是将所有图像的R图上的每个像素点的数值取平均,G,B通道同理,这里是image mean。
X_train_m = X_train - mean_image



print ("-----------------------------------------------")
print ("mean_image的形状以及数值")
print (mean_image.shape)
print (mean_image[0])
print ("-----------------------------------------------")
print ("减去均值之后,X_train的第一幅图像的RGB通道的第一个通道的图像数值32*32:")
print (X_train_m[0][0])
---------------------



像素均值(pixel mean)


import os
import cv2
from numpy import *

img_dir='.\img'
img_list=os.listdir(img_dir)
img_size=224
sum_r=0
sum_g=0
sum_b=0
count=0

for img_name in img_list:
    img_path=os.path.join(img_dir,img_name)
    img=cv2.imread(img_path)
    img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    img=cv2.resize(img,(img_size,img_size))
    sum_r=sum_r+img[:,:,0].mean()
    sum_g=sum_g+img[:,:,1].mean()
    sum_b=sum_b+img[:,:,2].mean()
    count=count+1

sum_r=sum_r/count
sum_g=sum_g/count
sum_b=sum_b/count
img_mean=[sum_r,sum_g,sum_b]
print (img_mean)

---------------------
作者:Jack_Kuo
来源:CSDN
原文:https://blog.csdn.net/weixin_37251044/article/details/81157344
版权声明:本文为博主原创文章,转载请附上博文链接!




回复

使用道具 举报

166

主题

616

帖子

1万

积分

xdtech

Rank: 5Rank: 5

积分
10733
发表于 2019-1-13 09:22:59 | 显示全部楼层
排版要改进

内容还是很好的
回复

使用道具 举报

166

主题

616

帖子

1万

积分

xdtech

Rank: 5Rank: 5

积分
10733
发表于 2019-2-27 23:19:18 | 显示全部楼层
very good
回复

使用道具 举报

665

主题

1234

帖子

6568

积分

xdtech

Rank: 5Rank: 5

积分
6568
 楼主| 发表于 2019-5-4 19:34:48 | 显示全部楼层
好久没更新了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表