参考资料:
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");