ZZIN33
re-code-cord
ZZIN33
전체 방문자
오늘
어제
  • 분류 전체보기 (52)
    • Paper (4)
      • Generative Model (2)
      • Segmentation (1)
      • 모델 경량화 (1)
    • Study (34)
      • AI (10)
      • MLOps (8)
      • CS (4)
      • OpenCV (1)
      • Algorithm (9)
      • ETC (2)
    • Project (6)
    • ETC (8)
      • 부스트캠프 AI Tech (2)
      • 도서 리뷰 (5)

블로그 메뉴

  • Home
  • About
  • Github

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ZZIN33

re-code-cord

올바른 손 씻기 교육을 위한 손 씻기 단계 인식 모델
Project

올바른 손 씻기 교육을 위한 손 씻기 단계 인식 모델

2022. 1. 18. 17:22

Project Overview


Purpose

  • 실시간 영상에서 손 씻기 단계를 판별하고 정부 권장 손 씻기 6단계 지침을 수행할 수 있게 도와주는 서비스
  • 기존의 rule-based 방식으로는 변수를 고려하기 어려운 문제(피부색, 촬영 환경, 개인마다 다른 손 모양 등)가 있어 다양한 데이터를 통해 학습된 딥러닝 모델로 문제 해결
  • 아동 손 씻기 교육을 위한 스마트폰 애플리케이션이나 음식점, 병원, 공공장소 등에서 사용될 수 있는 손 씻기 검수 애플리케이션 등 다양한 분야에서 사용될 수 있음

 

Model

Real Time Object Detection with YOLOv5

Model   mAP50
YOLOv5s Batch Size 144 0.715
  + Brightness Aug ↑ 0.7457
  + Mosaic, Mixup ↑ 0.7457
YOLOv5s Multiscale Batch Size 64 0.715
  + Brightness Aug ↑ 0.8643
  + Mosaic, Mixup ↑ 0.8753
YOLOv5m Batch Size 100 N/A
  + Brightness Aug ↑ 0.7966
  + Mosaic, Mixup ↑ 0.8375
손 씻는 단계를 인식한다는 것은 각 단계의 행동을 파악해야 할 필요가 있다. 당연히도 Video Task로 문제를 해결하는 것이 최적의 방법이나, 주어진 시간 내에 구현하는 것을 목표로 진행하였기에 Image Task로 문제를 접근하여 해결했다. 

 

Dataset

 학습에 사용한 데이터 셋은 다음과 같다. 

  • Kaggle 손 씻기 데이터 셋 (Link)
  • 병원 손 씻기 데이터 셋 (Link)

 주어진 데이터 셋의 경우 손씻는 영상의 프레임 별로 해당하는 단계의 라벨링이 제공된다.   

 이번 프로젝트에서는 따로 제출할 수 있는 리더보드가 있는 것이 아니기 때문에, 정말 객관적인 평가가 필요했다. 그래서 제작한 것이 골든 데이터 셋이다. 최대한 다양한 연령, 성별, 피부색의 사람과 다양한 화장실에서 촬영하여 자체 제작한 데이터를 평가 데이터로 사용했다. 그 결과 실제 데모 시연에서도 좋은 성능을 확인할 수 있었다.  

 

Architecture

 전반적인 아키텍쳐 구성은 다음과 같다. 

Overall Architecture

 먼저, 클라이언트가 웹브라우저를 통해 비디오 소스를 Streamlit 기반의 웹 서버에 전송한다. 웹 서버에서는 클라이언트로부터 실시간으로 비디오 소스를 전달받고, 프레임을 적정 간격으로 하나씩 추출(매 3 프레임마다)하여 디텍션 서버로 추론을 요청(Request)한다.

 디텍션 서버에서는 추론을 요청 받은 프레임에 대해 YOLOv5를 이용하여 해당 프레임에 대하여 탐지를 진행하고, 이를 통해 나온 결과 정보를 다시 웹 서버로 전송(Response)한다.

 이후 웹 서버에서는 전송 받은 결과를 모아(5개의 결과 종합) 후처리를 진행하며, 최종 예측 결과를 바탕으로 프레임에 손의 박스를 표시하고 단계의 진행도를 체크한다. 여기서 손 씻기 단계는 질병 관리청 권장 6단계에 맞춰 각 5초씩, 총 30초가 소요되도록 유도하고 있다.

 

 Input과 Output의 과정을 좀 더 자세하게 살펴보자.

