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 ...
随机推荐
- webpack配置:图片处理、css分离和路径问题
一.CSS中的图片处理: 1.首先在网上随便找一张图片,在src下新建images文件夹,将图片放在文件夹内 2.在index.html中写入代码:<div id="pic" ...
- python抓取日本网站上iphone5的价格
抓取日本网站上iphone5的价格,比国内便宜好多汇率换算是在中国银行的网站上取得 #-*- coding:utf-8 -*- import requests import time from bs4 ...
- 报错:numRecords must not be negative
报错的原因:删除已经使用过的kafka topic,然后新建同名topic 解决方法:把topic名字换一下 (有其他更好的解决方法,可以不修改topic名)
- Kafka 简单实验一(安装Kafka)
Apache Kafka - 安装步骤 步骤1 - Java安装 希望您现在已经在您的计算机上安装了Java,因此您只需使用以下命令进行验证. $ java -version 如果您的计算机上成功安装 ...
- EffectiveJava(25)泛型和数组的使用取舍及规范
泛型和数组 泛型:1.泛型是不可变的.对于任意两个不同类型Type1,type2;List既不是List的子类型,也不是List的超类型 2.泛型是通过擦除来实现的.故泛型只在编译时强化它们的信息,并 ...
- Drawing-Order-Of-meshes-and-sprites
Sprite 和 Mesh Render 共存 [CanEditMultipleObjects] [CustomEditor(typeof(MeshRenderer))] public class M ...
- Objective-C学习笔记(二十一)——函数的返回值与參数类型
我们在之前的博客中涉及到的函数都没有參数,同一时候返回值也为void,即不须要返回值. 可是在以后的开发中.函数返回值和參数是必须涉及到的. 所以如今我们来讨论这个问题.我们还是以People类为例. ...
- lombok使用总结
前提 这篇文章主要介绍lombok的使用,至于lombok的源码和原理暂不探究,可以看上一篇文章插件化注解处理API去了解lombok的基本原理.参考资料: lombok官网 lombok官方教程-l ...
- apktool反编译工具使用详解
文章转自: http://zhangyan1158.blog.51cto.com/2487362/683234 一.APKTOOL使用环境配置 1.安装JAVA并设置环境变量. 下载安装都很简单,关键 ...
- Java 遍历一个对象的属性 将非空属性赋值给另一个对象
//将origin属性注入到destination中 public <T> void mergeObject(T origin, T destination) { if (origin = ...