问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么测试cpu版的caffe有没有安装成功

发布网友 发布时间:2022-05-10 21:20

我来回答

1个回答

热心网友 时间:2023-11-01 19:08

  你想调用你的模型,最简单的办法是看examples/cpp_classification里面的cpp文件,那是教你如何调用caffe获取分类结果的…(你没接触过caffe的话,建议你直接按照这个文件来操作可能会比较简单,下面我的代码我也不知道没接触过caffe的人看起来难度会有多大)
  不过那个代码我看着不太习惯,所以之前自己稍微写了一个简易的版本,不知道怎么上传附件,懒人一个就直接把代码贴在最后了。
  先简单解释一下如何使用,把这个代码复制到一个头文件中,然后放在examples里面一个自己创建的文件夹里面,然后写一个main函数调用这个类就可以了,比如:
  复制,保存到caffe/examples/myproject/net_operator.hpp,然后同目录下写一个main.cpp,在main函数里面#include “net_operator.hpp”,就可以使用这个类了:
  const string net_prototxt = “…”; // 你的网络的prototxt文件,用绝对路径,下面同理
  const string pre_trained_file = “…”; // 你训练好的。caffemodel文件
  const string img_path = “…”; // 你要测试的图片路径
  // 创建NetOperator对象
  NetOperator net_operator(net_prototxt, pre_trained_file);
  Blob<float> *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<Blob<float> >类型的,搜一下boost shared_ptr就知道跟普通指针有什么不同了
  好了,接下来是贴代码了:
  #include <caffe/caffe.hpp>
  #include <opencv2/core/core.hpp>
  #include <opencv2/highgui/highgui.hpp>
  #include <opencv2/imgproc/imgproc.hpp>
  #include <iosfwd>
  #include <memory>
  #include <string>
  #include <utility>
  #include <vector>
  using namespace caffe; // NOLINT(build/namespaces)
  using std::string;
  class NetOperator
  {
  public:
  NetOperator(const string& net_prototxt);
  NetOperator(const string& net_prototxt, const string& trained_file);
  ~NetOperator() { }
  int batch_size() { return batch_size_; }
  Blob<float>* processImage(const string &img_path, bool is_color = true);
  Blob<float>* processImages(const vector<string> &img_paths, bool is_color = true);
  private:
  void createNet(const string& net_prototxt);
  // read the image and store it in the idx position of images in the blob
  void readImageToBlob(const string &img_path, int idx = 0, bool is_color = true);
  shared_ptr<Net<float> > net_;
  cv::Size input_geometry_;
  int batch_size_;
  int num_channels_;
  Blob<float>* input_blob_;
  TransformationParameter transform_param_;
  shared_ptr<DataTransformer<float> > data_transformer_;
  Blob<float> transformed_data_;
  };
  NetOperator::NetOperator(const string& net_prototxt) {
  createNet(net_prototxt);
  }
  NetOperator::NetOperator(const string& net_prototxt, const string& trained_file) {
  createNet(net_prototxt);
  net_->CopyTrainedLayersFrom(trained_file);
  }
  void NetOperator::createNet(const string& net_prototxt) {
  #ifdef CPU_ONLY
  Caffe::set_mode(Caffe::CPU);
  #else
  Caffe::set_mode(Caffe::GPU);
  #endif
  net_.reset(new Net<float>(net_prototxt, TEST));
  CHECK_EQ(net_->num_inputs(), 1) 《 “Network should have exactly one input.”;
  CHECK_EQ(net_->num_outputs(), 1) 《 “Network should have exactly one output.”;
  Blob<float>* input_layer = net_->input_blobs()[0];
  batch_size_ = input_layer->num();
  num_channels_ = input_layer->channels();
  CHECK(num_channels_ == 3 || num_channels_ == 1)
  《 “Input layer should have 1 or 3 channels.”;
  input_geometry_ = cv::Size(input_layer->width(), input_layer->height());
  // reshape the output shape of the DataTransformer
  vector<int> top_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<float>* NetOperator::processImage(const string &img_path, bool is_color) {
  // reshape the net for the input
  input_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();
  return net_->output_blobs()[0];
  }
  Blob<float>* NetOperator::processImages(const vector<string> &img_paths, bool is_color) {
  int img_num = img_paths.size();
  // reshape the net for the input
  input_blob_ = net_->input_blobs()[0];
  input_blob_->Reshape(img_num, num_channels_,
  input_geometry_.height, input_geometry_.width);
  net_->Reshape();
  for (int i=0; i<img_num; i++) {
  readImageToBlob(img_paths[i], i, is_color);
  }
  net_->ForwardPrefilled();
  return net_->output_blobs()[0];
  }
  void NetOperator::readImageToBlob(const string &img_path, int idx, bool is_color) {
  // read the image and resize to the target size
  cv::Mat img;
  int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
  CV_LOAD_IMAGE_GRAYSCALE);
  cv::Mat cv_img_origin = cv::imread(img_path, cv_read_flag);
  if (!cv_img_origin.data) {
  LOG(ERROR) 《 “Could not open or find file ” 《 img_path;
  return ;
  }
  if (input_geometry_.height > 0 && input_geometry_.width > 0) {
  cv::resize(cv_img_origin, img, input_geometry_);
  } else {
  img = cv_img_origin;
  }
  // transform the image to a blob using DataTransformer
  // create a DataTransformer using default TransformationParameter (no transformation)
  data_transformer_.reset(
  new DataTransformer<float>(transform_param_, TEST));
  data_transformer_->InitRand();
  // set the output of DataTransformer to the idx image of the input blob
  int offset = input_blob_->offset(idx);
  this->transformed_data_.set_cpu_data(input_blob_->mutable_cpu_data() + offset);
  // transform the input image
  data_transformer_->Transform(img, &(this->transformed_data_));
  }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
