راهنمای تشخیص چهره برای iOS

وظیفه MediaPipe Face Landmarker به شما امکان می دهد نشانه های چهره و حالات چهره را در تصاویر و ویدیوها تشخیص دهید. می توانید از این کار برای شناسایی حالات چهره انسان، اعمال فیلترها و افکت های صورت و ایجاد آواتارهای مجازی استفاده کنید. این کار از مدل‌های یادگیری ماشینی (ML) استفاده می‌کند که می‌توانند با تصاویر، ویدیوها یا جریان مداوم تصاویر کار کنند. این کار، نشانه‌های سه بعدی چهره، امتیازهای ترکیبی (ضرایبی که بیانگر حالت چهره است) برای استنتاج جزئیات سطوح صورت در زمان واقعی، و ماتریس‌های تبدیل برای انجام دگرگونی‌های مورد نیاز برای رندر افکت‌ها را خروجی می‌دهد.

نمونه کد شرح داده شده در این دستورالعمل ها در GitHub موجود است. شما می توانید با مشاهده این نسخه نمایشی وب، این کار را در عمل مشاهده کنید. برای اطلاعات بیشتر در مورد قابلیت‌ها، مدل‌ها و گزینه‌های پیکربندی این کار، به نمای کلی مراجعه کنید.

نمونه کد

کد مثال MediaPipe Tasks یک پیاده سازی اساسی از یک برنامه Face Landmarker برای iOS است. این مثال از دوربین یک دستگاه فیزیکی iOS برای شناسایی نشانه‌های چهره در یک جریان ویدیویی مداوم استفاده می‌کند. این برنامه همچنین می تواند نشانه های چهره را در تصاویر و ویدیوهای گالری دستگاه تشخیص دهد.

می‌توانید از برنامه به‌عنوان نقطه شروع برای برنامه iOS خودتان استفاده کنید، یا هنگام تغییر یک برنامه موجود به آن مراجعه کنید. کد نمونه Face Landmarker در GitHub میزبانی می شود.

کد را دانلود کنید

دستورالعمل های زیر به شما نشان می دهد که چگونه با استفاده از ابزار خط فرمان git یک کپی محلی از کد مثال ایجاد کنید.

برای دانلود کد نمونه:

  1. با استفاده از دستور زیر مخزن git را کلون کنید:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. به صورت اختیاری، نمونه git خود را برای استفاده از پرداخت پراکنده پیکربندی کنید، بنابراین فقط فایل‌های برنامه نمونه Face Landmarker را در اختیار داشته باشید:

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

پس از ایجاد یک نسخه محلی از کد نمونه، می توانید کتابخانه وظایف MediaPipe را نصب کنید، پروژه را با استفاده از Xcode باز کنید و برنامه را اجرا کنید. برای دستورالعمل‌ها، به راهنمای راه‌اندازی برای iOS مراجعه کنید.

اجزای کلیدی

فایل‌های زیر حاوی کد حیاتی برای برنامه نمونه Face Landmarker هستند:

  • FaceLandmarkerService.swift : Face Landmarker را راه‌اندازی می‌کند، انتخاب مدل را مدیریت می‌کند و استنتاج را روی داده‌های ورودی اجرا می‌کند.
  • CameraViewController.swift : رابط کاربری را برای حالت ورودی تغذیه زنده دوربین پیاده سازی می کند و نتایج را به تصویر می کشد.
  • MediaLibraryViewController.swift : رابط کاربری را برای حالت‌های ورودی تصویر ثابت و فایل ویدیویی پیاده‌سازی می‌کند و نتایج را تجسم می‌کند.

راه اندازی

این بخش مراحل کلیدی را برای راه‌اندازی محیط توسعه و پروژه‌های کد برای استفاده از Face Landmarker شرح می‌دهد. برای اطلاعات کلی در مورد تنظیم محیط توسعه خود برای استفاده از وظایف MediaPipe، از جمله الزامات نسخه پلت فرم، به راهنمای راه اندازی برای iOS مراجعه کنید.

وابستگی ها

Face Landmarker از کتابخانه MediaPipeTasksVision استفاده می کند که باید با استفاده از CocoaPods نصب شود. این کتابخانه با هر دو برنامه Swift و Objective-C سازگار است و نیازی به تنظیمات زبان خاصی ندارد.

برای دستورالعمل‌های نصب CocoaPods در MacOS، به راهنمای نصب CocoaPods مراجعه کنید. برای دستورالعمل‌های نحوه ایجاد یک Podfile با پادهای لازم برای برنامه خود، به استفاده از CocoaPods مراجعه کنید.

با استفاده از کد زیر، MediaPipeTasksVision pod را در Podfile اضافه کنید:

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

