Lib Caffe (C++): input_blobs()[0] 在第一次调用后会导致底部形状错误

Lib Caffe (C++): input_blobs()[0] causes bottom shape error after first call

本文关键字:调用 错误 第一次 底部 input C++ Caffe blobs Lib      更新时间:2023-10-16

我正在尝试使用Lib Caffe从图像中提取特征,因此我可以将其用于项目的其他目的。

我的 Caffe 神经网络在第一张图像上工作正常,但在第二张图像上,它抛出以下错误:

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] .

找到解决方案

在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,我不需要释放内存。实际上这是问题的根源。我只是不再删除斑点了。

该解决方案发布在 lib 的 git 论坛中(解决方案)