数据层我们可以理解成数据库,只不过对于区块链来讲,这个数据库是不可篡改的、分布式的数据库,也就是我们所谓的“分布式账本”在数据层上,也就是在这个“分布式账本”上,存放着区块链上的数据信息,封装着区块的块链式结构、非对称加密技术、哈希算法等技术手段,来保证数据在全网公开的情况下的安全性问题。
区块链最常见的数据结构当然就是单链式结构,像一条铁链一样,一个节点只有一个前序节点和一个后续节点。
区块链中的链式结构是实现数据存储、验证和共享的关键。通过顺序排列的区块,每个区块又通过哈希值链接到前一个区块,形成了一个不可篡改的链式结构。这种链式结构保证了交易的顺序和连贯性,数据的安全性和完整性,并提供了可追溯性和共识机制。
{"format":"RGB",
"mean":[127.5,127.5,127.5],
"normal":[0.00784314,0.00784314,0.00784314],
"width":224,
"height":224,
"path":"path/to/images/",
"used_image_num":500,
"feature_quantize_method":"KL",
"weight_quantize_method":"MAX_ABS"
}
Calibration::Calibration(MNN::NetTmodel,const uint8_tmodelBuffer,const int bufferSize,const std::string&configPath)
:_originaleModel(model){
//when the format of input image is RGB/BGR,channels equal to 3,GRAY is 1
int channles=3;
//解析量化json配置文件
rapidjson::Document document;
{
std::ifstream fileNames(configPath.c_str());
std::ostringstream output;
output<<fileNames.rdbuf();
auto outputStr=output.str();
document.Parse(outputStr.c_str());
if(document.HasParseError()){
MNN_ERROR("Invalid jsonn");
return;
}
}
auto picObj=document.GetObject();
ImageProcess::Config config;
config.filterType=BILINEAR;
config.destFormat=BGR;
{
if(picObj.HasMember("format")){
auto format=picObj["format"].GetString();
static std::map<std::string,ImageFormat>formatMap{ {"BGR",BGR},{"RGB",RGB},{"GRAY",GRAY},{"RGBA",RGBA},{"BGRA",BGRA}};
if(formatMap.find(format)!=formatMap.end()){
config.destFormat=formatMap.find(format)->second;
}
}
}
switch(config.destFormat){
case GRAY:
channles=1;
break;
case RGB:
case BGR:
channles=3;
break;
case RGBA:
case BGRA:
channles=4;
break;
default:
break;
}
//根据配置文件中的参数设置config
config.sourceFormat=RGBA;
std::string imagePath;
_imageNum=0;
{
if(picObj.HasMember("mean")){
auto mean=picObj["mean"].GetArray();
int cur=0;
for(auto iter=mean.begin();iter!=mean.end();iter++){
config.mean[cur++]=iter->GetFloat();
}
}
if(picObj.HasMember("normal")){
auto normal=picObj["normal"].GetArray();
int cur=0;
for(auto iter=normal.begin();iter!=normal.end();iter++){
config.normal[cur++]=iter->GetFloat();
}