caffe训练(4)
图片减去均值后,再进行训练和测试,会提高速度和精度。因此,一般在各种模型中都会有这个操作。
那么这个均值怎么来的呢,实际上就是计算所有训练样本的平均值,均值含义具体可见博客:深度学习(4)数据预处理-均值减法。计算出来后,保存为一个均值文件,在以后的测试中,就可以直接使用这个均值来相减,而不需要对测试图片重新计算。
一、二进制格式的均值计算
caffe中使用的均值数据格式是binaryproto, 作者为我们提供了一个计算均值的文件compute_image_mean.cpp,放在caffe根目录下的tools文件夹里面。
乌班图系统
编译后的可执行体放在 build/tools/ 下面,我们直接调用就可以了
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, 计算出来的结果保存文件。
windows系统
编译后的可执行体放在.\caffe-master\Build\x64\Release 下面,我们通过.sh脚本文件调用就可以了
D:/caffe/Build/x64/Release/compute_image_mean fenlei_train_lmdb fenlei_train_mean.binaryproto
生成的均值文件如下:
二、python格式的均值计算
如果我们要使用python接口,或者我们要进行特征可视化,可能就要用到python格式的均值文件了。首先,我们用lmdb格式的数据,计算出二进制格式的均值,然后,再转换成python格式的均值。
- 我们可以编写一个python脚本来实现:
import sys,os
caffe_root ='D:/caffe-master/zzfl/'
sys.path.append('D:/caffe-master/python')
import caffe
os.chdir(caffe_root)
import numpy as np
print "Usage: python convert_mean.py proto.mean out.npy"
blob = caffe.proto.caffe_pb2.BlobProto()
BINARY_PROTO_FILE_NAME ='D:/caffe-master/zzfl/fenlei_train_mean.binaryproto'
BINARY_PROTO_FILE_PATH = os.path.join(os.getcwd(),BINARY_PROTO_FILE_NAME)
NPY_FILE_NAME ='D:/caffe-master/zzfl/mean.npy'
NPY_FILE_PATH = os.path.join(os.getcwd(),NPY_FILE_NAME)
data = open(BINARY_PROTO_FILE_PATH, 'rb' ).read()
blob.ParseFromString(data)
arr = np.array(caffe.io.blobproto_to_array(blob))
out = arr[0]
np.save(NPY_FILE_PATH,out)
将这个脚本保存为convert_mean.py
调用格式为:
python d:\caffe-master\zzfl\convert_mean.py fenlei_train_mean.binaryproto mean.npy
其中的 mean.binaryproto 就是经过前面步骤计算出来的二进制均值。mean.npy就是我们需要的python格式的均值。
- 或者采用简化python脚本文件,但是需要在调用时带上路径:
#!/usr/bin/env python
import numpy as np
import sys,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 )
调用格式为:
python d:\caffe-master\zzfl\convert_mean.py d:\caffe-master\zzfl\fenlei_train_mean.binaryproto d:\caffe-master\zzfl\mean.npy