0x00

关于使用C++接口来提取特征,caffe官方提供了一个extract_features.cpp的例程,但是这个文件的输入是blob数据,即使输入层使用的是ImageData,也需要在deploy.prototxt中指定图片的位置,很不方便。

如果想要使用opencv来读取一个图片,然后用caffe训练好的model提取特征,就需要对输入层进行改写。另外官方例程默认的输出是leveldb格式,我们也可以获取float类型的多维特征(数组),这样集成到我们的项目中更灵活。

0x01

首先我们需要改写deploy.prototxt的输入层为"MemoryData":

layer {
name: "data"
type: "MemoryData"
top: "data"
top: "label" memory_data_param{
batch_size:1
channels:3
height:100
width:100
}
}

在之前的训练中可能使用的是"ImageData"、"Data"之类的,现在改成MemoryData不影响。

0x02

我准备提取的层的名字是"res5_6",就是"InnerProduct"的前一层,当我想提取"InnerProduct"全连接层的输出时,总是报错,提示原始参数和网络参数不匹配(就是训练好的model和现在deploy的网络维度不一样),所以只好提取前一层了,并且要把全连接层屏蔽掉,屏蔽的方法是把prototxt里相应层的名字改掉就好(相对于caffemodel里面的名字)。[以上问题暂时还没解决,留坑]

0x03

下面是更改之后的 extract_features.cpp的代码:

#include <stdio.h>
#include <string>
#include <vector>
#include <iostream> #include <opencv2/opencv.hpp>
#include "boost/algorithm/string.hpp"
#include "google/protobuf/text_format.h"
#include "caffe/blob.hpp"
#include "caffe/common.hpp"
#include "caffe/net.hpp"
#include "caffe/proto/caffe.pb.h"
#include "caffe/util/io.hpp"
#include "caffe/layers/memory_data_layer.hpp" #define NetTy float using namespace caffe;
using std::cout;
using std::endl;
using std::string; /* 加载模型函数 */
template <typename Dtype>
caffe::Net<Dtype>* loadNet(std::string param_file, std::string pretrained_param_file, caffe::Phase phase)
{
caffe::Net<Dtype>* net(new caffe::Net<Dtype>(param_file, phase)); net->CopyTrainedLayersFrom(pretrained_param_file); return net;
} int main()
{
cv::Mat src; src = cv::imread("face_example/test.jpg"); // 读取测试图片
cv::resize(src, src, cv::Size(100, 100)); // 这里要将图片resize到prototxt里面的输入层指定的大小 caffe::Net<NetTy>* _net = loadNet<NetTy>("face_example/face_deploy.prototxt", "face_example/face.caffemodel", caffe::TEST); // 加载网络定义文件和参数模型 caffe::MemoryDataLayer<NetTy> *m_layer = (caffe::MemoryDataLayer<NetTy> *)_net->layers()[0].get(); // 定义个内存数据层指针 std::vector<cv::Mat> dv = { src }; // AddMatVector(const vector<cv::Mat>& mat_vector,const vector<int>& labels)
std::vector<int> label = { 0 }; // ------------------------------------------------------------------------- m_layer->AddMatVector(dv, label); // 把图片和标签,添加到 MemoryData层 std::vector<caffe::Blob<NetTy>*> input_vec; // 无意义,为了函数参数需要
_net->Forward(input_vec); // 执行一次前向计算 boost::shared_ptr<caffe::Blob<NetTy>> layerData = _net->blob_by_name("res5_6"); // 获得指定层的输出 const NetTy* pstart = layerData->cpu_data(); // res5_6->cpu_data()返回的是多维数据(数组) /*-----输出特征-----*/
for (int i = 0; i < 30000; i++)
{
std::cout << *pstart << endl; pstart++;
} return 0;
}

