当加载神经网络时,如何解释mean.binaryproto文件?

4

我希望加载一个使用caffe训练的神经网络,用于图像分类。

这个神经网络包含一个文件mean.binaryproto,其中包含了在输入要被分类的图像之前需要减去的均值。

我正在尝试理解这个文件中包含的内容,因此我使用Google Colab来查看它的内部结构。

加载它的代码如下:

# Load the Drive helper and mount
from google.colab import drive

# This will prompt for authorization.
drive.mount('/content/drive')
!ls "/content/drive/My Drive"

#install packages
!apt install -y caffe-cuda
!apt update
!apt upgrade
!apt dist-upgrade
!ls "/content/drive/My Drive/NeuralNetwork/CNRPark-Trained-Models/mAlexNet-on-CNRPark/"
import caffe
import numpy as np
with open('/content/drive/My Drive/NeuralNetwork/CNRPark-Trained-Models/mAlexNet-on-CNRPark/mean.binaryproto', 'rb') as f:
    blob = caffe.proto.caffe_pb2.BlobProto()
    blob.ParseFromString(f.read())
    arr = np.array( caffe.io.blobproto_to_array(blob) )
    print(arr.shape)
    out = arr[0]
    data = np.array(blob.data).reshape([blob.channels, blob.height, blob.width])
    print (data.shape)
    print(data[0])
 #display the mean image
 from PIL import Image
 from IPython.display import Image as Im, display
 display(Image.fromarray(data[0], 'RGB'))

输出结果为:

(1, 3, 256, 256)
(3, 256, 256)

我了解的是该文件包含所讨论的手段和图像,这些图像是3通道的,因此每个通道都有一个平均值。
然而,我希望每个通道只有一个单独的值,但我发现了一个256x256的数组:这是否意味着对每个通道的每个像素都取了平均值?
另一个问题是:我想使用OpenCV中使用BGR而不是RGB的NN。如何知道3x256x256均值使用RGB还是BGR?
模型链接在这里。我正在查看的模型包含在zip文件CNRPark-Trained-Models.zip中的文件夹mAlexNet-on-CNRPark中。
2个回答

3
然而,我原本期望每个通道只有一个值,但我发现了一个256x256的数组:这是否意味着它对每个通道的每个像素取了平均值?确切地说,根据mean.binaryproto的形状,该文件是某个数据集的平均图像,这意味着它对每个通道的每个像素(特征)取了平均值。这不应与平均像素混淆,正如您所述,它是每个通道的单个值。例如,平均像素被Very Deep Convolutional Networks for Large-Scale Image Recognition采用。根据他们的论文:我们唯一进行的预处理就是从训练集上计算出的RGB平均值中减去每个像素。换句话说,如果您将RGB图像视为大小为N x N的3个特征数组,则平均图像将是每个特征的平均值,而平均像素将是所有特征的平均值。
另一个问题是:我想使用OpenCV中使用BGR而非RGB的NN,如何知道平均3x256x256使用RGB还是BGR?
我怀疑你正在读取的二进制文件不存储有关其颜色格式的任何信息,但找出实用的方法是使用matplotlib绘制此图像并查看颜色是否合理。例如,人脸图像。如果交换红色和蓝色通道,则肤色将呈蓝色。

enter image description here

事实上,上面的图像是平均图像(人脸图像)的一个例子 :)
你也可以假设它是BGR,因为OpenCV使用这种颜色格式。
然而,找出如何生成这个mean.binaryproto 的正确方法是查看他们的存储库或询问模型所有者。

0
import os, sys, glob, caffe
import numpy as np
mean_file= "path/to/file/mean.binaryproto"
#convert mean file to image
blob= caffe.proto.caffe_pb2.BlobProto()
try:
    data = open( mean_file, 'rb' ).read()
except:
    data = open( mean_file, 'r' ).read()
blob.ParseFromString(data)
arr = np.uint8(np.array( caffe.io.blobproto_to_array(blob) )[0])
#a= arr[0];    b= arr[1];    c= arr[2]
img= np.zeros([128,200,3])
img[:,:,0]= arr[0];    img[:,:,1]= arr[1];    img[:,:,2]= arr[2]
import cv2
cv2.imwrite(mean_file.replace(".binaryproto", ".bmp"), img)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接