如何调用训练好的caffemodel
1个回答
展开全部
文件夹里面,然后写一个main函数调用这个类就可以了,比如:复制,保存到caffe/examples/myproject/net_operator.hpp,然后同目录下写一个main.cpp,在main函数里面#include"net_operator.hpp",就可以使用这个类了:conststringnet_prototxt="";//你的网络的prototxt文件,用绝对路径,下面同理conststringpre_trained_file="";//你训练好的.caffemodel文件conststringimg_path="";//你要测试的图片路径//创建NetOperator对象NetOperatornet_operator(net_prototxt,pre_trained_file);Blob*blob=net_operator.processImage(img_path);//blob就得到了最后一层的输出结果,至于blob里面是怎么存放数据的,你需要去看看官网对它的定义写完main.cpp之后,到caffe目录下,make,然后它会编译你写的文件,对应生成的可执行文件。比如按我上面写的那样,make之后就会在caffe/build/examples/myproject文件夹里面生成一个main.bin,执行这个文件就可以了。因为生成的可执行文件并不是直接在代码目录下,所以前面我建议你写的路径用绝对路径另外如果你要获取的不是最后一层的输出,你需要修改一下processImage函数的返回值,通过NetOperator的成员变量net_来获取你需要的blob,比如有个blob名称为"label",你想获取这个blob,可以通过net_->blob_by_name("label")来获取,当然获取到的是shared_ptr>类型的,搜一下boostshared_ptr就知道跟普通指针有什么不同了好了,接下来是贴代码了:#include#include#include#include#include#include#include#include#includeusingnamespacecaffe;//NOLINT(build/namespaces)usingstd::string;classNetOperator{public:NetOperator(conststring&net_prototxt);NetOperator(conststring&net_prototxt,conststring&trained_file);~NetOperator(){}intbatch_size(){returnbatch_size_;}Blob*processImage(conststring&img_path,boolis_color=true);Blob*processImages(constvector&img_paths,boolis_color=true);private:voidcreateNet(conststring&net_prototxt);//readtheimageandstoreitintheidxpositionofimagesintheblobvoidreadImageToBlob(conststring&img_path,intidx=0,boolis_color=true);shared_ptr>net_;cv::Sizeinput_geometry_;intbatch_size_;intnum_channels_;Blob*input_blob_;TransformationParametertransform_param_;shared_ptr>data_transformer_;Blobtransformed_data_;};NetOperator::NetOperator(conststring&net_prototxt){createNet(net_prototxt);}NetOperator::NetOperator(conststring&net_prototxt,conststring&trained_file){createNet(net_prototxt);net_->CopyTrainedLayersFrom(trained_file);}voidNetOperator::createNet(conststring&net_prototxt){#ifdefCPU_ONLYCaffe::set_mode(Caffe::CPU);#elseCaffe::set_mode(Caffe::GPU);#endifnet_.reset(newNet(net_prototxt,TEST));CHECK_EQ(net_->num_inputs(),1)num_outputs(),1)*input_layer=net_->input_blobs()[0];batch_size_=input_layer->num();num_channels_=input_layer->channels();CHECK(num_channels_==3||num_channels_==1)width(),input_layer->height());//reshapetheoutputshapeoftheDataTransformervectortop_shape(4);top_shape[0]=1;top_shape[1]=num_channels_;top_shape[2]=input_geometry_.height;top_shape[3]=input_geometry_.width;this->transformed_data_.Reshape(top_shape);}Blob*NetOperator::processImage(conststring&img_path,boolis_color){//reshapethenetfortheinputinput_blob_=net_->input_blobs()[0];input_blob_->Reshape(1,num_channels_,input_geometry_.height,input_geometry_.width);net_->Reshape();readImageToBlob(img_path,0,is_color);net_->ForwardPrefilled();returnnet_->output_blobs()[0];}Blob*NetOperator::processImages(constvector&img_paths,boolis_color){intimg_num=img_paths.size();//reshapethenetfortheinputinput_blob_=net_->input_blobs()[0];input_blob_->Reshape(img_num,num_channels_,input_geometry_.height,input_geometry_.width);net_->Reshape();for(inti=0;iForwardPrefilled();returnnet_->output_blobs()[0];}voidNetOperator::readImageToBlob(conststring&img_path,intidx,boolis_color){//readtheimageandresizetothetargetsizecv::Matimg;intcv_read_flag=(is_color?CV_LOAD_IMAGE_COLOR:CV_LOAD_IMAGE_GRAYSCALE);cv::Matcv_img_origin=cv::imread(img_path,cv_read_flag);if(!cv_img_origin.data){LOG(ERROR)0){cv::resize(cv_img_origin,img,input_geometry_);}else{img=cv_img_origin;}//transformtheimagetoablobusingDataTransformer//createaDataTransformerusingdefaultTransformationParameter(notransformation)data_transformer_.reset(newDataTransformer(transform_param_,TEST));data_transformer_->InitRand();//settheoutputofDataTransformertotheidximageoftheinputblobintoffset=input_blob_->offset(idx);this->transformed_data_.set_cpu_data(input_blob_->mutable_cpu_data()+offset);//transformtheinputimagedata_transformer_->Transform(img,&(this->transformed_data_));
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询