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
相关产品推荐
相关产品推荐

