Przewodnik wykrywania twarzy w iOS

Zadanie Wykrywanie twarzy pozwala wykrywać twarze na zdjęciach lub filmach. Za pomocą to zadanie, aby znajdować twarze i twarze w kadrze. To zadanie używa model systemów uczących się, który działa z pojedynczymi obrazami lub ciągłym strumieniem. obrazów. Zadanie generuje lokalizacje twarzy wraz z tym klawiszem twarzy punkty: lewe oko, prawe oko, końcówka nosa, usta, tragencja lewego oka i prawe oko tragiczne.

Przykładowy kod opisany w tych instrukcjach jest dostępny na GitHub. Aby zobaczyć, jak działa to zadanie, wejdź na tę stronę wersji demonstracyjnej. Więcej informacje na temat możliwości, modeli i opcji konfiguracji tego , zapoznaj się z Przegląd.

Przykładowy kod

Przykładowy kod MediaPipe Tasks to prosta implementacja wykrywania twarzy na iOS. W tym przykładzie używamy aparatu w fizycznym urządzeniu z Androidem, aby wykryć w ciągłym strumieniu wideo. Aplikacja może również wykrywać twarze na obrazach i z galerii na urządzeniu.

Możesz użyć tej aplikacji jako punktu wyjścia dla własnej aplikacji na iOS lub skorzystać z niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod wykrywania twarzy jest hostowany na GitHub

Pobieranie kodu

Poniżej znajdziesz instrukcje tworzenia lokalnej kopii przykładu. za pomocą narzędzia wiersza poleceń git.

Aby pobrać przykładowy kod:

  1. Sklonuj repozytorium git za pomocą tego polecenia:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opcjonalnie możesz skonfigurować instancję git tak, aby wykorzystywała rozproszony proces płatności, aby Tylko pliki przykładowej aplikacji Wykrywacz twarzy:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_detector/ios/
    

Po utworzeniu lokalnej wersji przykładowego kodu możesz zainstalować w bibliotece zadań MediaPipe, otwórz projekt za pomocą Xcode i uruchom aplikację. Dla: instrukcje znajdziesz w Przewodniku po konfiguracji na iOS.

Kluczowe elementy

Te pliki zawierają kluczowy kod przykładowego wykrywania twarzy aplikacja:

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu, w których mają być używane wykrywanie twarzy. Ogólne informacje o konfigurowaniu środowisko programistyczne do używania zadań MediaPipe, w tym wersja platformy wymagania znajdziesz w przewodniku konfiguracji dla iOS.

Zależności

Wykrywanie twarzy używa biblioteki MediaPipeTasksVision, którą należy zainstalować za pomocą CocoaPods. Biblioteka jest zgodna z aplikacjami Swift i Objective-C. i nie wymaga żadnej dodatkowej konfiguracji.

Instrukcje instalowania CocoaPods w macOS znajdziesz w CocoaPods przewodnik instalacji. Aby dowiedzieć się, jak utworzyć Podfile z podami niezbędnymi dla Twojego aplikacji można znaleźć w sekcji Korzystanie CocoaPods.

Dodaj pod MediaPipeTasksVision w tabeli Podfile przy użyciu tego kodu:

target 'MyFaceDetectorApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

Jeśli Twoja aplikacja zawiera cele testów jednostkowych, zapoznaj się z przewodnikiem po konfiguracji iOS, gdzie znajdziesz dodatkowe informacje o konfigurowaniu Podfile.

Model

Zadanie wykrywania twarzy MediaPipe wymaga wytrenowanego modelu, który jest zgodny w tym zadaniu. Aby uzyskać więcej informacji o dostępnych wytrenowanych modelach dla Wykrywacz twarzy, zobacz omówienie zadania Modele .

Wybierz i pobierz model, a następnie dodaj go do katalogu projektu za pomocą Xcode. Instrukcje dodawania plików do projektu Xcode znajdziesz w sekcji Zarządzanie pliki i foldery w Xcode projekt.

Użyj właściwości BaseOptions.modelAssetPath, aby określić ścieżkę do modelu w pakiecie aplikacji. Przykładowy kod znajdziesz w następnej sekcji.

Tworzenie zadania

Możesz utworzyć zadanie Wykrywacz twarzy, wywołując jeden z jego inicjatorów. Inicjator FaceDetector(options:) akceptuje wartości konfiguracji .

