caffe C++接口前馈调用

该博客展示了如何在C++中利用Caffe库加载MobileNet模型,并对输入图像进行预处理及前向传播计算,以进行图像分类。代码首先设置CPU模式,然后加载模型的prototxt文件和caffemodel权重,接着读取并调整图像大小,将图像数据填充到网络输入Blob中,最后执行前向传播并找出概率最高的类别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#ifndef CPU_ONLY
#define CPU_ONLY
#endif
#include <string>
#include <vector>
#include <iostream>

#include "caffe/caffe.hpp"
#include "caffe/layers/input_layer.hpp"
#include "caffe/layers/conv_layer.hpp"
#include "caffe/net.hpp"
#include "caffe/blob.hpp"

#include <opencv2/opencv.hpp>

using namespace caffe;

int main(){
char * proto = "/home/wdh/models/mobilenet/mobilenet_deploy.prototxt";
char * model = "/home/wdh/models/mobilenet/mobilenet.caffemodel";
Phase phase = TEST;
Caffe::set_mode(Caffe::CPU);
boost::shared_ptr< Net<float> > net (new Net<float>(proto,phase));
net->CopyTrainedLayersFrom(model);
std::cout<<"load net and params done!"<<std::endl;

// cv::Mat img = cv::imread("/home/wdh/pictures/res.jpg");
cv::Mat img = cv::imread("/home/wdh/caffe/examples/images/cat.jpg");
cv::resize(img,img,cv::Size(224,224));
float * data = (float*)malloc(3*224*224*sizeof(float));
int channels = 3;
int height = 224;
int width = 224;

for(int i=0;i<height;++i){
    for(int j=0;j<width;++j){
        for(int c=0;c<channels;++c){
            data[c*height*width + i*width + j] = img.ptr<uchar>(i)[j*channels+c] / 255.0;
        }
    }
}

Blob<float>* input_blobs = net->input_blobs()[0];
std::cout<<input_blobs->channels()<<","<<input_blobs->height()<<","<<input_blobs->width()<<std::endl;

memcpy(input_blobs->mutable_cpu_data(), data,
sizeof(float) * input_blobs->count());

net->Forward();
Blob<float>* output_blobs = net->output_blobs()[0];

std::cout<<output_blobs->channels()<<","<<output_blobs->height()<<","<<output_blobs->width()<<std::endl;

int max_id = 0;
float max_p = 0.0;
for(int i=0;i<output_blobs->channels();++i){
float value = output_blobs->data_at(0,i,0,0);
if(value > max_p){
    max_p = value;
    max_id = i;
}
    std::cout<<value<<std::endl;
}

std::cout<<"max_id:"<<max_id<<",max_p"<<max_p<<std::endl;
free(data);
return 0;
}


cmake_minimum_required(VERSION 3.13)
project(helloworld)

set(out_name hellocaffe)
#include_directories(/home/wdh/caffe/include)
include_directories(/home/wdh/caffe/build/src)

add_executable(${out_name} helloworld.cpp)

link_directories(/home/wdh/caffe/build/lib)
link_directories(/usr/lib/x86_64-linux-gnu)

target_link_libraries(${out_name} caffe boost_system opencv_imgcodecs opencv_imgproc opencv_core glog)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值