[Tech +]"잠시 당신의 손을 가져가겠습니다" - Hand Segmentation에 대한 기술 이야기!

안녕하세요. 알비언 AI팀에서 인턴십 과정을 수료한 Charlie입니다! 

이번 Tech 콘텐츠에서는 인턴십 기간 동안 진행하였던 Hand Segmentation에 대해 소개하려 합니다. 
모쪼록 재밌는 글이 되길 바라며 바로 시작해볼게요 :)



손이 사라지는 마술기술 이야기 

Hand Segmentation에 대해




배경 및 목적

MERGY APP의 최초 관문은 핸드폰으로 찍은 Image에서 물체를 인식하는 것부터 시작합니다. 물체를 제대로 인식하기 위해서는 당연히 물체를 인식, 분류하는 모델을 잘 짜는 것이 주요한 과제입니다. 그러나 컴퓨터는 사람이 아니기 때문에 물체를 인식하는 데 있어 조금의 장애물만 있어도 대상 물체를 잘 인식해내지 못합니다. 그렇기 때문에 인식 과정과 별개로 물체를 제외한 그 이외의 장애물들을 제거해주는 작업이 필요합니다.

사람들이 어떤 물체의 사진을 찍을 때 가장 많이 활용하는 도구가 뭘까요? 바로 사람들의 '손'입니다. 우리는 손만 있으면 어디서든 원하는 구도로도 사진을 찍을 수 있습니다. 말 그대로 인간에게 있어 가장 Handy한 도구가 손인거죠. 하지만 이렇게 편리한 우리의 손은 안타깝게도 MERGY APP에서는 가장 큰 장애물로 작용합니다. 😱 

제가 한 일은 본질적으로 물체 인식을 위한 장애물의 제거입니다. 그 중 가장 주요한 장애물이 바로 손이기 때문에 Hand Segmentation이란 과제가 필요했던 겁니다. 그럼 어떻게 손을 제거할 수 있는지, Segmentation은 대체 어떤 것인지에 대한 주제로 넘어가보도록 하겠습니다.




Segmentation이란?

사람들에게 가장 익숙한 AI 모델 중 하나는 사진을 보고 '고양이인지 아닌지' 구별하는 모델입니다. 이런 작업을 Image classification이라 합니다. 사진을 보고 사진에 있는 물체가 무엇인지 판별하는 것이죠. 그러나 이 정도로는 부족합니다. Classification은 매우 coarse한 예측입니다. 사진 전체를 보고 물체의 종류만 내놓을 뿐이니까요. 

Image inference task는 이처럼 coarse한 예측에서 점점 더 fine한 예측으로 넘어갔습니다. 어떤 물체가 어떤 위치에 있는지 사각형의 box로 나타내는 Object localization, 더 나아가 사각형의 box가 아니라 pixel단위로 물체의 종류와 위치를 예측하는 Semantic segmentation, 다음으로 동일한 물체여도 객체 별로 구분해내는 Instance segmentation의 순으로 말입니다.

그렇다면 '사진에서 손을 지우기 위해' 가장 효과적인 방법은 무엇일까요? Classification은 아무 도움이 되지 못합니다. 기껏해야 사진에 '손이 있다, 없다' 정도만 구분할 수 있죠. Object localization은 이보다는 조금 나을 겁니다. 손을 인식하고 손의 위치까지 box로 잡아주니까요. 하지만 box안에는 손이 아닌 영역도 존재합니다. 이 box를 전부 손이라 생각하고 사진에서 지워버리면 정보의 손실이 너무 크겠죠.

Semantic segmentation은 어떨까요? 사진에서 정확히 손이 있는 영역만 pixel 단위로 예측합니다. 그럼 정확히 손이 있는 부분만 제거할 수 있게 됩니다. 따라서 우리의 목표에 가장 알맞습니다. 우리는 정확히 ‘손’만 지우고 싶은 거니까요.

Instance segmentation을 해도 문제는 없습니다. 그렇지만 우리 기술에 필요한 건 '이 손이 누구의 손인지, 왼손인지 오른손인지 구분하고자 하는 게 아닙니다. 손이기만 하면 되는거죠. 따라서 Instance segmentation은 안 될 건 없지만 필요 이상의 spec이고 더욱 복잡해지기만 합니다.

우리에게 정확히 필요한 것이 Hand semantic segmantation인 것을 알 수 있었습니다. 더도 말고 덜도 말고 딱 이거면 됩니다. 목표는 명확하게 정의되었으니, 다음으로는 어떻게 사진에서 손을 찾아냈는지 방법에 대해서 이야기하도록 하겠습니다.

Models

다양한 방법들이 있겠지만 AI model을 개발하는 방법을 사용했습니다.

AI 안에도 semantic segmentation을 위한 많은 model들이 있지만 저는 그중에서도 ResNet model에 ASPP를 적용한 HGR-Net이란 모델과 최근 NLP 뿐만 아니라 Vision 분야에서도 각광받고 있는 Transformer를 적용한 model을 사용하였습니다. 이번 Section에서는 각 모델의 기본 구조와 핵심 개념들에 대해 설명드리도록 하겠습니다.


1. HGR-Net

첫 번째 모델은 기본적으로 image 인식에 있어 유명한 CNN을 사용한 모델입니다. 거기에 ResNet(Residual Network)와 ASPP(Atrous Spatial Pyramid Pooling)이라는 기법을 추가한 것인데요.

ResNet이 무엇인지 설명하기 전에 Deep learning에 대해서 간략한 설명이 필요합니다. 기본적으로 Deep learning은 layer(층)들로 구성됩니다. 층이 여러 개 쌓이면 Deep Neural Network가 됩니다. 깊게 쌓였다 해서 Deep인 거죠. 예측을 잘 하기 위해서 layer를 더 여러 겹으로 쌓고 싶지만, layer를 계속하여 쌓다 보면 Gradient Vanishing이라는 문제가 발생하게 됩니다. 이러한 문제를 해결하기 위해서 등장한 것이 ResNet인데요. layer를 지난 결과에 원본을 더해주게 됩니다. 그러면 놀랍게도 layer를 쌓으면서 발생했던 Gradient Vanishing 문제를 해결할 수 있게 됩니다. 덕분에 저희는 원하는 만큼 여러 겹의 layer를 쌓을 수 있게 됩니다.



하지만 다른 것보다도 이 모델의 Key는 바로 ASPP라고 볼 수 있습니다. 사람도 어떤 물체를 인식하거나 경계를 구분할 때, 그 주변도 함께 고려합니다. 사실 CNN 자체가 image의 일정 영역에서 feature extraction하는 과정인데 어째서 ASPP가 별도로 필요할까 하는 의문이 생길 수도 있습니다. CNN과 ASPP는 바로 dilation에 있는데요. 기존 CNN의 kernel이 연속적인 사각형이었다면, ASPP의 kernel은 위의 그림처럼 이 사각형들의 사이사이가 비어있는 구조입니다. 따라서 같은 수의 parameter로 더 넓은 영역을 볼 수 있게 됩니다. 

이러한 구조의 convolution을 Atrous Convolution이라 부르고, 이러한 Atrous Convolution의 dilation rate를 바꿔가며 여러 번 진행한 결과를 이어붙인 것이 바로 ASPP입니다. 이를 통해 더 넓은 시야를 가질 수 있게 되었고, 나무뿐만 아니라 숲도 함께 볼 수 있게 되었습니다.


2. ViT model

두 번째로 제가 사용한 모델은 최근 각광을 받고 있는 ViT(Vision Transformer)를 사용한 segmentation model입니다. 기존의 ViT와 비슷한 구조를 갖고 있지만, 차이는 class token을 사용하지 않았고 transformer 이후에 segmentation map을 만들기 위한 Dense layer, Reshape layer들이 추가되었다는 것이지요. 다시 말해 1D 벡터를 다시 2D 이미지로 복원시킬 때 필요한 것이라 생각하시면 됩니다.

Transformer model은 NLP에서도 마찬가지지만, input 데이터들을 의미 상으로 연결된 token들로 나누고 이러한 token들 사이의 연관성에 기반하여 예측을 하는 모델입니다. 따라서 CNN보다 더 넓은 영역을 함께 보는 것과 더불어서 각 영역들 사이의 관계성까지도 함께 학습시킬 수 있는 모델입니다.

