Как исправить ошибки графического процессора кода IOAF при использовании ARKit2 и Vision (VNDetectFaceRectanglesRequest) на iPhone XS

При запуске ARKit на iPhone XS (с iOS 12.1.2 и Xcode 10.1) я получаю сообщения об ошибках и вылетает / зависает при запуске кода Vision для определения границ лица.

Я получаю следующие ошибки:

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

Это происходит на iPhone XS при запуске следующего кода подтверждения концепции для воспроизведения ошибки (всегда происходит в течение нескольких секунд после запуска приложения) - https://github.com/xta/ARKit-Vision-Demo

Соответствующий ViewController.swift содержит проблемные методы:

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
    }
}

Как правильно использовать Apple ARKit + Vision с VNDetectFaceRectanglesRequest? Получать загадочные ошибки кода IOAF некорректно.

В идеале я бы также хотел использовать VNTrackObjectRequest и VNSequenceRequestHandler для отслеживания запросов.

Существует приличная онлайн-документация по использованию VNDetectFaceRectanglesRequest с Vision (и без ARKit). У Apple есть страница здесь (https://developer.apple.com/documentation/arkit/using_vision_in_real_time_with_arkit), за которым я следил, но я все еще получаю ошибки / сбои.


person xta    schedule 04.01.2019    source источник


Ответы (3)


Для всех, кто испытывает боль, которую я только что пытался исправить именно эту ошибку для VNDetectRectanglesRequest, вот мое решение:

Похоже, что с помощью CIImage:

let imageRequestHandler = VNImageRequestHandler(ciImage: image, orientation: self.imageOrientation, options: options)

заставил Металл сохранить большое количество внутренних функций в моем графике памяти.

Я заметил, что все примеры проектов Apple используют это вместо этого:

let handler: VNImageRequestHandler! = VNImageRequestHandler(cvPixelBuffer: pixelBuffer,
                                                                    orientation: orientation,
                                                                    options: requestHandlerOptions)

Переключение на использование cvPixelBuffer вместо CIImage устранило все мои случайные ошибки тайм-аута графического процессора!

Я использовал эти функции, чтобы получить orientation (я использую заднюю камеру. Думаю, вам, возможно, придется отразить переднюю камеру, в зависимости от того, что вы пытаетесь сделать):

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)
}

и следующее как options:

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

Надеюсь, это спасет кого-нибудь от недели, которую я потерял!

person Steven    schedule 28.05.2020

Вам нужно вызвать метод perform async, как это делается в ссылке, которой вы поделились. Попробуйте код ниже:

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)
        }
    }
}
person M Reza    schedule 04.01.2019
comment
Я пробовал ваш код (ранее я пробовал использовать serialQueue в соответствии с кодом Apple), но приложение не работает. Используя указанный выше код, я все еще получаю ошибки / зависания: ARKit Vision Demo[13245:3429200] Execution of the command buffer was aborted due to an error during execution. Discarded (victim of GPU error/recovery) (IOAF code 5) ARKit Vision Demo[13245:3429144] Execution of the command buffer was aborted due to an error during execution. Caused GPU Timeout Error (IOAF code 2) - person xta; 05.01.2019
comment
@xta Странно, я запустил образец проекта, и у меня не было проблем на устройстве iPhone 7. - person M Reza; 05.01.2019
comment
Я согласен, так как я могу запустить код на iPhone 7 нормально, но сразу же получу сообщения об ошибках на iPhone XS. Очень неприятно, так как 7 = ОК, XS = множество ошибок. - person xta; 05.01.2019

Обновление: насколько я могу судить, проблема заключалась в сохранении циклов (или отсутствии [weak self]) в моем демонстрационном репо. В образце проекта Apple правильно используется [weak self], чтобы избежать циклов сохранения, и приложение ARKit + Vision. работает на iPhone XS.

person xta    schedule 07.01.2019
comment
как вы изменили приведенный выше код, чтобы правильно использовать [weak self] - person codingViking; 27.01.2019
comment
Я не менял приведенный выше код, я начал использовать проект Apple в качестве базового developer.apple .com / documentation / arkit /. - person xta; 31.01.2019