Вы можете использовать ML Kit для обнаружения лиц на изображениях и видео.
Попробуйте
- Поэкспериментируйте с образцом приложения, чтобы увидеть пример использования этого API.
- Попробуйте код самостоятельно с помощью codelab .
Прежде чем вы начнете
- Включите в свой подфайл следующие модули ML Kit:
pod 'GoogleMLKit/FaceDetection', '3.2.0'
. - После установки или обновления модулей вашего проекта откройте проект Xcode, используя его
.xcworkspace
. ML Kit поддерживается в Xcode версии 12.4 или выше.
Инструкции по входному изображению
Для распознавания лица следует использовать изображение размером не менее 480х360 пикселей. Чтобы ML Kit точно обнаруживал лица, входные изображения должны содержать лица, представленные достаточным количеством данных о пикселях. Как правило, каждое лицо, которое вы хотите обнаружить на изображении, должно иметь размер не менее 100x100 пикселей. Если вы хотите определить контуры лиц, ML Kit требует ввода с более высоким разрешением: каждое лицо должно быть не менее 200x200 пикселей.
Если вы обнаруживаете лица в приложении реального времени, вы также можете учитывать общие размеры входных изображений. Изображения меньшего размера могут обрабатываться быстрее, поэтому для уменьшения задержки делайте снимки с более низким разрешением, но помните о приведенных выше требованиях к точности и следите за тем, чтобы лицо объекта занимало как можно большую часть изображения. См. также советы по повышению производительности в реальном времени .
Плохая фокусировка изображения также может повлиять на точность. Если вы не получите приемлемых результатов, попросите пользователя повторно захватить изображение.
Ориентация лица относительно камеры также может влиять на то, какие черты лица обнаруживает ML Kit. См. Принципы распознавания лиц .
1. Настройте детектор лиц
Прежде чем применять обнаружение лиц к изображению, если вы хотите изменить какие-либо настройки детектора лиц по умолчанию, укажите эти настройки с помощью объектаFaceDetectorOptions
. Вы можете изменить следующие настройки:Настройки | |
---|---|
performanceMode | fast (по умолчанию) | accurate Отдайте предпочтение скорости или точности при обнаружении лиц. |
landmarkMode | none (по умолчанию) | all Следует ли пытаться обнаружить лицевые «ориентиры» — глаза, уши, нос, щеки, рот — всех обнаруженных лиц. |
contourMode | none (по умолчанию) | all Определять ли контуры черт лица. Контуры определяются только для наиболее заметного лица на изображении. |
classificationMode | none (по умолчанию) | all Следует ли классифицировать лица по таким категориям, как «улыбающиеся» и «открытые глаза». |
minFaceSize | CGFloat (по умолчанию: 0.1 )Устанавливает наименьший желаемый размер лица, выраженный как отношение ширины головы к ширине изображения. |
isTrackingEnabled | false (по умолчанию) | true Назначать ли лицам идентификатор, который можно использовать для отслеживания лиц на изображениях. Обратите внимание, что при включенном обнаружении контуров обнаруживается только одно лицо, поэтому отслеживание лиц не дает полезных результатов. По этой причине и для повышения скорости обнаружения не включайте одновременно определение контуров и отслеживание лиц. |
Например, создайте объект FaceDetectorOptions
, как в одном из следующих примеров:
Быстрый
// High-accuracy landmark detection and face classification let options = FaceDetectorOptions() options.performanceMode = .accurate options.landmarkMode = .all options.classificationMode = .all // Real-time contour detection of multiple faces // options.contourMode = .all
Цель-C
// High-accuracy landmark detection and face classification MLKFaceDetectorOptions *options = [[MLKFaceDetectorOptions alloc] init]; options.performanceMode = MLKFaceDetectorPerformanceModeAccurate; options.landmarkMode = MLKFaceDetectorLandmarkModeAll; options.classificationMode = MLKFaceDetectorClassificationModeAll; // Real-time contour detection of multiple faces // options.contourMode = MLKFaceDetectorContourModeAll;
2. Подготовьте входное изображение
Чтобы обнаружить лица на изображении, передайте изображение какUIImage
или CMSampleBufferRef
в FaceDetector
, используя метод process(_:completion:)
или results(in:)
: Создайте объект VisionImage
, используя UIImage
или CMSampleBuffer
.
Если вы используете UIImage
, выполните следующие действия:
- Создайте объект
VisionImage
сUIImage
. Убедитесь, что вы правильно.orientation
.Быстрый
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Цель-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Если вы используете
CMSampleBuffer
, выполните следующие действия:Укажите ориентацию данных изображения, содержащихся в
CMSampleBuffer
.Чтобы получить ориентацию изображения:
Быстрый
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Цель-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- Создайте объект
VisionImage
, используя объектCMSampleBuffer
и ориентацию:Быстрый
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Цель-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. Получите экземпляр FaceDetector
Получите экземпляр
FaceDetector
:Быстрый
let faceDetector = FaceDetector.faceDetector(options: options)
Цель-C
MLKFaceDetector *faceDetector = [MLKFaceDetector faceDetectorWithOptions:options];
4. Обработайте изображение
Затем передайте изображение в методprocess()
:Быстрый
weak var weakSelf = self faceDetector.process(visionImage) { faces, error in guard let strongSelf = weakSelf else { print("Self is nil!") return } guard error == nil, let faces = faces, !faces.isEmpty else { // ... return } // Faces detected // ... }
Цель-C
[faceDetector processImage:image completion:^(NSArray<MLKFace *> *faces, NSError *error) { if (error != nil) { return; } if (faces.count > 0) { // Recognized faces } }];
5. Получить информацию об обнаруженных лицах
Если операция обнаружения лиц завершается успешно, детектор лиц передает массив объектовFace
обработчику завершения. Каждый объектFace
представляет лицо, обнаруженное на изображении. Для каждого лица вы можете получить его ограничивающие координаты на входном изображении, а также любую другую информацию, которую вы настроили для поиска детектора лиц. Например:Быстрый
for face in faces { let frame = face.frame if face.hasHeadEulerAngleX { let rotX = face.headEulerAngleX // Head is rotated to the uptoward rotX degrees } if face.hasHeadEulerAngleY { let rotY = face.headEulerAngleY // Head is rotated to the right rotY degrees } if face.hasHeadEulerAngleZ { let rotZ = face.headEulerAngleZ // Head is tilted sideways rotZ degrees } // If landmark detection was enabled (mouth, ears, eyes, cheeks, and // nose available): if let leftEye = face.landmark(ofType: .leftEye) { let leftEyePosition = leftEye.position } // If contour detection was enabled: if let leftEyeContour = face.contour(ofType: .leftEye) { let leftEyePoints = leftEyeContour.points } if let upperLipBottomContour = face.contour(ofType: .upperLipBottom) { let upperLipBottomPoints = upperLipBottomContour.points } // If classification was enabled: if face.hasSmilingProbability { let smileProb = face.smilingProbability } if face.hasRightEyeOpenProbability { let rightEyeOpenProb = face.rightEyeOpenProbability } // If face tracking was enabled: if face.hasTrackingID { let trackingId = face.trackingID } }
Цель-C
for (MLKFace *face in faces) { // Boundaries of face in image CGRect frame = face.frame; if (face.hasHeadEulerAngleX) { CGFloat rotX = face.headEulerAngleX; // Head is rotated to the upward rotX degrees } if (face.hasHeadEulerAngleY) { CGFloat rotY = face.headEulerAngleY; // Head is rotated to the right rotY degrees } if (face.hasHeadEulerAngleZ) { CGFloat rotZ = face.headEulerAngleZ; // Head is tilted sideways rotZ degrees } // If landmark detection was enabled (mouth, ears, eyes, cheeks, and // nose available): MLKFaceLandmark *leftEar = [face landmarkOfType:FIRFaceLandmarkTypeLeftEar]; if (leftEar != nil) { MLKVisionPoint *leftEarPosition = leftEar.position; } // If contour detection was enabled: MLKFaceContour *upperLipBottomContour = [face contourOfType:FIRFaceContourTypeUpperLipBottom]; if (upperLipBottomContour != nil) { NSArray<MLKVisionPoint *> *upperLipBottomPoints = upperLipBottomContour.points; if (upperLipBottomPoints.count > 0) { NSLog("Detected the bottom contour of the subject's upper lip.") } } // If classification was enabled: if (face.hasSmilingProbability) { CGFloat smileProb = face.smilingProbability; } if (face.hasRightEyeOpenProbability) { CGFloat rightEyeOpenProb = face.rightEyeOpenProbability; } // If face tracking was enabled: if (face.hasTrackingID) { NSInteger trackingID = face.trackingID; } }
Пример контуров лица
Когда у вас включено обнаружение контуров лица, вы получаете список точек для каждой обнаруженной черты лица. Эти точки представляют форму объекта. Подробную информацию о представлении контуров см. в разделе Принципы обнаружения лиц .
На следующем изображении показано, как эти точки сопоставляются с лицом. Щелкните изображение, чтобы увеличить его:
Распознавание лиц в реальном времени
Если вы хотите использовать распознавание лиц в приложении реального времени, следуйте этим рекомендациям для достижения наилучшей частоты кадров:
Настройте детектор лиц для использования либо обнаружения контуров лица, либо классификации и обнаружения ориентиров, но не того и другого:
Обнаружение контура
Обнаружение ориентира
Классификация
Обнаружение и классификация ориентиров
Обнаружение контуров и обнаружение ориентиров
Обнаружение контура и классификация
Обнаружение контуров, обнаружение ориентиров и классификацияВключить
fast
режим (включен по умолчанию).Рассмотрите возможность захвата изображений с более низким разрешением. Однако также имейте в виду требования этого API к размеру изображения.
- Для обработки видеокадров используйте синхронный API
results(in:)
детектора. Вызовите этот метод изAVCaptureVideoDataOutputSampleBufferDelegate
captureOutput(_, didOutput:from:)
чтобы синхронно получить результаты из данного видеокадра. СохраняйтеAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
какtrue
, чтобы ограничить вызовы детектора. Если новый видеокадр становится доступным во время работы детектора, он будет отброшен. - Если вы используете выходные данные детектора для наложения графики на входное изображение, сначала получите результат от ML Kit, а затем выполните визуализацию изображения и наложение за один шаг. Поступая таким образом, вы визуализируете на поверхность дисплея только один раз для каждого обработанного входного кадра. В качестве примера см. updatePreviewOverlayViewWithLastFrame в образце быстрого запуска ML Kit.
Если не указано иное, контент на этой странице предоставляется по лицензии Creative Commons "С указанием авторства 4.0", а примеры кода – по лицензии Apache 2.0. Подробнее об этом написано в правилах сайта. Java – это зарегистрированный товарный знак корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2023-09-20 UTC.
[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Отсутствует нужная мне информация" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Слишком сложен/слишком много шагов" },{ "type": "thumb-down", "id": "outOfDate", "label":"Устарел" },{ "type": "thumb-down", "id": "translationIssue", "label":"Проблема с переводом текста" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Проблемы образцов/кода" },{ "type": "thumb-down", "id": "otherDown", "label":"Другое" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Прост для понимания" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Помог мне решить мою проблему" },{ "type": "thumb-up", "id": "otherUp", "label":"Другое" }]