ViT는 처음에 이미지를 받아 각 이미지를 patch라 부르는 작은 영역들로 쪼갭니다. 이러한 patch들이 각각 하나의 token이 되며 Transformer의 input으로 들어가게 되고, Transformer 내부에서 MSA(Multi-head Self Attention)이라는 과정을 거치게 됩니다.

MSA로 들어간 각 input들은 각자의 Q(Query), K(Key), V(Value)값들을 가지게 되고 이 Q, K, V의 값들을 갖고 연산을 통해 결과를 내놓습니다. 이러한 결과들은 다시 한 번 Feed Forward라는 layer를 지나 다음 단계의 input으로 넘어가게 됩니다. ViT에 대해서 더 자세한 설명은 이전 Kelly가 작성한 ViT 콘텐츠를 참고해주세요!


여기까지가 제가 사용한 모델에 대한 설명이었습니다. 그리고 결과로 넘어가기 전에 모델의 성능 향상을 위해 어떠한 Augmentation을 진행했는지에 대해 설명하도록 하겠습니다.



Augmentation

어떤 model이든 학습을 위해서는 데이터가 필요합니다. 하지만 아쉽게도 Hand Segmentation을 위한 데이터는 생각보다 많지 않았습니다. 열심히 모았음에도 전체가 25,000장 정도에 불과했으니까요. 또한 각 data source 별로 비슷한 사진들이 많았기 때문에 데이터에 의한 bias가 생길 가능성, overfitting의 가능성이 있었습니다. 따라서 Data의 수를 늘리고 이러한 bias를 줄이기 위해 Data Augmentation을 진행하였습니다.

1. Black Box Augmentation

우리의 목표를 좀 더 정확하게 써보자면 “Merge app을 위해 물체를 든 손을 제거한다”입니다. 하지만 제가 모은 데이터에는 손만 나온 데이터들이 많았습니다. Merge app을 사용하면서 손만 찍을리는 절대 없을텐데 말이죠. 그래서 손에 물체가 있는 것과 비슷한 효과를 줄 수 있도록 손의 영역을 찾아 중심에 Black box를 넣는 augmentation을 진행했습니다.

아래는 이와 같은 augmentation을 진행한 후 모델을 학습시킨 결과인데요. 정답 mask에서도 잡아내지 못했던 시계나, 손 사이의 행주를 잡아내는 것이 보이시나요?!


2. Other Augmentations

이외에도 Image augmentation에 많이 사용되는 Zoom / Translation / Rotation을 적용하였습니다. 뿐만 아니라 손을 인식하는데 있어 외부의 조명에 의해 채도/밝기/색상의 영향을 받으면 손을 잘 인식하지 못하는 경우가 있었기 때문에 채도/밝기/색상에 대한 Augmentation도 적용하였습니다.

아래 사진에서 이러한 Augmentation의 효과를 확인해 보실 수 있는데요. 2번째 / 3번째 열이 각각 Augmentation의 적용 후 / 적용 전 결과입니다. 확연한 차이가 보이시나요?




결과

Model 학습 후에 Test를 위해서 회사 내부와 근처를 돌아다니면서 직접 사진을 찍어서 테스트해보고 각 모델을 비교해 보았습니다.

모델마다 약간의 차이는 있지만 ViT 모델과 ResNet 모델 모두 손을 예측해내고 있습니다. 특히 ResNet은 ViT 모델과 비교해서 parameter 수가 현저히 작은데도 불구하고 비슷한 성능으로 예측해내었습니다. 아직 부족한 면면도 살짝씩 보이지만 손을 제외시킬 수 있다는 것 대단하지 않나요? 

오늘은 Hand Segmentation에 대해서 알아보았는데요, 약 두 달간 이곳 알비언에서 인턴으로 함께 연구하고 함께 고민하면서 많은 걸 배웠던 유익한 시간이 된 것 같습니다. 앞으로의 가능성이 눈부신 기업 '알비언'에 대해 앞으로도 많은 관심 부탁드립니다.

긴 글 읽어주셔서 감사드려요!


Reference

- A. Garcia-Garcia et al., (Link) 

- IET Comput. Vis., 2019, Vol. 13 Iss. 8, pp. 700-707

- Liang-Chieh Chen et al., arXiv:1606.00915v2  [cs.CV]  12 May 2017

Social Media

 official@mergerity.com