Unity

[Unity] Sentis Hand Detection (핸드 트래킹)

wnwnovo 2024. 10. 24. 20:37

https://github.com/Unity-Technologies/sentis-samples/tree/main/BlazeDetectionSample/Hand

 

sentis-samples/BlazeDetectionSample/Hand at main · Unity-Technologies/sentis-samples

Sentis samples internal development repository. Contains example and template projects for Sentis package use. - Unity-Technologies/sentis-samples

github.com

 

유니티 센티스 공식 예제에서 해당 예제를 받아 실행해보았다

 

HandDetection.cs

 

에서

 

        m_HandLandmarkerWorker.Schedule(m_LandmarkerInput);

        var landmarksAwaitable = (m_HandLandmarkerWorker.PeekOutput("Identity") as Tensor<float>).ReadbackAndCloneAsync();
        using var landmarks = await landmarksAwaitable;

 

Detect 함수내에 이런 부분이 있는데,

여기서

 

        var landmarksAwaitable = (m_HandLandmarkerWorker.PeekOutput("Identity") as Tensor<float>).ReadbackAndCloneAsync();
        var handednessAwaitable1 = (m_HandLandmarkerWorker.PeekOutput("Identity_1") as Tensor<float>).ReadbackAndCloneAsync();
        var handednessAwaitable2 = (m_HandLandmarkerWorker.PeekOutput("Identity_2") as Tensor<float>).ReadbackAndCloneAsync();
        
        using var landmarks = await landmarksAwaitable;
        using var isHandScore = await handednessAwaitable1;
        using var leftHandScore = await handednessAwaitable2;

        bool isHand = isHandScore[0] > 0.5;
        bool isLeftHand = leftHandScore[0] > 0.7;

 

이렇게 수정하면

 

Identity_1 은 이게 손이 맞을 확률

Identity_2 는 이게 왼손일 확률(낮으면 오른손)을 구할 수 있다

 

그리고 예제는 Input이 이미지로 되어있는데 WebCamTexture로 변경해서 돌렸다

 

참고 문서

https://storage.googleapis.com/mediapipe-assets/Model%20Card%20Hand%20Tracking%20(Lite_Full)%20with%20Fairness%20Oct%202021.pdf

 

 

Web 빌드시

BackendType를 GPUCompute 로 하고 빌드하면 Web 환경에서도 잘 작동하는데,

Project Setting -> Other Settings에서 Auto Graphics API를 체크 해제하고

Graphics APIs 를 WebGPU로 설정해야 작동한다

그리고 시작하자마자 바로 실행되는 경우 웹에서 에러나기 때문에,,, Start 버튼을 따로 만들어주니 제대로 작동했다

 

 

 

(손을 감지했을 때만 랜드마크 모델로 넘어가기 때문에 아예 감지되지 않았을 때는 값이 업데이트되지 않는다)

영상은 웹캠으로 왼손 -> 오른손 -> 양손 순서로 진행한 결과고(캠 화면은 없앰)

한 손 일땐 잘 작동하지만 양손이면 왼손 오른손 깜빡거리면서 이상해진다ㅠ

예제에서는 가장 손일 확률이 높은 박스 한 개를 먼저 구하고, 그 박스 내에서 한 손 기준의 랜드마크를 구하기 때문에 한 손만 탐지된다

양손으로 바꾸려면 손일 확률이 높은 다른 박스 두 개를 구해서 따로 랜드마크 모델을 돌리거나

두 손의 랜드마크가 output으로 나오는 모델을 사용해야할 듯 하다

 

https://ai.google.dev/edge/mediapipe/solutions/vision/hand_landmarker

 

손 랜드마크 감지 가이드  |  Google AI Edge  |  Google AI for Developers

LiteRT 소개: 온디바이스 AI를 위한 Google의 고성능 런타임(이전 명칭: TensorFlow Lite)입니다. 이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 손 랜드마크 감지 가이드 컬렉션을 사

ai.google.dev

 

원본 모델 문서를 보면 최대 측정되는 손을 1, 2 이렇게 정할 수 있고 양손도 잘 탐지된다!

좀 더 공부하면 잘 써먹을 수 있을 듯