Jeśli nie potrzebujesz wykrywania twarzy zainicjowanego z użyciem niestandardowej konfiguracji możesz użyć inicjatora FaceDetector(modelPath:) do utworzenia Wykrywacz twarzy z opcjami domyślnymi. Więcej informacji o konfiguracji Więcej informacji znajdziesz w artykule Omówienie konfiguracji.

Zadanie Wykrywacz twarzy obsługuje 3 typy danych wejściowych: obrazy i pliki wideo i transmisje wideo na żywo. Domyślnie FaceDetector(modelPath:) inicjuje dla nieruchomych obrazów. Jeśli chcesz, aby zadanie zostało zainicjowane do przetworzenia filmu plików lub transmisji wideo na żywo, użyj właściwości FaceDetector(options:), aby określić wideo. czy w trybie biegowym transmisji na żywo. Tryb transmisji na żywo wymaga również dodatkowych faceDetectorLiveStreamDelegate, która włącza Wykrywacz twarzy, aby asynchronicznie dostarczać wyniki wykrywania twarzy przedstawicielowi.

Wybierz kartę odpowiadającą Twojemu trybowi biegowemu, aby zobaczyć, jak utworzyć zadanie i prowadź wnioskowanie.

Swift

Obraz

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image

let faceDetector = try FaceDetector(options: options)
    

Wideo

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video

let faceDetector = try FaceDetector(options: options)
    

Transmisja na żywo

import MediaPipeTasksVision

// Class that conforms to the `FaceDetectorLiveStreamDelegate` protocol and
// implements the method that the face detector calls once it finishes
// detecting faces in each input frame.
class FaceDetectorResultProcessor: NSObject, FaceDetectorLiveStreamDelegate {

  func faceDetector(
    _ faceDetector: FaceDetector,
    didFinishDetection result: FaceDetectorResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the face detection result or errors here.

  }
}

let modelPath = Bundle.main.path(
  forResource: "model",
  ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream

// Assign an object of the class to the `faceDetectorLiveStreamDelegate`
// property.
let processor = FaceDetectorResultProcessor()
options.faceDetectorLiveStreamDelegate = processor

let faceDetector = try FaceDetector(options: options)
    

Objective-C

Obraz

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

Wideo

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

Transmisja na żywo

@import MediaPipeTasksVision;

// Class that conforms to the `MPPFaceDetectorLiveStreamDelegate` protocol
// and implements the method that the face detector calls once it finishes
// detecting faces in each input frame.

@interface APPFaceDetectorResultProcessor : NSObject 

@end

@implementation APPFaceDetectorResultProcessor

-   (void)faceDetector:(MPPFaceDetector *)faceDetector
    didFinishDetectionWithResult:(MPPFaceDetectorResult *)faceDetectorResult
         timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                           error:(NSError *)error {

    // Process the face detector result or errors here.

}

@end

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;

// Assign an object of the class to the `faceDetectorLiveStreamDelegate`
// property.
APPFaceDetectorResultProcessor *processor = [APPFaceDetectorResultProcessor new];
options.faceDetectorLiveStreamDelegate = processor;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

Uwaga: jeśli używasz trybu wideo lub transmisji na żywo, Wykrywacz twarzy używa śledzenia, aby uniknąć aktywowania modelu wykrywania w każdej ramce, co pomaga i zmniejszyć opóźnienia.

Opcje konfiguracji

To zadanie zawiera te opcje konfiguracji aplikacji na iOS:

Nazwa opcji Opis Zakres wartości Wartość domyślna
runningMode Ustawia tryb działania zadania. Są trzy tryby:

IMAGE: tryb wprowadzania pojedynczego obrazu.

WIDEO: tryb zdekodowanych klatek filmu.

LIVE_STREAM: tryb transmisji danych wejściowych na przykład z kamery. W tym trybie detektor wyników musi mieć wartość wywołano, aby skonfigurować detektor i otrzymywać wyniki asynchronicznie.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
minDetectionConfidence Minimalny wskaźnik ufności, który musi spełniać, aby wykrywanie twarzy zostało uznane za udane. Float [0,1] 0.5
minSuppressionThreshold Minimalny niemaksymalny próg wyłączenia funkcji wykrywania twarzy, który może zostać uznany za pokrywający się. Float [0,1] 0.3

Konfiguracja transmisji na żywo

Gdy tryb biegowy jest ustawiony na transmisję na żywo, wykrywanie twarzy wymaga dodatkową opcję konfiguracji faceDetectorLiveStreamDelegate, która umożliwia korzystanie detektor twarzy, aby asynchronicznie dostarczać wyniki wykrywania. Delegat stosuje faceDetector(_:didFinishDetection:timestampInMilliseconds:error:), który wywołuje detektor twarzy po przetworzeniu wyników wykrywania twarzy każdej klatki.

Nazwa opcji Opis Zakres wartości Wartość domyślna
faceDetectorLiveStreamDelegate Włącza wykrywanie twarzy asynchronicznie odbieranie wyników wykrywania twarzy w trybie transmisji na żywo. Klasa, której instancja jest ustawiona na tę właściwość, musi zastosuj faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) . Nie dotyczy Nie ustawiono

