返回

解决 Google ML Kit 自定义模型边界框与预览不匹配的指南

java

解决 Google ML Kit 自定义模型错误边界框的全面指南

引言

使用 Google ML Kit 的自定义模型进行物体检测时,偶尔会出现边界框与预览不匹配的情况,即使标签是准确的。这个问题可能会令人沮丧,阻碍模型的有效部署。本文旨在提供一个全面的指南,帮助你了解导致此问题的常见原因,并提供详细的解决步骤。

问题根源

边界框与预览不匹配的问题通常由以下几个因素引起:

  • 图像转换:从相机预览到用于检测的图像之间的图像转换可能会引入误差。
  • 比例缩放:输入图像和预览图像的大小比例不匹配。
  • 映射矩阵:用于将检测结果从检测图像空间转换到预览空间的映射矩阵计算不正确。
  • 模型输出:模型输出的边界框在原始检测图像坐标系中不准确。

解决步骤

要解决此问题,请遵循以下逐步指南:

1. 验证图像转换

确保用于图像转换的函数是正确的,尤其是图像旋转。

// 检查图像旋转
val rotationDegrees = imageProxy.getImageInfo().getRotationDegrees()
if (rotationDegrees % 90 != 0) {
    Log.e("Object Detection", "Invalid image rotation: $rotationDegrees")
}

2. 检查比例缩放

确保ImageAnalysis.setTargetResolution()设置的分辨率与预览分辨率相同。

3. 重新计算映射矩阵

手动计算映射矩阵并将其与ProjectHelper.getMappingMatrix()返回的矩阵进行比较。

// 重新计算映射矩阵
val matrix = Matrix()
matrix.mapRect(boundingRect, boundingRect)
val mappedRect = Rectangle(boundingRect.left, boundingRect.top, boundingRect.width(), boundingRect.height())
rectangleOverlayView.updateRect(mappedRect)

4. 检查模型输出

在调试模式下运行模型,并检查输出边界框在检测图像中的准确性。

5. 考虑非矩形边界框

如果模型输出的边界框不是矩形,则需要修改rectangleOverlayView以正确处理它们。

6. 排除相机预览问题

确保相机预览本身没有显示问题或延迟,从而影响边界框的准确性。

结论

通过遵循这些步骤并调试模型和应用程序,你可以解决自定义 ML Kit 模型生成不匹配预览的错误边界框的问题。记住要彻底测试和验证所有修改,以确保应用程序准确可靠。

常见问题解答

1. 为什么会出现图像转换误差?

图像转换涉及旋转、缩放或裁剪图像,这些操作可能会引入细微的误差。

2. 比例缩放不匹配会导致什么问题?

比例缩放不匹配会导致边界框的大小和位置不正确。

3. 如何手动计算映射矩阵?

可以使用变换矩阵来手动计算映射矩阵。有关更多详细信息,请参考 Google ML Kit 文档。

4. 为什么我的模型输出的边界框不准确?

这可能是由于训练数据不足、模型架构不合适或推理过程中的错误。

5. 如何处理非矩形边界框?

你可以使用具有自定义形状绘制功能的自定义ShapeOverlayView类来处理非矩形边界框。