Post Processing

 웹 서버로 부터 디텍션 서버는 초당 15 프레임으로 비디오 소스를 받으며, 눈으로 봤을 때의 자연스러움(박스가 수시로 바뀌면 어지러우니까)과 연산 부담을 줄이기 위해 3 프레임당 하나의 이미지를 받도록 설정했다. 그 뒤로 추론을 진행하고 결과 값을 웹 서버로 돌려준다.

 여기서 후처리를 적용하고 있는데, 앙상블이라고 생각하면 편할 것 같다. 아무래도 Image Task로 진행하면서 Video Task와 같이 이전 프레임에 대한 정보를 활용하지 않기 때문에, 최대한 순간순간의 결과보다는 경향성을 활용하기 위해서 큐에 결과를 모으고 있다가 최빈값을 구해 최종 결과로 사용하는 방법으로 해결했다. 실험을 거듭하면서 5개의 결과를 종합하는 것이 성능이 잘 나왔던 것 같다.  

 

Trial and Errors


Making Dataset

 프로젝트를 진행하는 과정에서 다시금 데이터의 소중함을 느꼈다. 이전에는 워낙 많은 데이터를 갖고 있어서 EDA를 통해서 Augment만 잘 적용하면 괜찮은 성능을 확보 할 수 있었다. 하지만, 이번 데이터에서는 손의 포인트나 손의 위치 같은 정보는 없고 오로지 해당하는 단계만이 라벨링 되어 있었으며, 노이즈 정보가 많았다.

 수십만장의 데이터를 검수하는 것은 시간만 있다면 어려운 일은 아니다. 우리가 가장 우려했던 점은 시간을 투자했지만 큰 성과가 없는 경우였다. 수차례의 회의 끝에 시간에 쫓기는 와중에 위험을 감수하고 데이터 검수 및 제작을 진행하고자 결정했다.

 먼저, 가지고 있던 학습 데이터 셋에서 너무 과도한 노이즈(손이 제대로 찍히지 않은 경우, 단계가 구분되지 않는 경우)라고 판단되는 데이터를 먼저 제거했다. 다음으로는 오픈소스를 활용하여 손 박스의 수도라벨링을 진행했다. 그리고 최종적으로 자체적으로 가이드라인을 만들고 가이드라인에 따라서 데이터를 검수하며 잘못 생성된 박스를 제거하여 데이터 셋을 제작했다.

 추가적으로 모델의 객관적인 평가를 위해서 자체 평가 데이터 셋을 제작했다. 환경, 연령 그리고 피부색 등을 고려하여 최대한 다양하게 데이터를 제작하여 평가를 진행했다. 그 결과 일반화 성능을 상당히 높일 수 있었다.    

 

APP Trial

 초기에는 이용자의 관심을 끌기 위해서는 AR을 활용하거나 최소한 사용하기 쉽게 어플을 만들면 좋을 것이라고 생각했다. AR은 물론, 어플을 만들어 본 경험이 없었기에 일단은 Pytorch Live, Pytorch Mobile 그리고 다양한 APP 관련 오픈소스들을 찾아보고 사용해봤다. 역시나 다양한 문제가 발생했고 진행이 더뎠다.

 충분히 시간을 투자하면 구현 가능하겠지만, 그만큼 다른 부분에서 미흡할 것이라고 판단했다. 그래서 Flask + Streamlit의 조합으로 구성하여, 최대한 빠르게 구현하고 필요한 기능적인 부분을 구현하기 위해 노력했다. 그 결과로 성공적으로 기간내에 데모를 완성할 수 있었고, 필요하다고 생각한 기능들(시작 트리거나 Post Processing 등)을 구현할 수 있었다.

 

Post Processing

 간단하게 테스트 하기 위한 웹을 구현하고 팀원들에게 테스트를 받으며 피드백을 받았던 부분이다. 먼저,  하나의 프레임으로만 판별하는 지금의 방법으로는 제대로 단계가 인식되지 않더라도 중간 중간 값이 튀면 진행이 되는 문제가 있었다. 이를 해결하기 위해서는 이전의 프레임도 고려하여 전반적인 경향성을 보는 것이 필요하다고 판단했다.

 경향성을 보기 위해서 여러 프레임을 모았다가 하나의 결과로 앙상블하는 방법을 선택했다. 지금 수행하고 있는 단계를 잘 인식하면서도, 다른 행동을 하면 바로 진행을 멈출 수 있도록 실험한 결과 총 5개의 프레임을 수집하여 최빈값을 최종 결과로 사용하는 방법이 가장 성능이 잘 나오는 것을 확인했다. 

 Post Processing 과정을 사용하여 다른 단계를 행동하는 동안에는 진행이 멈추며, 하나의 단계를 진행하는 과정에서 중간 중간 값이 튀더라도 일정한 속도로 단계가 진행되어 각 단계의 시간을 조절하기 수월했다. 하지만, 손을 멈추고 있어도 단계가 진행되는 부분은 해결하지 못해서 아쉬움이 남는다.  

 

