如何在C++中正确获取TFLite口罩检测模型的推理输出结果
问题原因及修复方案
存在的核心错误
- 预处理顺序错误:和Python实现逻辑不一致,你在C++中先将BGR三通道图转32位浮点数,再转灰度,正确顺序应为先转灰度,再转32位浮点数,错误的顺序会导致像素值完全偏离预期。
- 未将图像数据拷贝到TFLite输入缓冲区:代码中
input = inputImg.ptr<float>(0);只是修改了指针的指向,并没有把图像数据复制到TFLite分配的输入张量内存中,推理时读取的是缓冲区的垃圾值,自然输出异常。 - 输出张量索引硬编码错误:不要手动写149作为输出索引,和Python逻辑一致,直接取第0个输出即可,硬编码的索引大概率对应错误的张量位置。
- (可选)检查像素归一化:如果你的模型训练时将输入像素缩放到了0~1范围,还需要将灰度值除以255.0,和训练逻辑对齐。
修复后的核心代码片段
// 修正后的预处理逻辑 cv::Mat img = cv::imread("D:\\nomask.png"); cv::Mat img_gray; // 先转灰度 cv::cvtColor(img, img_gray, cv::COLOR_BGR2GRAY); // 再转32位浮点数 cv::Mat inputImg; img_gray.convertTo(inputImg, CV_32FC1); // 缩放至32x32 cv::resize(inputImg, inputImg, cv::Size(32, 32)); // 若模型需要归一化到0~1,取消下面这行注释 // inputImg = inputImg / 255.0; // ... 中间模型加载、解释器初始化逻辑保持不变 ... // 修正输入赋值逻辑:把图像数据拷贝到TFLite输入缓冲区 float* input = interpreter->typed_input_tensor<float>(0); memcpy(input, inputImg.ptr<float>(0), 32 * 32 * sizeof(float)); // 推理 TFLITE_MINIMAL_CHECK(interpreter->Invoke() == kTfLiteOk); // 修正输出索引,直接取第0个输出即可,和Python逻辑一致 float* output = interpreter->typed_output_tensor<float>(0); std::cout << output[0] << std::endl;
内容的提问来源于stack exchange,提问作者Mohamed Gamal
相关产品推荐
相关产品推荐