اگر برنامه شما شامل اهداف تست واحد است، برای اطلاعات بیشتر در مورد راه‌اندازی Podfile ، به راهنمای تنظیم برای iOS مراجعه کنید.

مدل

وظیفه MediaPipe Face Landmarker به یک بسته مدل آموزش دیده نیاز دارد که با این کار سازگار باشد. برای اطلاعات بیشتر در مورد مدل‌های آموزش‌دیده موجود برای Face Landmarker، بخش مدل‌های نمای کلی کار را ببینید.

یک مدل را انتخاب و دانلود کنید و با استفاده از Xcode آن را به فهرست پروژه خود اضافه کنید. برای دستورالعمل‌هایی درباره نحوه افزودن فایل‌ها به پروژه Xcode، به مدیریت فایل‌ها و پوشه‌ها در پروژه Xcode خود مراجعه کنید.

از ویژگی BaseOptions.modelAssetPath برای تعیین مسیر مدل در بسته نرم افزاری خود استفاده کنید. برای مثال کد، بخش بعدی را ببینید.

کار را ایجاد کنید

می توانید با فراخوانی یکی از اولیه سازهای آن، وظیفه Face Landmarker را ایجاد کنید. آغازگر FaceLandmarker(options:) مقادیری را برای گزینه های پیکربندی می پذیرد.

اگر به یک Face Landmarker که با گزینه‌های پیکربندی سفارشی‌شده مقداردهی شده است، نیاز ندارید، می‌توانید از مقداردهی اولیه FaceLandmarker(modelPath:) برای ایجاد یک Face Landmarker با گزینه‌های پیش‌فرض استفاده کنید. برای اطلاعات بیشتر درباره گزینه‌های پیکربندی، به نمای کلی پیکربندی مراجعه کنید.

وظیفه Face Landmarker از 3 نوع داده ورودی پشتیبانی می‌کند: تصاویر ثابت، فایل‌های ویدیویی و جریان‌های ویدیویی زنده. به طور پیش فرض، FaceLandmarker(modelPath:) یک کار را برای تصاویر ثابت مقداردهی اولیه می کند. اگر می‌خواهید کار شما برای پردازش فایل‌های ویدیویی یا پخش جریانی زنده ویدیویی اولیه شود، از FaceLandmarker(options:) برای تعیین حالت اجرای ویدیو یا پخش زنده استفاده کنید. حالت پخش زنده همچنین به گزینه پیکربندی faceLandmarkerLiveStreamDelegate اضافی نیاز دارد، که Face Landmarker را قادر می‌سازد تا نتایج نشانگر چهره را به صورت ناهمزمان به نماینده ارائه دهد.

برای مشاهده نحوه ایجاد کار و اجرای استنتاج، برگه مربوط به حالت در حال اجرا خود را انتخاب کنید.

سویفت

تصویر

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)
    

ویدئو

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)
    

پخش زنده

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)
    

هدف-C

تصویر

@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];
    

ویدئو

@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];
    

پخش زنده

@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];
    

توجه: اگر از حالت ویدیو یا حالت پخش زنده استفاده می‌کنید، Face Landmarker از ردیابی برای جلوگیری از راه‌اندازی مدل تشخیص در هر فریم استفاده می‌کند که به کاهش تأخیر کمک می‌کند.

گزینه های پیکربندی

این کار دارای گزینه های پیکربندی زیر برای برنامه های iOS است:

نام گزینه توضیحات محدوده ارزش مقدار پیش فرض
runningMode حالت اجرا را برای کار تنظیم می کند. Face Landmarker سه حالت دارد:

IMAGE: حالت برای ورودی های تک تصویر.

VIDEO: حالت برای فریم های رمزگشایی شده یک ویدیو.

LIVE_STREAM: حالت پخش زنده داده های ورودی، مانند دوربین. در این حالت، «faceLandmarkerLiveStreamDelegate» باید روی نمونه‌ای از کلاسی تنظیم شود که «FaceLandmarkerLiveStreamDelegate» را برای دریافت نتایج تشخیص چهره به‌صورت ناهمزمان اجرا می‌کند.
{RunningMode.image، RunningMode.video، RunningMode.liveStream} {RunningMode.image}
numFaces حداکثر تعداد چهره هایی که می تواند توسط Face Landmarker شناسایی شود. صاف کردن فقط زمانی اعمال می شود که numFaces روی 1 تنظیم شده باشد. عدد صحیح > 0 1
minFaceDetectionConfidence حداقل امتیاز اطمینان برای تشخیص چهره موفق در نظر گرفته شود. شناور [0.0،1.0] 0.5
minFacePresenceConfidence حداقل امتیاز اطمینان نمره حضور چهره در تشخیص نقطه عطف چهره. شناور [0.0،1.0] 0.5
minTrackingConfidence حداقل امتیاز اطمینان برای ردیابی چهره موفق در نظر گرفته شود. شناور [0.0،1.0] 0.5
outputFaceBlendshapes اینکه آیا FaceLandmarker ترکیبات چهره را خروجی می‌دهد. ترکیب صورت برای رندر کردن مدل چهره سه بعدی استفاده می شود. بول نادرست
outputFacialTransformationMatrixes آیا FaceLandmarker ماتریس تبدیل چهره را خروجی می دهد یا خیر. FaceLandmarker از ماتریس برای تبدیل نشانه‌های چهره از یک مدل چهره متعارف به چهره شناسایی‌شده استفاده می‌کند، بنابراین کاربران می‌توانند افکت‌ها را روی نشانه‌های شناسایی شده اعمال کنند. بول نادرست

