2
votes

Comment corriger les erreurs de GPU de code IOAF lors de l'utilisation d'ARKit2 & Vision (VNDetectFaceRectanglesRequest) sur iPhone XS

Lorsque j'exécute ARKit sur iPhone XS (avec iOS 12.1.2 et Xcode 10.1), j'obtiens des erreurs et des plantages / blocages lors de l'exécution du code Vision pour détecter les limites du visage.

Les erreurs que j'obtiens sont: p>

func classifyCurrentImage() {
    guard let buffer = currentBuffer else { return }

    let image = CIImage(cvPixelBuffer: buffer)
    let options: [VNImageOption: Any] = [:]
    let imageRequestHandler = VNImageRequestHandler(ciImage: image, orientation: self.imageOrientation, options: options)

    do {
        try imageRequestHandler.perform(self.requests)
    } catch {
        print(error)
    }
}

func handleFaces(request: VNRequest, error: Error?) {
    DispatchQueue.main.async {
        guard let results = request.results as? [VNFaceObservation] else { return }
        // TODO - something here with results
        print(results)

        self.currentBuffer = nil
    }
}

Cela se produit sur l'iPhone XS lors de l'exécution du code de preuve de concept suivant pour reproduire l'erreur (se produit toujours quelques secondes après l'exécution de l'application) - https://github.com/xta/ARKit-Vision-Demo

Le ViewController concerné .swift contient les méthodes problématiques:

2019-01-04 03:03:03.155867-0800 ARKit Vision Demo[12969:3307770] Execution of the command buffer was aborted due to an error during execution. Caused GPU Timeout Error (IOAF code 2)
2019-01-04 03:03:03.155786-0800 ARKit Vision Demo[12969:3307850] Execution of the command buffer was aborted due to an error during execution. Discarded (victim of GPU error/recovery) (IOAF code 5)
[SceneKit] Error: display link thread seems stuck

Quelle est la bonne façon d'utiliser ARKit + Vision d'Apple avec VNDetectFaceRectanglesRequest ? Obtenir de mystérieuses erreurs de code IOAF n'est pas correct.

Idéalement, j'aimerais également utiliser VNTrackObjectRequest & VNSequenceRequestHandler pour suivre les demandes.

Il existe une documentation en ligne décente pour utiliser VNDetectFaceRectanglesRequest avec Vision ( et sans ARKit). Apple a une page ici ( https://developer.apple.com/documentation/arkit/using_vision_in_real_time_with_arkit / a>) que j'ai suivi, mais j'obtiens toujours les erreurs / plantages.


0 commentaires

3 Réponses :


0
votes

Vous devez appeler la méthode perform async, comme cela se fait dans le lien que vous avez partagé. Essayez le code ci-dessous:

func classifyCurrentImage() {
    guard let buffer = currentBuffer else { return }

    let image = CIImage(cvPixelBuffer: buffer)
    let options: [VNImageOption: Any] = [:]
    let imageRequestHandler = VNImageRequestHandler(ciImage: image, orientation: self.imageOrientation, options: options)

    DispatchQueue.global(qos: .userInteractive).async {
        do {
            try imageRequestHandler.perform(self.requests)
        } catch {
            print(error)
        }
    }
}


3 commentaires

J'ai essayé votre code (auparavant, j'ai essayé d'utiliser un serialQueue selon le code d'Apple), mais l'application ne fonctionne pas. En utilisant votre code ci-dessus, j'obtiens toujours des erreurs / blocages: Démo ARKit Vision [13245: 3429200] L'exécution du tampon de commande a été abandonnée en raison d'une erreur lors de l'exécution. Rejeté (victime d'une erreur / récupération GPU) (code IOAF 5) Démo ARKit Vision [13245: 3429144] L'exécution du tampon de commande a été abandonnée en raison d'une erreur lors de l'exécution. Erreur de délai d'expiration du GPU (code IOAF 2)


@xta C'est étrange, j'ai exécuté l'exemple de projet et je n'ai eu aucun problème sur un appareil iPhone 7.


Je suis d'accord car je peux bien exécuter le code sur l'iPhone 7, mais j'obtiendrai immédiatement les erreurs avec l'iPhone XS. Très frustrant puisque 7 = OK, XS = des erreurs à gogo.



0
votes

Mise à jour: d'après ce que je peux dire, le problème était de conserver les cycles (ou l'absence de [self faible] ) dans mon dépôt de démonstration. Dans l ' exemple de projet d'Apple, ils utilisent correctement [faible self] pour éviter les cycles de rétention et l'application ARKit + Vision fonctionne sur l'iPhone XS.


2 commentaires

comment avez-vous modifié le code ci-dessus pour utiliser correctement [faible self]


Je n'ai pas modifié le code ci-dessus, j'ai recommencé à utiliser le projet Apple comme un developer.apple .com / documentation / arkit /…



1
votes

Pour tous ceux qui traversent la douleur, je viens d'essayer de corriger cette erreur exacte pour VNDetectRectanglesRequest , voici ma solution:

Il semble que l'utilisation d'une CIImage:

XXX

a amené Metal à conserver une grande quantité de fonctions internes dans mon graphique de mémoire.

J'ai remarqué que les exemples de projets d'Apple l'utilisent tous à la place:

var requestHandlerOptions: [VNImageOption: AnyObject] = [:]
let cameraIntrinsicData = CMGetAttachment(pixelBuffer, key: kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, attachmentModeOut: nil)
if cameraIntrinsicData != nil {
            requestHandlerOptions[VNImageOption.cameraIntrinsics] = cameraIntrinsicData
}

Le passage à l'utilisation de cvPixelBuffer au lieu d'une CIImage a corrigé toutes mes erreurs de délai d'expiration GPU aléatoires!

J'ai utilisé ces fonctions pour obtenir l ' orientation (j'utilise la caméra arrière. Je pense que vous devrez peut-être mettre en miroir la caméra avant en fonction de ce que vous essayez de faire):

func exifOrientationForDeviceOrientation(_ deviceOrientation: UIDeviceOrientation) -> CGImagePropertyOrientation {

    switch deviceOrientation {
    case .portraitUpsideDown:
        return .right

    case .landscapeLeft:
        return .down

    case .landscapeRight:
        return .up

    default:
        return .left
    }
}

func exifOrientationForCurrentDeviceOrientation() -> CGImagePropertyOrientation {
    return exifOrientationForDeviceOrientation(UIDevice.current.orientation)
}


0 commentaires