nyancoder

WWDC 2021 - Detect people, faces, and poses using Vision 본문

WWDC/WWDC 2021

WWDC 2021 - Detect people, faces, and poses using Vision

nyancoder 2021. 9. 17. 03:02

원본 영상: https://developer.apple.com/videos/play/wwdc2021/10040/

 

 

People Analysis Technology

  • Vision에서 사람 분석의 초석 얼굴 분석입니다.
  • 얼굴 감지, 얼굴 랜드마크 감지, 얼굴 캡처 품질 감지를 제공합니다.

  • Vision 프레임워크의 얼굴 감지는 DetectFaceRectanglesRequest를 통해 사용할 수 있으며, 인식의 정확도에 대한 지표를 제공합니다.
  • 또한 임의의 방향이나 다양한 크기, 일부 가려진 얼굴을 감지할 수 있습니다.

  • 기존에는 안경, 모자에 의해 가려진 경우만을 지원하였습니다.
  • 이제 VNDetectFaceRectanglesRequestRevision3 에는 성능의 개선 이외에도 마스크로 덮인 얼굴을 감지할 수 있습니다.

  • 이전에는 Roll과 Yaw 지표 만을 제공하였지만, 새 버전에는 Pitch를 추가하였습니다.

  • 얼굴 방향에 대한 메트릭은 VNFaceObservation 객체의 속성 제공됩니다.

  • 예제 앱을 통해서도 이러한 수치 변화를 확인할 수 있습니다.
  • 위 예제에는 Roll의 수치가 머리의 방향에 따라 변경되는 것을 볼 수 있습니다.

  • 또는 고개를 좌/우로 움직일 경우 Yaw 수치가 변경되는 것을 볼 수 있습니다.

  • 고개를 들거나 숙이면 Pitch 값이 변하는 것을 확인할 수 있습니다.

  • VNDetectFaceLandmarksRequest를 통해 얼굴 랜드마크를 얻어올 수 있습니다.
  • 특히 최신인 VNDetectFaceLandmarksRequestRevision3 에는 보다 정확한 얼굴 영역을 감지할 수 있습니다.
  • 또한 눈동자 인식이 제공되며, 눈동자 랜드마크는 76개 점을 통해 제공됩니다.

  • 이러한 얼굴 인식은 사람의 얼굴 표정, 조명, 겹침, 흐려짐 등의 속성을 고려합니다.
  • 이는 DetectFaceCaptureQualityRequest API를 통해 노출되며, 최신 버전은 2입니다.
  • 얼굴 캡처 품질은 동일한 대상에 대한 비교이며, 이를 통해 사진 라이브러리에 있는 가장 좋은 사진을 선택하거나 여러 사진 중 하나의 사진을 고르는데 유용합니다.
  • 이 기능은 서로 다른 사람의 얼굴을 비교하도록 설계되지 않았습니다.

  • Vision프레임워크를 통해서 인체 감지, 인체 모양 감지, 손 모양 감지를 포함한 여러 기능을 제공합니다.

  • 인체 감지는 DetectHumanRectanglesRequest를 통해 제공되며 버전 1에는 사람의 상체만 감지합니다.
  • 새로운 버전 2에서는 상체 감지 이외에 전신 감지도 제공합니다.

  • DetectHumanRectanglesRequest에 새로 추가되는 속성 upperBodyOnly를 통해 상체만 감지할지를 결정할 수 있습니다.
  • 기존 버전과의 호환성을 위해 이 속성의 기본값은 true입니다.

  • 인체 모양 감지는 VNDetectHumanBodyPoseRequest를 통해 제공됩니다.
  • 이 요청을 통해 인체 관절 위치들을 얻을 수 있으며, 버전 1이 최신입니다.

  • VNDetectHumanHandPoseRequest로 사람의 손 모양을 감지할 수 있습니다.
  • 이 요청을 통해 손 관절 위치 모음이 반환됩니다.

  • 얻어온 VNHumanHandPoseObservation 정보에서 chirality 필드를 통해 감지된 손이 왼손인지 오른손인지를 알 수 있습니다.

 

