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

Android端PyTorch Mobile部署YOLOv8张量尺寸不匹配问题排查

问题分析与解决:YOLOv8 TorchScript在Android端的张量尺寸不匹配错误

错误根源

你遇到的RuntimeError: The size of tensor a (3549) must match the size of tensor b (8400)错误,核心原因是训练、模型导出、Android推理三个环节的输入图像尺寸不统一,导致YOLOv8内部锚点(anchor points)数量不匹配:

  • 训练时你设置了imgsz=416,模型会基于416×416的尺寸计算锚点,对应锚点数量为3549
  • 导出和Android推理时却用了imgsz=640,640×640尺寸对应的锚点数量为8400
  • 模型在decode_bboxes()函数中会用训练阶段生成的锚点做张量运算,尺寸不匹配直接触发报错

解决方案步骤

1. 统一全流程的图像尺寸

必须保证训练、导出、推理的imgsz完全一致,建议统一为640:
修改训练代码的imgsz参数:

# Entrenar el modelo
model.train(data=yaml_path, epochs=50, imgsz=640, batch=8, workers=0, verbose=False, device=device)

导出和Android端的640设置保持不变即可。

2. 重新训练并导出模型

删除旧的训练模型和TorchScript文件,重新执行训练+导出流程,确保模型内部锚点与640×640尺寸完全匹配。

3. 修正输入归一化逻辑(优化检测效果)

当前Android代码的归一化规则不符合YOLOv8默认训练配置,会导致检测精度下降:
YOLOv8训练时默认将像素值除以255,无需均值减法,修改bitmapToFloat32Tensor的参数:

val inputTensor = TensorImageUtils.bitmapToFloat32Tensor(
    resizedBitmap,
    floatArrayOf(0f, 0f, 0f),
    floatArrayOf(255f, 255f, 255f)
)

4. 验证输出张量形状

重新导出模型后,通过Android端的Log.d("ModelOutput", "Forma del tensor: ${shape.toList()}")确认输出形状应为[1, 32, 8400](4个坐标参数+28个类别),确保processOutput函数的逻辑匹配。

额外优化建议

  • 导出TorchScript时添加移动端优化参数:
model.export(format="torchscript", imgsz=640, simplify=True, optimize=True)
  • 确保Android端PyTorch Mobile版本与训练时的PyTorch版本尽量接近,避免兼容性问题。

内容的提问来源于stack exchange,提问作者Chechu Martínez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:23:17