encoder:
拥有自己的加密解密过程,下面只是简单实例,如果实际使用应该使用更加复杂的方式进行。
void encoder_conv_model(std::string prototxt, std::string &model_path, std::vector<float> & param) {
caffe::NetParameter netparam;
caffe::ReadNetParamsFromBinaryFileOrDie(model_path, &netparam);
int layer_size = netparam.layer_size();
std::cout << "layer_size = " << layer_size << std::endl;
caffe::LayerParameter* layerparam = nullptr;
for (size_t i = 0; i < 2; i++)
{
layerparam = netparam.mutable_layer(i);
std::cout << "layer type:" << layerparam->type() << std::endl;
int n = layerparam->mutable_blobs()->size();
for (size_t j = 0; j < n; j++)
{
const caffe::BlobProto& blob = layerparam->blobs(j);
printf("%s layer: %s weight(%d)", layerparam->type().c_str(), layerparam->name().c_str(), blob.data_size());
std::cout << blob.data()[0]<<std::endl;
}
}
string model_filename = "model\\encode_test.caffemodel";
//加密-----------------------------------------------------
for (size_t i = 0; i < layer_size; i++)
{
layerparam = netparam.mutable_layer(i);
std::cout << "layer type:" << layerparam->type() << std::endl;
int n = layerparam->mutable_blobs()->size();
//if (layerparam->type() == "Convolution") {
for (size_t j = 0; j < n; j++)
{
const caffe::BlobProto& blob = layerparam->blobs(j);
printf("%s layer: %s weight(%d)", layerparam->type().c_str(), layerparam->name().c_str(), blob.data_size());
caffe::BlobProto * blobs = layerparam->mutable_blobs(j);
google::protobuf::RepeatedField< float > * data = blobs->mutable_data();
data[0][0] = blob.data()[0] - 3.5f;
std::cout << blob.data()[0] << std::endl;
}
//}
}
caffe::WriteProtoToBinaryFile(netparam, model_filename);
//加密-----------------------------------------------------
//google::protobuf::ShutdownProtobufLibrary();
}
decoder:
int CommonCaffe::load_model(string model_definition, string weights, int gpu_id) {
SetDevice(gpu_id);
auto load_net= new Net<float>(model_definition, Phase::TEST);//boost::make_shared<Net<float> >(model_definition, Phase::TEST);
caffe::NetParameter netparam;
caffe::ReadNetParamsFromBinaryFileOrDie(weights, &netparam);
//解密---------------------------------------------------------------------
int layer_size = netparam.layer_size();
std::cout << "layer_size = " << layer_size << std::endl;
caffe::LayerParameter* layerparam = nullptr;
for (size_t i = 0; i < layer_size; i++)
{
layerparam = netparam.mutable_layer(i);
std::cout << "layer type:" << layerparam->type() << std::endl;
int n = layerparam->mutable_blobs()->size();
for (size_t j = 0; j < n; j++)
{
const caffe::BlobProto& blob = layerparam->blobs(j);
printf("%s layer: %s weight(%d)", layerparam->type().c_str(), layerparam->name().c_str(), blob.data_size());
caffe::BlobProto * blobs = layerparam->mutable_blobs(j);
google::protobuf::RepeatedField< float > * data = blobs->mutable_data();
data[0][0] = blob.data()[0] + 3.5f;
std::cout << blob.data()[0] << std::endl;
}
}
load_net->CopyTrainedLayersFrom(netparam);
}
#ifndef _SECURITY_H_
#define _SECURITY_H_
//#include <iostream>
//#include <fstream>
//#include <string>
//#include <caffe/proto/caffe.pb.h>
//#include <caffe/caffe.hpp>
//#include <caffe/util/io.hpp>
//#include <google/protobuf/io/coded_stream.h>
//#include <google/protobuf/io/zero_copy_stream_impl.h>
//using google::protobuf::io::FileInputStream;
//using google::protobuf::io::FileOutputStream;
//using google::protobuf::io::ZeroCopyInputStream;
//using google::protobuf::io::CodedInputStream;
namespace security {
const int change_size = 20;
const float asisc[change_size] = {3.35f, 3.21f, 0.92f, -2.48f, -1.96f, -3.71f, 5.64f, 8.55f, 6.97f, -7.83f
-5.67f, -4.96f, -1.54f, 2.56f, 3.68f, 2.64f, -2.45f, 5.63f, 2.72f, 3.95f};
int getParameterFormCaffeModel(std::string &model_path, std::vector<float> & param)
{
caffe::NetParameter netparam;
std::ifstream caffemodel(model_path, std::ifstream::in | std::ifstream::binary);
if (&caffemodel == NULL) {
std::cout << "The ptr of caffemodel is NULL" << std::endl;
return -1;
}
if (!caffemodel.is_open()) {
std::cout << "Can not open model" << std::endl;
return -1;
}
bool flag = netparam.ParseFromIstream(&caffemodel); //该方法有大小限制,注意
int layer_size = netparam.layer_size();
std::cout << "layer_size = " << layer_size << std::endl;
caffe::LayerParameter* layerparam = nullptr;
for (size_t i = 0; i < layer_size; i++)
{
layerparam = netparam.mutable_layer(i);
std::cout << "layer type:" << layerparam->type() << std::endl;
int n = layerparam->mutable_blobs()->size();
if (n)
{
const caffe::BlobProto& blob = layerparam->blobs(0);
printf("%s layer: %s weight(%d)", layerparam->type().c_str(), layerparam->name().c_str(), blob.data_size());
for (size_t j = 0; j < blob.data_size(); j++)
{
float weight = blob.data()[j];
std::cout << "weight is:" << weight << std::endl;
param.push_back(weight);
}
const caffe::BlobProto& blob_b = layerparam->blobs(1);
printf("%s layer: %s weight(%d)", layerparam->type().c_str(), layerparam->name().c_str(), blob_b.data_size());
for (size_t j = 0; j < blob_b.data_size(); j++)
{
float bias = blob_b.data()[j];
std::cout << "bias is:" << bias << std::endl;
param.push_back(bias);
}
}
}
caffemodel.close();
google::protobuf::ShutdownProtobufLibrary();
return 0;
}
caffe::NetParameter encoder_model(std::string model_file, std::string save_model_file) {
caffe::NetParameter netparam;
caffe::ReadNetParamsFromBinaryFileOrDie(model_file, &netparam);
int layer_size = netparam.layer_size();
std::cout << "layer_size = " << layer_size << std::endl;
caffe::LayerParameter* layerparam = nullptr;
/*for (size_t i = 0; i < 2; i++)
{
layerparam = netparam.mutable_layer(i);
std::cout << "layer type:" << layerparam->type() << std::endl;
int n = layerparam->mutable_blobs()->size();
for (size_t j = 0; j < n; j++)
{
const caffe::BlobProto& blob = layerparam->blobs(j);
printf("%s layer: %s weight(%d)", layerparam->type().c_str(), layerparam->name().c_str(), blob.data_size());
std::cout << blob.data()[0] << std::endl;
}
}*/
//加密-----------------------------------------------------
for (size_t i = 0; i < layer_size; i++)
{
layerparam = netparam.mutable_layer(i);
std::cout << "layer type:" << layerparam->type() << std::endl;
int n = layerparam->mutable_blobs()->size();
for (size_t j = 0; j < n; j++)
{
const caffe::BlobProto& blob = layerparam->blobs(j);
//printf("%s layer: %s weight(%d)", layerparam->type().c_str(), layerparam->name().c_str(), blob.data_size());
caffe::BlobProto * blobs = layerparam->mutable_blobs(j);
google::protobuf::RepeatedField< float > * data = blobs->mutable_data();
if (data[0].size() > change_size) {
for (size_t k = 0; k < change_size; k++)
{
data[0][k] = blob.data()[k] - asisc[k];
}
}
else {
data[0][0] = blob.data()[0] - asisc[0];
}
//std::cout << blob.data()[0] << std::endl;
}
}
caffe::WriteProtoToBinaryFile(netparam, save_model_file);
//加密-----------------------------------------------------
return netparam;
}
void decoder_model(caffe::NetParameter &netparam, std::string weights) {
//caffe::NetParameter netparam;
caffe::ReadNetParamsFromBinaryFileOrDie(weights, &netparam);
//解密---------------------------------------------------------------------
int layer_size = netparam.layer_size();
//std::cout << "layer_size = " << layer_size << std::endl;
caffe::LayerParameter* layerparam = nullptr;
for (size_t i = 0; i < layer_size; i++)
{
layerparam = netparam.mutable_layer(i);
//std::cout << "layer type:" << layerparam->type() << std::endl;
int n = layerparam->mutable_blobs()->size();
for (size_t j = 0; j < n; j++)
{
const caffe::BlobProto& blob = layerparam->blobs(j);
//printf("%s layer: %s weight(%d)", layerparam->type().c_str(), layerparam->name().c_str(), blob.data_size());
caffe::BlobProto * blobs = layerparam->mutable_blobs(j);
google::protobuf::RepeatedField< float > * data = blobs->mutable_data();
if (data[0].size() > change_size) {
for (size_t k = 0; k < change_size; k++)
{
data[0][k] = blob.data()[k] + asisc[k];
}
}
else {
data[0][0] = blob.data()[0] + asisc[0];
}
//data[0][0] = blob.data()[0] + 3.5f;
//std::cout << blob.data()[0] << std::endl;
}
}
//解密---------------------------------------------------------------------
}
}
#endif // _UTIL_H_