استفاده از مدل tflite در c++ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

استفاده از مدل tflite در c++

+1 امتیاز
سلام  و عرض احترام خدمت همگی

من برای کلاسیفیکیشن دیتاست دست نوشته mnist مدلی با کراس ساختم و تبدیل به مدل tflite کردم .حالا باید این مدل را در c++ استفاده کنم آیا کسی اینکار را قبلا انجام داده راهنماییم کنه؟
سوال شده خرداد 27, 1401  بوسیله ی Mr.Hadi (امتیاز 21)   1 3

1 پاسخ

+1 امتیاز
 
بهترین پاسخ
test2.cpp

//inference a trained model with a new opencv image by tflite
// Language: cpp
void inference_with_opencv(std::string model_path, std::string image_path){
    //load model
    tflite::FlatBufferModel model = tflite::FlatBufferModel::BuildFromFile(model_path.c_str());
    tflite::ops::builtin::BuiltinOpResolver resolver;
    tflite::InterpreterBuilder builder(model, resolver);
    std::unique_ptr<tflite::Interpreter> interpreter;
    builder(&interpreter);
    interpreter->AllocateTensors();
    //load image
    cv::Mat img = cv::imread(image_path);
    cv::resize(img, img, cv::Size(224, 224));
    cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
    //set input
    Tensor* input_tensor = interpreter->tensor(interpreter->inputs()[0]);
    int input_height = input_tensor->dims->data[1];
    int input_width = input_tensor->dims->data[2];
    int input_channels = input_tensor->dims->data[3];
    int input_size = input_height * input_width * input_channels;
    float* input_data = input_tensor->data.f;
    for (int i = 0; i < input_size; ++i) {
        input_data[i] = 0.0;
    }
    //set input image
    int input_image_offset = 0;
    for (int i = 0; i < input_height; ++i) {
        for (int j = 0; j < input_width; ++j) {
            for (int k = 0; k < input_channels; ++k) {
                int index = i * input_width * input_channels + j * input_channels + k;
                input_data[index] = img.data[input_image_offset++];
            }
        }
    }
    //run inference
    interpreter->Invoke();
    //get output
    Tensor* output_tensor = interpreter->tensor(interpreter->outputs()[0]);
    int output_size = output_tensor->bytes / sizeof(float);
    float* output_data = output_tensor->data.f;
    //print output
    for (int i = 0; i < output_size; ++i) {
        printf("%f\n", output_data[i]);
    }
    //compute softmax
    float* softmax = new float[output_size];
    for (int i = 0; i < output_size; ++i) {
        softmax[i] = exp(output_data[i]) / (exp(output_data[i]) + 1);
    }
    //print softmax
    for (int i = 0; i < output_size; ++i) {
        printf("%f\n", softmax[i]);
    }
    //get top k
    int top_k = 5;
    std::vector<std::pair<float, int>> vec;
    for (int i = 0; i < output_size; ++i) {
        vec.push_back(std::make_pair(softmax[i], i));
    }
    std::sort(vec.begin(), vec.end(), [](const std::pair<float, int>& a, const std::pair<float, int>& b) {
        return a.first > b.first;
    });
    for (int i = 0; i < top_k; ++i) {
        printf("%d: %f\n", vec[i].second, vec[i].first);
    }
    delete[] softmax;
    
}

 

پاسخ داده شده تیر 3, 1401 بوسیله ی copilot (امتیاز 1,549)   1 3 6
انتخاب شد تیر 17, 1401 بوسیله ی Mr.Hadi
...