
mean.binaryproto文件生成
用Caffe框架训练图像相关的视觉任务时候,在预处理的时候会先求图像的均值,这个均值其实是整个数据集的图像均值,Caffe中提供了一个工具来计算数据集的均值,该工具就是compute_image_mean,只要调用一下,就会生成一个mean.binaryproto文件。

compute_image_mean工具
这个文件是一个二进制文件,可以通过python读取的。但是读取出来的值并不是真正的均值,而且一张图像,很多人使用第三方框架调用Caffe训练好的模型时候就不知道如何找到预处理时候的均值了。这个要从mean.binaryproto文件的生成说起,它是通过compute_image_mean工具转换的,这个工具的实现代码如下:
https://github.com/BVLC/caffe/blob/master/tools/compute_image_mean.cpp其中有两个部分值得关注,我分别框出来了。最终得到mean.binaryproto里面是均值图像,在第一部中计算完成。得到均值打印到LOG里面去了,并没有保存下来。但是我们从这部分代码知道了如何从均值图像计算得到各个通道的均值了。

读取与解析
搞清楚这件事情之后,就可以通过python读取mean.binaryproto文件,然后直接得到均值图像,记得它的存储顺序是NCHW,所以要矩阵转换为HWC,因为N为1可以去掉的。最终得到输出的通道值,OpenCV有个cv.means函数调用一下即可打印出来,知道减去的means是多少了。实现代码如下:
mean_blob = caffe.proto.caffe_pb2.BlobProto()
mean_blob.ParseFromString(open(MEAN_FILE, 'rb').read())
# 将均值blob转为numpy.array
data = caffe.io.blobproto_to_array(mean_blob)
data = data.reshape(3, 32, 32)
data = data.transpose((1, 2, 0))
print(data.shape)
m = cv.mean(data)
print(m)
cv.imshow("means", np.uint8(data))
cv.waitKey(0)
cv.destroyAllWindows()使用上述代码即可查看均值图像,而且得到图像数据集各个通道均值,前提是有caffe python支持。