Making Demo

 꼭 필요하다고 생각하는 다음 기능들은 다음과 같았다. 

  • 현재 진행 단계에 대한 설명과 진행 상태를 보여주기 (이건 프로젝트의 목적)
  • 대기 상태에 있다가 시작 트리거가 인식되면 시작하기 (물 묻은 손으로 무언가 만지고 싶지는 않으니까)
  • 예쁘게 꾸미기 보다는 최대한 원하는 의도를 명확하게 전달하기 (손의 박스와 진행 바의 색상을 통일하기, 현재 진행 단계를 글 + 시각적인 정보로 전달하기 등)

 다소 부족한 부분이 있었지만, 주변 사람들에게 테스트한 결과 목표한 바는 달성했다고 생각한다.

 

Conclusion


Demo

 

Retrospective

 이번 프로젝트에서 가장 초점을 둔 것은 프로젝트 주제에 다른 것들을 맞추는 것이다. 당연히, 데이터 셋을 먼저 확인하고 가능한 주제를 생각하고 진행하면 쉽게 진행할 수 있을 것이다. 하지만, 실제 현업에서 주제에 딱 맞게 데이터나 모델 등이 주어질까? 아니라고 생각한다. 우리는 먼저 주제를 생각하고 필요한 것이 무엇인가를 생각했다. 이 방식으로 진행하기 위해서 수십만장의 데이터도 직접 검수하고 자체 테스트 셋도 제작한 것이다.

 그 다음으로 중요했던 것은 시간이었다. 덕분에 프로젝트를 진행하면서 다양한 난관을 마주했다. 처음 사용해보는 모델로 실험도 해보고 데이터 라벨링도 다시 하고 다양한 자료를 탐색했다. 그 외에도 모델을 서빙하는 과정도 이론으로만 배우고 실제로 해보는 것은 처음이었다. 처음 해보는 작업들이 많아서 시간을 가늠하는 것도 어려웠고, 마일스톤도 수차례 수정을 거듭했다. 미흡한 부분이 많았지만 멘토님들에게 물어보기도 하고 팀원들과 회의를 통해서 최대한 객관적으로 보기 위해서 노력했다. 덕분에 프로젝트를 진행하면서 우선순위를 정하거나 포기할 것은 포기하는 현실적으로 생각하는 법을 기를 수 있었다. 

 

 부스트캠프를 시작하며 비전공자라는 말로 자기소개를 하며, 캠프를 시작하고 첫 프로젝트에서는 따라가기 급급했던 나였다. 부족했던 만큼 주변 캠퍼나 멘토님들에게 열심히 질문했던 것 같다. 그리고 비전공자라고는 하지만 기계과를 다니면서 배운 팀원과 소통하는 법, 프로젝트를 진행하는 법, 문제가 발생했을때 대처하는 방법 등 그동안 배운 것들을 헛되이 하지 않고 잘 녹여 부스트캠프를 진행했던 것 같다. 마지막 프로젝트를 진행하며 어느덧 팀 리더와 프로젝트 매니저의 역할을 수행하는 나를 돌아보니 그래도 6개월 동안 열심히 했다 생각이 든다. 

저작자표시

'Project' 카테고리의 다른 글

눈바디 AI Challenge Wrap-up  (0) 2021.12.05
재활용 품목 분류를 위한 Semantic Segmentation 대회 Wrap-up  (0) 2021.11.06
재활용 품목 분류를 위한 Semantic Segmentation 대회 [3/3]  (0) 2021.11.04
재활용 품목 분류를 위한 Semantic Segmentation 대회 [2/3]  (0) 2021.10.29
재활용 품목 분류를 위한 Semantic Segmentation 대회 [1/3]  (0) 2021.10.22

    티스토리툴바