Pra*_*tti 5 vision avfoundation ios swift avkit
我正在尝试提高通过身体跟踪绘制骨骼的性能,VNDetectHumanBodyPoseRequest即使距离超过 5 米,并且使用稳定的 iPhone XS 摄像头。
跟踪对我身体右下肢的置信度较低,明显滞后且存在抖动。我无法复制今年 WWDC演示视频中展示的性能。
\n以下是相关代码,改编自Apple的示例代码:
\nclass Predictor {\n\xc2\xa0\xc2\xa0func extractPoses(_ sampleBuffer: CMSampleBuffer) throws -> [VNRecognizedPointsObservation] {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let requestHandler = VNImageRequestHandler(cmSampleBuffer: sampleBuffer, orientation: .down)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let request = VNDetectHumanBodyPoseRequest()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0do {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0// Perform the body pose-detection request.\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0try requestHandler.perform([request])\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0} catch {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0print("Unable to perform the request: \\(error).\\n")\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return (request.results as? [VNRecognizedPointsObservation]) ?? [VNRecognizedPointsObservation]()\n\xc2\xa0\xc2\xa0}\n}\nRun Code Online (Sandbox Code Playgroud)\n我已经捕获了视频数据并正在此处处理示例缓冲区:
\nclass CameraViewController: AVCaptureVideoDataOutputSampleBufferDelegate {\n\n func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let observations = try? predictor.extractPoses(sampleBuffer)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0observations?.forEach { processObservation($0) }\n }\n\n func processObservation(_ observation: VNRecognizedPointsObservation) {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0// Retrieve all torso points.\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0guard let recognizedPoints =\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0try? observation.recognizedPoints(forGroupKey: .all) else {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let storedPoints = Dictionary(uniqueKeysWithValues: recognizedPoints.compactMap { (key, point) -> (String, CGPoint)? in\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return (key.rawValue, point.location)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0})\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0DispatchQueue.main.sync {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let mappedPoints = Dictionary(uniqueKeysWithValues: recognizedPoints.compactMap { (key, point) -> (String, CGPoint)? in\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0guard point.confidence > 0.1 else { return nil }\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let norm = VNImagePointForNormalizedPoint(point.location,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Int(drawingView.bounds.width),\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Int(drawingView.bounds.height))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return (key.rawValue, norm)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0})\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let time = 1000 * observation.timeRange.start.seconds\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0// Draw the points onscreen.\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0DispatchQueue.main.async {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0self.drawingView.draw(points: mappedPoints)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0}\n}\nRun Code Online (Sandbox Code Playgroud)\n该drawingView.draw函数用于UIView在相机视图之上进行自定义,并使用CALayer子图层绘制点。该代码与此处的AVCaptureSession示例代码完全相同。
我尝试使用该VNDetectHumanBodyPoseRequest(completionHandler:)变体,但这对我的性能没有影响。我可以尝试使用移动平均滤波器进行平滑..但是离群值预测仍然存在问题,非常不准确。
我缺少什么?
\n我认为这是 iOS 14 beta v1-v3 上的一个错误。升级到 v4 及更高版本后,跟踪效果好多了。通过最新的测试版更新,API 也变得更加清晰,具有细粒度的类型名称。
\n请注意,我没有\xe2\x80\x99从Apple那里得到关于此错误的官方答复,但这个问题可能会在官方iOS 14版本中完全消失。
\n| 归档时间: |
|
| 查看次数: |
1282 次 |
| 最近记录: |