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:
Sklonuj repozytorium git za pomocą tego polecenia:
git clone https://github.com/google-ai-edge/mediapipe-samples
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:
- FaceDetectorService.swift: Inicjuje detektor, obsługuje wybór modelu i wykonuje wnioskowanie na danych wejściowych.
- CameraViewController: Implementuje interfejs trybu wprowadzania obrazu z kamery na żywo i wizualizuje wyniki wykrywania.
- MediaLibraryViewController.swift: Implementuje interfejs trybu wprowadzania zdjęć i filmów oraz wizualizuje wyniki wykrywania.
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 obiektMPImage
.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 platformyCoreImage
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ślidetectAsync
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.