-1

Vision フレームワーク機能 (CoreML モデルの処理) を備えた ARKit アプリを開発しています。

loopCoreMLUpdate()関数は、非常に高いエネルギーへの影響(CPU=70%、GPU=66%)につながるループを作成します。

このタスクを処理し、エネルギー影響を LOW レベルに下げるにはどうすればよいですか?

CPU/GPU ワークロードを減らすのに役立つ、このループの問題の回避策は何ですか?

ここに私のコードがあります:

import UIKit
import SpriteKit
import ARKit
import Vision

class ViewController: UIViewController, ARSKViewDelegate {

    @IBOutlet weak var sceneView: ARSKView!
    let dispatchQueueML = DispatchQueue(label: "AI")
    var visionRequests = [VNRequest]()

    // .........................................
    // .........................................

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let configuration = AROrientationTrackingConfiguration()
        sceneView.session.run(configuration)

        loopCoreMLUpdate()
    }

    func loopCoreMLUpdate() {          
        dispatchQueueML.async {
            self.loopCoreMLUpdate()  // SELF-LOOP LEADS TO A VERY HIGH IMPACT
            self.updateCoreML()
        }
    }

    func updateCoreML() {
        let piBuffer: CVPixelBuffer? = (sceneView.session.currentFrame?.capturedImage)
        if piBuffer == nil { return }
        let ciImage = CIImage(cvPixelBuffer: piBuffer!)
        let imageRequestHandler = VNImageRequestHandler(ciImage: ciImage, options: [:])

        do {
            try imageRequestHandler.perform(self.visionRequests)
        } catch {
            print(error)
        }
    }
    // .........................................
    // .........................................
}
4

1 に答える 1

2

はい、あなたがマークした行は間違いなく大きな問題になるでしょう. ここではループしていません。前のタスクが完了する前に、できるだけ早く新しい非同期タスクを生成しています。いずれにせよ、CVPixelBuffers を作成するよりも速くキャプチャしようとしていますが、これは大きな無駄です。

フレームをキャプチャする場合は、それらをサンプリングするためのタイトなループを作成しません。自分自身を ARSessionDelegate として設定し、 を実装しsession(_:didUpdate:)ます。新しいフレームが利用可能になると、システムから通知されます。(独自のレンダリング ループを作成することは可能ですが、ここでは作成しません。独自のレンダリング パイプラインが本当に必要でない限り、作成しないでください。)

非常に多くのフレームを非常に迅速に受信することに注意してください。30fps または 60fps が非常に一般的ですが、120fps に達することもあります。そのタイム スライスのすべてを使用することはできません (他のことにもプロセッサ時間が必要です)。ポイントは、多くの場合、フレーム レートについていくことができず、後で処理するためにバッファするか、フレームをドロップするか、またはその両方が必要になるということです。これは、リアルタイム処理のごく普通の部分です。

この種の分類システムでは、実際のフレーム レートを 10 ~ 20 fps 程度に低く設定し、そのレートを維持するためにフレームをスキップすることをお勧めします。ほぼ同一の数十のフレームを分類することは、おそらく役に立ちません。

とはいえ、ライブ キャプチャでのオブジェクトの認識を読んだことを確認してください。それがあなたがやろうとしていることのように感じられ、そのための優れたサンプル コードが用意されています。

于 2018-12-02T15:55:58.403 に答える