如何使用 Opencv dnn 模块调用 Caffe 预训练模型?

 QString modelPrototxt = "D:\\Qt\\qmake\\CaffeModelTest\\caffe\\lenet.prototxt";
    QString modelBin = "D:\\Qt\\qmake\\CaffeModelTest\\caffe\\snapshot_iter_10000.caffemodel";
    QString imageFile = "D:\\Qt\\qmake\\CaffeModelTest\\caffe\\9.png";

    //读取存储在caffe模型文件中的网络模型
    cv::dnn::Net net = cv::dnn::readNetFromCaffe(modelPrototxt.toStdString(),modelBin.toStdString());
    if (net.empty())
    {
        qDebug() << "readNetFromCaffe faild";
    }

    //读取图像文件
    cv::Mat img = cv::imread(imageFile.toStdString(),0);
    if(img.empty())
    {
        qDebug() << "imread faild";
    }

    cv::Mat inputBlob = cv::dnn::blobFromImage(img,0.00390625f, cv::Size(28, 28), cv::Scalar(), false);
    cv::Mat prob;
    cv::TickMeter t;
    for (int i = 0; i < 1; i++)
    {
        //设置网络的输入层名字(和训练网络模型文件里面的 name 对应)
        net.setInput(inputBlob, "data");
        t.start();
        //设置网络的输出层名字(和训练网络模型文件里面的 name 对应)
        prob = net.forward("prob");
        t.stop();
    }

    int classId;
    double classProb;
    cv::Mat probMat = prob.reshape(1, 1); //reshape the blob to 1x1000 matrix
    cv::Point classNumber;

    cv::minMaxLoc(probMat, NULL, &classProb, NULL, &classNumber);
    classId = classNumber.x;

    qDebug() << t.getTimeMicro() << "index:" << classId << "%"<< classProb;

LeNet

name: "LeNet"
input: "data"
input_shape {
  dim: 1   # batchsize
  dim: 1   # number of channels
  dim: 28  # width
  dim: 28  # height
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "ip1"
  type: "InnerProduct"
  bottom: "pool2"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 500
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 10
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "prob"
  type: "Softmax"
  bottom: "ip2"
  top: "prob"
}

原文地址:https://www.cnblogs.com/cheungxiongwei/p/8732957.html

时间: 2024-10-30 08:13:57

如何使用 Opencv dnn 模块调用 Caffe 预训练模型?的相关文章

OpenCv dnn模块扩展研究(1)--style transfer

一.opencv的示例模型文件 使用Torch模型[OpenCV对各种模型兼容并包,起到胶水作用], 下载地址: fast_neural_style_eccv16_starry_night.t7 http://cs.stanford.edu/people/jcjohns/fast-neural-style/models/eccv16/starry_night.t7 和 fast_neural_style_instance_norm_feathers.t7 http://cs.stanford.e

基于OpenCV的dnn模块的SSD demo运行

最近项目有个任务,要在windows环境下用VS+OpenCV实现caffe模型的调用,于是在网上找了几个相关的博客跑了几个demo练练手.这些博客写得都很详细,但是有些细节由于版本更新的问题,配置的过程中有些变化,所以自己再发篇博客记录下. 前期的准备工作可以参考这篇博客:基于opencv dnn模块 的caffe模型的调用,关于配置环境,我用的VS2015,CMake是官网的最新版本,OpenCV选的是博客中用的OpenCV3.2.0.其中需要注意的是,运行环境及前期准备过程中, OpenC

创建新的C++工程来调用Caffe对图片进行识别

前段时间一直在跑Caffe训练数据.之前用训练好的caffemodel对图片进行分类都是用的命令行指令,于是就想着自己新建一个工程来调用caffe,结合classification的代码来对图片进行分类.上网查阅了很多资料,最详细的一篇就是:http://blog.csdn.net/qq_14845119/article/details/52541622#reply. 一.步骤描述 我今天写这篇的主要目的是为了加深自己的记忆和理解,大部分都是参考上面给出的博客的内容.具体分为以下三个步骤:(1)

DNN模块开发之利器篇:七种武器

我们在进行DNN模块开发时经常需要调用Dotnetnuke.dll中的方法函数,模块开发用到DNN的方法函数会让你的开发更加得心应手,下面我们就来介绍一下. 1) PortalModuleBase 所属命名空间:DotNetNuke.Entities.Modules 这是一个开发DNN模块所必须继承的基类,标志性的基类,在此基类中,你可以得到DNN所为你封装的一些模块基本信息,毋需你多费周折,其中包括当前用户UseID,UserInfo,TabID,ModulePath,ModuleConfig

Caffe学习3-使用预训练模型finetuning

该篇陈述了在采用imagenet大数据集合上使用caffenet预训练得到caffemodel,然后应用该caffemodel进一步fintuning图像风格数据库style.下面为主要步骤: #采用别人的预训练模型,在自己的数据库上进行微调(fine-tunning) #fine-tune是应用别人在大数据集合上训练到一定程度的caffemodel,在这进行微调.这比随机化参数要好,因为该模型可能已经接近最优! #可以省时间,省资源.也可以克服没有大数据的困扰 #这里采用imagenet数据集

OpenCV DNN之YOLO实时对象检测

OpenCV DNN之YOLO实时对象检测 OpenCV在3.3.1的版本中开始正式支持Darknet网络框架并且支持YOLO1与YOLO2以及YOLO Tiny网络模型的导入与使用.YOLO是一种比SSD还要快的对象检测网络模型,算法作者在其论文中说FPS是Fast R-CNN的100倍,基于COCO数据集跟SSD网络的各项指标对比 在最新的OpenCV3.4上我也测试了YOLO3,发现不支持,因为YOLO3有个新层类型shortcut,OpenCV3.4的Darknet暂时还不支持.这里首先

Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)

原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问这个类不存在的方法,那么它会去访问”魔术方法__call()” 用户访问一个不存在的操作—>解决:给每个控制器都定义个_empty()方法来处理 第二个解决方法:定义一个空操作 [空模块处理] 我们使用一个类,但是现在这个类还没有被include进来. 我们可以通过自动加载机制处理__autoloa

如何在程序中调用Caffe做图像分类

Caffe是目前深度学习比较优秀好用的一个开源库,采样c++和CUDA实现,具有速度快,模型定义方便等优点.学习了几天过后,发现也有一个不方便的地方,就是在我的程序中调用Caffe做图像分类没有直接的接口.Caffe的数据层可以从数据库(支持leveldb.lmdb.hdf5).图片.和内存中读入.我们要在程序中使用,当然得从内存中读入.参见http://caffe.berkeleyvision.org/tutorial/layers.html#data-layers和MemoryDataLay

ThinkPHP实现跨模块调用操作方法概述

ThinkPHP实现跨模块调用操作方法概述 投稿:shichen2014 字体:[增加 减小] 类型:转载 使用 $this 可以调用当前模块内的方法,但是很多情况下经常会在当前模块中调用其他模块的方法.这篇文章主要介绍了ThinkPHP跨模块调用操作,需要的朋友可以参考下 使用 $this 可以调用当前模块内的方法,但是很多情况下经常会在当前模块中调用其他模块的方法.ThinkPHP内置了A方法与R方法这两个特殊的大写字母方法来处理跨模块调用的问题. 目前Index模块内有index操作Use