深度学习:caffe使用string变量进行加载

参考资料:

https://stackoverflow.com/questions/37159655/set-caffe-net-parameters-via-string/38845573

 

以前的操作方式:

shared_ptr<Net<float> > net_;
string modelString;
string trainedString;


net_.reset(new Net<float>(modelString, TEST));
net_->CopyTrainedLayersFrom(trainedString);

加解密之后,获取的prototxt和caffemodel都是string类型的变量,上面的方式就不合适了

 

方式1:

	//解析prototxt
	caffe::NetParameter _prototxt;
	std::istringstream net_prototxt(prototxt_string);
	google::protobuf::io::IstreamInputStream * prototxt_input = new google::protobuf::io::IstreamInputStream((std::istream *)(&net_prototxt));
	google::protobuf::io::ZeroCopyInputStream* prototxt_instream = prototxt_input;
	google::protobuf::TextFormat::Parse(prototxt_instream, &_prototxt);
	_prototxt.mutable_state()->set_phase(caffe::TEST);

	//解析caffemodel
	caffe::NetParameter _model;
	std::istringstream net_model(model_string);
	google::protobuf::io::IstreamInputStream * model_input = new google::protobuf::io::IstreamInputStream((std::istream *)(&net_model));
	google::protobuf::io::CodedInputStream* coded_input_model = new google::protobuf::io::CodedInputStream(model_input);
	coded_input_model->SetTotalBytesLimit(INT_MAX, 536870912);
	_model.ParseFromCodedStream(coded_input_model);


    net_.reset(new Net<float>(_prototxt));
    net_->CopyTrainedLayersFrom(_model);

方式2:

	//解析prototxt
	caffe::NetParameter _prototxt;
	std::istringstream net_prototxt(prototxt_string);
	google::protobuf::io::IstreamInputStream * prototxt_input = new google::protobuf::io::IstreamInputStream((std::istream *)(&net_prototxt));
	google::protobuf::io::ZeroCopyInputStream* prototxt_instream = prototxt_input;
	google::protobuf::TextFormat::Parse(prototxt_instream, &_prototxt);
	_prototxt.mutable_state()->set_phase(caffe::TEST);

	//解析caffemodel
	caffe::NetParameter _model;
	google::protobuf::TextFormat::ParseFromString(model_string, &_model);


    net_.reset(new Net<float>(_prototxt));
    net_->CopyTrainedLayersFrom(_model);

更新**2020/07/23**:项目需要把原先加密后的模型,解密并存储,方便后期的RT使用

使用下面的两个函数接口,在解密后获取string,然后就存储了

WriteProtoToTextFile(_prototxt, save_name + ".prototxt");

WriteProtoToBinaryFile(_model, save_name + ".caffemodel");

	//解析prototxt
	caffe::NetParameter _prototxt;
	std::istringstream net_prototxt(prototxt_string);
	google::protobuf::io::IstreamInputStream * prototxt_input = new google::protobuf::io::IstreamInputStream((std::istream *)(&net_prototxt));
	google::protobuf::io::ZeroCopyInputStream* prototxt_instream = prototxt_input;
	google::protobuf::TextFormat::Parse(prototxt_instream, &_prototxt);
	caffe::UpgradeNetAsNeeded(encryption_model, &_prototxt);

	_prototxt.mutable_state()->set_phase(caffe::TEST);

	WriteProtoToTextFile(_prototxt, save_name + ".prototxt");

	//解析caffemodel
	caffe::NetParameter _model;
	std::istringstream net_model(model_string);
	google::protobuf::io::IstreamInputStream * model_input = new google::protobuf::io::IstreamInputStream((std::istream *)(&net_model));
	google::protobuf::io::CodedInputStream* coded_input_model = new google::protobuf::io::CodedInputStream(model_input);
	coded_input_model->SetTotalBytesLimit(INT_MAX, 536870912);
	_model.ParseFromCodedStream(coded_input_model);

	WriteProtoToBinaryFile(_model, save_name + ".caffemodel");

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微风❤水墨

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值