[iOS - WWDC] 1-2주차 주제 : Detect Body and Hand Pose with Vision

spring·2022년 5월 4일
2

WWDC Study

목록 보기
1/4
post-thumbnail

WWDC 스터디 첫 주제!
Detect Body and Hand Pose with Vision

너무 어려웠던 주제라 제대로 적은건지 잘 모르겠으나...
공부 기록을 남겼다는 것에 의의를...

※ 번역기와 함께 공부한거라.. 문장이 어색할 수도 있음!

0. Vision 시작하기

  1. ImageRequestHandler 사용
  2. 요청 생성
  3. VNDetectHumanHandPoseRequest 사용
  4. performRequests 호출 → handler에게 요청 제공
  5. 성공적으로 완료되면 request results 속성에 관찰 결과 표시
  6. VNRecognizedPointsObservation 반환
  7. 관측치에는 발견된 손의 모든 랜드마크의 위치가 포함되어 있음
  8. 알고리즘이 위치만 반환할 경우, VNPoint 부여
    a. VNPoint에는 CGPoint 위치 포함, 원하는 경우 x,y 좌표에도 직접 접근 가능
  9. 알고리즘에 신뢰도도 있는 경우, VNDetectedPoint 개체 얻을 수 있음
  10. 알고리즘이 점들에 labelling할 경우 VNrecognizedPoint 객체를 얻을 수 있음
  11. hand pose의 경우 VNRecognizedPoint 객체 반환

1. hand pose observation에서 점들에 access하는 법

  1. 먼저 recognizedPoints(forGroupKey:) 호출 → landmarks의 딕셔너리 요청
    a. 모든 포인트를 원할 경우 VNRecognizedPointGroupKeyAll 사용

  2. 엄지, 검지에 접근
    a. .thumb, .indexFinger 으로 손가락 그룹에 접근, point들을 가져옴

    	// Get points for thumb and index finger.
    	let thumbPoints = try observation.recognizedPoints(.thumb)
    	let indexFingerPoints = try observation.recognizedPoints(.indexFinger)

    b. .thumbTip, .indexTip 으로 각 손가락의 끝점 지정

    	// Look for tip points.
    	guard let thumbTipPoint = thumPoints[.thumbTip]. let indexTipPoint = indexFingerPoints[.indexTip] else { return }
        

** 손가락 지점 구분

  1. 검지, 중지, 약지, 소지 동일
  2. 엄지만 조금 다름
  3. 손목도 있음!
    - 손목 랜드마크는 손목 중앙에 위치
    - All 그룹 제외 어떤 그룹에도 속하지 않음 = 손가락 그룹의 일부가 아님

2. Vision을 통해 이 API를 제공하는 이유는?

➡️ ARKit 세션 밖에서 정확하게 애플의 body pose 기술을 이용할 수 있게 하기 위함

Vision vs ARKit

어느 쪽이든 동일한 랜드마크 세트를 얻을 수 있지만, Vision은 포인트당 신뢰값을 제공, ARKit은 그렇지 않음

  • 일반적으로 Vision framework는 정지 이미지, 카메라 피드에서 사용 가능
  • Vision이 제공하는 다른 모든 것과 마찬가지로, Vision의 body pose는 오프라인에서 전체 이미지 라이브러리를 분석하는데 사용될 수 있다.
  • ARKit은 라이브 모션 캡처 애플리케이션을 위해 설계되었음
  • 특별한 use case때문에 ARKit body pose는 iOS 및 iPadOS 장치에서 AR 세션 내에서만 후면 카메라와 함께 사용할 수 있음
  • Vision의 API는 워치 제외 모든 플랫폼에서 사용 가능

3. 샘플 코드 (엄지와 검지의 끝이 닿으면 그림을 그릴 수 있다!)

전부를 설명하기엔 제대로 이해도 다 못한 것 같고 대충만 끄적여보자면..
파일은 크게 CameraView, CameraViewController, HandGestureProcessor 3가지로 나뉨!
CameraView는 그냥 전체 화면을 카메라로 비춰 보여주기 위해 이런저런 설정을 해둔 것 같음 잘 모르겠다(??)

CameraViewController

손을 인식하면 어떤 것을 수행할지, 그림 그리기 설정 (line 색 등등) 정도?

  • setupAVSession() : videoDevice 즉 내 휴대폰 카메라 관련 설정인듯! 난 전면카메라(.front)를 후면카메라(.back)로 바꾸고 싶어서 건드려서 나머지는 무슨 내용인지 잘 모르겠다..
  • processPoints() : 2초 이상 관찰되지 않으면 제스처 프로세서를 재설정하고 그렇지 않으면 엄지와 검지의 점들을 AVfoundation 좌표로 변환한다.
  • handleGestureStateChange() : 제스쳐 상태의 변화에 따라 다르게 행동한다. 뒤이어 나올 HandGestureProcessor 파일에서 자세히 설명하겠지만 꼬집은 상태(.pinched), 꼬집을 수 있는 상태(.possiblePinch), 분리된 상태(.apart), 분리될 수 있는 상태(.possibleApart) 등으로 나누어 각 상태에 맞는 동작을 수행한다. 하나만 예를 들자면 .pinched 에서는 증거를 수집하는 버퍼를 초기화하고 점들로 그림을 그린다. Vision 공부해보면서 다른 블로그 링크도 참고했었는데 원하는 상태를 커스텀해서 그림 그리기 말고도 특정 제스처를 취하면 gif 파일이 보이도록 하는 것도 있었다!
  • updatePath() : 여기가 점들로 그림 그리는 곳!
  • handleGesture() : 화면을 2번 탭하면 그렸던 그림이 사라지도록 하는 함수
  • 제일 아래에 extension: AVCaptureVideoDataOutputSampleBufferDelegate에서는 샘플 버퍼를 사용하여 핸들러를 생성하고 이를 이용해 요청을 수행한다. 엄지와 검지의 끝점을 찾아 access하고 낮은 신뢰도의 값은 무시하도록 한다.

HandGestureProcessor

현재 손의 상태를 판단하는 곳임!

  • init : 꼬집고 있는 상태를 판단할때 어느 값까지, 몇장의 프레임까지 보고 결정할 것인지 설정. 여기서는 한계값 40과 프레임 3장으로 정했다.
  • processPointsPair : 엄지와 검지 끝 사이의 거리를 보고 있음, 이 거리가 40보다 작으면 꼬집고 있는 상태인지 꼬집을 수 있는 상태인지 판단하기 위한 증거를 축적한다. 아래 사진처럼 pinchEvidenceCounter 값을 하나씩 증가시키고 3프레임을 넘기면 .pinched로 상태를 변경한다.

    .apart도 비슷한 방식으로 40보다 클 때 apartEvidenceCounter 값을 하나씩 증가시키면서 상태 변경함!

====
썸네일에 있는 사진은 샘플 코드 다운받아서 바로 실행해봤던건데
선이 많이 찌그러져서.. 쭈굴하트됨..

※ 신체 포즈 관련도 영상 후반부에 있지만 이번 포스팅에서는 손만..
※ 2번 항목은 신체 포즈와 조금 더 관련있는 주제지만 그냥 넣어봤습니다🤓
※ 오타나 잘못 이해하고 작성한 부분이 있다면 알려주세요!!!

🎥 WWDC 영상 링크 : https://developer.apple.com/videos/play/wwdc2020/10653/
🔤 샘플 코드 다운 링크 : https://developer.apple.com/documentation/vision/detecting_hand_poses_with_vision

profile
CS 4th 💻

0개의 댓글