WWDC Quick Look 💓 By SwiftGGTeam
Detect people, faces, and poses using Vision

Detect people, faces, and poses using Vision

元の動画を見る

ハイライト

Vision フレームワークの顔検出がリビジョン 3 にアップグレードされ、マスクを着用している顔の検出がサポートされ、ピッチ姿勢インジケーターが追加されました。すべての姿勢インジケーターが離散値から連続値に変更されました。人物セグメンテーション API には、複数のプラットフォームで仮想背景とキャラクターの切り抜きを実現できるセマンティック人物セグメンテーションが追加されました。

主な内容

マスク時代の顔検出のアップグレード

マスクの着用が日常になると、独自の顔検出アルゴリズムは課題に直面することになります。WWDC2021 では、顔検出がリビジョン 3 (01:15) にアップグレードされました。これにより、マスクで遮られた顔を識別できるだけでなく、眼鏡や帽子などの障害物を識別する機能も維持されます。

顔のポーズインジケーターも改善されました。以前はロールとヨーだけでしたが、今年は新たにピッチが追加されました(うなずきます)。さらに重要なのは、すべてのメトリクスが離散値 (バケット化) から連続値 (01:41) に変更されることです。以前は、roll は -90、-45、0、45、および 90 のみを返すことができました。現在では、任意の円弧値を返すことができるため、姿勢追跡がよりスムーズになります。

3 つの姿勢インジケーターの意味は、飛行力学に基づいています (02:54)。

  • ロール: 頭を左右に傾けます (頭を振る)
  • ヨー: 頭を左右に回転します (後ろを向く)
  • ピッチ: 頭を上下にうなずきます

これらのインジケーターは合格しますVNFaceObservationrollyawpitch属性取得、単位はラジアンです。

人間の姿勢検出の改善

人体の四角形検出がリビジョン 2 (05:17) にアップグレードされ、新たに全身検出がサポートされました。以前は上半身しか検出できませんでしたが、通過できるようになりました。upperBodyOnlyプロパティの切り替え。デフォルトのままですtrue下位互換性を維持するには、次のように設定します。false全身を検知できる。

ハンドジェスチャー検出が追加されましたchirality属性 (06:16) により、検出された手が左か右かを判断できます。

人物セグメンテーション: 意味論的な人物セグメンテーション

これは今年最大の新機能です (06:53)。VNGeneratePersonSegmentationRequestセグメンテーション マスクを生成して、画像内の文字を背景から分離できます。従来の前景と背景のセグメンテーションとは異なり、Vision はセマンティック セグメンテーションを実装しています。つまり、「人々」が何であるかを認識し、写真内の全員を同じマスクにマージします。

API は 3 つの品質レベルを提供します (09:06):

  • 正確: 最高品質、コンピュテーショナル フォトグラフィーに適しています
  • バランス: バランスが取れており、フレームごとのビデオ処理に適しています。
  • 高速: 最速で、リアルタイムのストリーム処理に適しています。

品質が高くなるほど、リソースの消費量も多くなります。品質が向上するにつれて、マスクのダイナミック レンジ、解像度、メモリ フットプリント、処理時間はすべて増加します。

マルチフレーム文字セグメンテーション機能

人物のセグメンテーションは Vision で利用できるだけでなく、複数のフレームワークにも統合されています (14:15):

  • AVFoundation: 写真撮影時に取得可能AVCapturePhoto.portraitEffectsMatte、一部の新しいデバイスでサポートされています
  • ARKitARFrame.segmentationBufferAR シーンでキャラクターのセグメンテーションを提供します。A12 バイオニック チップとその後の機器が必要です
  • Core ImageCIFilter.personSegmentation()純粋な Core Image ドメインへのインターフェイスを提供します

##詳細

文字分割リクエストの設定

08:13

// 创建请求
let request = VNGeneratePersonSegmentationRequest()

// 创建请求处理器
let requestHandler = VNImageRequestHandler(url: imageURL, options: options)

// 执行请求
try requestHandler.perform([request])

// 获取结果
let mask = request.results!.first!
let maskBuffer = mask.pixelBuffer

キーポイント:

  • リクエストは状態オブジェクトです。同じリクエストをビデオ ストリームで再利用する必要があるため、フレーム間のスムージングに役立ちます。
  • 消すVNPixelBufferObservationpixelBufferプロパティにはマスク データが含まれています

08:33

let request = VNGeneratePersonSegmentationRequest()

// 设置 revision(明确指定以避免未来 SDK 更新行为变化)
request.revision = VNGeneratePersonSegmentationRequestRevision1

// 设置质量级别
request.qualityLevel = VNGeneratePersonSegmentationRequest.QualityLevel.accurate

// 设置输出像素格式
request.outputPixelFormat = kCVPixelFormatType_OneComponent8

キーポイント:

  • 確定的な動作を保証するためにリビジョンを明示的に設定します。そうでない場合、SDK は更新後に最新のリビジョンを自動的に使用します。
  • さまざまなシナリオにおける 3 つの品質レベルの推奨事項: コンピューテーショナル フォトグラフィーの場合は正確、ビデオの場合はバランスが取れ、リアルタイム ストリーミングの場合は高速
  • 出力形式はオプションです: 8 ビット整数、32 ビット浮動小数点、16 ビット浮動小数点 (半浮動小数点)。16 ビット浮動小数点を GPU に直接入力して処理できる

セグメンテーション マスクを適用して背景を置き換えます

12:24

let input = CIImage(contentsOf: imageUrl)!
let mask = CIImage(cvPixelBuffer: maskBuffer)
let background = CIImage(contentsOf: backgroundImageUrl)!

// 缩放掩码到输入图像尺寸
let maskScaleX = input.extent.width / mask.extent.width
let maskScaleY = input.extent.height / mask.extent.height
let maskScaled = mask.transformed(by: CGAffineTransform(
    maskScaleX, 0, 0, maskScaleY, 0, 0
))

// 缩放背景到输入图像尺寸
let backgroundScaleX = input.extent.width / background.extent.width
let backgroundScaleY = input.extent.height / background.extent.height
let backgroundScaled = background.transformed(by: CGAffineTransform(
    backgroundScaleX, 0, 0, backgroundScaleY, 0, 0
))

// 使用混合滤镜
let blendFilter = CIFilter.blendWithRedMask()
blendFilter.inputImage = input
blendFilter.backgroundImage = backgroundScaled
blendFilter.maskImage = maskScaled

let blendedImage = blendFilter.outputImage

キーポイント:

  • マスクと背景の両方を入力画像と同じ寸法にスケールする必要があります
  • CIFilter.blendWithRedMask()赤のチャンネルマスクに基づいて前景と背景をブレンドする
  • CIImage が単一チャネル PixelBuffer として初期化されている場合、デフォルトは赤チャネルです。

AVCapture のセグメンテーション マスク

14:37

private let photoOutput = AVCapturePhotoOutput()

if self.photoOutput.isPortraitEffectsMatteDeliverySupported {
    self.photoOutput.isPortraitEffectsMatteDeliveryEnabled = true
}

// AVCapturePhoto 的分割掩码属性
open class AVCapturePhoto {
    var portraitEffectsMatte: AVPortraitEffectsMatte? { get }
    // nil 表示场景中没有人
}

キーポイント:

  • isPortraitEffectsMatteDeliverySupportedデバイスがサポートしているかどうかを確認する
  • 有効にすると写真撮影時にセグメンテーションマスクを自動的に計算します
  • AVPortraitEffectsMatte後処理にも使用可能

ARKit のセグメンテーション マスク

14:58

// 检查是否支持人物分割
if ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth) {
    // 可以获取人物分割掩码
    // ...
}

open class ARFrame {
    var segmentationBuffer: CVPixelBuffer? { get }
}

キーポイント:

  • A12 Bionic チップ以降のデバイスが必要です (iPhone Xs 以降)
  • supportsFrameSemantics特定のデバイスがサポートしているかどうかを確認する
  • .personSegmentationWithDepthセグメンテーション マスクと深度情報の両方を提供します

コアイメージのセグメンテーション

15:31

let input = CIImage(contentsOf: imageUrl)!

let segmentationFilter = CIFilter.personSegmentation()
segmentationFilter.inputImage = input

let mask = segmentationFilter.outputImage

キーポイント:

  • CIFilter.personSegmentation()Vision API の薄いラッパーです
  • Core Image ドメイン内で完全に処理する必要があるシナリオに適しています。
  • 出力は CIImage であり、他の Core Image フィルタで直接使用できます。

重要ポイント

1.仮想バックグラウンドビデオ通話アプリ

  • 内容: ユーザーがビデオ通話中に背景を置き換えることができる、Zoom のような仮想背景機能
  • 実行する価値がある理由: 人物セグメンテーションは複数のプラットフォームをサポートしています。balancedライブビデオストリームで実行できる品質レベル
  • 開始方法: を使用しますAVCaptureVideoDataOutputビデオフレームを取得し、各フレームを実行しますVNGeneratePersonSegmentationRequestqualityLevel = .balanced)、背景画像とマスクをブレンドします。

2.顔ジェスチャー制御のための対話型インターフェース

  • やるべきこと: 頭のジェスチャーを使用して UI を制御します (ページをめくるために頭を回す、うなずいて確認するなど)。
  • 価値がある理由: 連続値の顔のポーズ インジケーターにより、飛び跳ねる離散値とは異なり、より正確な制御が可能になります。
  • 開始方法: を使用しますVNDetectFaceRectanglesRequestrollyawpitch属性、対応するアクションをトリガーするためのしきい値を設定します

3.スマート写真編集アプリ

  • 何をするか: キャラクターを自動的に識別し、キャラクター固有の編集効果 (背景のぼかし、背景の置換など) を提供します。
  • 実行する価値がある理由: 人物のセグメンテーションaccurateモードの品質は高く、写真編集シナリオに適しています
  • 開始方法: を使用しますVNGeneratePersonSegmentationRequestaccurateコアイメージを備えた品質CIFilter.portraitEffect()キャラクターの照明効果を実現

4. AR ソーシャル アプリにおける人物のオクルージョン

  • 内容: AR シーンでは、現実の人々が仮想オブジェクトをブロックして現実感を高めることができます
  • 実行する価値がある理由: ARKitpersonSegmentationWithDepthマスキングと深度の両方を提供して、より正確なオクルージョンを実現します。
  • 開始方法: 確認してくださいsupportsFrameSemantics(.personSegmentationWithDepth)、からARFrame.segmentationBufferレンダリング用のマスクを取得する

関連セッション

コメント

GitHub Issues · utterances