Caffe模型读取
caffe模型最终保存使用过的protobuf形式,将一个已经训练好的caffe模型读取出来,可以参考如下:
1,包含的头文件:
#include <google/protobuf/io/coded_stream.h>
#include <google/protobuf/io/zero_copy_stream_impl.h>
#include <google/protobuf/text_format.h> #include "caffe/proto/caffe.pb.cc" //在caffe src/caffe、proto里面,是编译后自动生成的,其中包括(caffe.pb.cc caffe.pb.d caffe.pb.h caffe.pb.o.warnings.txt)
2,读取网络Message:
bool loadCaffeNet(const std::string& model_list, Message* proto){ //
using google::protobuf::io::FileInputStream;
using google::protobuf::io::ZeroCopyInputStream;
using google::protobuf::io::CodedInputStream;
//Message * proto;
std::vector<std::string> model_names;
boost::split(model_names, model_list, boost::is_any_of(",") );
bool success = false;
for (int i = 0; i < model_names.size(); ++i) {
std::cout<< "Finetuning from " << model_names[i];
const char* filename = model_names[i].c_str();
int fd = open(filename, O_RDONLY);
if( fd < 0 ){
std::cout << "File not found: " << fd;
return -1;
}
ZeroCopyInputStream* raw_input = new FileInputStream(fd);
CodedInputStream* coded_input = new CodedInputStream(raw_input);
coded_input->SetTotalBytesLimit(INT_MAX, 536870912);
success = proto->ParseFromCodedStream(coded_input);
delete coded_input;
delete raw_input;
close(fd);
return success;
}
return success;
}
3,参考caffe/proto/caffe.pb.cc 文件,获取对应的参数
例如读取文件后:
std::string trained_filename = "lenet_iter_10000.caffemodel";
caffe::NetParameter net_protobuf;
if(loadCaffeNet(trained_filename, &net_protobuf)){
std::cout<<"load net param success"<<std::endl;
}else{
std::cout<<"load net param failed"<<std::endl;
}
获取网络层数:
int num_source_layers = net_protobuf.layer_size();
for(int i=0; i<num_source_layers; ++i){
caffe::LayerParameter layer_param = net_protobuf.layer(i);
std::cout << layer_param.name() << std::endl;
std::cout << layer_param.type() << std::endl;
int blobsize = layer_param.blobs_size();
std::cout << "blobs_size: "<<blobsize << std::endl;
for(int j=0; j<blobsize; j++){
int dataSize = layer_param.blobs(j).data_size();
if(j==0){
std::cout << " weight data_size: "<<dataSize << std::endl;
int ind_weight = dataSize;
weight = (float*)malloc(ind_weight*sizeof(float));
for(int index=0; index<dataSize; index++){
weight[index] = layer_param.blobs(j).data(index);
}
std::cout<<" Convolution->:"<<std::endl;
std::cout<<" layer_param.blobs weight_n "<<layer_param.blobs(0).shape().dim(0)<<std::endl; //n
std::cout<<" layer_param.blobs weight_c "<<layer_param.blobs(0).shape().dim(1)<<std::endl; //c
std::cout<<" layer_param.blobs weight_h "<<layer_param.blobs(0).shape().dim(2)<<std::endl; //h
std::cout<<" layer_param.blobs weight_w "<<layer_param.blobs(0).shape().dim(3)<<std::endl; //w
}
else if(j==1){
std::cout << " bias data_size: "<<dataSize << std::endl;
int ind_bias = dataSize;
bias = (float*)malloc(ind_bias*sizeof(float));
for(int index=0; index<dataSize; index++){
bias[index] = layer_param.blobs(j).data(index);
} } }
}
以上仅仅是部分代码,需要注意调试!
其中caffe.pb.cc 和caffe.pb.hpp 文件是基于caffe.proto文件生成的。执行过程为:protoc caffe.proto --cpp_out=. ;将caffe.proto文件,基于目前protobuf的版本生成对应的版本的.cc 和 .hpp文件。
Caffe模型读取的更多相关文章
- (原)linux下caffe模型转tensorflow模型
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/7419352.html 参考网址: https://github.com/ethereon/caffe- ...
- 使用caffe模型测试图片(python接口)
1.加载相关模块 1.1 加载numpy import numpy as np 1.2 加载caffe 有两种方法. 方法一(静态导入): 找到当前环境使用的python的site-packages目 ...
- TensorFlow模型转为caffe模型
最近由于要将训练好的模型移植到硬件上,因此需要将TensorFlow转为caffe模型. caffe模型需要两个文件,一个是定义网络结构的prototxt,一个是存储了参数的caffemodel文件. ...
- c++ 和 matlab 下的caffe模型输入差异
在向一个caffe模型传递输入数据的时候,要注意以下两点: 1. opencv中Mat数据在内存中的存放方式是按行存储,matlab中图像在内存中的存放方式是按列存储. 2. opencv中Mat数据 ...
- 机器学习进阶-目标追踪-SSD多进程执行 1.cv2.dnn.readnetFromCaffe(用于读取已经训练好的caffe模型) 2.delib.correlation_tracker(生成追踪器) 5.cv2.writer(将图片写入视频中) 6.cv2.dnn.blobFromImage(图片归一化) 10.multiprocessing.process(生成进程)
1. cv2.dnn.readNetFromCaffe(prototxt, model) 用于进行SSD网络的caffe框架的加载 参数说明:prototxt表示caffe网络的结构文本,model ...
- DL开源框架Caffe | 模型微调 (finetune)的场景、问题、技巧以及解决方案
转自:http://blog.csdn.net/u010402786/article/details/70141261 前言 什么是模型的微调? 使用别人训练好的网络模型进行训练,前提是必须和别人 ...
- caffe数据读取
caffe的数据读取分为lmdb和 待清理,包括fast 这个一系列是怎么转换成lmdb数据的
- caffe模型各层数据和参数可视化
先用caffe对cifar10进行训练,将训练的结果模型进行保存,得到一个caffemodel,然后从测试图片中选出一张进行测试,并进行可视化. In [1]: #加载必要的库 import nump ...
- caffe模型的一些解释~
转自:https://blog.csdn.net/wjmishuai/article/details/50890214 刚开始摸caffe,找了个比较清楚的模型. 原始数据是28* input: &q ...
随机推荐
- [Python爬虫] 之二十三:Selenium +phantomjs 利用 pyquery抓取智能电视网数据
一.介绍 本例子用Selenium +phantomjs爬取智能电视网(http://news.znds.com/article/news/)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字 ...
- float:center???
老规矩,先上图(请忽略图中文字^V^): 乍一看感觉是对中间的图片使用了float:center;可是细致一想float属性是没有center这个值的. 那是怎么实现的呢?我一步一步拆给大家看. 1. ...
- Guice 学习(五)多接口的实现( Many Interface Implementation)
1.接口 /* * Creation : 2015年6月30日 */ package com.guice.InterfaceManyImpl; public interface Service { p ...
- hdoj-1213-How Many Tables【并查集】
How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- How to get the url of a page in OpenERP?
How to get the url of a page in OpenERP? User is using OpenERP. I have a button on one web page. The ...
- T420s成功加装固态硬盘(SSD)
目的 为了提升系统和经常使用工具的启动速度,ThinkPad T420s光驱位加一块固态硬盘. 操作步骤 购买:没做太多对照了解,初步计划是安装在光驱位,直接JD上买了SanDisk的128G和推荐的 ...
- UnrealEngine4.5 BluePrint初始化中遇到编译警告的解决办法
今天遇到一个问题,如下图: 假如你在一个BP的初始化脚本里用了"Get Player Character",编译BP时候就会遇到上述警告(Warning Function ' Ge ...
- KINavigationController使用演示例子
代码地址如下:http://www.demodashi.com/demo/12905.html 运行效果 实现思路 创建pan手势,添加到页面中,监听手势的动作.重写push的方法,在push之前截图 ...
- Jenkins集成Docker实现镜像构建和线上发布
原文地址:http://www.cnblogs.com/keithtt/p/6410229.html 大概过程如下图: 由于需要用到docker打包镜像,jenkins宿主机上需要安装docker,原 ...
- Centos下安装JDK、Maven和Git
原文地址:https://github.com/eacdy/spring-cloud-book/blob/master/3%20%E4%BD%BF%E7%94%A8Docker%E6%9E%84%E5 ...