Detyra MediaPipe Face Landmarker ju lejon të zbuloni pikat referuese të fytyrës dhe shprehjet e fytyrës në imazhe dhe video. Ju mund ta përdorni këtë detyrë për të identifikuar shprehjet e fytyrës njerëzore, për të aplikuar filtra dhe efekte të fytyrës dhe për të krijuar avatarë virtualë. Kjo detyrë përdor modele të mësimit të makinerive (ML) që mund të funksionojnë me imazhe të vetme, video ose një rrymë të vazhdueshme imazhesh. Detyra nxjerr pika referimi 3-dimensionale të fytyrës, rezultatet e formës së përzierjes (koeficientët që përfaqësojnë shprehjen e fytyrës) për të nxjerrë përfundime të sipërfaqeve të detajuara të fytyrës në kohë reale dhe matricat e transformimit për të kryer transformimet e kërkuara për paraqitjen e efekteve.
Shembulli i kodit i përshkruar në këto udhëzime është i disponueshëm në GitHub . Ju mund ta shihni këtë detyrë në veprim duke parë këtë demonstrim në ueb . Për më shumë informacion rreth aftësive, modeleve dhe opsioneve të konfigurimit të kësaj detyre, shihni Përmbledhjen .
Shembull kodi
Kodi i shembullit të MediaPipe Tasks është një zbatim bazë i një aplikacioni Face Landmarker për iOS. Shembulli përdor kamerën në një pajisje fizike iOS për të zbuluar pikat referuese të fytyrës në një transmetim të vazhdueshëm video. Aplikacioni mund të zbulojë gjithashtu pikat referuese të fytyrës në imazhe dhe video nga galeria e pajisjes.
Mund ta përdorni aplikacionin si pikënisje për aplikacionin tuaj iOS ose t'i referoheni kur modifikoni një aplikacion ekzistues. Kodi i shembullit të Face Landmarker gjendet në GitHub .
Shkarkoni kodin
Udhëzimet e mëposhtme ju tregojnë se si të krijoni një kopje lokale të kodit shembull duke përdorur mjetin e linjës së komandës git .
Për të shkarkuar kodin shembull:
Klononi depon e git duke përdorur komandën e mëposhtme:
git clone https://github.com/google-ai-edge/mediapipe-samples
Opsionale, konfiguroni shembullin tuaj të git për të përdorur arkëtimin e rrallë, në mënyrë që të keni vetëm skedarët për shembullin e aplikacionit Face Landmarker:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/face_landmarker/ios
Pas krijimit të një versioni lokal të kodit shembull, mund të instaloni bibliotekën e detyrave MediaPipe, të hapni projektin duke përdorur Xcode dhe të ekzekutoni aplikacionin. Për udhëzime, shihni Udhëzuesin e konfigurimit për iOS .
Komponentët kryesorë
Skedarët e mëposhtëm përmbajnë kodin vendimtar për shembullin e aplikacionit Face Landmarker:
- FaceLandmarkerService.swift : Inicializon Face Landmarker, trajton zgjedhjen e modelit dhe ekzekuton konkluzionet në të dhënat hyrëse.
- CameraViewController.swift : Zbaton ndërfaqen e përdoruesit për modalitetin e hyrjes së furnizimit të drejtpërdrejtë të kamerës dhe vizualizon rezultatet.
- MediaLibraryViewController.swift : Zbaton ndërfaqen e përdoruesit për modalitetet e futjes së skedarëve të imazheve dhe videove dhe vizualizon rezultatet.
Konfigurimi
Ky seksion përshkruan hapat kryesorë për konfigurimin e mjedisit tuaj të zhvillimit dhe projekteve të kodit për të përdorur Face Landmarker. Për informacion të përgjithshëm mbi konfigurimin e mjedisit tuaj të zhvillimit për përdorimin e detyrave të MediaPipe, duke përfshirë kërkesat e versionit të platformës, shihni udhëzuesin e konfigurimit për iOS .
varësitë
Face Landmarker përdor bibliotekën MediaPipeTasksVision
, e cila duhet të instalohet duke përdorur CocoaPods. Biblioteka është e pajtueshme me të dy aplikacionet Swift dhe Objective-C dhe nuk kërkon ndonjë konfigurim shtesë specifik për gjuhën.
Për udhëzime për instalimin e CocoaPods në MacOS, referojuni udhëzuesit të instalimit të CocoaPods . Për udhëzime se si të krijoni një Podfile
me pods-et e nevojshme për aplikacionin tuaj, referojuni Përdorimit të CocoaPods .
Shtoni podin MediaPipeTasksVision
në Podfile
duke përdorur kodin e mëposhtëm:
target 'MyFaceLandmarkerApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
Nëse aplikacioni juaj përfshin objektiva testimi të njësisë, referojuni Udhëzuesit të konfigurimit për iOS për informacion shtesë mbi konfigurimin e skedarit tuaj Podfile
.
Model
Detyra MediaPipe Face Landmarker kërkon një paketë modeli të trajnuar që është në përputhje me këtë detyrë. Për më shumë informacion rreth modeleve të trajnuara të disponueshme për Face Landmarker, shihni seksionin Modelet e përmbledhjes së detyrave.
Zgjidhni dhe shkarkoni një model dhe shtoni atë në drejtorinë e projektit tuaj duke përdorur Xcode. Për udhëzime se si të shtoni skedarë në projektin tuaj Xcode, referojuni Menaxhimi i skedarëve dhe dosjeve në projektin tuaj Xcode .
Përdorni veçorinë BaseOptions.modelAssetPath
për të specifikuar shtegun drejt modelit në paketën tuaj të aplikacionit. Për një shembull kodi, shihni seksionin tjetër.
Krijo detyrën
Ju mund të krijoni detyrën Face Landmarker duke thirrur një nga inicializuesit e tij. Inicializuesi FaceLandmarker(options:)
pranon vlerat për opsionet e konfigurimit.
Nëse nuk keni nevojë për një Face Landmarker të inicializuar me opsione të personalizuara të konfigurimit, mund të përdorni iniciatorin FaceLandmarker(modelPath:)
për të krijuar një Face Landmarker me opsionet e paracaktuara. Për më shumë informacion rreth opsioneve të konfigurimit, shihni Përmbledhjen e konfigurimit .
Detyra Face Landmarker mbështet 3 lloje të dhënash hyrëse: imazhe statike, skedarë video dhe transmetime video të drejtpërdrejta. Si parazgjedhje, FaceLandmarker(modelPath:)
inicializon një detyrë për imazhet statike. Nëse dëshironi që detyra juaj të inicializohet për të përpunuar skedarë video ose transmetime video të drejtpërdrejta, përdorni FaceLandmarker(options:)
për të specifikuar modalitetin e ekzekutimit të videos ose transmetimit të drejtpërdrejtë. Modaliteti i transmetimit të drejtpërdrejtë kërkon gjithashtu opsionin shtesë të konfigurimit të faceLandmarkerLiveStreamDelegate
, i cili i mundëson Face Landmarker t'i japë delegatit në mënyrë asinkrone rezultatet e shënuesve të fytyrës.
Zgjidhni skedën që korrespondon me modalitetin tuaj të ekzekutimit për të parë se si të krijoni detyrën dhe të ekzekutoni konkluzionet.
Swift
Imazhi
import MediaPipeTasksVision let modelPath = Bundle.main.path( forResource: "face_landmarker", ofType: "task") let options = FaceLandmarkerOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .image options.minFaceDetectionConfidence = minFaceDetectionConfidence options.minFacePresenceConfidence = minFacePresenceConfidence options.minTrackingConfidence = minTrackingConfidence options.numFaces = numFaces let faceLandmarker = try FaceLandmarker(options: options)
Video
import MediaPipeTasksVision let modelPath = Bundle.main.path( forResource: "face_landmarker", ofType: "task") let options = FaceLandmarkerOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .video options.minFaceDetectionConfidence = minFaceDetectionConfidence options.minFacePresenceConfidence = minFacePresenceConfidence options.minTrackingConfidence = minTrackingConfidence options.numFaces = numFaces let faceLandmarker = try FaceLandmarker(options: options)
Transmetim i drejtpërdrejtë
import MediaPipeTasksVision // Class that conforms to the `FaceLandmarkerLiveStreamDelegate` protocol and // implements the method that the face landmarker calls once it finishes // performing face landmark detection in each input frame. class FaceLandmarkerResultProcessor: NSObject, FaceLandmarkerLiveStreamDelegate { func faceLandmarker( _ faceLandmarker: FaceLandmarker, didFinishDetection result: FaceLandmarkerResult?, timestampInMilliseconds: Int, error: Error?) { // Process the face landmarker result or errors here. } } let modelPath = Bundle.main.path( forResource: "face_landmarker", ofType: "task") let options = FaceLandmarkerOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .liveStream options.minFaceDetectionConfidence = minFaceDetectionConfidence options.minFacePresenceConfidence = minFacePresenceConfidence options.minTrackingConfidence = minTrackingConfidence options.numFaces = numFaces // Assign an object of the class to the `faceLandmarkerLiveStreamDelegate` // property. let processor = FaceLandmarkerResultProcessor() options.faceLandmarkerLiveStreamDelegate = processor let faceLandmarker = try FaceLandmarker(options: options)
Objektivi-C
Imazhi
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"face_landmarker" ofType:@"task"]; MPPFaceLandmarkerOptions *options = [[MPPFaceLandmarkerOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeImage; options.minFaceDetectionConfidence = minFaceDetectionConfidence; options.minFacePresenceConfidence = minFacePresenceConfidence; options.minTrackingConfidence = minTrackingConfidence; options.numFaces = numFaces; MPPFaceLandmarker *faceLandmarker = [[MPPFaceLandmarker alloc] initWithOptions:options error:nil];
Video
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"face_landmarker" ofType:@"task"]; MPPFaceLandmarkerOptions *options = [[MPPFaceLandmarkerOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeVideo; options.minFaceDetectionConfidence = minFaceDetectionConfidence; options.minFacePresenceConfidence = minFacePresenceConfidence; options.minTrackingConfidence = minTrackingConfidence; options.numFaces = numFaces; MPPFaceLandmarker *faceLandmarker = [[MPPFaceLandmarker alloc] initWithOptions:options error:nil];
Transmetim i drejtpërdrejtë
@import MediaPipeTasksVision; // Class that conforms to the `MPPFaceLandmarkerLiveStreamDelegate` protocol // and implements the method that the face landmarker calls once it finishes // performing face landmark detection in each input frame. @interface APPFaceLandmarkerResultProcessor : NSObject@end @implementation APPFaceLandmarkerResultProcessor - (void)faceLandmarker:(MPPFaceLandmarker *)faceLandmarker didFinishDetectionWithResult:(MPPFaceLandmarkerResult *)faceLandmarkerResult timestampInMilliseconds:(NSInteger)timestampInMilliseconds error:(NSError *)error { // Process the face landmarker result or errors here. } @end NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"face_landmarker" ofType:@"task"]; MPPFaceLandmarkerOptions *options = [[MPPFaceLandmarkerOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeLiveStream; options.minFaceDetectionConfidence = minFaceDetectionConfidence; options.minFacePresenceConfidence = minFacePresenceConfidence; options.minTrackingConfidence = minTrackingConfidence; options.numFaces = numFaces; // Assign an object of the class to the `faceLandmarkerLiveStreamDelegate` // property. APPFaceLandmarkerResultProcessor *processor = [APPFaceLandmarkerResultProcessor new]; options.faceLandmarkerLiveStreamDelegate = processor; MPPFaceLandmarker *faceLandmarker = [[MPPFaceLandmarker alloc] initWithOptions:options error:nil];
Shënim: Nëse përdorni modalitetin e videos ose modalitetin e transmetimit të drejtpërdrejtë, Face Landmarker përdor gjurmimin për të shmangur aktivizimin e modelit të zbulimit në çdo kornizë, gjë që ndihmon në uljen e vonesës.
Opsionet e konfigurimit
Kjo detyrë ka opsionet e mëposhtme të konfigurimit për aplikacionet iOS:
Emri i opsionit | Përshkrimi | Gama e vlerave | Vlera e paracaktuar |
---|---|---|---|
runningMode | Vendos modalitetin e ekzekutimit për detyrën. Face Landmarker ka tre mënyra: IMAGE: Modaliteti për hyrjet e një imazhi të vetëm. VIDEO: Modaliteti për kornizat e dekoduara të një videoje. LIVE_STREAM: Modaliteti për një transmetim të drejtpërdrejtë të të dhënave hyrëse, si p.sh. nga një aparat fotografik. Në këtë modalitet, "faceLandmarkerLiveStreamDelegate" duhet të vendoset në një shembull të një klase që zbaton "FaceLandmarkerLiveStreamDelegate" për të marrë rezultatet e kryerjes së zbulimit të pikës referimi të fytyrës në mënyrë asinkrone. | {RunningMode.image, RunningMode.video, RunningMode.liveStream} | {RunningMode.image} |
numFaces | Numri maksimal i fytyrave që mund të zbulohen nga Shënuesi i Fytyrës. Zbutja zbatohet vetëm kur numFaces është vendosur në 1. | Numër i plotë > 0 | 1 |
minFaceDetectionConfidence | Rezultati minimal i besimit për zbulimin e fytyrës për t'u konsideruar i suksesshëm. | Float [0,0,1,0] | 0.5 |
minFacePresenceConfidence | Rezultati minimal i besimit të rezultatit të pranisë së fytyrës në zbulimin e pikës referimi të fytyrës. | Float [0,0,1,0] | 0.5 |
minTrackingConfidence | Rezultati minimal i besimit për gjurmimin e fytyrës për t'u konsideruar i suksesshëm. | Float [0,0,1,0] | 0.5 |
outputFaceBlendshapes | Nëse FaceLandmarker nxjerr format e përzierjes së fytyrave. Format e përzierjes së fytyrës përdoren për paraqitjen e modelit të fytyrës 3D. | Bool | e rreme |
outputFacialTransformationMatrixes | Nëse FaceLandmarker nxjerr matricën e transformimit të fytyrës. FaceLandmarker përdor matricën për të transformuar pikat referuese të fytyrës nga një model kanonik i fytyrës në fytyrën e zbuluar, në mënyrë që përdoruesit të mund të aplikojnë efekte në pikat referuese të zbuluara. | Bool | e rreme |
Kur modaliteti i funksionimit caktohet në LIVE_STREAM
, Face Landmarker kërkon opsionin shtesë të konfigurimit të faceLandmarkerLiveStreamDelegate
, i cili i mundëson Face Landmarker të japë rezultatet e zbulimit të pikës referimi të fytyrës në mënyrë asinkrone. I deleguari duhet të zbatojë metodën faceLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)
, të cilën Face Landmarker e quan pas përpunimit të rezultateve të kryerjes së zbulimit të pikës referimi të fytyrës në çdo kornizë.
Emri i opsionit | Përshkrimi | Gama e vlerave | Vlera e paracaktuar |
---|---|---|---|
faceLandmarkerLiveStreamDelegate | Aktivizon Face Landmarker të marrë rezultatet e kryerjes së zbulimit të pikës referimi të fytyrës në mënyrë asinkrone në modalitetin e transmetimit të drejtpërdrejtë. Klasa instanca e së cilës është caktuar në këtë veti duhet të zbatojë metodën faceLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) . | E pazbatueshme | Nuk është vendosur |
Përgatitni të dhënat
Ju duhet të konvertoni imazhin ose kornizën hyrëse në një objekt MPImage
përpara se ta kaloni atë te Face Landmarker. MPImage
mbështet lloje të ndryshme të formateve të imazhit iOS dhe mund t'i përdorë ato në çdo modalitet ekzekutimi për përfundime. Për më shumë informacion rreth MPImage
, referojuni MPImage API .
Zgjidhni një format imazhi iOS bazuar në rastin tuaj të përdorimit dhe mënyrën e ekzekutimit që kërkon aplikacioni juaj. MPImage
pranon formatet e imazhit UIImage
, CVPixelBuffer
dhe CMSampleBuffer
iOS.
UIIimazh
Formati UIImage
është i përshtatshëm për mënyrat e mëposhtme të funksionimit:
Imazhet: imazhet nga një grup aplikacioni, galeri përdoruesish ose sistem skedarësh të formatuar si imazhe
UIImage
mund të konvertohen në një objektMPImage
.Videot: përdorni AVAssetImageGenerator për të nxjerrë kornizat e videos në formatin CGImage , më pas i konvertoni ato në imazhe
UIImage
.
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)
Objektivi-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];
Shembulli inicializon një MPImage
me orientimin e paracaktuar UIImage.Orientation.Up . Mund të inicializoni një MPImage
me ndonjë nga vlerat e mbështetura të UIImage.Orientation . Face Landmarker nuk mbështet orientime të pasqyruara si .upMirrored
, .downMirrored
, .leftMirrored
, .rightMirrored
.
Për më shumë informacion rreth UIImage
, referojuni Dokumentacionit të Zhvilluesit të UIImage Apple .
CVPixelBuffer
Formati CVPixelBuffer
është i përshtatshëm për aplikacionet që gjenerojnë korniza dhe përdorin kornizën iOS CoreImage për përpunim.
Formati CVPixelBuffer
është i përshtatshëm për mënyrat e mëposhtme të funksionimit:
Imazhet: aplikacionet që gjenerojnë imazhe
CVPixelBuffer
pas disa përpunimit duke përdorur kornizënCoreImage
të iOS, mund të dërgohen te Face Landmarker në modalitetin e ekzekutimit të imazhit.Videot: kornizat e videos mund të konvertohen në formatin
CVPixelBuffer
për përpunim dhe më pas të dërgohen te Face Landmarker në modalitetin e videos.transmetim i drejtpërdrejtë: aplikacionet që përdorin një kamerë iOS për të gjeneruar korniza mund të konvertohen në formatin
CVPixelBuffer
për përpunim përpara se të dërgohen te Face Landmarker në modalitetin e transmetimit të drejtpërdrejtë.
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)
Objektivi-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];
Për më shumë informacion rreth CVPixelBuffer
, referojuni Dokumentacionit të Zhvilluesit të Apple CVPixelBuffer .
CMSampleBuffer
Formati CMSampleBuffer
ruan mostrat e mediave të një lloji uniform të medias dhe është i përshtatshëm për modalitetin e ekzekutimit të transmetimit të drejtpërdrejtë. Kornizat e drejtpërdrejta nga kamerat iOS shpërndahen në mënyrë asinkrone në formatin CMSampleBuffer
nga 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)
Objektivi-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];
Për më shumë informacion rreth CMSampleBuffer
, referojuni Dokumentacionit të Zhvilluesit të Apple CMSampleBuffer .
Drejtoni detyrën
Për të ekzekutuar Face Landmarker, përdorni metodën detect()
specifike për modalitetin e caktuar të funksionimit:
- Imazhi i palëvizshëm:
detect(image:)
- Video:
detect(videoFrame:timestampInMilliseconds:)
- Transmetimi i drejtpërdrejtë:
detectAsync(image:timestampInMilliseconds:)
Shembujt e mëposhtëm të kodit tregojnë shembuj bazë se si të ekzekutohet Face Landmarker në këto mënyra të ndryshme drejtimi:
Swift
Imazhi
let result = try faceLandmarker.detect(image: image)
Video
let result = try faceLandmarker.detect( videoFrame: image, timestampInMilliseconds: timestamp)
Transmetim i drejtpërdrejtë
try faceLandmarker.detectAsync( image: image, timestampInMilliseconds: timestamp)
Objektivi-C
Imazhi
MPPFaceLandmarkerResult *result = [faceLandmarker detectImage:image error:nil];
Video
MPPFaceLandmarkerResult *result = [faceLandmarker detectVideoFrame:image timestampInMilliseconds:timestamp error:nil];
Transmetim i drejtpërdrejtë
BOOL success = [faceLandmarker detectAsyncImage:image timestampInMilliseconds:timestamp error:nil];
Shembulli i kodit Face Landmarker tregon implementimet e secilës prej këtyre mënyrave në mënyrë më të detajuar detect(image:)
, detect(videoFrame:timestampInMilliseconds:)
dhe detectAsync(image:timestampInMilliseconds:)
. Kodi shembull i lejon përdoruesit të kalojë ndërmjet mënyrave të përpunimit që mund të mos kërkohen për rastin tuaj të përdorimit.
Vini re sa vijon:
Kur ekzekutoni në modalitetin e videos ose në modalitetin e transmetimit të drejtpërdrejtë, duhet të jepni gjithashtu vulën kohore të kornizës së hyrjes në detyrën Face Landmarker.
Kur ekzekutohet në modalitetin e imazhit ose të videos, detyra Face Landmarker bllokon fillin aktual derisa të përfundojë përpunimin e imazhit ose kornizës hyrëse. Për të shmangur bllokimin e fillit aktual, ekzekutoni përpunimin në një fill në sfond duke përdorur kornizat iOS Dispatch ose NSOoperation . Nëse aplikacioni juaj është krijuar duke përdorur Swift, mund të përdorni gjithashtu Swift Concurrency për ekzekutimin e fillit në sfond.
Kur ekzekutohet në modalitetin e transmetimit të drejtpërdrejtë, detyra e Face Landmarker kthehet menjëherë dhe nuk e bllokon lidhjen aktuale. Ai thërret metodën
faceLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)
me rezultatin e zbulimit të pikës referimi të fytyrës pas përpunimit të çdo kornize hyrëse. Face Landmarker e thërret këtë metodë në mënyrë asinkrone në një radhë të dedikuar dërgimi serik. Për shfaqjen e rezultateve në ndërfaqen e përdoruesit, dërgoni rezultatet në radhën kryesore pas përpunimit të rezultateve.
Trajtoni dhe shfaqni rezultatet
Pas ekzekutimit të konkluzionit, Face Landmarker kthen një FaceLandmarkerResult
i cili përmban një rrjetë fytyre për çdo fytyrë të zbuluar, me koordinata për çdo pikë referimi të fytyrës. Opsionale, objekti i rezultatit mund të përmbajë gjithashtu forma të përzierjes, të cilat tregojnë shprehjet e fytyrës dhe matricat e transformimit të fytyrës për të aplikuar efektet e fytyrës në pikat referuese të zbuluara.
Më poshtë tregon një shembull të të dhënave dalëse nga kjo detyrë:
FaceLandmarkerResult:
face_landmarks:
NormalizedLandmark #0:
x: 0.5971359014511108
y: 0.485361784696579
z: -0.038440968841314316
NormalizedLandmark #1:
x: 0.3302789330482483
y: 0.29289937019348145
z: -0.09489090740680695
... (478 landmarks for each face)
face_blendshapes:
browDownLeft: 0.8296722769737244
browDownRight: 0.8096957206726074
browInnerUp: 0.00035583582939580083
browOuterUpLeft: 0.00035752105759456754
... (52 blendshapes for each face)
facial_transformation_matrixes:
[9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
[1.66496094e-02, 9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
...
Imazhi i mëposhtëm tregon një vizualizim të daljes së detyrës:
Kodi i shembullit të Face Landmarker demonstron se si të shfaqen rezultatet e kthyera nga detyra, shihni FaceOverlay.swift për më shumë detaje.