Face Landmark
Unity Technologies
서론
급하게 Landmark를 테스트 해보았는데 시작부터 되지 않는 부분이 많아서... Sentis를 쓰시는 분이 많을까 싶지만 버그를 찾는 과정을 기록합니다.
본문
Landmark란?
관련해서 잘 정리된 글이 있으니 한번 확인해보시길 바랍니다. 간단하게 이야기하면, 얼굴의 특징 점 위치를 각각에 맞게 잡아주기 위해 사용합니다. 사용 사례로는 디지털 휴먼 또는 아바타가 가장 많습니다. 예를 들어서 요즘 인기가 많은 버튜버들이 웃거나 울거나 눈을 깜빡일 때 카메라 output을 input으로 써서 트래킹이 가능하다 라고 설명할 수 있습니다.
Facial landmarks with dlib, OpenCV, and Python
Facial landmarks with dlib, OpenCV, and Python - PyImageSearch
Learn how to detect and extract facial landmarks from images using dlib, OpenCV, and Python.
pyimagesearch.com
Hugging Face Sample
Unity Hugging Face에서는 Face, Iris, Hand 총 3개의 landmark 샘플을 지원합니다. 그 중 Face Landmark를 사용해서 해당 글을 포스팅해보도록 하겠습니다.
unity (Unity Technologies)
Official Unity Technologies space for models and more. We provide validated models that we know import and run well in the Sentis framework. They are pre-converted to our .sentis format, which can be directly imported into the Unity Editor. We encourage yo
huggingface.co
Sentis 1.6.0 Upgrade
센티스 1.6.0으로 업데이트 되면서 퍼포먼스 관련 업데이트가 있었습니다. GC, CPU, GPU 등... 따라서 output을 읽는데 필수적인 함수가 바뀌었습니다. 기존에는 CompleteandDownload()를 통해서 cpu로 내릴 수 있었는데 이제는 별도의 변수를 생성하여 해당 값에 copy를 해야 합니다.
자세한 내용은 문서에서 확인할 수 있지만 정말 중요한 부분은 아래에서 확인할 수 있습니다.
TensorFloat outputTensor = worker.PeekOutput(output.name) as TensorFloat;
using var downloadedTensorCopy = outputTensor.ReadbackAndClone();
downloadedTensorCopy.PrintDataPart(10);
Webcam bug
사실 유니티에서 기존에 저장된 이미지나 비디오를 inference 하는 경우가 있을까...? 생각해보았는데 사실 그렇게 할거면 python에서 직접하는게 좋을 것 같다는 생각을 하게 되었고 그렇게 readme를 보고 진행했지만... 버그가 발생하였습니다.
몇가지 발생 가능한 예상 문제와 관련해서 생각해보았습니다.
- landmark가 바로 초기화 되지 않을 가능성 또는 계속 남아있을 가능성?
위 내용을 확인해보기 위해 각 프레임 별로 확인을 진행 하였고 그 결과 특이한 현상이 발생되었습니다.
- 각 프레임 별로 확인
- 다음 프레임 키를 매우 빠르게 누를 경우 해당 현상이 완화된 형태로 생성
- 다음 프레임 키를 천천히 누를 경우 위의 버그를 확인할 수 없음.
작성된 코드에서는 late update에서 초기화 및 minimap에 landmark를 표시하기 때문에 문제가 없어 보였습니다.
void LateUpdate()
{
if (!closing)
{
RunInference(targetTexture);
}
}
다만 의아한 점이 requestedFPS였습니다. 이 부분을 보고 들어던 가정이 설마 카메라 output의 fps를 고려하지 않는 것일까? 하는 부분이였습니다.
만약 해당 내용이 맞다면 frame에서 카메라의 output이 업데이트 되지 않았음 -> 이전 landmark가 남아있는 render texture에 landmark 생성 -> 결과적으로 위와 같은 현상이 발생하지 않을까? 하는 생각이 들었습니다.
확인해본 결과 제가 사용하는 카메라는 10fps로 확인되었습니다. 따라서 에디터의 프레임을 10 프레임으로 고정 후 진행하니 다음과 같이 정상적으로 작동 하였습니다.
개인 사진을 올리는 것이 부담스러워서 landmark만 표시하도록 코드를 수정한 점 양해 부탁드립니다.
결과적으로 원인은 확인하였으니 이벤트 (action)을 만들어서 카메라가 업데이트 될 때만 runinference를 하도록 하면 문제가 해결될 것으로 생각하였고 실제 정상적으로 작동 하였습니다. (Github)
결론
모델의 애니메이터까지 연결해보고자 합니다. 현재 모델의 경우 사실 488개로 너무 많은 landmark를 사용하고 있는 것으로 확인하였습니다. 다음 포스팅은 각 모델의 anmation과 landmark를 연결해보도록 하겠습니다.
댓글