Person Segmentation

  • Vision 프레임 워크의 기능을 통해 배경과 사람을 분리할 수 있습니다.

  • 이런 기능은 화상 회의 앱의 가상 배경이나, 라이브 스포츠 분석, 자율 주행 등에서 사용할 수 있습니다.

  • 이 기능은 단일 프레임에서 동작하도록 만들어진 기능입니다.
  • 또한 스트리밍 파이프라인이나 오프라인 처리에서도 사용할 수 있습니다.
  • macOS, iOS, iPadOS, tvOS와 같은 여러 플랫폼에서 지원됩니다.

  • 여러 사람이 있는 경우 프레임의 모든 사람에 대한 한 장의 마스크를 반환합니다.

  • VNGeneratePersonSegmentationRequest를 통해 이렇게 사람에 대한 마스크를 얻어올 수 있습니다.
  • 이 기능은 Stateful 한 요청이므로, 기존의 다른 요청과는 다르게 동일한 요청 객체를 전체 프레임 시퀀스에서 재사용합니다.

  • Person Segmentation API를 사용하여 요청 생성, 요청 핸들러 생성, 요청 핸들러로 요청 처리, 마지막으로 결과 확인의 단계를 을 수행할 수 있습니다.

  • GeneratePersonSegmentationRequest 객체를 통해 버전, 품질, 출력 마스크의 형식 속성을 설정할 수 있습니다.

  • 버전은 현재 Revision1만 제공되지만, 이후에 새 버전이 추가되어도 동일한 결과를 얻을 수 있도록 명시적으로 지정해주는 것이 좋습니다.

  • 품질 속성에서는 기본값인 품질, 균형, 속도의 세 가지 속성 중 하나를 선택할 수 있습니다.
  • 컴퓨터 사진 촬영과 같이 제한 시간이 없는 이용 사례에서는 높은 품질을 선택하는 것이 좋습니다.
  • 비디오 프레임에는 균형 레벨을 권장하고 스트리밍 처리에는 속도 레벨을 권장합니다.

  • 출력 마스크 형식 속성에서는 세 가지 종류의 속성 중 하나를 선택할 수 있습니다.
  • 첫 번째 옵션은 0 ~ 255 범위의 부호 없는 8비트 정수입니다.
  • 나머지 두 가지 옵션은 부동 포인트 형식으로 각각 16비트, 32비트의 정밀도를 가집니다.
  • 16비트 정밀도를 사용하면 Metal을 사용하여 GPU에 직접 추가적인 처리를 할 수 있습니다.

  • 처리 결과는 VNObservation 객체로 제공하며 VNPixelBufferObservation를 얻을 수 있습니다.
  • VNPixelBufferObservation의 pixelBuffer를 통해 실제 마스크를 얻을 수 있으며, CVPixelBuffer 개체의 Format을 통해 픽셀 형식을 얻을 수 있습니다.

  • 처리 결과를 보면 속도 타입에서 품질로 갈수록 더 높은 품질의 마스크를 얻을 수 있는 것을 볼 수 있습니다.

  • 높은 품질을 선택할수록 더 많은 프레임 크기, 메모리, 처리 시간을 사용하는 것을 볼 수 있습니다.

  • 다음은 하나의 이미지에서 사람의 마스크 이미지를 얻어 이를 다른 배경으로 합성하는 예제를 보겠습니다.

  • 우선 모든 처리를 미리 하여 세 개의 이미지를 미리 준비하였다고 가정하겠습니다.
  • 그 이후에 마스크와 배경을 원본 이미지의 크기로 조정할 수 있도록 Scale 값을 계산합니다.
  • 다음 붉은색 마스크를 사용하는 Core Image Blend 필터를 만듭니다.
  • CIImage가 하나의 구성 요소의 PixelBuffer를 사용할 때는 빨간색 채널을 사용하기 때문입니다.
  • 그리고 이 필터를 통해 합성된 결과를 얻을 수 있습니다.

  • 이러한 예제 코드를 이용하여 단색 배경으로 배경을 합성한 예제는 이와 같습니다.

  • 최신 단말에서는 AVFoundation을 이용해서 마스크를 얻을 수도 있습니다.
  • 마스크는 AVCapturePhoto의 portraitEffectsMatte 속성을 통해 반환됩니다.
  • isPortraitEffectsMatteDeliverySupported를 통해 지원유무를 확인할 수 있습니다.

  • A12 Bionic 이상의 기기에서는 ARKit을 통해서 카메라 입력을 처리할 때 마스크를 얻을 수 있습니다.
  • 마스크는 ARFrame의 segmentationBuffer속성을 통해 반환됩니다.
  • 사용하기 전에 ARWorldTrackingConfiguration 클래스의 supportFrameSemantics를 통해 지원 유무를 확인해야 합니다.

  • Core Image는 Vision API의 래퍼를 제공하므로 Core Image에서도 사용할 수 있습니다.

  • 이처럼 각 API를 서로 다른 사례에서 사용할 수 있습니다.
  • AVFoundation은 일부 iOS 기기에서 사용할 수 있으며, AVCaptureSession을 사용 중인 경우 선택할 수 있습니다.
  • ARKit을 사용한 앱을 개발 중인 경우 이미 존재하는 AR 세션을 통해 얻어올 수 있습니다.
  • 이외의 경우에는 Vision API를 통해 온라인 및 오프라인 단일 프레임 처리를 여러 플랫폼에서 할 수 있습니다.
  • 마지막으로 Core Image는 기존에 사용 중인 Core Image를 처리하고자 할 때, Vision API의 래퍼를 제공받아 사용할 수 있습니다.

  • 사람의 마스크를 얻는 알고리즘도 다른 알고리즘들처럼 가장 잘 작동하는 조건이 있습니다.
  • 최대 4명의 사람을 분할하는 경우 잘 동작합니다.
  • 각 사람의 키는 이미지 높이의 절반 이상이어야 하며, 배경과 대비가 잘 되는 것이 좋습니다.
  • 동상, 사람 사진, 멀리 있는 사람 등 모호한 대상은 피하는 것이 좋습니다.

 

목차: https://nyancoder.tistory.com/2

Comments