iOS CIFaceDetector очень медленно работает с металлом - PullRequest
0 голосов
/ 08 марта 2019

Я пытался применить фильтры к определенной части лица, обнаруженной на изображении.

Чтобы применить фильтры ко всему изображению, я использовал пример кода от apple: https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/avcamfilter_applying_filters_to_a_capture_stream

Если я просто добавлю одну строку обнаружения лиц через CIDetector, к методу, который отправляет CVPixelBuffers в класс FilterRenderer, а затем в MTKView для рендеринга отфильтрованного буфера, производительность сильно падает.

Цепочка выглядит следующим образом: CMSampleBuffer> CVImageBuffer> CIImage> Определить лица> Применить фильтр только к лицу > Получить CVPixelBuffer обратно из FilterRenderer> Отправить его в MTKView

"Детектирование лиц"часть слишком медленная, я не могу себе представить Если я сделаю еще какую-то обработку (определю положение глаз и рта), насколько медленной она будет.

Вы можете увидеть пример реализации здесь:https://github.com/nipun0505/FaceDetectionMetal

func processVideo(sampleBuffer: CMSampleBuffer) {
    if !renderingEnabled {
        return
    }

    guard let videoPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer),
        let formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer) else {
            return
    }

    var finalVideoPixelBuffer = videoPixelBuffer
    if let filter = videoFilter {
        if !filter.isPrepared {
            filter.prepare(with: formatDescription, outputRetainedBufferCountHint: 3)
        }

        //Detect faces
        if let faceDetector = faceDetector{
            let features = faceDetector.features(in: CIImage(cvImageBuffer: videoPixelBuffer))
        }

        // Send the pixel buffer through the filter
        guard let filteredBuffer = filter.render(pixelBuffer: finalVideoPixelBuffer) else {
            print("Unable to filter video buffer")
            return
        }

        finalVideoPixelBuffer = filteredBuffer
    }

    previewView.pixelBuffer = finalVideoPixelBuffer
}

Я что-то здесь не так делаю?Я попробовал то же самое без MTKView, где я просто определяю лица и накладываю некоторые изображения на AVCaptureVideoPreviewLayer, что прошло очень гладко.Не уверен, что замедляет мою работу.

...