我正在使用 Vision
和 CoreML
框架。我有一个实时视频源。对于每一帧,我首先使用 VNDetectRectanglesRequest
检测矩形。对于我检测到的每个矩形,我裁剪出图像的那一部分并执行 VNCoreMLRequest
来对图像的那一部分进行分类。对对象进行分类后,如果是我要查找的对象类型,则绘制矩形。这就像我在没有数据来训练实际神经网络进行检测时构建了一个对象检测器。
通常,我检测到大约 1 到 3 个矩形。没有那么多。因此,对于每个 VNDetectRectanglesRequest
,我每帧要执行 1 到 3 个额外的 VNCoreMLRequest
。但是,执行所有这些请求会使我的视频流非常滞后。当我将相机对准矩形物体时,这一点非常明显。我想我应该补充一点,这段视频片段来自 ARKit
,所以无论 ARKit
正在执行什么后台操作,都可能使延迟变得更糟。
我尝试使用 DispatchQueue
优化代码。下面是我的伪代码。我对代码所做的事情感到满意,但我需要摆脱滞后。
DispatchQueue.global(qos: .background).async {
let request = VNDetectRectanglesRequest(completionHandler: { (request, error) in
// ...
for observation in request.results {
let mlRequest = VNCoreMLRequest(model: model){ (request, error) in
// classify ... if is object I want then jump back to main queue and draw
DispatchQueue.main.async {
// draw rectangles
}
})
}
})
}
我认为您的代码没有任何问题,只是为每一帧发出所有这些请求对于设备来说负载太高而无法处理。
尝试降低请求的频率,并可能在首先发出请求之前添加一些条件来检查。只需添加一个检查以查看您是否已经在等待其他请求完成可能会显着减少负载。您还可以检查用户是否稳定地握住设备、框架是否清晰、照明是否充足等。
关于ios - 每帧多个视觉请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48030439/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) | Powered by Discuz! X3.4 |