You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:24:03