지루하지 않게 코노미 사진 4만장 어노테이션하기 (머신러닝과 함께)
안녕하세요. 네이버 플레이스 CONOMI 개발팀에서 ML 응용에 관심이 많은 곽도영입니다.
머신러닝을 활용하기 위해서는 그림1과 같이 데이터셋 구축 과정이 필요합니다. 이때, 이미 구축된 오픈 데이터셋등을 잘 활용하는 방법도 있지만 서비스에 맞는 데이터셋을 구축하면 서비스에 최적화된 모델을 만들 수 있습니다.
저는 이번에 코노미에 서비스에 최적화된 분류기 모델을 적용해보기 위해 직접 데이터셋 구축을 시도하였습니다. 이번 글에서는 코노미 사진 데이터(로우 데이터)를 어떻게 빠르게 카테고리 데이터셋으로 만들 수 있었는지 경험과 앞으로 발전시킬 수 있는 방향을 공유드리고자 합니다.
목표
머신러닝의 도움을 받아, 빠르게 코노미 사진 카테고리 데이터셋을 만들고자 했습니다. 4만장의 사진을 5개의 카테고리로 나누는 작업을 수행합니다.
방법
기존에 제가 했던 방식은 사진 한장 한장을 미리 정의된 카테고리의 폴더로 이동시켜가며 어노테이션을 수행했습니다. 이 방법 외에도 어노테이션을 도와주는 여러 도구들이 있었지만 한장 한장 사진을 확인해야하는 프로세스는 피할 수 없었습니다.
미리 초벌로 분류된 사진셋에서 적절하지 않는 카테고리인 것을 걸러내는 방식으로 어노테이션을 한다면 시간당 어노테이션 수가 높아질 수 있을 것이라 생각했습니다. 이번에 제가 사용했던 어노테이션 방식에서는 수동 어노테이션을 최소한
으로 수행하고, 자동 어노테이션
으로 중간 결과를 만든 뒤 데이터셋 정제
과정을 거처 데이터셋을 완성하게 됩니다. 어노테이션 절차는 다음과 같고, 그림2는 전체적인 데이터 플로우를 표현합니다.
- 수동 어노테이션과 머신러닝 학습
- 자동 어노테이션
- 중간 결과 정제
1. 수동 어노테이션과 머신러닝 학습
- input: 초벌 어노테이션을 위한 소규모 학습 데이터셋
- output: 초벌 어노테이션용 모델
최근에 작은 데이터셋으로 간편하게 모델을 만들어 볼 수 있는 도구들이 있습니다.그 중 하나인 teachable machine[1]는 Google에서 만든 도구로, 몇가지 정해진 도메인에 대해 드레그 앤 드롭, 클릭 몇번 만으로 학습을 시켜볼 수 있습니다. (머신러닝에 아직 익숙하지 않는 분들께서 입문용으로 사용해보시는 것도 좋을 것 같습니다. ‘모델 학습’이 어떤 절차로 이루어지는지 간편하게 체험해 볼 수 있습니다.)
코노미 사진의 약 200장을 무작위로 선별하여 각 사진별 카테고리를 나누어보았습니다. 사진은 음료, 음식, 실내, 실외, 메뉴판 정도의 카테고리로 분류가 되는것 같아보였으며, 이 카테고리로 나눈 데이터셋을 teachable machine에 넣어 학습 시켰습니다. teachable machine은 디폴트로 50회(50 epoch) 학습을 수행하도록 세팅되어있는데, 이번 데이터셋의 경우 5회 이상의 학습에서는 validation loss가 증가하는 오버피팅 현상이 발생하여 4회까지 학습하도록 조정하였습니다.
비록 데이터셋이 작고 카테고리별 데이터 비율도 불균형했지만 자동 어노테이션을 시켜볼 수 있을 만큼의 정확도가 나온것 같아 자동 어노테이션을 수행했습니다.
teachable machine에서 학습을 수행하고 나면 우측 상단에 Export Model 버튼을 눌러 학습된 모델을 다운받을 수 있습니다. teachable machine은 아래 세가지 포맷의 모델을 지원합니다.
- 자바스크립트에서 실행할 수 있는 TensorFlow.js[2]
- TensorFlow[3]를 설치할 수 있는 곳에서 실행할 수 있는 TensorFlow 모델 (keras용 혹은 saved_model)
- 모바일 기기에서 실행할 수 있는 TensorFlow Lite[4] 모델
저는 파이썬 스크립트를 실행하여 자동 어노테이션을 수행할 것이기 때문에 TensorFlow용 모델로 다운로드 받았습니다. 3 MB가 조금 넘는 크기의 작은 모델이었습니다.
2. 초벌 자동 어노테이션
- input: 어노테이션되지 않은 4만장 사진들
- output: 초벌 어노테이션된 4만장의 사진들
다음으로, 남은 4만장의 모든 코노미 사진 데이터를 순회하면서 위에서 다운로드 받은 모델로 추론하여 초벌 어노테이션을 수행합니다. teachable machine에서는 각 플랫폼에서 실행가능한 추론용 샘플코드를 제공하기 때문에 쉽게 스크립트를 만들 수 있습니다.
이 과정에서 추론된 결과에따라 각기 다른 카테고리 폴더에 사진을 저장하여 초벌로 어노테이션된 데이터셋을 얻습니다.
3. 중간 결과 정제
- input: 초벌 어노테이션된 사진들
- output: 정제된 데이터셋
초벌로 어노테이션된 결과는 꽤나 잘 어노테이션이 되어있었습니다. 초벌 어노테이션 없이 어노테이션을 한다면 사진 한장 한장을 신경써서 어떤 카테고리에 속할지 판단해야했지만, 초벌 어노테이션이 되어있는 사진들에서는 슥슥 스크롤을 내려가며 카테고리가 잘못 지정된 사진을 편하게 바로잡을 수 있었습니다.
다른 도메인에서의 시도 케이스
머신과 함께 어노테이션한 경험은 이번이 처음은 아닌데요. 아래 두가지 프로젝트에서도 머신러닝의 도움을 받아 데이터셋을 구축&정제할 수 있었습니다.
코노미 회전된 사진 데이터셋
최근에 프로토타입으로 만든 코노미 회전 감지 모델의 정확도가 쉽게 개선되지 않는 것을 확인했습니다. 처음부터 4만장의 사진을 모두 확인하기에는 시간이 너무 많이 소요될 것으로 생각되어, 실험에서 만들어진 모델들을 사용하여 원본 사진에서 회전된 사진을 걸러냈습니다. train set에 과적합(overfiting)되지 않은 모델 2가지를 선별하여 정제를 수행했고, 회전 여부를 잘못 감지한 데이터들은 잘못 어노테이션이 된 경우나, 일반적인 코노미 사진 데이터에서 나와서는 안되는 사진들인 경우, 혹은 사람이 보기에도 애매하게 회전된 사진들이 있었습니다. 머신러닝 모델로 정제한 데이터셋으로 학습을 다시 수행하니 정확도가 조금 더 개선된 것을 확인할 수 있었습니다.
코노미 일본 영수증 모서리 감지 데이터셋
pose estimation으로 영수증 모서리를 찾는 문제를 딥러닝으로 해결하려했던 시도가 있었습니다. 이때에도 1만장의 영수증 사진에 모서리의 점을 찍는 어노테이션이 필요했는데, 1000장 어노테이션 후 초벌용으로 학습된 모델로 나머지 9000장 어노테이션을 수행하여 수훨하게 데이터셋을 구축할 수 있었습니다.
정리
핵심 아이디어는 어노테이션을 수행할 초기 단계부터 머신러닝을 활용하여 초벌된 어노테이션으로 편하게 데이터셋을 구축해보자는 것이었습니다.
자동 어노테이션은 semi-supervised learning[5] 연구 분야 중 하나로, 다양한 곳에서 시도되고 있는데요. 그 중에 AWS의 제품으로 출시되어 있는 automated labeling[6]은 약 1.5천개 레이블을 넣으면 나머지 데이터에대해 자동으로 어노테이션을 수행해주는 기능을 제공하고 있습니다. 이 기능은 최소 1.5천개(5천개가 적정 가이드)의 데이터를 미리 만들어놓아야하지만, 이번과 같이 간단한 문제의 경우에는 AWS automated labeling과 같은 기능을 사용하지 않고 더 적은 데이터셋으로 반자동 어노테이션을 수행해 볼 수 있을 것 같습니다.
다음 할 일
위에서 소개한 반자동 어노테이션은 머신이 중간 결과를 만들어주고 사람이 정제했습니다. 여기서 더 나아가, 사람이 정제하는 동안 머신이 중간결과를 주기적으로 개선한다면, 기존 방식보다 더 빠르게 어노테이션을 수행할 수 있을 것으로 생각합니다.
링크
[1] teachable machine — https://teachablemachine.withgoogle.com/
[2] tensorflow.js — https://www.tensorflow.org/js
[3] TensorFlow — https://www.tensorflow.org/
[4] TensorFlow Lite — https://www.tensorflow.org/lite
[5] semi-supervised learning — https://en.wikipedia.org/wiki/Semi-supervised_learnin
[6] AWS SageMaker Automated Labeling — https://docs.aws.amazon.com/sagemaker/latest/dg/sms-automated-labeling.html