nyancoder

WWDC 2021 - Classify hand poses and actions with Create ML 본문

WWDC/WWDC 2021

WWDC 2021 - Classify hand poses and actions with Create ML

nyancoder 2021. 8. 21. 02:26

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

 

  • 2020년 Vision Framework에서 손과 손에 있는 21개의 관절을 식별할 수 있는 손 포즈 감지가 추가되었습니다.
  • 이것은 손이 있는지를 식별할 때는 좋지만, 손이 하는 일을 분류하기는 어려울 수 있습니다.

  • 손으로 V를 표시하거나, 멈추라는 표현을 하는 것은 이미지나 영상 모두에서 의미를 가집니다.

  • 반면 이리 오라거나, 저리 가라는 등의 표현은 여러 장의 프레임이 있어야만 의미가 명확해집니다.

  • 올해 두 가지 새로운 Create ML 템플릿인 손 모양 분류 및 손동작 분류가 추가되었습니다.
  • 이러한 새 템플릿을 사용하면 Create ML 앱 또는 Create ML 프레임워크를 사용하여 손 포즈 및 동작 모델을 훈련할 수 있습니다.

  • 이 모델은 macOS Big Sur 이상, iOS 및 iPadOS 14 이상과 호환됩니다.
  • 그리고 올해의 새로운 기능으로 Create ML 프레임워크를 사용하여 iOS 기기에서 모델을 교육하는 기능이 추가되었습니다.

  • 먼저 손 모양 분류에서는 앱이 분류해야 하는 포즈를 정의해야 합니다.

  • 예를 들어 위의 예제 앱에서는 손가락이 하나이거나 둘 인 경우를 구분하고, 그 외에는 배경으로 분류합니다.

  • 다른 모든 Create ML 프로젝트와 마찬가지로 손 모양 분류기를 앱에 추가하는 것은 간단합니다.
  • 이를 위해서는 훈련 데이터를 수집 및 분류하고, 모델을 훈련하고, 모델을 애플리케이션에 통합하는 3가지 단계가 필요합니다.

  • 훈련 데이터를 수집할 때는 이름이 이미지에 있는 모양과 일치하는 폴더로 분류되어야 합니다.
  • 위의 예제에서는 식별하고자 하는 포즈는 "하나", "둘", "배경"의 세 가지입니다.

  • "배경" 분류는 앱이 식별하지 않는 손 모양에 대한 포괄적인 범주입니다.
  • 잘 정의된 "배경" 분류는 사용자가 중요한 포즈를 취하지 않을 때 앱이 알 수 있도록 도와줍니다.
  • "배경" 분류를 구성하는 두 가지 유형의 이미지 가 있습니다.

  • 첫 번째는 앱에서 분류하기를 원하는 손 모양이 아닌 임의의 손 모양이 있습니다.
  • 이러한 모양에는 다양한 피부색, 연령, 성별, 조명 조건이 포함되어야 합니다.

  • 두 번째는 우리가 인식하려는 손 모양으로 손을 이동하거나, 손을 내릴 때 발생하는 모양입니다.
  • 이러한 전환 상태에서는 우리가 관심 있는 모양과 유사하지만 일치하지는 않는다는 것을 알 수 있습니다.

  • 이러한 전환 모양은 임의의 모양과 함께 배경 분류에 추가되어야 합니다.
  • 이 조합을 통해 모델은 앱이 관심을 갖는 모양과 다른 배경 모양을 적절하게 구분할 수 있습니다.

  • 수집된 데이터를 가지고 기존 CreateML 모델을 이용하여 훈련을 할 수 있습니다.

  • 훈련 결과가 좋은 것을 확인할 수 있습니다.

  • 훈련된 데이터를 라이브 미리보기를 통해서 훈련 결과를 확인해볼 수 있습니다.

  • 기존의 모델에 새로운 손 모양을 추가로 학습할 수 있으며, 이를 위해서는 새 모델 소스를 생성해야 합니다.

  • 추가할 손 모양이 포함된 데이터 세트를 선택합니다.

  • 이제 새로 추가하려고 하는 손을 편 모양과 기존의 다른 모양들이 추가되어 있음을 볼 수 있습니다.

  • Create ML에서 Random Move나 Random Scale 같은 전처리를 지정할 수 있습니다.
  • 위의 예제에서는 80번의 반복 훈련을 지정했으며, 경우에 따라 적절히 수치를 조절해야 할 수 있습니다.

  • 훈련이 끝나면 미리 보기를 통해서 새로 훈련된 모델이 이제 손을 편 자세를 올바르게 식별하는지를 확인할 수 있습니다.

  • 만들어진 모델을 사용하는 시스템의 예를 들면 카메라로부터 이미지를 지속적으로 받을 것입니다.
  • 각 프레임에 대해 Vision 프레임워크의 DetectHumanHandPoseRequest요청을 통하여 손의 위치와 키포인트를 감지할 것입니다.
  • 감지된 결과로는 HumanHandPoseObservation을 받아 MLMultiArray형태의 keypointsMultiArray속성을 받아서 CoreML에 전달할 것입니다.
  • 그러면 손 모양 분류기가 신뢰도 점수와 함께 최고 예상 손 모양 이름을 반환합니다.
  • 이를 받아서 앱 내에서 어떤 작업을 수행할지를 결정할 수 있습니다.

  • Vision을 사용하여 이미지에서 손을 감지하는 코드를 예로 살펴볼 것입니다.
  • VNDetectHumanHandPoseRequest를 생성하여 한 손만 감지하면 되므로 maximumHandCount를 기본값인 2에서 1로 설정합니다.
  • 프레임에 지정된 것보다 더 많은 손이 있는 경우 알고리즘은 프레임에서 가장 눈에 띄는 중앙의 손을 감지할 것입니다.

  • VNImageRequestHandler를 생성하고 요청을 전달하면, 응답은 최대 인식 손의 수만큼 VNHumanHandPoseObservations를 채울 것입니다.
  • 응답에서 손 모양이 감지되지 않는 경우와 감지되는 경우를 나누어서 처리합니다.

  • 손 모양 인식을 매 프레임마다 하는 대신 일정한 간격으로 수행하면 보다 부드러운 경험을 제공할 수 있습니다.
  • 예측을 하려면 먼저 MLMultiArray를 손 모양 CoreML 모델에 전달하고 반환된 예측에서 최상위 레이블과 신뢰도를 얻습니다.
  • 높은 수준의 신뢰도로 예측될 때만 처리하도록 하면, 너무 빈번하게 처리가 일어나는 것을 줄일 수 있습니다.
  • 배경 분류는 신뢰도 임계값을 매우 높게 유지하면 더 안정적입니다.
  • 이 예제에서는 하나의 손가락이 감지되면 effectNode를 표시하고 아닌 경우 모든 파티클 효과를 제거하도록 되어있습니다.

  • 위의 예제를 실행해보면 한 손가락을 들었을 때 정확하게 이펙트가 시작하는 것을 볼 수 있습니다.

  • 이제 이펙트가 손가락을 따라가도록 위와 같이 수정합니다.
  • Vision이 제공하는 정규화된 좌표를 화면의 좌표로 변환한 다음 이펙트를 표시합니다.

  • setLocationForEffects을 매 프레임마다 비동기적으로 호출하여 이전에 계산해둔 좌표에 효과가 표시되도록 설정합니다.

  • 이제 이펙트가 손가락에서 표시됩니다.

  • 이제 처음에 분류했던 두 개의 손가락에서는 각 손가락에 이펙트가 나타나도록 할 수 있습니다.

  • 손을 편 경우도 학습했기 때문에 중지의 키 포인트와 손목의 키 포인트 사이에서 빔 효과가 나도록 할 수 있습니다.

  • Vision에서 HumanHandPoseObservation에서 왼손과 오른손을 구별할 수 있는 속성을 제공합니다.
  • 이 속성은 왼손, 오른손 또는 알 수 없음의 세 가지 값 중 하나입니다.

  • 이러한 예측은 각 손에 대해서 별개로 진행되기 때문에, 한 손의 예측이 다른 손의 예측에 영향을 미치지 않습니다.

  • 이를 위해서는 VNDetectHumanHandPoseRequest를 생성하여 예측을 수행합니다.
  • 결과 목록을 얻어온 다음 이를 순회하면서 enum 속성을 통해서 각 손을 구분할 수 있습니다.

  • Create ML은 손 모양 분류 외에도 손동작 분류를 위한 새로운 템플릿을 도입했습니다.

  • 손동작은 ML 모델이 손을 움직이는 동안 분석해야 하는 일련의 손 모양으로 구성됩니다.
  • 영상 내의 손 모양의 수는 처음부터 끝까지 전체 손동작을 캡처할 수 있을 만큼 충분히 커야 합니다.
  • 손 모양 분류기를 훈련하는 것과 거의 비슷하지만 이미지 대신 비디오를 사용하여 손동작 인식을 훈련합니다.

  • 손동작 분류기를 훈련하기 위해서는 각 손동작에 대한 폴더 내의 구성된 짧은 동영상들을 사용합니다.
  • 분류기가 인식하기를 원하는 동작이 아닌 다른 동작을 모아놓은 배경 분류를 포함해야 합니다.

  • 또 다른 표현 방법으로는 모든 예제 비디오 파일을 단일 폴더에 넣을 수 있습니다.
  • 그다음 CSV 또는 JSON 형식을 사용한 설명 파일을 추가합니다.
  • 설명 파일의 각 항목은 비디오 파일의 이름, 분류, 손동작의 시작 및 종료 시간을 나타냅니다.
  • 이 경우에도 동일하게 배경 분류를 포함해야 합니다.

  • 모델의 훈련은 동일한 길이의 비디오로 이루어집니다.
  • 학습 길이를 매개변수로 제공하면 Create ML은 제공받은 값에 따라 연속적인 프레임을 무작위로 샘플링합니다.
  • 또한 비디오 프레임 속도나 반복 횟수를 지정할 수 있습니다.

  • 이 이외에도 모델을 보다 일반화하고 정확도를 높이는데 도움이 되는 다양한 유형의 데이터 보정을 제공합니다.
  • 특히 시간 보간 및 프레임 드롭은 실제 사용 사례에 더 가까운 비디오 변형을 제공합니다.

  • 손동작 인식기를 사용하여 손을 회전하면 이펙트도 회전하는 예제 앱을 만들 수 있습니다.

  • 또한 이전에 학습한 손 모양 인식기와 함께 사용할 수 있습니다.
  • 이 경우에는 왼손과 오른손을 구분하여 인식하고, 그 결과를 각각 손 모양 인식기와 손동작 인식기에 적용하였습니다.

  • Create ML Hand Action Classifier를 통합할 때의 모델의 입력은 45 x 3 x 21 크기의 MultiArray입니다.
  • 45는 분류기가 동작을 인식하기 위해서 분석해야 하는 손 모양의 수입니다.
  • 21은 Vision Framework에서 각 손에 대해 제공하는 관절 수입니다.
  • 3은 x 및 y 좌표와 각 관절에 대한 신뢰 값입니다.

  • 예제에서 30 fps의 1.5초 길이로 녹화된 비디오로 모델을 훈련하면 총 45개의 프레임이므로 추론에 제공되는 크기와 동일합니다.

  • 추론할 때의 모델은 학습할 때의 프레임 모델과도 일치해야 합니다.
  • ARKit을 사용하는 데모에서는 60 fps로 입력이 들어오지만 학습은 30 fps로 이루어졌기 때문에 초당 받는 손 모양의 수를 절반으로 줄여서 사용해야 합니다.

  • 예제 코드에서는 프레임 수를 60 fps에서 30 fps로 절반으로 낮추기 위해 frameCounter를 사용하였습니다.
  • 그런 다음 각 손에 대한 관절과 왼손인지 오른손인지의 정보를 가지는 VNHumanHandPoseObservation.Chirality 정보를 받습니다.
  • 그다음 queue를 통해 45개의 손 모양을 누적해서 보관합니다.
  • 그리고 대기열이 가득 차면 Vision에서 handActionModel에 전달하여 손동작을 예측합니다.
  • 마지막으로 인식 결과가 충분히 신뢰할 수 있을 정도의 점수를 가지면 적절한 이펙트를 화면에 그립니다.

  • 그래서 예제 앱을 살펴보면 CreateML Hand Action을 사용하기 위해서는 분류기를 훈련하는 데 사용된 비디오의 동일한 프레임 속도로 입력을 일치시킵니다.
  • 그다음 Queue를 사용하여 모델 예측에 대한 손 모양을 수집합니다.
  • 그다음 사용하려는 상황에 맞는 속도로 Queue를 읽고 예측을 수행합니다.

  • 보다 좋은 품질을 위해서 몇 가지 항목을 염두에 두어야 합니다.
  • 우선 카메라에서 손이 얼마나 떨어져 있는지를 고려해야 하며 최상의 결과를 얻으려면 3.5미터 미만으로 유지해야 합니다.
  • 또한 너무 어둡거나 너무 밝은 조명 조건을 피하는 것이 좋습니다.
  • 부피가 크거나 헐렁하거나 컬러풀한 장갑은 손의 모양을 감지하기 어렵게 합니다.
  • 다른 모든 기계 학습 작업과 마찬가지로 교육 데이터의 품질과 양이 중요하며 예제에서는 분류당 100개의 비디오를 사용했지만 사용처에 따라 데이터 요구 사항은 다를 수 있습니다.

 

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

Comments