2

我正在尝试在 android 的实时摄像头提要上使用firebase MLKit检测对象和文本。有特定的识别器(FirebaseVisionTextRecognizerFirebaseVisionObjectDetector)来处理图像。如果我一一使用这些识别器,它工作得很好,我能够得到期望的响应。

但是,我想使用与 Google Lens 应用程序相同的相机源同时检测对象和文本。为了实现这一点,首先,我尝试同时运行两个识别器,但延迟时间更长(执行特定帧需要时间),因为两者都是按顺序运行的,因此只有文本检测有效,而对象检测无效。这意味着对象检测没有结果。

然后,我尝试并行执行两个识别器,延迟减少但不足以让检测 API 返回响应。当摄像头供稿中没有文本时,对象检测效果很好,但是当摄像头供稿中有文本时,延迟会增加,因此没有跟踪对象。

注意:我检查了检测后函数调用的延迟(检测到对象后执行的代码),它不需要太多时间。在并行执行的情况下,识别器需要更多时间来处理图像。我正在三星 Galaxy S30s 手机上进行测试,我猜它的处理器并没有那么差。

代码中的一些概述:

  1. 使用FirebaseVisionObjectDetectorOptions.STREAM_MODEenableMultipleObjects=falseenableClassification=false进行对象检测
  2. FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21在构建 FirebaseVisionImageMetadata 时使用格式
  3. 根据 Google 定义的最佳实践,如果检测正在进行中,则丢弃最新的帧
  4. 使用 OnDeviceObjectDetector 进行对象检测
  5. 对于文本检测,我使用 OnDeviceTextRecognizer

我需要帮助来了解 Google Lens 应用程序如何同时执行多个识别器,但不是在我的应用程序中。我可以做些什么来在同一个相机框架上启用多个识别器?

4

1 回答 1

2

目前,在同一图像帧上运行多个检测器的方法是按顺序运行它们,因为我们在内部在单个线程中运行它们。我们正在积极添加对并行运行不同检测器的支持。

...因为两者都是按顺序运行的,因此只有文本检测有效,而对象检测无效。

ObjectDetection 功能STREAM_MODE预计两个图像帧之间的延迟很小,例如 < 300 毫秒。如果您在两者之间运行文本识别,则延迟可能会太长,以至于 ObjectDetection 功能无法正常运行。您可以更改为STREAM_MODESINGLE_IMAGE_MODE在您的设置中获得结果,但延迟会更高。

于 2020-05-01T18:14:58.023 回答