(1) 减去均值方式1
从caffe 给的 models/bvlc_reference_caffenet/下的训练协议train_val.prototxt
transform_param {
mirror: true
crop_size: 227
mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
# mean pixel / channel-wise mean instead of mean image
# transform_param {
# crop_size: 227
# mean_value: 104
# mean_value: 117
# mean_value: 123
# mirror: true
# }
以及,给定的分类示例:
mu = np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy')
mu = mu.mean(1).mean(1) # average over pixels to obtain the mean (BGR) pixel values
print 'mean-subtracted values:', zip('BGR', mu)
# create transformer for the input called 'data'
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1)) # move image channels to outermost dimension
transformer.set_mean('data', mu) # subtract the dataset-mean value in each channel
transformer.set_raw_scale('data', 255) # rescale from [0, 1] to [0, 255]
transformer.set_channel_swap('data', (2,1,0)) # swap channels from RGB to BGR
我们看到,减去均值文件的方式是:
img - [104,117,123];
即三个通道,每个通道减去对应的值。
(2) 减均值方式2
就是我们通常意义上的减去均值,即
img - mean(img_all);
img 和 mean(img_all)拥有同样的size。
(3) 减去均值在除以标准差
假定图像中每一个位置的像素为一个随机变量,那么标准化的方式为:
x−μσ
img = img - mean(img_all);
img = img ./ std(img_all);
三种处理数据的方式,在识别率上有啥差距呢?有空做一下调查。当然,对于图像来说,进行标准化是好的,曾经做过一个实验,使用标准化和未标准化数据相差大约10个百分点。