딥러닝으로 세탁기 상태 추적 모듈 만들기

안녕하세요, 메이아이의 CPO 김찬규입니다.

딥러닝을 통한 인공지능 모델, 특히 CNN(Convolutional Neural Networks) 모델은 시각적인 분류, 감지, 추론 등의 문제에서 웬만한 사람보다 더 뛰어난 성능을 보이고 있는 것으로 유명한데요. 이러한 CNN 모델은 학습을 위해 상대적으로 매우 많은 양의 데이터가 필요하다는 측면에서 악명이 높기도 합니다.

많은 데이터를 확보하는 일은 적지 않은 비용을 수반하기 때문에, 딥러닝 기술은 대기업 혹은 큰 규모의 조직에서나 활용할 수 있다고 생각하기 쉽습니다. 하지만 해결하고자 하는 문제에 따라 딥러닝 기술은 아주 빠른 시간 안에, 매우 적은 비용으로도 높은 활용도를 보여주기도 합니다. 오늘은 한 가지 예시로 제가 직접 진행했던 프로젝트를 하나 소개해 드리고자 합니다.


세탁기 상태 추적 프로젝트는?

먼저 프로젝트를 간단히 설명드리겠습니다. 메이아이는 불특정 다수가 이용하는 세탁실을 구비한 어떤 클라이언트로부터 세탁실 이용 패턴에 대한 분석을 의뢰받았습니다. 클라이언트 측의 니즈는 세탁기 이용 현황을 파악하고, 이를 이용하여 세탁기의 활용도를 극대화하는 것이었습니다.

메이아이 팀에서 열심히 만들어 온 엔진이 세탁실 영상에서 여러 가지 정보를 뽑아 줄 예정이지만, 이번 프로젝트에는 새롭게 구현해야 하는 기능이 있었습니다. 바로 세탁기의 상태(세탁 중, 예약 대기 중, 중지)를 영상 정보로부터 실시간으로 추론 및 추적하는 기능이었습니다. 클라이언트의 니즈를 충족시키기 위해서는 언제 세탁기가 예약되었고, 언제 예약되었고, 언제 중지되었는지를 알아내 세탁기의 사용 패턴 및 활용도를 도출해낼 수 있어야 했기 때문입니다.


문제 정의하기

이제 기능 구현을 위해 해결해야 했던 문제를 조금 더 상세히 설명드리겠습니다. 먼저 다행스럽게도 세탁기에는 해당 세탁기의 상태를 알려주는 LED 등이 장착되어 있었습니다. 이 LED 등은 항상 세 가지 색깔(R: 빨강, G: 초록, B: 파랑) 중 하나로 빛을 뿜고 있으며, 이 세 가지 색깔은 세탁기의 세 가지 상태(세탁 중, 예약 대기 중, 중지)와 일대일 대응 관계를 가집니다. 즉, 세탁기의 LED 등이 어떤 색깔로 빛나고 있는지만 파악하면 세탁기의 상태를 추론해낼 수 있습니다. 여기서 끝이었으면 인생이 참 아름다웠을 것 같습니다. 하지만 real data는 항상 우리에게 문제를 던져주었고, 이번에도 문제는 더 있었습니다.

첫째는 화질이었습니다. LED 상태등이 밝은 빛을 내며 빠른 속도로 회전하는데, 이것이 좋지 않은 화질과 만나 초록과 파랑을 굉장히 구분하기 어렵게 만들었습니다. 더욱이 세탁실은 24시간 내내 운영되었고, 이로 인해 시각에 따라 밝기가 크게 달라지는 문제도 있었습니다. 이로 인해 이미지의 RGB 값을 활용하여 LED 등의 상태를 추론하는 등의 전통적인 컴퓨터 비전 방법들은 좋은 성능을 보여주지 못했습니다.

무슨 색일까요? 파랑? 초록?

둘째는 occlusion이었습니다. 사람들이 실제로 세탁기를 이용하고자 혹은 여타 이유로 세탁실을 돌아다닐 때 LED 등을 가리게 되며, 이런 상황에서의 추론 결과는 실시간 추적에서 제외해야 했습니다.

마지막으로 프레임 별 추론 결과가 100% 정확하지 않은 상황에서, 상태 등이 언제 어떤 색에서 어떤 색으로 바뀌었는지를 시간별로 알아낼 수 있는 방법이 필요했습니다. 즉, 부정확한 추론 결과를 시간의 흐름에 따라 aggregation하는 알고리즘이 필요했습니다.

또한 비용 상의 문제로 컴퓨팅 비용이 매우 큰 detection model 등은 활용할 수 없다는 제약 사항 역시 존재했습니다.

문제를 정리해 보자면 영상 내에 고정되어 있는 LED 등의 색깔을 알아내면 세탁기의 상태를 알아낼 수 있지만, 화질 및 환경의 문제로 인해 이따금씩 사람도 구분하기 힘든 색깔이 나타나고요. LED 등이 사람 등의 요소에 의해 가려지는 경우가 있고, 프레임별 결과를 영상 전체의 결과로 요약해야 한다는 것이었습니다. (4번 문제는 딥러닝과는 크게 관계있는 부분이 아니기 때문에, 이번 포스트에서는 간단한 딥러닝 모델을 해결함으로써 1~3번 문제를 해결하는 과정만 다룸을 알립니다.)


모델 설계하기

영상 내에 LED 등의 위치는 누군가 갑자기 세탁기를 옮기지 않는 한 고정되어 있습니다. 영상으로부터 해당 위치만 잘라 딥러닝 모델을 통해 상태를 추론할 수 있을 것 같습니다. 즉 모델은 영상 전체가 아닌 LED 등의 이미지들로부터 각각의 상태를 추론하게 됩니다. 마찬가지로 이미 확보된 영상의 해당 위치의 이미지들을 잘라 딥러닝 학습을 위한 이미지셋을 구축할 수 있을 것 같습니다.

