Как адаптировать упаковщик Caffe Matlab для сети, обученной на Mnist?

Я успешно обучил свою сеть Caffe в базе данных mnist по http://caffe.berkeleyvision.org/gathered/examples/mnist.html

Теперь я хочу протестировать сеть с моими собственными изображениями, используя оболочку Matlab.

Поэтому в "matcaffe.m" я загружаю файл "lenet.prototxt", который не используется для обучения, но, кажется, подходит для тестирования. Он ссылается на входной размер 28 х 28 пикселей:

name: "LeNet"
input: "data"
input_dim: 64
input_dim: 1
input_dim: 28
input_dim: 28
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"

Поэтому я адаптировал функцию "prepare_image" в "matcaffe.m" соответственно. Теперь это выглядит так:

% ------------------------------------------------------------------------
function images = prepare_image(im)
IMAGE_DIM = 28;
% resize to fixed input size
im = rgb2gray(im);
im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear');
im = single(im);
images = zeros(1,1,IMAGE_DIM,IMAGE_DIM);
images(1,1,:,:) = im;
images = single(images);
%-------------------------------------------------------------

Это преобразует входное изображение в [1 x 1 x 28 x 28], 4dim, изображение в градациях серого. Но все же Матлаб жалуется:

Error using caffe
MatCaffe input size does not match the input size of the
network
Error in matcaffe_myModel_mnist (line 76)
scores = caffe('forward', input_data);

У кого-нибудь есть опыт тестирования обученной сети mnist на его собственных данных?

2 ответа

Решение

Наконец, я нашел полное решение: это как предсказать цифру вашего собственного входного изображения, используя matcaffe.m (Matlab wrapper) для Caffe

  1. В "matcaffe.m": нужно ссылаться на файл "caffe-master/examples/mnist/lenet.prototxt"
  2. Адаптируйте файл "lenet.prototxt", как указано в mprat: измените запись input_dim на input_dim: 1
  3. Используйте следующую адаптацию к подфункции "prepare_image" в matcaffe.m:

(На входе может быть изображение RGB любого размера)

function image = prepare_image(im)

IMAGE_DIM = 28;

% If input image is too big , is rgb and of type uint8:
% -> resize to fixed input size, single channel, type float

im = rgb2gray(im);
im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear');
im = single(im);

% Caffe needs a 4D input matrix which has single precision
% Data has to be scaled by 1/256 = 0.00390625 (like during training)
% In the second last line the image is beeing transposed!
images = zeros(1,1,IMAGE_DIM,IMAGE_DIM);
images(1,1,:,:) = 0.00390625*im';
images = single(images);

Причиной возникновения этой ошибки (размер входного файла не совпадает) является то, что сетевой прототип ожидает пакет из 64 изображений. Линии

input_dim: 64
input_dim: 1
input_dim: 28
input_dim: 28

Означает, что сеть ожидает пакет из 64 оттенков серого, 28 на 28 изображений. Если вы сохраните все свои коды MATLAB одинаковыми и измените первую строку на

input_dim: 1

Ваша проблема должна уйти.

Другие вопросы по тегам