هنگامی که حالت در حال اجرا روی LIVE_STREAM تنظیم شده است، Face Landmarker به گزینه پیکربندی اضافی faceLandmarkerLiveStreamDelegate نیاز دارد، که به Face Landmarker امکان می دهد نتایج تشخیص نقطه عطف چهره را به صورت ناهمزمان ارائه دهد. نماینده باید متد faceLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) را اجرا کند، که Face Landmarker پس از پردازش نتایج انجام تشخیص نشانه چهره در هر فریم آن را فراخوانی می کند.

نام گزینه توضیحات محدوده ارزش مقدار پیش فرض
faceLandmarkerLiveStreamDelegate Face Landmarker را قادر می‌سازد تا نتایج تشخیص نقطه عطف چهره را به صورت ناهمزمان در حالت پخش زنده دریافت کند. کلاسی که نمونه آن روی این ویژگی تنظیم شده است باید متد faceLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) را پیاده سازی کند. قابل اجرا نیست تنظیم نشده است

داده ها را آماده کنید

قبل از ارسال آن به Face Landmarker، باید تصویر یا فریم ورودی را به یک شی MPImage تبدیل کنید. MPImage از انواع فرمت های تصویر iOS پشتیبانی می کند و می تواند از آنها در هر حالت در حال اجرا برای استنتاج استفاده کند. برای اطلاعات بیشتر در مورد MPImage ، به MPImage API مراجعه کنید.

یک قالب تصویر iOS را بر اساس مورد استفاده خود و حالت اجرای مورد نیاز برنامه خود انتخاب کنید. MPImage فرمت‌های تصویر UIImage ، CVPixelBuffer ، و CMSampleBuffer را می‌پذیرد.

تصویر UII

فرمت UIImage برای حالت‌های اجرای زیر مناسب است:

  • تصاویر: تصاویر از یک بسته نرم افزاری، گالری کاربر یا سیستم فایل فرمت شده به عنوان تصاویر UIImage را می توان به یک شی MPImage تبدیل کرد.

  • ویدیوها: از AVAssetImageGenerator برای استخراج فریم های ویدیو به فرمت CGImage استفاده کنید، سپس آنها را به تصاویر UIImage تبدیل کنید.

سویفت

// 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)
    

هدف-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];
    

این مثال یک MPImage با جهت پیش‌فرض UIImage.Orientation.Up مقداردهی اولیه می‌کند. می توانید یک MPImage با هر یک از مقادیر UIImage.Orientation پشتیبانی شده مقداردهی کنید. Face Landmarker از جهت‌های آینه‌ای مانند .upMirrored ، .downMirrored ، .leftMirrored ، .rightMirrored پشتیبانی نمی‌کند.

برای اطلاعات بیشتر در مورد UIImage ، به UIImage Apple Developer Documentation مراجعه کنید.

CVPixelBuffer

فرمت CVPixelBuffer برای برنامه هایی که فریم تولید می کنند و از چارچوب CoreImage iOS برای پردازش استفاده می کنند، مناسب است.

فرمت CVPixelBuffer برای حالت‌های اجرای زیر مناسب است:

  • تصاویر: برنامه هایی که تصاویر CVPixelBuffer پس از مدتی پردازش با استفاده از چارچوب CoreImage iOS تولید می کنند، می توانند در حالت اجرای تصویر به Face Landmarker ارسال شوند.

  • فیلم‌ها: فریم‌های ویدیو را می‌توان برای پردازش به فرمت CVPixelBuffer تبدیل کرد و سپس در حالت ویدیو به Face Landmarker فرستاد.

  • پخش زنده: برنامه هایی که از دوربین iOS برای تولید فریم استفاده می کنند ممکن است قبل از ارسال به Face Landmarker در حالت پخش زنده به فرمت CVPixelBuffer برای پردازش تبدیل شوند.

