123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- #include "include/version.h"
- #include "include/model.h"
- #include "include/version.h"
- #include "include/context.h"
- #include "include/errorcode.h"
- #include "include/lite_session.h"
- #include <iostream>
- #include <string>
- #include <cstdio>
- #include "imagenet_label.inc"
- // model size limit: 64 MiB
- const int MAX_MODEL_SIZE = 64 * 1024 * 1024;
- // dataset
- const std::string IMAGE_FILE = "/data/val_data_c/%05d.bin";
- using namespace mindspore;
- using namespace mindspore::lite;
- using namespace mindspore::session;
- void read_image(int idx, void *tensor_buf, size_t size)
- {
- char image[128];
- sprintf(image, IMAGE_FILE.c_str(), idx);
- FILE *fp = fopen(image, "rb");
- fread(tensor_buf, sizeof(char), size, fp);
- fclose(fp);
- }
- void print_tensor(tensor::MSTensor *t)
- {
- float *data_ptr = static_cast<float *>(t->MutableData());
- for (int i = 0; i < t->ElementsNum(); ++i)
- {
- std::cout << data_ptr[i] << ", ";
- if (i % 13 == 12)
- {
- std::cout << std::endl;
- }
- }
- }
- int arg_max(tensor::MSTensor *t)
- {
- float *data_ptr = static_cast<float *>(t->MutableData());
- float max_val = 0.f;
- int max_idx = -1;
- for (int i = 0; i < t->ElementsNum(); ++i)
- {
- if (data_ptr[i] > max_val)
- {
- max_idx = i;
- max_val = data_ptr[i];
- }
- }
- return max_idx;
- }
- int main(int argc, const char *argv[])
- {
- if (argc != 3)
- {
- std::cout << "usage: ./classification your_model.ms image_num" << std::endl;
- return -1;
- }
- std::string version = mindspore::lite::Version();
- std::cout << "version: " << version << std::endl;
- // load model
- FILE *fp = fopen(argv[1], "rb");
- char *model_buf = new char[MAX_MODEL_SIZE];
- size_t model_size = fread(model_buf, sizeof(char), MAX_MODEL_SIZE, fp);
- fclose(fp);
- std::cout << "model: " << argv[1] << ", size: " << model_size << " Bytes" << std::endl;
- Model *model = Model::Import(model_buf, model_size);
- // create context
- Context *context = new (std::nothrow) Context;
- if (context == nullptr)
- {
- std::cerr << "New context failed while running %s", argv[1];
- return RET_ERROR;
- }
- CpuDeviceInfo &cpu_decice_info = context->device_list_[0].device_info_.cpu_device_info_;
- cpu_decice_info.cpu_bind_mode_ = HIGHER_CPU;
- context->thread_num_ = 2;
- // create session1
- LiteSession *session = LiteSession::CreateSession(context);
- delete (context);
- if (session == nullptr)
- {
- std::cerr << "CreateSession failed while running %s", argv[1];
- return RET_ERROR;
- }
- // compile graph
- int ret = session->CompileGraph(model);
- if (ret != RET_OK)
- {
- std::cerr << "CompileGraph failed" << std::endl;
- // session and model need to be released by users manually.
- delete (session);
- delete (model);
- return ret;
- }
- model->Free();
- // alloc input mem
- std::vector<tensor::MSTensor *> inputs = session->GetInputs();
- tensor::MSTensor *input = inputs.front();
- void *input_buf = input->MutableData();
- std::cout << "input tenosr num: " << inputs.size() << std::endl;
- std::cout << "input tensor[0] shape: ";
- for (int i : input->shape())
- {
- std::cout << i << " ";
- }
- std::cout << std::endl;
- // get output
- std::unordered_map<std::string, tensor::MSTensor *> outputs = session->GetOutputs();
- tensor::MSTensor *output = outputs.begin()->second;
- std::cout << "output tenosr num: " << outputs.size() << std::endl;
- std::cout << "output tensor[0] name: " << outputs.begin()->first << ", shape: ";
- void *output_buf = output->MutableData();
- for (int i : output->shape())
- {
- std::cout << i << " ";
- }
- std::cout << std::endl;
- // infer
- std::vector<int> result;
- int IMAGE_NUM = std::atoi(argv[2]);
- std::cout << "inference start" << std::endl;
- for (size_t i = 0; i < IMAGE_NUM; i++)
- {
- read_image(i, input_buf, input->Size());
- int ret = session->RunGraph();
- if (ret != RET_OK)
- {
- std::cerr << "Run graph failed." << std::endl;
- return RET_ERROR;
- }
- //print_tensor(output);
- //std::cout << arg_max(output) << std::endl;
- result.push_back(arg_max(output));
- std::cout << "\r" << i * 100 / IMAGE_NUM << "%, ";
- for (int j = 0; j < i * 80 / IMAGE_NUM; ++j)
- {
- std::cout << '*';
- }
- }
- std::cout << std::endl;
- std::cout << "inference finished" << std::endl;
- int correct = 0;
- for (int i = 0; i < IMAGE_NUM; ++i)
- {
- if (label[i] == result[i] - 1)
- {
- correct++;
- }
- }
- std::cout << "top1 acc: " << correct / (float)IMAGE_NUM << std::endl;
- return 0;
- }
|