Как интерпретировать файл mean.binaryproto при загрузке нейронной сети? - PullRequest
0 голосов
/ 24 октября 2018

Я хочу загрузить нейронную сеть, которая была обучена работе с 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?

Ссылка на модель это .Модель, которую я смотрю, содержится в zip-файле CNRPark-Trained-Models.zip в папке: mAlexNet-on-CNRPark.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019
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)
0 голосов
/ 08 ноября 2018

Однако я ожидал одного значения на канал, вместо этого я обнаружил массив 256x256: означает ли это, что он взял среднее значение для каждого пикселя каждого канала?

Точно.В соответствии с формой mean.binaryproto этот файл является усредненным изображением некоторого набора данных, что означает, что он взял среднее значение каждого пикселя (функции) для каждого канала.

Это не следует путать со среднимпиксель, который, как вы сказали, является одним значением для каждого канала.

Например, средний пиксель был принят Очень глубокие сверточные сети для крупномасштабного распознавания изображений .Согласно их статье:

Единственная предварительная обработка, которую мы делаем, - это вычитание среднего значения RGB, вычисленного на обучающем наборе, из каждого пикселя

Другими словами,если вы рассматриваете изображение RGB как 3 массива объектов размером N x N, среднее изображение будет представлять собой среднее значение каждой функции, а средний пиксель будет представлять собой среднее значение всех объектов.


Другой вопрос заключается в следующем: я хочу использовать такой NN с OpenCV, который вместо RGB использует BGR: Как узнать, использует ли среднее значение 3x256x256 RGB или BGR?

Я сомневаюсь, что в двоичном файле, который вы читаете, хранится какая-либо информация о его цветовом формате, но практический способ выяснить это - построить это изображение, используя matplotlib, и посмотреть, имеют ли цвета смысл.

Например, изображения лица.Если поменять местами красный и синий каналы, оттенок кожи будет выглядеть голубоватым.

enter image description here

Фактически, изображение выше является примером среднего изображения (изображения лица):)

Вы также можете предположить, что это BGR, поскольку OpenCV использует этот цветовой формат.

Тем не менее, правильный способ выяснить, как был создан этот mean.binaryproto, - просмотреть их репозитории.или спросив владельца модели.

...