سویفت

// 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)
    

هدف-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];
    

برای اطلاعات بیشتر در مورد CVPixelBuffer ، به مستندات توسعه دهنده Apple CVPixelBuffer مراجعه کنید.

CMSampleBuffer

فرمت CMSampleBuffer نمونه‌های رسانه‌ای از یک نوع رسانه یکنواخت را ذخیره می‌کند و برای حالت پخش زنده مناسب است. قاب‌های زنده دوربین‌های iOS به‌صورت ناهمزمان در قالب CMSampleBuffer توسط iOS AVCaptureVideoDataOutput ارائه می‌شوند.

سویفت

// 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)
    

هدف-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];
    

برای اطلاعات بیشتر در مورد CMSampleBuffer ، به مستندات توسعه دهنده Apple CMSampleBuffer مراجعه کنید.

وظیفه را اجرا کنید

برای اجرای Face Landmarker، از متد detect() مخصوص حالت اجرای اختصاص داده شده استفاده کنید:

  • تصویر ثابت: detect(image:)
  • ویدیو: detect(videoFrame:timestampInMilliseconds:)
  • پخش زنده: detectAsync(image:timestampInMilliseconds:)

نمونه‌های کد زیر نمونه‌های اساسی نحوه اجرای Face Landmarker را در این حالت‌های مختلف اجرا نشان می‌دهند:

سویفت

تصویر

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

ویدئو

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

پخش زنده

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

هدف-C

تصویر

MPPFaceLandmarkerResult *result =
  [faceLandmarker detectImage:image error:nil];
    

ویدئو

MPPFaceLandmarkerResult *result =
  [faceLandmarker detectVideoFrame:image
           timestampInMilliseconds:timestamp
                             error:nil];
    

پخش زنده

BOOL success =
  [faceLandmarker detectAsyncImage:image
           timestampInMilliseconds:timestamp
                             error:nil];
    

مثال کد Face Landmarker اجرای هر یک از این حالت‌ها را با جزئیات بیشتری نشان می‌دهد detect(image:) , detect(videoFrame:timestampInMilliseconds:) و detectAsync(image:timestampInMilliseconds:) . کد مثال به کاربر اجازه می دهد تا بین حالت های پردازشی که ممکن است برای مورد استفاده شما مورد نیاز نباشد جابجا شود.

به موارد زیر توجه کنید:

  • هنگام اجرا در حالت ویدیو یا حالت پخش زنده، باید مهر زمانی فریم ورودی را نیز به وظیفه Face Landmarker ارائه دهید.

  • هنگامی که در حالت تصویر یا ویدیو اجرا می شود، وظیفه Face Landmarker رشته فعلی را مسدود می کند تا زمانی که پردازش تصویر یا فریم ورودی به پایان برسد. برای جلوگیری از مسدود کردن رشته فعلی، پردازش را در یک رشته پس‌زمینه با استفاده از چارچوب‌های iOS Dispatch یا NSOperation انجام دهید. اگر برنامه شما با استفاده از Swift ایجاد شده است، می توانید از Swift Concurrency برای اجرای رشته پس زمینه نیز استفاده کنید.

  • وقتی در حالت پخش زنده اجرا می‌شود، وظیفه Face Landmarker بلافاصله برمی‌گردد و رشته فعلی را مسدود نمی‌کند. پس از پردازش هر فریم ورودی، متد faceLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) را با نتیجه تشخیص نقطه عطف چهره فراخوانی می کند. Face Landmarker این روش را به صورت ناهمزمان در یک صف پخش سریال اختصاصی فراخوانی می کند. برای نمایش نتایج در رابط کاربری، پس از پردازش نتایج، نتایج را به صف اصلی ارسال کنید.

کنترل و نمایش نتایج

پس از اجرای استنباط، Face Landmarker یک FaceLandmarkerResult را برمی‌گرداند که حاوی یک مش چهره برای هر چهره شناسایی شده، با مختصات برای هر نقطه عطف چهره است. به صورت اختیاری، شی نتیجه می‌تواند شامل شکل‌های ترکیبی نیز باشد که بیانگر حالات چهره، و ماتریس‌های تبدیل چهره برای اعمال جلوه‌های چهره بر روی نشانه‌های شناسایی شده باشد.

شکل زیر نمونه ای از داده های خروجی از این کار را نشان می دهد:

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]
    ...

تصویر زیر تصویری از خروجی کار را نشان می دهد:

کد نمونه Face Landmarker نحوه نمایش نتایج بازگردانده شده توسط کار را نشان می دهد، برای جزئیات بیشتر به FaceOverlay.swift مراجعه کنید.