caffe训练出来的模型,进行分类测试 10
caffe寻来出来的模型在windows下测试一张从网上下载的图片出现这问题,请问大神们怎么解决啊...
caffe寻来出来的模型在windows下测试一张从网上下载的图片出现这问题,请问大神们怎么解决啊
展开
1个回答
2017-08-31
展开全部
你想调用你的模型,最简单的法是看examples/cpp_classification里面的cpp文件,那是教你如何调用caffe获取分类结果的…(你没接触过caffe的话,建议你直接按照这个文件来操作可能会比较简单,下面我的代码我也不知道没接触过caffe的人看起来难度会有多大)不过那个代码我看着不太习惯,所以之前自己稍微写了一个简易的版本,不知道怎么上传附件,懒人一个就直接把代码贴在最后了。先简单解释一下如何使用,把这个代码复制到一个头文件中,然后放在examples里面一个自己创建的文件夹里面,然后写一个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(conststringnet_prototxt);NetOperator(conststringnet_prototxt,conststringtrained_file);~NetOperator(){}intbatch_size(){returnbatch_size_;}Blob*processImage(conststringimg_path,boolis_color=true);Blob*processImages(constvectorimg_paths,boolis_color=true);private:voidcreateNet(conststringnet_prototxt);//readtheimageandstoreitintheidxpositionofimagesintheblobvoidreadImageToBlob(conststringimg_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(conststringnet_prototxt){createNet(net_prototxt);}NetOperator::NetOperator(conststringnet_prototxt,conststringtrained_file){createNet(net_prototxt);net_->CopyTrainedLayersFrom(trained_file);}voidNetOperator::createNet(conststringnet_prototxt){#ifdefCPU_ONLYCaffe::set_mode(Caffe::CPU);#elseCaffe::set_mode(Caffe::GPU);#endifnet_.reset(newNet(net_prototxt,TEST));CHECK_EQ(net_->num_inputs(),1)《“Networkshouldhaveexactlyoneinput.”;CHECK_EQ(net_->num_outputs(),1)《“Networkshouldhaveexactlyoneoutput.”;Blob*input_layer=net_->input_blobs()[0];batch_size_=input_layer->num();num_channels_=input_layer->channels();CHECK(num_channels_==3||num_channels_==1)《“Inputlayershouldhave1or3channels.”;input_geometry_=cv::Size(input_layer->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(conststringimg_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(constvectorimg_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(conststringimg_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)《“Couldnotopenorfindfile”《img_path;return;}if(input_geometry_.height>0input_geometry_.width>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_));}
上海华然企业咨询
2024-10-28 广告
2024-10-28 广告
上海华然企业咨询有限公司专注于AI与数据合规咨询服务。我们的核心团队来自头部互联网企业、红圈律所和专业安全服务机构。凭借深刻的AI产品理解、上百个AI产品的合规咨询和算法备案经验,为客户提供专业的算法备案、AI安全评估、数据出境等合规服务,...
点击进入详情页
本回答由上海华然企业咨询提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |