ML Kit предоставляет два оптимизированных SDK для определения позы.
Имя SDK | Обнаружение позы | PoseDetectionAccurate |
---|---|---|
Выполнение | Ресурсы для базового детектора статически связаны с вашим приложением во время сборки. | Ресурсы для точного детектора статически связаны с вашим приложением во время сборки. |
Размер приложения | До 29,6 МБ | До 33,2 МБ |
Производительность | iPhone X: ~45 кадров в секунду | iPhone X: ~29 кадров в секунду |
Попробуйте это
- Поэкспериментируйте с примером приложения, чтобы увидеть пример использования этого API.
Прежде чем начать
Включите в свой подфайл следующие модули ML Kit:
# If you want to use the base implementation: pod 'GoogleMLKit/PoseDetection', '15.5.0' # If you want to use the accurate implementation: pod 'GoogleMLKit/PoseDetectionAccurate', '15.5.0'
После установки или обновления модулей вашего проекта откройте проект Xcode, используя его
xcworkspace
. ML Kit поддерживается в Xcode версии 13.2.1 или выше.
1. Создайте экземпляр PoseDetector
Чтобы обнаружить позу на изображении, сначала создайте экземпляр PoseDetector
и при необходимости укажите настройки детектора.
Опции PoseDetector
Режим обнаружения
PoseDetector
работает в двух режимах обнаружения. Убедитесь, что вы выбрали тот, который соответствует вашему варианту использования.
-
stream
(по умолчанию) - Детектор позы сначала обнаружит самого заметного человека на изображении, а затем запустит определение позы. В последующих кадрах этап обнаружения человека не будет выполняться, пока человек не станет скрытым или не будет обнаружен с высокой степенью достоверности. Детектор позы попытается отследить наиболее выдающегося человека и вернуть его позу при каждом выводе. Это уменьшает задержку и упрощает обнаружение. Используйте этот режим, если вы хотите обнаружить позу в видеопотоке.
-
singleImage
- Детектор позы обнаружит человека, а затем запустит обнаружение позы. Этап обнаружения человека будет выполняться для каждого изображения, поэтому задержка будет выше, а отслеживание людей не будет выполняться. Используйте этот режим при использовании определения позы на статичных изображениях или там, где отслеживание нежелательно.
Укажите параметры детектора позы:
Быстрый
// Base pose detector with streaming, when depending on the PoseDetection SDK let options = PoseDetectorOptions() options.detectorMode = .stream // Accurate pose detector on static images, when depending on the // PoseDetectionAccurate SDK let options = AccuratePoseDetectorOptions() options.detectorMode = .singleImage
Цель-C
// Base pose detector with streaming, when depending on the PoseDetection SDK MLKPoseDetectorOptions *options = [[MLKPoseDetectorOptions alloc] init]; options.detectorMode = MLKPoseDetectorModeStream; // Accurate pose detector on static images, when depending on the // PoseDetectionAccurate SDK MLKAccuratePoseDetectorOptions *options = [[MLKAccuratePoseDetectorOptions alloc] init]; options.detectorMode = MLKPoseDetectorModeSingleImage;
Наконец, получите экземпляр PoseDetector
. Передайте указанные вами параметры:
Быстрый
let poseDetector = PoseDetector.poseDetector(options: options)
Цель-C
MLKPoseDetector *poseDetector = [MLKPoseDetector poseDetectorWithOptions:options];
2. Подготовьте входное изображение
Чтобы обнаружить позы, выполните следующие действия для каждого изображения или кадра видео. Если вы включили потоковый режим, вам необходимо создать объекты VisionImage
из CMSampleBuffer
s.
Создайте объект 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. Обработка изображения
Передайте
VisionImage
одному из методов обработки изображений детектора позы. Вы можете использовать либо метод асинхронногоprocess(image:)
, либо метод синхронныхresults()
.Чтобы обнаружить объекты синхронно:
Быстрый
var results: [Pose] do { results = try poseDetector.results(in: image) } catch let error { print("Failed to detect pose with error: \(error.localizedDescription).") return } guard let detectedPoses = results, !detectedPoses.isEmpty else { print("Pose detector returned no results.") return } // Success. Get pose landmarks here.
Цель-C
NSError *error; NSArray
*poses = [poseDetector resultsInImage:image error:&error]; if (error != nil) { // Error. return; } if (poses.count == 0) { // No pose detected. return; } // Success. Get pose landmarks here. Чтобы обнаружить объекты асинхронно:
Быстрый
poseDetector.process(image) { detectedPoses, error in guard error == nil else { // Error. return } guard !detectedPoses.isEmpty else { // No pose detected. return } // Success. Get pose landmarks here. }
Цель-C
[poseDetector processImage:image completion:^(NSArray
* _Nullable poses, NSError * _Nullable error) { if (error != nil) { // Error. return; } if (poses.count == 0) { // No pose detected. return; } // Success. Get pose landmarks here. }]; 4. Получить информацию об обнаруженной позе
Если на изображении обнаружен человек, API обнаружения позы либо передает массив объектов
Pose
обработчику завершения, либо возвращает массив, в зависимости от того, вызвали ли вы асинхронный или синхронный метод.Если человек не находился полностью внутри изображения, модель присваивает координаты недостающих ориентиров за пределами кадра и присваивает им низкие значения InFrameConfidence.
Если ни один человек не был обнаружен, массив пуст.
Быстрый
for pose in detectedPoses { let leftAnkleLandmark = pose.landmark(ofType: .leftAnkle) if leftAnkleLandmark.inFrameLikelihood > 0.5 { let position = leftAnkleLandmark.position } }
Цель-C
for (MLKPose *pose in detectedPoses) { MLKPoseLandmark *leftAnkleLandmark = [pose landmarkOfType:MLKPoseLandmarkTypeLeftAnkle]; if (leftAnkleLandmark.inFrameLikelihood > 0.5) { MLKVision3DPoint *position = leftAnkleLandmark.position; } }
Советы по повышению производительности
Качество результатов зависит от качества входного изображения:
- Чтобы ML Kit мог точно определить позу, человек на изображении должен быть представлен достаточным количеством пиксельных данных; для достижения наилучшего качества размер объекта должен быть не менее 256x256 пикселей.
- Если вы обнаруживаете позу в приложении реального времени, вам также может потребоваться учитывать общие размеры входных изображений. Изображения меньшего размера можно обрабатывать быстрее, поэтому, чтобы уменьшить задержку, снимайте изображения с более низким разрешением, но помните о вышеуказанных требованиях к разрешению и следите за тем, чтобы объект занимал как можно большую часть изображения.
- Плохая фокусировка изображения также может повлиять на точность. Если вы не получили приемлемых результатов, попросите пользователя повторно сделать снимок.
Если вы хотите использовать определение позы в приложении реального времени, следуйте этим рекомендациям для достижения наилучшей частоты кадров:
- Используйте базовый SDK PoseDetection и режим обнаружения
stream
. - Рассмотрите возможность захвата изображений с более низким разрешением. Однако также имейте в виду требования к размеру изображения этого API.
- Для обработки видеокадров используйте синхронный API
results(in:)
детектора. Вызовите этот метод из функции captureOutput(_, DidOutput:from:) AVCaptureVideoDataOutputSampleBufferDelegate , чтобы синхронно получить результаты из данного видеокадра. Оставьте для AVCaptureVideoDataOutput значение AlwaysDiscardsLateVideoFrames как true, чтобы ограничить вызовы детектора. Если во время работы детектора появится новый видеокадр, он будет удален. - Если вы используете выходные данные детектора для наложения графики на входное изображение, сначала получите результат из ML Kit, затем визуализируйте изображение и наложите его за один шаг. При этом вы выполняете рендеринг на поверхность дисплея только один раз для каждого обработанного входного кадра. Пример см. в классах PreviewOverlayView и MLKDetectionOverlayView в примере приложения-демонстратора.
Следующие шаги
- Чтобы узнать, как использовать ориентиры поз для классификации поз, см. Советы по классификации поз .
- Пример использования этого API см. в образце быстрого запуска ML Kit на GitHub.
Если не указано иное, контент на этой странице предоставляется по лицензии Creative Commons "С указанием авторства 4.0", а примеры кода – по лицензии Apache 2.0. Подробнее об этом написано в правилах сайта. Java – это зарегистрированный товарный знак корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2024-11-12 UTC.
[null,null,["Последнее обновление: 2024-11-12 UTC."],[],[]]