【问题标题】:What does the error "Exceeded maximum allowed number of Trackers" mean?错误“超过允许的最大跟踪器数量”是什么意思?
【发布时间】:2018-02-10 01:57:41
【问题描述】:

我正在关注this tutorial 在 iOS 11 上实现对象跟踪。我能够完美地跟踪对象,直到某个点,然后控制台中出现此错误。

抛出:错误域 = com.apple.vis 代码 = 9“内部错误:超过跟踪器类型允许的最大跟踪器数量:VNObjectTrackerType” UserInfo={NSLocalizedDescription=内部错误:超过跟踪器允许的最大跟踪器数量类型:VNObjectTrackerType}

是我错误地使用了 API,还是 Vision 无法处理太多连续的对象跟踪任务?好奇是否有人能深入了解为什么会发生这种情况。

【问题讨论】:

  • 添加产生异常的行
  • 这里有同样的问题。看起来我很可能做错了什么,但是,我不确定它可能是什么。
  • @nathan 对我来说导致这个问题的代码行是这样的:尝试 self.visionSequenceHandler.perform(trackRequests, on: ciimage)

标签: ios11 swift4 apple-vision


【解决方案1】:

您似乎达到了系统中可以激活的跟踪器数量的限制。首先要注意的是,每次新的观察都会创建一个新的跟踪器,并使用新的 -uuid 属性。你应该回收你在启动跟踪器时使用的初始观察,直到你不再想使用它,方法是将你从时间 T 的“结果”中获得的内容提供给你对时间 T+1 的后续请求。当您不再想使用该跟踪器时(可能置信度得分太低),可以设置一个“lastFrame”属性,让 Vision 框架知道您已使用该跟踪器。当序列请求处理程序被释放时,跟踪器也会被释放。

【讨论】:

  • “回收最初的观察”是什么意思?
  • 这在developer.apple.com/videos/play/wwdc2018/716中有详细解释。还有一个示例应用程序的链接,该应用程序使用 Vision.framework 实现电影解析跟踪序列。
【解决方案2】:

要跟踪矩形,您将后续观察提供给相同的 VNSequenceRequestHandler 实例,例如 handler。当矩形丢失时,即处理函数/回调中的新观察值是 nil,或者您遇到其他一些跟踪错误,只需重新实例化 handler 并继续,例如(展示想法的示例代码):

private var handler = VNSequenceRequestHandler()

// <...>

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard
        let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer),
        let lastObservation = self.lastObservation
    else { 
        self.handler = VNSequenceRequestHandler()
        return
    }

    let request = VNTrackObjectRequest(detectedObjectObservation: lastObservation, completionHandler: self.handleVisionRequestUpdate)
    request.trackingLevel = .accurate

    do {
        try self.handler.perform([request], on: pixelBuffer)
    } catch {
        print("Throws: \(error)")
    }
}

注意handler 是var,而不是常量。

另外,如果新的观察对象无效,您可以在实际处理函数(如func handleVisionRequestUpdate(_ request: VNRequest, error: Error?))中重新实例化handler。

【讨论】:

  • 我对如何/为什么解决错误有点困惑。你能详细说明一下吗?
【解决方案3】:

我的问题是我有一个调用 perform... 的函数在跟踪也调用 perform 的同一个 VNSequenceRequestHandler 上,因为我同时处理了太多 try self.visionSequenceHandler.perform(trackRequests, on: ciimage)。确保 VNSequenceRequestHandler 不会被多个执行同时击中....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2013-09-29
    • 2011-01-06
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多