Как адаптировать упаковщик 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
- В "matcaffe.m": нужно ссылаться на файл "caffe-master/examples/mnist/lenet.prototxt"
- Адаптируйте файл "lenet.prototxt", как указано в mprat: измените запись input_dim на
input_dim: 1
- Используйте следующую адаптацию к подфункции "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
Ваша проблема должна уйти.