caffe:使用C++来提取任意一张图片的特征
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++来提取任意一张图片的特征的更多相关文章
- caffe:使用C++来提取任意一张图片的特征(从内存读取数据)
0x00 关于使用C++接口来提取特征,caffe官方提供了一个extract_features.cpp的例程,但是这个文件的输入是blob数据,即使输入层使用的是ImageData,也需要在depl ...
- Caffe C++API 提取任意一张图片的特征系列二----MemoryData
介绍一种更加灵活的方法,用MemoryData层输入数据,可以直接用opencv接口读入我们的图片再添加的网络中. 第一个问题:仍然是工程建立问题,提示卷积层或其他层没有注册,解决方法与上一篇博客一 ...
- Caffe提取任意层特征并进行可视化
现在Caffe的Matlab接口 (matcaffe3) 和python接口都非常强大, 可以直接提取任意层的feature map以及parameters, 所以本文仅仅作为参考, 更多最新的信息请 ...
- OpenCV提取显示一张图片(或者视频)的R,G,B颜色分量
使用OpenCV可以提分别提取显示一张图片(或者视频)的R,G,B颜色分量.效果如下. 原图: R: G: B: 示例代码如下,貌似很久以前网上找的的,逻辑很清晰,就是把R,G,B三个分量分开,然后显 ...
- caffe的python接口提取resnet101某层特征
论文的caffemodel转化为tensorflow模型过程中越坑无数,最后索性直接用caffe提特征. caffe提取倒数第二层,pool5的输出,fc1000层的输入,2048维的特征 #codi ...
- caffe matlab 借口怎么提取灰度图的 feature ? What happened if I mixed the color images with gray images together for training ?
1. caffe matlab 接口提供了提取feature的脚本,但是由于中间要对这些图像进行RGB ---> BGR 的变换,卧槽,灰度图没有三通道啊?怎么破?从上午就在纠结怎么会跑着跑着程 ...
- 学习笔记之 初试Caffe,Matlab接口提取feature
Caffe 提供了matlab接口,可以用于提取图像的feature.
- caffe提取每一层中的特征,在matlab或python查看
参考博客: http://blog.csdn.net/abc8730866/article/details/52522843 http://blog.csdn.net/lijiancheng0614/ ...
- Machine Learning With Spark学习笔记(提取10万电影数据特征)
注:原文中的代码是在spark-shell中编写运行的,本人的是在eclipse中编写运行,所以结果输出形式可能会与这本书中的不太一样. 首先将用户数据u.data读入SparkContext中.然后 ...
随机推荐
- C-C语言概述
1.数据+算法=程序. 2.C语言程序是由一个或多个函数组成的,函数是由语句组成的,语句是由关键字,标识符,运算符,数据组成的:语句可分为:声明语句,赋值语句,控制语句,函数语句,空语句. 3.#in ...
- Android + Eclipse + NDK + cygwin配制
以前做NDK开发时留下来的笔记,希望对后继开发人员有所帮助,在开放给大家使用,有不对的地方请留,扔砖头都可以的. 为了方便在Win32下开发android C++ 程序,我们作了如下配制:1.Andr ...
- [hihocoder][Offer收割]编程练习赛45
互补二元组 Xi + Xj = Yi + Yj等价于Xi - Yi + Xj - Yj = 0 ,对每个二元组计算其x与y的差,每次加上其相反数的个数. #pragma comment(linker, ...
- android 自定义空间 组合控件中 TextView 不支持drawableLeft属性
android 自定义空间 组合控件中 TextView 不支持drawableLeft属性.会报错Caused by: android.view.InflateException: Binary X ...
- 如何上传SNAPSHOT类型的JAR文件到nexus中
在要上传的文件的目录中执行以下命令即可: mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.5.4 ...
- 读书笔记「Python编程:从入门到实践」_2.变量和简单数据类型
做了大半年RPA了,用的工具是Kapow. 工作没有那么忙,不想就这么荒废着,想学点什么.就Python吧. 为期三个月,希望能坚持下来. 2.1 变量的命名和使用 变量名只能包含字母.数字和下划线. ...
- js prototype 原型
//https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E7%9A%84%E4% ...
- Ubuntu14.04 Anaconda
我虚拟机Ubuntu14.04上的Python已经存在了两个版本,一个是python 2.7,一个是Python 3.4.想在它上面安装Anaconda,但又有所顾虑.我先想到的是,先卸载Ubuntu ...
- python对大文件的处理
多线程框架中采取queue来实现线程间资源的互斥. 在文件过大的情况下,如果都读入内存的话,占用内存就太多了. 这里手动实现了一个多线程调用文件迭代器来使用f.next() # -*- coding: ...
- Spring管理流程部署——Activiti
pom.xml <!-- activit jar 包 --> <dependency> <groupId>org.activiti</groupId> ...