Lib Caffe (C ++): input_blobs () [0] вызывает ошибку формы дна после первого вызова - PullRequest
0 голосов
/ 11 января 2019

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

Моя Caffe Neural Network отлично работает для первого изображения, но на втором изображении выдает следующую ошибку:

Check failed: bottom[0]->shape() == bottom[i]->shape() bottom[0]: 87122736 0 85536896 0 (37632), bottom[1]: 1 3 112 112 (37632)

И первое, и второе изображения одинаковы, а их форма (112 x 112) с 3 каналами.

Код

Caffe::set_mode(Caffe::CPU);
my_net.reset(new caffe::Net<float>(arch, caffe::TEST));
my_net->CopyTrainedLayersFrom(model);

for(int i=0; i<num_images;i++) {
    Blob<float> *my_blob = my_net->input_blobs()[0]; 

    // accessing blob attributes just for debugging purposes
    // 1 after first call OK, 87122736 at second call (?)
    int batch_size = my_blob->num(); 
    // 3 after first call OK, 0 at second call (?)
    int channels = my_blob->channels(); 
    // 112 after first call OK, 85536896 at second call (?)
    int height = my_blob->height(); 
    // 112 after first call OK, 0 at second call (?)
    int width = my_blob->width(); 

    my_blob->set_cpu_data(images[i]);
    my_net->Forward();

    //delete my_blob; <-- IT WAS CAUSING THE PROBLEM
}

Как я могу просто кормить сеть, чтобы я мог запустить ее на следующих изображениях? Как заставить input_blobs () [0] указывать на тот же блок памяти, что и с первой попытки? Как видите, атрибуты у одних и тех же параметров разные input_blobs()[0].

1 Ответ

0 голосов
/ 14 января 2019

РЕШЕНИЕ НАЙДЕНО

В предыдущем выпуске Caffe я использовал, чтобы выделить новый входной BLOB-объект, установить его данные, отодвинуть его назад, а затем использовать его как ниже:

// allocate new input blob
Blob<float> *my_blob = new Blob<float>(1, 1, width, height);
// set its data
feature_blob->set_cpu_data(image[i]);
// push it back to a bottom
std::vector<Blob<float>*> feature_botton;
feature_botton.push_back(feature_blob);
// use the blob forwarding the network
loss=0;
const std::vector<Blob<float>*>& feature_points(
feature_extraction_net->Forward(feature_botton, loss));

// deallocate memory
feature_botton.clear();
delete feature_blob;

Проблема в новом выпуске Caffe, мне не нужно освобождать память. На самом деле это был корень проблемы. Я просто больше не удаляю блоб.

Решение выложено на git форуме библиотеки lib ( solution )

...