caffe:使用C++来提取任意一张图片的特征的更多相关文章

  1. caffe:使用C++来提取任意一张图片的特征(从内存读取数据)

    0x00 关于使用C++接口来提取特征,caffe官方提供了一个extract_features.cpp的例程,但是这个文件的输入是blob数据,即使输入层使用的是ImageData,也需要在depl ...

  2. Caffe C++API 提取任意一张图片的特征系列二----MemoryData

    介绍一种更加灵活的方法,用MemoryData层输入数据,可以直接用opencv接口读入我们的图片再添加的网络中.  第一个问题:仍然是工程建立问题,提示卷积层或其他层没有注册,解决方法与上一篇博客一 ...

  3. Caffe提取任意层特征并进行可视化

    现在Caffe的Matlab接口 (matcaffe3) 和python接口都非常强大, 可以直接提取任意层的feature map以及parameters, 所以本文仅仅作为参考, 更多最新的信息请 ...

  4. OpenCV提取显示一张图片(或者视频)的R,G,B颜色分量

    使用OpenCV可以提分别提取显示一张图片(或者视频)的R,G,B颜色分量.效果如下. 原图: R: G: B: 示例代码如下,貌似很久以前网上找的的,逻辑很清晰,就是把R,G,B三个分量分开,然后显 ...

  5. caffe的python接口提取resnet101某层特征

    论文的caffemodel转化为tensorflow模型过程中越坑无数,最后索性直接用caffe提特征. caffe提取倒数第二层,pool5的输出,fc1000层的输入,2048维的特征 #codi ...

  6. caffe matlab 借口怎么提取灰度图的 feature ? What happened if I mixed the color images with gray images together for training ?

    1. caffe matlab 接口提供了提取feature的脚本,但是由于中间要对这些图像进行RGB ---> BGR 的变换,卧槽,灰度图没有三通道啊?怎么破?从上午就在纠结怎么会跑着跑着程 ...

  7. 学习笔记之 初试Caffe,Matlab接口提取feature

    Caffe 提供了matlab接口,可以用于提取图像的feature.

  8. caffe提取每一层中的特征,在matlab或python查看

    参考博客: http://blog.csdn.net/abc8730866/article/details/52522843 http://blog.csdn.net/lijiancheng0614/ ...

  9. Machine Learning With Spark学习笔记(提取10万电影数据特征)

    注:原文中的代码是在spark-shell中编写运行的,本人的是在eclipse中编写运行,所以结果输出形式可能会与这本书中的不太一样. 首先将用户数据u.data读入SparkContext中.然后 ...

随机推荐

  1. Dynamic编程

    Dynamic Binding 动态绑定 Binding:解析Type,member,operation的过程. 动态绑定将Binding从编译时延迟到运行时进行. 场景 编译时,程序员知道特定的fu ...

  2. android黑科技系列——Apk的加固(加壳)原理解析和实现

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  3. [原创]Eclipse 安卓开发几个异常的处理办法

    一.代码没有问题,就是报错,重启一下就会好.可以先clean再build; 二.R.Java丢失 网上讲了若干方法,有用android toos的,有clean再build的,我的解决办法是勾选bui ...

  4. MongoDB 博客截图之一

    来源:十天掌握MongoDB之三:学会Find - 学吧网 - 专注于PHP资源分享

  5. windows安装pyspider

    基本环境 python2.7 win7 64bit 问题 Microsoft Visual C++ 10.0 is required Microsoft Visual C++ Compiler for ...

  6. 我的新书《计算机图形学基础(OpenGL版)》

    我的新书<计算机图形学基础(OpenGL版)>今年6月份在清华大学出版社出版了!新书与原在机械工业出版社出的<计算机图形学>相比,主要有以下不同: 1.加重OpenGL的内容, ...

  7. 【转】ORACLE SQL基础—DDL语言 礼记八目 2017-12-23 21:26:21

    原文地址:https://www.toutiao.com/i6502733303550837261/ SQL语言分为:DDL数据定义语言,DML数据操纵语言,DCL是数据库控制语言,TC事务控制语言 ...

  8. javase 异常处理

    1.简述什么是异常.异常的继承体系?  异常就是java代码块在运行时出现的错误,有编译错误和运行错误,  Throwable是所有异常的父类它包含了error和Exception两个子类.  其中e ...

  9. spring boot --部署war到tomcat中

    1.在pom文件中,将默认的jar包打包,改成以war包打包:<!--打包方式--><packaging>war</packaging> 2.将项目在doc命令中执 ...

  10. POJ 1258 Agri-Net( 裸最小生成树 )

    链接:传送门! 题意:一个裸最小生成树,采用Kruskal. /******************************************************************** ...