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

时间:2018-10-24 16:45:49

标签: python neural-network caffe pycaffe

我想加载经过caffe训练的神经网络,用于图像分类。

NN包含文件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的数组:这是否意味着对每个通道的每个像素取平均值?

另一个问题如下:我想将这种NN与OpenCV一起使用,而不是RGB使用BGR:如何知道平均值3x256x256是使用RGB还是BGR?

模型的链接为this。我正在查看的模型包含在文件夹CNRPark-Trained-Models.zip中的压缩文件mAlexNet-on-CNRPark中。

2 个答案:

答案 0 :(得分:1)

  

但是我期望每个通道有一个单一的值,但是我发现   256x256数组:这是否意味着对每个像素的每个像素取平均值   频道?

完全正确。根据{{​​1}}的形状,此文件是某个数据集的平均图像,这意味着它采用了每个通道的每个像素(特征)的平均值。

这不应与平均像素(如您所述,每个通道的单个值)相混淆。

例如,平均像素被Very Deep Convolutional Networks for Large-Scale Image Recognition修饰。根据他们的论文:

  

我们唯一要做的预处理是减去平均RGB值,   根据每个像素在训练集上计算

换句话说,如果您将RGB图像视为3个大小为N x N的特征阵列,则平均图像将是每个特征的均值,而平均像素将是每个特征的均值。 所有功能。


  

另一个问题如下:我想在OpenCV中使用这样的NN   使用BGR而不是RGB:如何知道平均值3x256x256是否使用   RGB还是BGR?

我怀疑您正在读取的二进制文件中存储了有关其颜色格式的任何信息,但是一种实际的找出方法是使用mean.binaryproto绘制此图像,并查看颜色是否有意义。

例如,面部图像。如果交换了红色和蓝色通道,则肤色看起来会发蓝。

enter image description here

实际上,上面的图像是平均图像(面部图像)的示例:)

您还可以假定它是BGR,因为OpenCV使用这种颜色格式。

但是,找出此matplotlib生成方式的正确方法是查看其存储库或询问模型所有者。

答案 1 :(得分: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)