이 글은 Barracuda 여행기 1편 | 1. 실시간 손 탐지 파티클 적용Barracuda 여행기 | 2. 실시간 얼굴(눈) 탐지에서 이어집니다.

안녕하세요.
비브스튜디오스 연구소 서비스개발팀 정인호 연구원입니다.

이번 포스팅에서는 지난 실시간 손 탐지 파티클 적용과 얼굴(눈) 탐지에 이어 Barracuda를 이용한 Body-Segmentation 모델을 소개해드리려 합니다.

이번 프로젝트는 게임 '리그오브레전드'에 등장하는 '자크' 캐릭터를 모티브로 삼아 진행한 프로젝트입니다.


Segmenataion Model

Segmenatation OutputTexture 적용
23

Barracuda를 이용한 Body-Segmentation을 진행하기 위해 먼저 MediaPipe의 selfiSegmentation 모델을 이용해 사람 영역을 추출해줍니다.

이 모델은 3개의 채널을 가진 (R,G,B) input을 넣어주면 하나의 채널을 가진 output을 내보내 줍니다. 다음으로 해당 영역에 제가 원하는 텍스처를 넣어주기만 하면 됩니다.
(자크 캐릭터의 느낌을 살리기 위해 이것저것 시도해보니 제가 좋아하는 파란색이 가장 마음에 들었습니다💙)

텍스처 만으로는 어딘가 허전하지 않나요...?
그래서 지난 포스팅에서 소개한 BlazeFace 모델을 이용해 눈을 추가해보겠습니다.
지난 포스팅 바로가기>>


Eye Detection 모델 추가

Option 1Option 2
45

BlazeFace 모델을 이용하는 과정에서 조금 당황스러운 상황이 발생했습니다.

효율적인 렌더링을 위해 Option 1 처럼 WebCam 데이터의 전처리를 공유하고자 했는데, 두 모델의 전처리 과정이 달랐습니다. Segmentation의 경우 pixel color의 범위가 [-1,1]이고, Detection 모델의 경우 [0,1]입니다. 두 모델 전부 Mediapipe에서 제작했는데 눈물을 머금고 option 2의 방식을 택해야 했습니다.


float4 frag(v2f i) : COLOR
{
    float4 color = tex2D( _MainTex, i.uv );

    color = color.r > 0.5? tex2D(_bodyTexture, i.uv+(0, _time*0.01f)) : tex2D(_webcamTexture, i.uv);

    color = length(_eyePosition.xy - i.uv) < 0.02? tex2D(_eyeTexture, i.uv+(0, _time*0.01f)) : color; // left eye

    color = length(_eyePosition.zw - i.uv) < 0.02? tex2D(_eyeTexture, i.uv+(0, _time*0.01f)) : color; // right eye

    return color;
}

다행인 점은 Eye Detection 모델의 output 좌표가 (0~1)범위의 값으로 출력된다는 것입니다.
따라서 별다른 좌표 변환 없이 uv 좌표계를 이용해 바로 적용할 수 있었습니다.


Result

Segmenataion Model에 Eye Detection 모델을 추가한 결과물입니다.

마지막으로 최종 결과 영상을 첨부해드리며 포스팅을 마치겠습니다.

이렇게 3번째 Body-Segmenataion Model로 Barracuda 여행기가 마무리 되었지만 또 재미있는 프로젝트로 다시 돌아오겠습니다👍

감사합니다.

profile
VIV LAB은 Visual AI와 VR,MR,AR기술을 기반으로 버추얼프로덕션과 디지털휴먼 제작, VFX/CGI 등 AI기술의 연구 개발을 수행하는 비브스튜디오스의 제작 기술 연구소 입니다.

0개의 댓글