R&D

[R&D] 바라쿠다 Barracuda & 페이스 메시 FaceMesh

스튜디오 오버그래픽스 2022. 6. 30. 17:40

인터랙티브 컨텐츠 개발하면서 관객으로부터 특정 데이터를 쉽게 가져올 구조가 필요해서 R&D 시작.

 

기존에 키넥트, 라이다, 리얼센스트랙킹, 스켈레톤, 뎁스 등은 많이 썼었기 때문에 제외하고

웹캠 rgb데이터만으로 쉽게 관객과 인터랙션 할수 있는 방식을 조사.

 

그래서 OpenCV를 사용하려다가 Barracuda가 흥미로워보여서 R&D하게됌.

 

※확실하지 않은 정보 다수

'경량 크로스 플랫폼 뉴럴 네트워크 추론 라이브러리' 라고 하는데

인공지능 학습된 모델을 유니티에서 쓸수 있게 해주는 라이브러리.

플랫폼,환경에 따라 호환이 어려운점을 개선한듯?

패키지 매니저에서 설치가능하고 ONNX모델을 지원.

 

기존에 OpenCV에서 있던 기능들과 비슷한데 성능은 더 좋은듯?

-스켈레톤 트랙킹

-이미지 데이터에서 숫자,알파벳 인식

-사물 추론

-얼굴 인식

등등...

 

https://www.youtube.com/watch?v=XgNga6LbQ30 

이 처럼 게임의 배경을 특정 화풍으로 바꿔주는것도 있고.

https://github.com/keijiro/Waifu2xBarracuda

 

GitHub - keijiro/Waifu2xBarracuda: Waifu2x Unity Barracuda implementation

Waifu2x Unity Barracuda implementation. Contribute to keijiro/Waifu2xBarracuda development by creating an account on GitHub.

github.com

이처럼 저화질의 이미지를 업스케일링 하는 것도 가능(게임이나 웹컨텐츠에서 리소스 용량을 많이 차지하는게 텍스쳐인데 이를 활용하면 낮은 용량으로도 고품질 효과를 낼수 있을듯)

 

 

 

 

 

 

 

https://github.com/keijiro/FaceMeshBarracuda

 

GitHub - keijiro/FaceMeshBarracuda: Lightweight facial capture package for Unity

Lightweight facial capture package for Unity. Contribute to keijiro/FaceMeshBarracuda development by creating an account on GitHub.

github.com

아무튼 인터랙티브 컨텐츠제작에 사용할 케이지로의 FaceMeshBarracuda

 

얼굴을 인식하고 468개의 버텍스로 이루어진 메시를 얼굴에 맞춰서 그려준다

프레임이랑 정확도가 기대이상으로 잘 나온다.

이제 여기서 각각의 버텍스들의 위치값을 받아내서 컨텐츠에 유의미한 데이터로 뽑아내면 될것 같다.

ex)

눈의 깜빡임

입모양 움직임

안면 구조 위치

전반적인 안면근육 움직임?

 

각각 버텍스 468개가 배열로 c#코드 안에 가지런히 잘 정리되어 있어서 그냥 가져다 쓰면 될줄 알았는데,

생각보다 조금은 더 복잡함.

해당 Scene에는 Visualizer라는 오브젝트안에 2개의 C#코드가 있다.

- Webcam Input (웹캠 호출 및 설정)

- Visualizer (웹캠 이미지 데이터를 컴퓨트 쉐이더 인풋 ->  컴퓨트 쉐이더 연산 실행 -> 연산된 결과값 가져오기(GPU to CPU) -> 가져온 결과값 쉐이더에 적용 ->유니티에 페이스 메쉬 출력)

 

Visualizer.cs에 연결된 Resource Set과 Shader가 있음

- Resources (바라쿠다, 컴퓨트 쉐이더 관련한 항목들?)

- Shader (컴퓨트 쉐이더에서 연산된 값을 받아서 페이스 메쉬로 그리는 쉐이더)

 

 

-코드 뜯어보기-

Visualizer.cs의 업데이트문에서

웹캠 텍스쳐를 인자로 넣어서 ProcessImage라는 함수를 실행하고 있음.

 

타고 타고 코드를 들어가보면

컴퓨트쉐이더 연산을 하고 있고 그 이상은 이해X

여기까지 웹캠 텍스쳐를 넣어서 연산을 하고 있다는 것을 코드 확인함.

(GPU에서 연산된거고 이거를 CPU로 가져오면 될거 같다)

 

 

Visualizer.cs의 OnRenderObject함수

페이스 메쉬를 그리는 쉐이더의 버텍스에 '_pipeline.RefinedFaceVertexBuffer'를 넣어주는 코드가 있음.

 

 

Visualizer.cs에서 public static으로 'Vert'라는 이름으로 Vector4 배열을 468개 짜리로 만들고

_pipeline.RefinedFaceVertexBuffer.GetData(Vert);

컴퓨트 쉐이더 연산 다음줄에 코드를 추가해서 값을 받아옴

다른 C# 코드에서 Visualizer.Vert[n]으로 n번 버텍스 위치값을 받아올수 있음.

13번과 14번 버텍스가 각각 윗입술과 아랫입술이라서 입을 얼마나 벌렸는지 확인 가능

(버텍스의 위치값들이 작은 범위라서 소수점 5째자리 까지 보기위해서 'ToString("N5")'를 추가함)

 

입을 벌렸을때

약 0.07값이 나옴

 

입을 닫았을때

약 0.002~3정도 나옴

 

 

 

 

 

 

+에셋 스토어 Barracuda 관련 샘플

https://assetstore.unity.com/packages/tools/ai/moodme-4-emotions-barracuda-sdk-202171?aid=1101lvqJ5 

 

MoodMe 4 Emotions Barracuda SDK | AI | Unity Asset Store

Get the MoodMe 4 Emotions Barracuda SDK package from MoodMe and speed up your game development process. Find this & other AI options on the Unity Asset Store.

assetstore.unity.com

표정에 따라 감정을 분석해서 수치로 나타내주는 샘플

 

 

스튜디오 오버그래픽스
정준희 Technical Artist
ovgrps@gmail.com