Распознавание лиц с низким энергопотреблением с Swift Vision API - PullRequest
0 голосов
/ 26 апреля 2019

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

Я настроил тестовое приложение, использующее API Vision, и начал с некоторого код от Рэй Вендерлих .Я изменил код так, чтобы он печатал лицо / лицо не в зависимости от того, смотрит кто-то на устройство или нет.Тем не менее, я заметил, что загрузка процессора действительно высока, и через пару минут устройство немного нагревается.Есть ли способ уменьшить частоту обновления функции распознавания лиц или есть другое решение моей проблемы, которое потребляет меньше энергии?

Вот мой модифицированный код:

import AVFoundation
import UIKit
import Vision

class FaceDetectionViewController: UIViewController {
  var sequenceHandler = VNSequenceRequestHandler()


  let session = AVCaptureSession()
  var previewLayer: AVCaptureVideoPreviewLayer!

  let dataOutputQueue = DispatchQueue(
    label: "video data queue",
    qos: .userInitiated,
    attributes: [],
    autoreleaseFrequency: .workItem)

  override func viewDidLoad() {
    super.viewDidLoad()
    configureCaptureSession()

    session.startRunning()
  }
}

// MARK: - Video Processing methods

extension FaceDetectionViewController {
  func configureCaptureSession() {
    // Define the capture device we want to use
    guard let camera = AVCaptureDevice.default(.builtInWideAngleCamera,
                                               for: .video,
                                               position: .front) else {
      fatalError("No front video camera available")
    }

    // Connect the camera to the capture session input
    do {
      let cameraInput = try AVCaptureDeviceInput(device: camera)
      session.addInput(cameraInput)
    } catch {
      fatalError(error.localizedDescription)
    }

    // Create the video data output
    let videoOutput = AVCaptureVideoDataOutput()
    videoOutput.setSampleBufferDelegate(self, queue: dataOutputQueue)
    videoOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA]

    // Add the video output to the capture session
    session.addOutput(videoOutput)

    let videoConnection = videoOutput.connection(with: .video)
    videoConnection?.videoOrientation = .portrait

  }
}

extension FaceDetectionViewController: AVCaptureVideoDataOutputSampleBufferDelegate {
  func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    // 1
    guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
      return
    }

    let detectFaceRequest = VNDetectFaceLandmarksRequest(completionHandler: detectedFace)

    do {
      try sequenceHandler.perform(
        [detectFaceRequest],
        on: imageBuffer,
        orientation: .leftMirrored)
    } catch {
      print(error.localizedDescription)
    }
  }
}

extension FaceDetectionViewController {

  func detectedFace(request: VNRequest, error: Error?) {
    // 1
    guard
      let results = request.results as? [VNFaceObservation],
      let result = results.first
      else {
        print("** NO FACE")
        return
    }
    print("FACE")
  }
}

Есть ли способ использовать Vision API более энергоэффективным способом?Мне не нужны быстрые частоты обновления.Одного обнаружения достаточно 5 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...