Przygotuj dane

Musisz przekonwertować obraz lub ramkę wejściową na obiekt MPImage przed i przekazuje je do wykrywania twarzy. MPImage obsługuje różne typy obrazów z iOS formatów i używać ich w dowolnym trybie działania do wnioskowania. Więcej informacje na temat marki MPImage znajdziesz w Interfejs MPImage API

Wybierz format obrazu na iOS na podstawie swojego przypadku użycia i trybu uruchamiania wymagane jest zgłoszenie.MPImage akceptuje UIImage, CVPixelBuffer i CMSampleBuffer Formaty obrazów w iOS.

UIImage

Format UIImage sprawdza się w tych trybach biegu:

  • Obrazy: obrazy z pakietu aplikacji, galerii użytkownika lub systemu plików w formacie Obrazy (UIImage) można przekonwertować na obiekt MPImage.

  • Filmy: użyj narzędzia AVAssetImageGenerator. aby wyodrębnić klatki wideo do CGImage a potem przekonwertuj je na UIImage obrazy.

Swift

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(uiImage: image)
    

Objective-C

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

Ten przykład inicjuje MPImage z domyślną wartością UIImage.Orientation.Up orientacji ekranu. Możesz zainicjować MPImage przy użyciu dowolnej z obsługiwanych UIImage.Orientation . Wykrywanie twarzy nie obsługuje lustrzanych orientacji, takich jak .upMirrored, .downMirrored, .leftMirrored, .rightMirrored.

Więcej informacji o UIImage znajdziesz na stronie UIImage dla deweloperów Apple Dokumentacja.

CVPixelBuffer

Format CVPixelBuffer sprawdza się w przypadku aplikacji generujących ramki. i zastosuj CoreImage na iOS platformy przetwarzania danych.

Format CVPixelBuffer sprawdza się w tych trybach biegu:

  • Obrazy: aplikacje, które po przetworzeniu generują CVPixelBuffer obrazy. przy użyciu platformy CoreImage systemu iOS można przesłać do wykrywania twarzy w w trybie uruchamiania obrazu.

  • Filmy: klatki wideo można konwertować do formatu CVPixelBuffer dla a następnie przesłany do Wykrywania twarzy w trybie wideo.

  • transmisja na żywo: aplikacje korzystające z aparatu w iOS do generowania klatek mogą być konwertowane w formacie CVPixelBuffer do przetworzenia przed wysłaniem do Wykrywanie twarzy w trybie transmisji na żywo.

Swift

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(pixelBuffer: pixelBuffer)
    

Objective-C

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

Więcej informacji o CVPixelBuffer znajdziesz tutaj: CVPixelBuffer Apple Dla programistów Dokumentacja.

CMSampleBuffer

Format CMSampleBuffer przechowuje próbki multimediów jednolitego typu mediów i jest co sprawdza się w trybie biegowym transmisji na żywo. Klatki na żywo z aparatów z iOS są asynchronicznie dostarczone w formacie CMSampleBuffer przez iOS AVCaptureVideoDataOutput.

Swift

// Obtain a CMSampleBuffer.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(sampleBuffer: sampleBuffer)
    

Objective-C

// Obtain a `CMSampleBuffer`.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
    

Więcej informacji o CMSampleBuffer znajdziesz tutaj: CMSampleBuffer Apple Dla programistów Dokumentacja.

Uruchamianie zadania

