从苹果示例代码here可以很容易地说明此问题。我观察到,初始v3网络做出推理/预测的时间随着时间的推移而越来越高。从大约400ms到800-900ms开始。我有一个比较深的网,我已经观察了1秒钟以上以做出预测。该应用程序变得非常不可用(实时且带有AR)。
为了进行快速而肮脏的配置文件,我只是做了一个tic / toc:
let requestHandler = VNImageRequestHandler(cvPixelBuffer: currentBuffer!, orientation: orientation)
visionQueue.async {
do {
// Release the pixel buffer when done, allowing the next buffer to be processed.
defer { self.currentBuffer = nil }
self.tik = Date()
try requestHandler.perform([self.classificationRequest])
let tok = Date()
let executionTime = tok.timeIntervalSince(self.tik)
print("Total Execution time: \(executionTime*1000) ms")
} catch {
print("Error: Vision request failed with error \"\(error)\"")
}
这可以使演示过程持续1或2分钟,但似乎会出现一些可见的帧丢失。任何人都已经看到了这一点,以及有关如何调试的任何指示?我对此并不陌生,可能需要深入研究其中一种工具。但是,如果有人在这种调试方面有深厚的经验,那将是很棒的。如果这确实是苹果方面的错误,也将进行很好的讨论。
其他见解:我还发现了一个很好的理由,该示例代码决定仅在CPU上运行初始指令,从而使GPU可以处理AR和SceneKit图形。在我的一次运行中,我关闭了此功能,以便网络可以使用GPU。当两者都需要GPU功能时,这似乎在AR和Vision之间造成了激烈的竞争。随后,我还观察到,由于AR试图跟踪手机,移动手机可能会对FPS以及推论时间产生重大影响(此外,我还添加了飞机检测功能,这都会使整个手机过热)。
答案 0 :(得分:0)
@MatthijsHollemans。我回顾了WWDC 2018的会议视频“ Vision with CoreML”。鉴于他们有一个不错的API和示例代码,这似乎很容易做到,尽管它可能不是最佳方法,但可能是简单的启发式方法。我将尝试实施。
另外,这可能是有道理的:
1)检测图像是否完全变暗(用户将手机正面朝下放置)
2)如果cnn推理未检测到obj,则它也应停止进行新的推理。由于如果新的obj进入场景,它将触发图像增量重新唤醒它。如果您的净假阳性比假阴性多,这可能会起作用。即非常希望做出预测。