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

安卓AI肺炎检测应用TFLite模型输出恒为0.0039问题求解

问题根因

  • 最核心的错误是输出时多余除以了255:模型推理输出的结果本身就是0~1区间的概率值,额外除以255后最大值仅为1/255≈0.0039,和你观察到的输出特征完全吻合。
  • 预处理存在多余重复缩放逻辑,Bitmap先通过Matrix缩放到224x224,后续又通过ImageProcessor再次执行224x224缩放,会引入不必要的像素误差。
  • 未显式校验通道顺序与训练环境对齐:Android系统Bitmap默认是ARGB通道排列,而Python训练时通常使用RGB/BGR顺序,通道不匹配会导致预测结果完全错误。

修复步骤

1. 修正输出计算逻辑

删除stackedModel和aiModel函数中输出概率时多余的/255.0操作,修改后代码如下:

// stackedModel中的输出代码修改为
String pred = String.format("Probability: %s", Float.toString(out[0]));

// aiModel中的输出代码修改为
String pred = String.format("Probability: %s", Float.toString(out[0]));

2. 精简预处理逻辑,去掉重复缩放

删除preProcessImage中手动实现的Matrix缩放逻辑,统一使用ImageProcessor完成所有预处理操作,同时显式指定归一化逻辑,修改后代码如下:

// 需提前导入NormalizeOp:import org.tensorflow.lite.support.image.ops.NormalizeOp;
public ByteBuffer preProcessImage(Bitmap imgBitmap){
    // 删掉原有Matrix缩放相关代码
    ImageProcessor imageProcessor = new ImageProcessor.Builder()
                    .add(new ResizeOp(224, 224, ResizeOp.ResizeMethod.BILINEAR))
                    // 用NormalizeOp完成0~255到0~1的归一化,语义更准确
                    .add(new NormalizeOp(0f, 255f))
                    .build();
    TensorImage tensorImage = new TensorImage(DataType.FLOAT32);
    tensorImage.load(imgBitmap);
    tensorImage = imageProcessor.process(tensorImage);
    // 如果训练时用的是BGR通道输入,添加以下代码调整通道顺序
    // 需导入ConvertOp和ColorSpaceType:import org.tensorflow.lite.support.image.ops.ConvertOp; import org.tensorflow.lite.support.image.ColorSpaceType;
    // tensorImage = new ConvertOp(ColorSpaceType.RGB, ColorSpaceType.BGR).apply(tensorImage);
    ByteBuffer imageBuffer = tensorImage.getBuffer();
    return imageBuffer;
}

3. 可选优化

删除预处理中对imageView的重复设值逻辑,避免用户看到图片被反复缩放调整的闪烁问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 16:54:03