mindspore\lite\examples\quick_start_cpp/main方法注释2
一、代码路径
链接在这 https://forgeplus.trustie.net/projects/Huawei_Technology/mindspore/tree/master/mindspore/lite/examples/quick_start_cpp/main.cc
代码块三
template <typename T, typename Distribution>//模板函数声明
void GenerateRandomData(int size, void *data, Distribution distribution) {//定义一个模板函数
std::mt19937 random_engine;//生成随机数
int elements_num = size / sizeof(T);//定义元素数量
(void)std::generate_n(static_cast<T *>(data)elements_num,
[&]() { return static_cast<T>(distribution(random_engine)); });
}
int GenerateInputDataWithRandom//定义随机生成输入数据方法(std::vector<mindspore::tensor::MSTensor *> inputs) {
for (auto tensor : inputs) {//对于输入的元素做遍历
auto input_data = tensor->MutableData();//储存随机数据
if (input_data == nullptr) {//判断随机数据是否为null
std::cerr << "MallocData for inTensor failed." << std::endl;//输出inTensor 的 MallocData 失败
return -1;
}
GenerateRandomData<float>(tensor->Size(), input_data, std::uniform_real_distribution<float>(0.1f, 1.0f));
}
return mindspore::lite::RET_OK;//返回lite正确
}
int Run(mindspore::session::LiteSession *session) {//定义Run方法
auto inputs = session->GetInputs();//从Getinpus方法中取出session
// Generate random data as input data.
auto ret = GenerateInputDataWithRandom(inputs);//随机数据作为输入数据
if (ret != mindspore::lite::RET_OK) {//判断ret是否等于初始ret
std::cerr << "Generate Random Input Data failed." << std::endl;//输出随机生成错误
return ret;返回ret
}
// Run Inference.
ret = session->RunGraph();//
if (ret != mindspore::lite::RET_OK) {//判断ret是否等于
std::cerr << "Inference error " << ret << std::endl;//输出推理错误
return ret;
}
// Get Output Tensor Data.
auto out_tensors = session->GetOutputs();//定义输出张量
for (auto tensor : out_tensors) {//对所有的张量进行遍历
std::cout << "tensor name is:" << tensor.first << " //tensor size is:" << tensor.second->Size() << " tensor elements num is:" << tensor.second->ElementsNum() << std::endl;//输出张量的数据
auto out_data = reinterpret_cast<float *>(tensor.second->MutableData());//重新定义数据
std::cout << "output data is:";//输出数据
for (int i = 0; i < tensor.second->ElementsNum() && i <= 50; i++) {
std::cout << out_data[i] << " ";//遍历输出数据
}
std::cout << std::endl;
}
return mindspore::lite::RET_OK;
}
mindspore::session::LiteSession *Compile(mindspore::lite::Model *model) {
// 创建和初始化上下文
auto context =std::make_shared<mindspore::lite::Context>();//创建上下文
if (context == nullptr) {//判断context是否为null
std::cerr << "New context failed while." << std::endl;//输出创建失败
return nullptr;
}
// Create the session.//创建session链接
mindspore::session::LiteSession *session = mindspore::session::LiteSession::CreateSession(context.get());
if (session == nullptr) {//判断sesson是否创建成功
std::cerr << "CreateSession failed while running." << std::endl;//输出错误信息
return nullptr;
}
// Compile graph.
auto ret = session->CompileGraph(model);
if (ret != mindspore::lite::RET_OK) {//判断ret是否正确
delete session;
std::cerr << "Compile failed while running." << std::endl;//输出编译失败
return nullptr;
}
// Note: when use model->Free(), the model can not be compiled again.
if (model != nullptr) {//当模型为null
model->Free();//使模型无法编译
}
return session;
}
代码块4
int CompileAndRun(int argc, const char **argv) {//编译运行方法
if (argc < 2) {//当arg<2时
std::cerr << "Usage: ./mindspore_quick_start_cpp ../model/mobilenetv2.ms\n";//输出该数据
return -1;
}
// Read model file.
auto model_path = RealPath(argv[1]);//读取模型文件
if (model_path.empty()) {//如果该模型路径为空
std::cerr << "model path " << argv[1] << " is invalid.";
return -1;//输出该路径为无效值
}
size_t size = 0;
char *model_buf = ReadFile(model_path.c_str(), &size);
//储存文件的路径和大小
if (model_buf == nullptr) {//判断是否为空
std::cerr << "Read model file failed." << std::endl;
return -1;//输出读取文件错误
}
// Load the .ms model.
auto model = mindspore::lite::Model::Import(model_buf, size);//导入model
delete[](model_buf);//删除缓冲流
if (model == nullptr) {//如果mode是空值
std::cerr << "Import model file failed." << std::endl;
return -1;//输出错误
}
// Compile MindSpore Lite model.
auto session = Compile(model);//运行model
if (session == nullptr) {//判断是否成功
delete model;//从内存中删除model
std::cerr << "Create session failed." << std::endl;//输出创建session链接失败
return -1;
}
// Run inference.
auto ret = Run(session);//运行链接
if (ret != mindspore::lite::RET_OK) {//当ret不正确时
delete model;//删除model
delete session;//删除session
std::cerr << "MindSpore Lite run failed." << std::endl;
return -1;//输出lite运行失败
}
// Delete model buffer.
delete model;//删除model
// Delete session buffer.
delete session;//删除session链接
return mindspore::lite::RET_OK;
}
这个文件主要使用于快速启动,以及一系列的启动错误处理