Multi-class classification

이에 따라 먼저 세탁기의 상태 추론을 위한 모델을 설계해 보았습니다. 가장 먼저 LED 등의 이미지를 R, G, B 세 가지의 class 중 하나로 분류하는 분류 모델을 고려할 수 있습니다. 이 경우 통상적으로 마지막 layer에서 3차원의 output vector를 출력하게 되며, 이로부터 softmax 함수로 각각의 class에 대한 확률을 도출하게 됩니다. 여기서 가장 확률이 큰 class를 선택하게 되는 것입니다.

하지만 이러한 모델 구조는 한 가지 문제가 있습니다. 바로 occlusion 문제에 취약하다는 것입니다. 대부분의 학습된 딥러닝 모델은 out-of-distribution data에 대해서도 높은 confidence를 보이는 overconfidence 현상을 보이기 때문에, 위와 같은 분류 모델은 사람 혹은 사물에 의해 가려져 있는 이미지를 발견하더라도 아주 높은 confidence로 셋 중 하나의 class로 분류하게 될 것입니다. 세탁실의 특성상 많은 사람들이 오가기 때문에, 이 문제는 모듈의 정확도를 크게 낮출 수 있습니다.

Multiple binary classification

그렇다면 어떻게 이미지를 세 가지 class로 정확히 분류하면서도 occlusion에 대처할 수 있는 모델을 학습할 수 있을까요? 저는 가장 직관적인 방법을 선택했습니다. 바로 문제를 3-class classification 문제가 아닌 3가지 binary classification 문제로 정의하고, distracting image들을 통해 세 binary classifier가 모두 out-of-distribution에 대해서는 낮은 확률을 출력하도록 유도하는 것입니다.

즉 softmax 함수가 아닌 sigmoid 함수로 세 가지 class의 각각에 대한 확률을 도출하도록 하였으며, 영상으로부터 LED 등이 아닌 구역의 이미지를 임의로 잘라내어 모델에 학습시킴으로써, LED 등이 아닌 다른 data에 대해서는 세 가지 분류기가 모두 낮은 확률을 보이도록 유도하였습니다.

이에 추론 시에는 세 가지 class 중 가장 확률이 높은 class로 이미지를 분류하되, 해당 class에 대한 확률이 threshold(e.g. 0.5)를 넘지 못하면 occlusion 상태로 분류하도록 하였습니다. 더욱이 모델의 feature extractor로는 아주 간단한 임의의 CNN을 사용하였습니다.


데이터셋 수집하기

이후 위에서 설계한 모델을 학습시키기 위해 데이터를 수집해 보았습니다. 먼저 세탁실마다 LED 등이 위치하는 RoI(Region of Interest)를 지정하고, 해당 구역으로부터 이미지를 추출했습니다. 이때, 이미지의 RGB 값을 통해 LED 등의 상태를 추론하는 방법은 실전에 적용할 만큼 정확하지는 않지만, 데이터 레이블링 비용을 줄여주기에는 충분한 성능을 보여주었습니다. 이에 따라 추출된 이미지를 RGB 값에 따라 세 가지 레이블로 우선적으로 분류한 후, 인간 지능(수작업)을 이용하여 잘못 분류된 이미지들을 다시 분류하였습니다.

마지막으로 distracting image들은, 매 프레임마다 단순히 영상의 임의의 구역으로부터 이미지를 추출하여 구성하였습니다. 이 결과 RGB 클래스 각각 1,000장, 그리고 distractor 클래스 500장으로 구성된 총 3,500장의 이미지셋을 구성하였습니다. 딥러닝 모델 학습을 목적으로 한 것치고는 굉장히 소소한 규모의 이미지셋이지만, 간단한 문제이기 때문에 충분하다고 판단하였습니다.


모델 학습 및 결과

모델 학습에는 흔히 쓰이는 Adam optimizer와 BCE loss를 사용하였습니다. 학습은 굉장히 빨리 이루어졌으며, 학습된 모델은 LED 등의 상태를 정확히 추론할 뿐만 아니라, occlusion 상태 역시 정확히 추론하며 아주 훌륭한 성능을 보여주었습니다. 다만 계약상의 문제로 영상, 이미지 및 코드를 공개할 수 없는 점 양해 부탁드립니다.


마치며

‘딥러닝은 아주 많은 데이터를 통해 아주 오래 학습시켜야만 한다’는 통념과 다르게, 잘 정의된 문제에 대해서는 아주 간단하고 빠르게 딥러닝 모델을 개발하고 학습시켜 활용해 볼 수 있습니다. 실제로 위의 모델을 구상하고, 개발하고, 학습하는 데는 1 영업일이 채 걸리지 않았습니다. 더욱이 self-supervised learning, semi/unsupervised learning이나 active learning 등 적은 데이터로도 강력한 모델을 만들어내고자 하는 많은 연구들이 이루어지고 있으니, 딥러닝의 활용도는 더 빠른 속도로 높아지리라 확신합니다.

위처럼 메이아이의 리서치 팀에서는 핵심적인 기술에 대한 장기적인 연구도 진행되지만, 클라이언트의 니즈를 충족시키고 메이아이의 솔루션인 매쉬의 가치를 높이기 위해 여러 방향으로 딥러닝을 활용하고 적용하는 시도들도 꾸준히 진행되고 있습니다. 앞으로도 메이아이와 메이아이 기술 블로그의 행방에 많은 관심 가져주시길 바랍니다. 감사합니다!