正确使用 CIDetectorTracking

Posted

技术标签:

【中文标题】正确使用 CIDetectorTracking【英文标题】:Proper usage of CIDetectorTracking 【发布时间】:2012-11-08 15:34:42 【问题描述】:

Apple 最近在 CIDetector 类中添加了一个名为 CIDetectorTracking 的新常量,它似乎能够跟踪视频中帧之间的人脸。如果我能弄清楚它是如何工作的,这对我来说将是非常有益的..

我已经尝试使用我能想到的远程相关的每个对象将这个键添加到检测器选项字典中,包括我的 AVCaptureStillImageOutput 实例、我正在处理的 UIImage、YES、1 等。

NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyHigh, CIDetectorAccuracy,myAVCaptureStillImageOutput,CIDetectorTracking, nil];

但无论我尝试传递什么参数,它要么崩溃(显然我在这里猜测)要么调试器输出:

指定了未知的 CIDetectorTracking。忽略。

通常情况下,我不会猜到这一点,但关于这个主题的资源几乎不存在。 Apple's class reference 状态:

用于启用或禁用检测器的面部跟踪的键。采用 当您想要跨视频帧跟踪人脸时使用此选项。

ios 6+ 和 OS X 10.8+ 除外。

CIDetector.h内的评论:

/*选项字典中用于指定该功能的键 应该使用跟踪。 */

如果这还不够糟糕,Google 搜索会提供 7 个结果(当他们找到这篇文章时为 8 个)所有这些结果要么是 Apple 类引用、API 差异、一个 SO 帖子询问如何在 iOS 5 中实现这一点,或前者的第 3 方副本。

话虽如此,任何有关正确使用 CIDetectorTracking 的提示或技巧将不胜感激!

【问题讨论】:

使用 YES 选项,您是否将其包装到 NSNumber 中? [NSNumber numberWithBool:YES]?什么是崩溃日志?此示例适用于静止图像,但如果您还没有看到它,它可能会很有用:b2cloud.com.au/how-to-guides/face-detection-in-ios-5 @CharlieMonroe 感谢您的回复,我已经尝试过了,我相信它会导致同样的崩溃。当我回到我的电脑上时,我会仔细检查日志。我只是浏览了那个教程,我不相信它会有帮助。这是一个很好的教程,但正如你所说,只涵盖静止图像,我正在寻找有关使用 iOS 6 中引入的类在帧之间进行面部跟踪的信息。 在视频中跨帧跟踪人脸是什么意思?这与单独分析每一帧有何不同? 【参考方案1】:

你是对的,这个密钥没有很好的文档记录。除了 API 文档之外,它也在:

中进行了解释 CIDetector.h 头文件 Core Image 编程指南 WWDC 2012 会议"520 - What's New in Camera Capture" 此会话的示例代码 (StacheCam 2)

我为CIDetectorTracking 尝试了不同的值,唯一接受的值似乎是@(YES)@(NO)。使用其他值,它会在控制台中打印此消息:

指定了未知的 CIDetectorTracking。忽略。

当您将值设置为@(YES) 时,您应该使用检测到的面部特征获取跟踪ID。


但是,当您想要检测从相机捕获的内容中的人脸时,您应该更喜欢 AVFoundation 中的人脸检测 API。它内置人脸跟踪,人脸检测发生在 GPU 的后台,比 CoreImage 人脸检测快得多 它需要 iOS 6 和至少 iPhone 4S 或 iPad 2。

人脸作为元数据对象 (AVMetadataFaceObject) 发送到AVCaptureMetadataOutputObjectsDelegate

您可以使用此代码(取自 StacheCam 2 和上述 WWDC 会议的幻灯片)来设置人脸检测并获取人脸元数据对象:

- (void) setupAVFoundationFaceDetection
       
    self.metadataOutput = [AVCaptureMetadataOutput new];
    if ( ! [self.session canAddOutput:self.metadataOutput] ) 
        return;
    

    // Metadata processing will be fast, and mostly updating UI which should be done on the main thread
    // So just use the main dispatch queue instead of creating a separate one
    // (compare this to the expensive CoreImage face detection, done on a separate queue)
    [self.metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    [self.session addOutput:self.metadataOutput];

    if ( ! [self.metadataOutput.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeFace] ) 
        // face detection isn't supported (via AV Foundation), fall back to CoreImage
        return;
    

    // We only want faces, if we don't set this we would detect everything available
    // (some objects may be expensive to detect, so best form is to select only what you need)
    self.metadataOutput.metadataObjectTypes = @[ AVMetadataObjectTypeFace ];



// AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput
         didOutputMetadataObjects:(NSArray *)metadataObjects
         fromConnection:(AVCaptureConnection *)c

   for ( AVMetadataObject *object in metadataObjects ) 
     if ( [[object type] isEqual:AVMetadataObjectTypeFace] ) 
      AVMetadataFaceObject* face = (AVMetadataFaceObject*)object;
      CMTime timestamp = [face time];
      CGRect faceRectangle = [face bounds];
      NSInteger faceID = [face faceID];
      CGFloat rollAngle = [face rollAngle];
      CGFloat yawAngle = [face yawAngle];
      NSNumber* faceID = @(face.faceID); // use this id for tracking
      // Do interesting things with this face
     

如果要在预览层中显示人脸框,需要获取转换后的人脸对象:

AVMetadataFaceObject * adjusted = (AVMetadataFaceObject*)[self.previewLayer transformedMetadataObjectForMetadataObject:face];

详情请查看sample code from WWDC 2012。

【讨论】:

faceRectangle 包含 .0 坐标,它类似于图像的百分比吗?究竟是什么意思? 文档中有详细解释:developer.apple.com/library/ios/documentation/AVFoundation/… 对于偏航和滚动值,我没有得到非常准确的输出。偏航角始终为 0、-45 或 45,并且滚动以 30 度的步长变化。有没有办法得到更准确的值? @Liron 这里有根据的猜测是对象检测器的底层实现受到 Harr/LBP 级联检测算法的启发。这些算法无法估计偏航/俯仰值。输入图像数据可能会针对 0、45、90... 度训练的级联进行测试,并保留最佳结果。 关于它在 GPU 上运行的评论,我发现运行面部检测器时 CPU 利用率高达 150%。这是在运行 iOS 10.3 的 iPhone 7 Plus 上。那是一个完整的核心加上第二个核心的一半。也许它会使旧 iPhone 上的 CPU 饱和(200%)。

以上是关于正确使用 CIDetectorTracking的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 Composer 安装 Laravel 扩展包

如何正确使用 Composer 安装 Laravel 扩展包

如何正确强制正确使用类方法?

如何正确使用 Composer 安装 Laravel 扩展包

C#注释的正确的使用方法有哪些?

如何正确的使用QWebEngineView