Aby uruchomić wykrywanie twarzy, użyj metody detect() specyficznej dla przypisanego tryb działania:

  • Zdjęcie: detect(image:)
  • Film: detect(videoFrame:timestampInMilliseconds:)
  • Transmisja na żywo: detectAsync(image:timestampInMilliseconds:)

Wykrywanie twarzy zwraca wykryte twarze na zdjęciu lub w ramce.

Poniżej znajdziesz przykładowy kod pokazujący, jak w prosty sposób uruchomić Wykrywacz twarzy w różnych trybach:

Swift

Obraz

let result = try faceDetector.detect(image: image)
    

Wideo

let result = try faceDetector.detect(
  videoFrame: image,
  timestampInMilliseconds: timestamp)
    

Transmisja na żywo

try faceDetector.detectAsync(
  image: image,
  timestampInMilliseconds: timestamp)
    

Objective-C

Obraz

MPPFaceDetectorResult *result = [faceDetector detectInImage:image
                                                      error:nil];
    

Wideo

MPPFaceDetectorResult *result = [faceDetector detectInVideoFrame:image
                                         timestampInMilliseconds:timestamp
                                                           error:nil];
    

Transmisja na żywo

BOOL success = [faceDetector detectAsyncInImage:image
                        timestampInMilliseconds:timestamp
                                          error:nil];
    

Przykładowy kod wykrywania twarzy pokazuje implementacje każdego z tych trybów więcej informacji: detect(image:), detect(videoFrame:timestampInMilliseconds:), i detectAsync(image:timestampInMilliseconds:). Ten przykładowy kod umożliwia użycie funkcji przełączać się między trybami przetwarzania, które mogą nie być wymagane tych kwestii.

Pamiętaj:

  • Korzystając z trybu wideo lub transmisji na żywo, musisz też podać: sygnatura czasowa ramki wejściowej zadania Wykrywacz twarzy.

  • W trybie obrazu lub wideo zadanie Wykrywacz twarzy blokuje w bieżącym wątku aż do zakończenia przetwarzania obrazu lub ramki wejściowej. Do unikaj blokowania bieżącego wątku, uruchamiaj przetwarzanie w tle w iOS na iOS Dispatch lub NSOperation zasad.

  • W trybie transmisji na żywo zadanie wykrywania twarzy jest natychmiast przywracane i nie blokuje bieżącego wątku. Wywołuje on metodę faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) metoda z wynikiem wykrywania twarzy po przetworzeniu każdej klatki wejściowej. Wykrywanie twarzy asynchronicznie wywołuje tę metodę w dedykowanym kolejki wysyłki. Aby wyświetlić wyniki w interfejsie, wyślij do głównej kolejki po przetworzeniu wyników. Jeśli detectAsync jest wywoływana, gdy zadanie Wykrywacz twarzy jest zajęte przetwarzaniem innej , detektor twarzy zignoruje nową ramkę.

Obsługa i wyświetlanie wyników

Po przeprowadzeniu wnioskowania zadanie Wykrywacz twarzy zwraca błąd FaceDetectorResult który zawiera ramki ograniczające wykrytych twarzy, a także poziom ufności. wynik dla każdej wykrytej twarzy.

Poniżej znajdziesz przykładowe dane wyjściowe tego zadania:

FaceDetectionResult:
  Detections:
    Detection #0:
      BoundingBox:
        origin_x: 126
        origin_y: 100
        width: 463
        height: 463
      Categories:
        Category #0:
          index: 0
          score: 0.9729152917861938
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.18298381567001343
          y: 0.2961040139198303
        NormalizedKeypoint #1:
          x: 0.3302789330482483
          y: 0.29289937019348145
        ... (6 keypoints for each face)
    Detection #1:
      BoundingBox:
        origin_x: 616
        origin_y: 193
        width: 430
        height: 430
      Categories:
        Category #0:
          index: 0
          score: 0.9251380562782288
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.6151331663131714
          y: 0.3713381886482239
        NormalizedKeypoint #1:
          x: 0.7460576295852661
          y: 0.38825345039367676
        ... (6 keypoints for each face)

Ten obraz przedstawia wizualizację danych wyjściowych zadania:

Zobacz oryginalny obraz obrazu bez ramek ograniczających.

Przykładowy kod wykrywania twarzy pokazuje, jak wyświetlić wyniki. Zobacz przykładowego kodu.