Caffe(5)--计算数据集的图像均值

特征标准化(使数据集中所有特征都具有零均值和单位方差)。 零均值:计算每一个维度上数据的均值(使用全体数据计算),之后在每一个维度上都减去该均值。 单位方差:在数据的每一维度上除以该维度上数据的标准差。

在大多数情况下,我们并不关注所输入图像的整体明亮程度。比如在目标识别任务中,图像的整体明亮程度并不会影响图像中存在的是什么物体。更为正式地说,我们对图像块的平均亮度值不感兴趣,所以可以减去这个值来进行均值削减。

深层一点的解释:斯坦福大学的cs231n深度学习课程,其中在激活函数一章讲到: http://study.163.com/course/courseMain.htm?courseId=1003223001 Consider what happens when the input to a neuron is always positive…

根据求导的链式法则,w的局部梯度是X,当X全为正时,由反向传播传下来的梯度乘以X后不会改变方向,要么为正数要么为负数,也就是说w权重的更新在一次更新迭代计算中要么同时减小,要么同时增大。为了更好得理解,假设w有两维,做出下图:

其中,w的更新方向向量只能在第一和第三象限。假设最佳的w向量如蓝色线所示,由于输入全为正,现在迭代更新只能沿着红色路径做zig-zag运动,更新的效率很慢。基于此,当输入数据减去均值后,就会有负有正,会消除这种影响。

图片减去均值后,再进行训练/测试,会提高速度和精度。

在caffe中,计算所有训练样本的平均值,保存为一个均值文件,在以后的测试中,就可以直接使用这个均值,而不需要重新对待测试的图像进行计算了。

一、以Caffe中的MNIST数据集为例

1、二进制格式的均值计算

Caffe中使用的均值数据格式是binaryproto, 作者提供了一个计算均值的文件compute_image_mean.cpp,在Caffe根目录下的tools文件夹里面。编译后的可执行体在 build/tools/下面,直接调用就可以。 Caffe根目录下执行:

sudo build/tools/compute_image_mean examples/mnist/mnist_train_lmdb examples/mnist/mean.binaryproto

第一个参数:examples/mnist/mnist_train_lmdb,表示需要计算均值的数据,格式为lmdb。 第二个参数:examples/mnist/mean.binaryproto,计算出来的结果保存文件。

2、python格式的均值计算mean.binaryproto转mean.npy

如果要使用python接口,或者要进行特征可视化,可能就要用到python格式的均值文件了。首先,我们用lmdb格式的数据,计算出二进制格式的均值mean.binaryproto,然后,再转换成python格式的均值mean.npy。 转换脚本convert_mean.py如下: 调用方法为:

sudo python examples/mnist/convert_mean.py examples/mnist/mean.binaryproto examples/mnist/mean.npy
#!/usr/bin python
# -*- coding: utf-8 -*-

import numpy as np
import sys

caffe_root = '/home/bu5/bu5project/caffe-ssd/'
sys.path.insert(0, caffe_root + 'python') # 添加系统环境变量
import caffe

if len(sys.argv)!=3:
    print "Usage: python convert_mean.py mean.binaryproto mean.npy"
    sys.exit()

blob = caffe.proto.caffe_pb2.BlobProto()
bin_mean = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(bin_mean)
arr = np.array( caffe.io.blobproto_to_array(blob) )
npy_mean = arr[0]
np.save( sys.argv[2] , npy_mean )

二、处理自己的数据

1、二进制格式的均值计算

训练数据先转为lmdb,由lmdb计算出均值

将caffe下的imagenet文件夹的make_imagenet_mean.sh复制到制作数据的文件夹下进行修改,进行均值的计算,运行该sh。

执行:

./ make_imagenet_mean.sh或者sh make_imagenet_mean.sh 可生成image_mean.binaryproto文件

#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12

EXAMPLE=/home/bu5/bu5project/LMDB-lwp
DATA=/home/bu5/bu5project/LMDB-lwp
TOOLS=/home/bu5/bu5project/caffe-ssd/build/tools

$TOOLS/compute_image_mean $EXAMPLE/image_train_lmdb \
  $DATA/image_mean.binaryproto

echo "Done."

2、python格式的均值计算

同上MNIST的转换

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券