色彩中蓝色、红色、黄色除了加白色以外还有什么办法提高明度 色彩不敢调亮怎么办? 色彩如何提亮 男朋友惹我生气了 事后一点悔意也没 都在气头上 我不小心打男朋友了 他... 解签:为人处事莫亏心,暗室之中有灵应,一时得意反成失,半点悔改胜似金... 我手机之前一段时间由于欠费停机了 前几天我充了50元进去怎么还是... 撕名牌可以用哪些超能力技能? 为什么5孔插座带开关,安装好之后,灯有电,插座不通电? 怎么把照片内存变小 图片内存变小的方法 百度地图导航如何连接车蓝牙 百度地图导航连接车蓝牙方法 人事档案管理的基本内容 怎么将人事档案转回到户口所在地? 什么是人事档案的转递 转递干部人事档案有哪些规定? 档案转递的依据可以有以下哪些? 冰箱三包 我于07年左右吧,买了一台美菱两开门冰箱,经过两年零三个月的正常使用后,突然出现问题经过N次 海尔冰箱售后维修怎么不给维修记录单 冰箱保修期内两次维修仍不制冷,能退换货吗 冰箱维修多久可以退换 我的海尔冰箱使用不到三年维修了四次,究竟是不是属于质量的问题呢?我该怎么办呢? 容声冰箱一年内修了三次没开修理记录怎样更换? 梦见交话费赠了两把花雨伞 梦见女儿结婚,新房里的花雨伞破了是啥意思,也是装修品吧。 河北省英语专业专接本 河北外国语学院专接本总共要花费多少钱??? 河北专接本考试缴费显示已缴费 2009年河北省专接本报名费是多少? 计算机网络专业的专接本要考什么? 小苏打和氢氧化钠在一起用会有毒吗? 什么样的企业需要纯碱?片碱?小苏打?元明粉?详细! 氢氧化钠是小苏打吗 我是今年的毕业生档案已经回到大庆请问我应该办理什么手续 懂得英语的人速度进,送分,翻译下.谢谢 我的档案该怎么办 外贸英语求翻译 关于衣服包装的 求英语翻译,汉译英,此为本人考试作业,请勿恶搞乱译或用垃圾翻译器,谢谢! BDC in batch: How do you determine the number of 英文翻译:请帮我翻译一下。这个布料很难控制色差。 OneKey Ghost Y2.0 正式版.exe是什么程序 caffe的contrastiveLoss怎样设置loss weight 如何查看电脑显卡信息,如何查看电脑显卡gpu 《水浒传》108位好汉的结局是什么? 放风筝理论如何应用于高管的激励与约束? 梁山好汉都是怎么死的 我国企业高层管理人员制度激励的重要性 水浒传108好汉死了几个?都是怎么死的? 请列举两个以上激励方面的理论,并说明这些理论在实践工作中的运用 梁山好汉一百零八将都是怎么死的? 108条梁山好汉是怎么死的? 论述激励机制的设计和激励原则与方法 、根据在管理学中学到的激励的有关理论,试述在管理实践中,如何有效激励员工?