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

Flutter集成自定义TensorFlow Lite模型后目标检测失效问题

解决自定义Teachable Machine TFLite模型集成Flutter检测示例无结果问题

以下是针对性的排查和修改步骤,帮你在live_object_detection_ssd_mobilenet示例中适配自定义模型:

1. 确认模型输出结构与代码解析逻辑匹配

Teachable Machine导出的目标检测模型,输出结构和官方SSD MobileNet不一致:

  • 用Netron打开你的自定义模型,查看输出张量的形状(比如常见为[1, 10, 6],对应10个候选框,每个框包含[ymin, xmin, ymax, xmax, 置信度, 类别ID])。
  • 对比示例代码中_runInference方法的输出解析逻辑:原代码是从多个分离的输出张量提取数据,你需要改成适配自己模型的单张量解析方式,示例修改逻辑如下:
    // 假设你的模型输出是单个张量,形状为[1, 10, 6]
    void _runInference(Uint8List imageBytes, Size cameraSize) {
      // 预处理图像(后续还要调整预处理逻辑)
      final inputTensor = _preProcessImage(imageBytes);
      // 分配输出张量内存
      final output = List.filled(1 * 10 * 6, 0.0).reshape([1, 10, 6]);
      _interpreter?.run(inputTensor, output);
    
      // 解析输出结果
      final detections = <Map<String, dynamic>>[];
      for (var box in output[0]) {
        final confidence = box[4];
        if (confidence > confidence) {
          final classId = box[5].toInt();
          // 将模型输出的归一化坐标转换为相机图像实际尺寸
          final yMin = box[0] * cameraSize.height;
          final xMin = box[1] * cameraSize.width;
          final yMax = box[2] * cameraSize.height;
          final xMax = box[3] * cameraSize.width;
    
          detections.add({
            'box': [xMin, yMin, xMax, yMax],
            'label': _labels?[classId],
            'confidence': confidence,
          });
        }
      }
      // 将检测结果发送到UI层
      _sendPort.send(detections);
    }
    

2. 匹配标签文件与模型

  • 确保Teachable Machine导出的labels.txt(包含你的自定义类别)放在示例项目的正确路径,并且代码中_loadLabels方法的路径指向该文件。
  • 检查标签文件格式:每行一个类别名称,顺序必须和模型训练时的类别顺序完全一致,否则会出现类别匹配错误。

3. 调整图像预处理逻辑

Teachable Machine模型的预处理要求和官方SSD不同,需修改_preProcessImage方法:

  • 像素归一化:通常Teachable Machine会将像素值归一化到[0,1](即每个像素值除以255),而官方SSD可能用[-1,1]的归一化方式,需调整代码中的归一化逻辑。
  • 图像尺寸与通道顺序:确认模型输入是RGB还是BGR通道,示例默认可能是BGR,需改成RGB(Teachable Machine常用格式)。

4. 调整置信度阈值

原示例的confidence = 0.5可能过高,自定义模型的检测精度可能达不到,先临时调低到0.2或0.3测试是否能输出检测结果。

5. 调试验证模型输出

在_runInference方法中添加日志,打印模型原始输出数据:

print('模型原始输出:${output.toString()}');
  • 如果输出全是0或极低置信度:说明预处理错误或模型本身加载有问题;
  • 如果有高置信度的结果:说明是后续解析或UI显示逻辑的问题。

内容的提问来源于stack exchange,提问作者zimmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:52:36