mean.binaryproto轉mean.npy
使用Caffe的C++接口進行操作時,需要的圖像均值文件是pb格式,例如常見的均值文件名爲mean.binaryproto;但在使用python接口進行操作時,需要的圖像均值文件是numpy格式,例如mean.npy。所以在跨語言進行操作時,需要將mean.binaryproto轉換成mean.npy,轉換代碼如下:
import caffe
import numpy as np
MEAN_PROTO_PATH = 'mean.binaryproto' # 待轉換的pb格式圖像均值文件路徑
MEAN_NPY_PATH = 'mean.npy' # 轉換後的numpy格式圖像均值文件路徑
blob = caffe.proto.caffe_pb2.BlobProto() # 創建protobuf blob
data = open(MEAN_PROTO_PATH, 'rb' ).read() # 讀入mean.binaryproto文件內容
blob.ParseFromString(data) # 解析文件內容到blob
array = np.array(caffe.io.blobproto_to_array(blob))# 將blob中的均值轉換成numpy格式,array的shape (mean_number,channel, hight, width)
mean_npy = array[0] # 一個array中可以有多組均值存在,故需要通過下標選擇其中一組均值
np.save(MEAN_NPY_PATH ,mean_npy)
已知圖像均值,構造mean.npy
如果已知圖像中每個通道的均值,例如3通道圖像每個通道的均值分別爲104,117,123,我們也可以通過其構造mean.npy。代碼如下:
import numpy as np
MEAN_NPY_PATH = 'mean.npy'
mean = np.ones([3,256, 256], dtype=np.float)
mean[0,:,:] = 104
mean[1,:,:] = 117
mean[2,:,:] = 123
np.save(MEAN_NPY, mean)
載入mean.npy
上面我們用兩種方式構造了均值文件mean.npy,在使用時載入mean.npy的代碼如下:
import numpy as np
mean_npy = np.load(MEAN_NPY_PATH)
mean = mean_npy.mean(1).mean(1)