Amazon Web Services 한국 블로그

Amazon SageMaker기반 무신사 상품 후기 이미지 자동 검수 서비스 개발 사례

무신사는 840만 회원을 보유하고 6,000개 패션 브랜드가 입점한 한국 최대 규모의 온라인 패션 플랫폼입니다. 매월 400만 명의 고객이 무신사에 방문하고 있으며, 고객 연령층은 트렌드에 민감한 10~30대 비율이 90% 이상입니다. 무신사는 한국의 패션 트렌드를 선도하는 플랫폼으로서, 어떤 곳과도 비교할 수 없는 압도적인 양의 데이터를 보유하고 있습니다.

무신사 데이터솔루션팀은 무신사 스토어에 쌓이는 데이터와 관련된 모든 업무를 진행하고 있습니다. 로그의 수집부터 모델링, 서빙까지 데이터 관련해서는 풀스택(Full Stack)으로 개발합니다. 앱 메인 화면에 노출되는 ‘실시간 추천 상품’이나, ‘사이즈’, ‘만족도’ 같은 특정 키워드를 후기 텍스트에서 하이라이팅 해주는 서비스 등 다양한 데이터 관련 기능을 개발하고 있습니다.

상품 후기 이미지 자동 검수의 필요성

전자 상거래 서비스는 물건을 직접 보지 않고 구매를 결정하기 때문에 고객이 남기는 상품 후기의 양과 질이 중요합니다. 이를 위해 무신사는 구매 결정에 도움이 되는 상품 사진이나 상품을 착용한 사진을 후기로 올리는 고객에게 적립금을 지급하고 있습니다.

모든 상품 후기는 적립금 지급 조건에 만족하는지 확인하는 검수 과정을 거칩니다. 예를 들어, ‘스타일 후기’는 해당 상품을 착용한 전신 사진, ‘상품 후기’는 해당 상품의 윤곽이 모두 보이게 펼쳐진 상품 사진을 등록해야 적립금이 지급됩니다.

왼쪽이 상품 후기, 오른쪽이 스타일 후기입니다. 당사자에게 게재 동의를 받은 사진입니다.

문제는 무신사 스토어에 하루 동안 약 2만 건의 후기가 올라온다는 것입니다. 모든 후기를 사람이 일일이 검수하려면 시간이 많이 필요하고, 사람마다 검수 기준을 다르게 해석할 수 있다는 점에서 한계가 있었습니다. 이 문제를 해결하기 위해 ‘포장’, ‘신체 일부’, ‘전신’, ‘상품’ 등의 분류 기준을 세워놓고, 이미지를 이에 맞게 자동 분류할 수 있는 상품 후기 이미지 검수 자동화 모델을 Amazon Sagemaker를 이용해서 개발했습니다.

Amazon SageMaker는 개발자 및 데이터 사이언티스트가 기계 학습(ML) 모델을 빠르게 구축, 훈련 및 배포할 수 있는 완전관리형 서비스를 제공하기 때문에 빠르고 만족스러운 성능의 후기 이미지 검수 서비스를 개발할 수 있었습니다. 이제 이 문제를 어떻게 모델링으로 해결하였고, 그 과정에서 Amazon SageMaker를 어떤식으로 적용했는지 하나씩 말씀드리도록 하겠습니다!

상품 후기 이미지 검수 작업 자동화

먼저, 상품 후기에 주로 업로드 되는 이미지들을 몇가지 유형으로 분류하고, 해당 유형에 따라 적립 여부를 매핑했습니다. 예를 들어, 이미지를 ‘전신’, ‘상체’, ‘포장’, ‘상품’ 등으로 분류한 뒤, 상품 후기라면 ‘상품’에 대한 이미지만 적립을 해주고, 스타일 후기라면 ‘전신’에 대한 이미지만 적립을 해주는 방식입니다.

이미지 분류(Image Classification) 분야에서는 주로 기 훈련된 CNN (Pre-trained Convolutional Neural Network) 모델을 사용합니다. 학습에 필요한 인풋 이미지가 굉장히 많이 필요하기 때문입니다. 이미지에서 유의미한 특징(feature)을 파악하고, 이를 이용해 분류를 하는데, 하나의 이미지에서 파악할 수 있는 특징은 무궁무진하기 때문입니다. 그래서 ImageNet과 같은 1만장이 넘는 데이터셋에서 학습을 시키고, 어느 정도 특징들이 찾아진 모델을 이용해서 각자 분류하고자 하는 라벨에 맞춰 전이 학습(transfer learning)을 시키게 됩니다.

Amazon SageMaker Ground Truth를 이용한 이미지 수집

위에서 말씀드린 전이 학습(Transfer learning)도 상위 일부 레이어에 대해서는 새로 학습이 되어야 하기 때문에, 인풋 이미지가 필요합니다. 대신 전체 레이어를 학습시킬 때보다는 더 적은 이미지로도 충분히 성능이 보장됩니다. 이미 대량의 이미지로 학습된 레이어에서 특징을 잘 찾아주기 때문입니다.

무신사의 인프라는 모두 AWS 기반이기 때문에, 고객들이 업로드하는 후기 이미지들은 Amazon Simple Storage Service (S3)에 저장되어 있었고, 이를 분류하고자 하는 라벨에 맞춰 폴더별로 저장하는 과정이 필요했습니다. 무신사는 이 과정에서 Amazon SageMaker Ground Truth를 서비스를 사용했습니다. 그 이유는 아래와 같습니다.

1. 수작업보다 신뢰성 있는 결과 – 수작업으로 분류를 하다 보면, 한 명의 작업자가 실수를 할 경우 그 결과가 그대로 반영 되는데요. SageMaker Ground Truth에서는 하나의 이미지에 대해 여러 작업자가 분류를 할 수 있고, 잘 분류하는 작업자의 결과를 더 많이 반영하는 로직 때문에 더 신뢰성 높은 결과를 얻게 됩니다.

2. 수작업보다 적은 작업량 – SageMaker Ground Truth에 내재된 자동화 라벨링(Automated labeling)을 이용하면 초기 단계에서 수작업으로 분류된 이미지로 분류 모델을 만들고, 그 모델이 나머지 이미지를 자동으로 분류하게 됩니다. 단계별 자세한 내용은 SageMaker Ground Truth 개발자 문서를 참고하시기 바랍니다. 이 과정을 통해서 수작업으로 분류해야 하는 이미지를 43% 감소시키는 효과가 있었습니다. 다음은 직접 SageMaker Ground Truth를 이용하면서 얻은 이터레이션(iteration)별 이미지 수 입니다. (training, validation은 이전 이터레이션까지의 누적 값이며, 그 외 지표는 각 이터레이션 별 값입니다.)

3. SageMaker를 이용한 모델링 시 결과 데이터 그대로 이용 가능 – SageMaker 내에서 모델링을 진행할 시에, SageMaker Ground Truth에서 생성되는 결과 매니페스트 파일을 바로 로드해서 학습에 이용할 수 있었습니다.

결과적으로 약 1만 장의 이미지를 분류하는 데 22명의 작업자가 5일간 투입되었고, 약 $980의 비용이 소요되었습니다. 이렇게 분류된 이미지로 모델링을 진행했습니다.

Amazon SageMaker Studio를 이용한 이미지 분류 모델 개발

후기 이미지 검수 작업을 위해서 업로드 되는 후기 이미지를 ‘전신’, ‘상체’, ‘포장’, ‘상품’ 등으로 자동으로 분류하고, 상품은 카테고리별로 분류해야 했습니다. 이를 위해 2가지 모델을 비교했습니다. 하나는 resnet 기반의 SageMaker built-in 모델이고, 다른 하나는 Tensorflow 기반의 Mobile Net 모델입니다. 동일한 테스트 데이터로 비교시 F1-score 기준으로 Tensorflow는 0.88, SageMaker가 0.98로 더 우세하여 SageMaker 빌트인 모델을 이용하게 되었습니다.

Amazon Sagemaker Studio를 이용한 모델 학습 과정은 아래와 같습니다.

  1. SageMaker Ground Truth에서 수집된 이미지 불러오기
  2. 이미지 데이터 전처리(Image Resizing & Augmentation)
  3. Amazon Sagemaker built-in model을 docker 형태의 이미지로 불러오기
  4. grid search를 통한 hyperparameter tuning
  5. 전이 학습(transfer learning) 진행
  6. 학습 지표 확인 후 파라미터 재조정
  7. 모델 저장

위 대부분의 단계는 SageMaker 에서 지원되기 때문에 직접 구현할 부분이 많지 않았습니다.

Hyperparameter tuning 단계에서 전이 학습(transfer learning) 시 새로 학습시킬 레이어 수(num_layers)와 학습 회수(epochs)가 분류 모델의 정확도에 많은 영향을 주었기 때문에 해당 hyperparameter의 최적값을 grid search를 이용하여 튜닝했습니다.

epochs_list = [5, 10, 15]
num_layers_list = [18, 34, 50]
 
from sagemaker.analytics import TrainingJobAnalytics
metric_df = pd.DataFrame()
 
for i in range(len(epochs_list)):
    for j in range(len(num_layers_list)):
        # 하이퍼파라미터 세팅
        ic.set_hyperparameters(num_layers=num_layers_list[j],
                                 use_pretrained_model=1,
                                 image_shape = "3,256,256",
                                 num_classes=9,
                                 num_training_samples=50399,
                                 mini_batch_size=128,
                                 epochs=epochs_list[i],
                                 learning_rate=0.01,
                                 precision_dtype='float32')
         
        ic.fit(inputs=data_channels, logs=True)
         
        latest_job_name = ic.latest_training_job.job_name
        job_metric = TrainingJobAnalytics(training_job_name=latest_job_name).dataframe()
        job_metric['epochs'] = epochs_list[i]
        job_metric['num_layers'] = num_layers_list[j]
         
        metric_df = pd.concat([metric_df, job_metric])

SageMaker Batch Transform과 Apache Airflow를 이용한 모델 서빙

이렇게 새로 생성한 이미지 분류 모델을 이용해 실제 후기 이미지의 적립금 지급 여부를 예측하기 위해서는 ML 워크플로우가 필요합니다. ML 워크플로우는 크게 4단계를 거쳐 구성됩니다.

  1. 자동 검수가 필요한 후기 이미지 및 메타 정보 가져오기
  2. 학습된 모델을 이용하여 이미지의 라벨을 추론(Inference)
  3. 추론된 라벨 값을 이용하여 적립금 지급 여부 예측
  4. 결과 테이블을 운영 데이터베이스에 저장

무신사는 Apache Airflow를 이용해서 통해 데이터 프로덕트의 워크플로우를 관리하고 있습니다. Apache Airflow란 Airbnb에서 개발한 워크플로우 스케쥴링 & 모니터링 플랫폼입니다. 구성이 간단하고 웹 UI의 그래프 형태가 직관적인 것이 장점입니다. 또한 SageMaker를 지원하기 때문에 SageMaker Studio에서 사용하던 코드를 쉽고 간단하게 마이그레이션 할 수 있었습니다. Apache Airflow에서 SageMaker job을 수행하기 위해 다음 2가지 방식을 사용할 수 있습니다.

  1. SageMaker Operator 사용
  2. Python Operators 사용 (Airflow에서 간단한 python 함수를 작성한 뒤, 이를 callable이라는 파라미터로 받아서 사용하는 방식입니다. 이 python 함수에 SageMaker 코드를 작성할 수도 있습니다.)
def transform(dt, bucket, training_job, **kwargs):
    estimator = sagemaker.estimator.Estimator.attach(training_job)
    transformer = estimator.transformer(instance_count=1,
                                        instance_type='ml.m4.xlarge',
                                        output_path=f's3://{bucket}/.../dt={dt}',
                                        max_payload=1)
    transformer.transform(data=f's3://{bucket}/.../dt={dt}',
                          data_type='S3Prefix',
                          content_type='application/x-image',
                          split_type='None')
    transformer.wait()

… 

transform_op = PythonOperator(
        task_id='transform',
        dag=dag,
        provide_context=True,
        python_callable=transform,
        op_kwargs={"dt": dt,
                   "bucket": bucket,
                   "training_job": training_job})

이 중에서 후자인 Python Operators 방식을 사용했습니다. 그 이유는 SageMaker Operator 문법을 새로 배워야 하는 학습 장벽 없이, SageMaker Studio에서 기존에 사용하던 파이썬 코드를 그대로 사용할 수 있는 장점이 있기 때문입니다.

Apache Airflow에 SageMaker를 도입하는 것은 처음이라 많은 시행착오가 있었습니다. 향후에는 인프라 측면에서 아래 3가지 부분을 고려해 연동하면 좋을 것 같습니다.

  1. Boto3 업데이트: 기존 운영환경 Apache Airflow에서 사용하던 boto3와 SageMaker 패키지의 의존성이 맞지 않아 업데이트가 필요했습니다. SageMaker 버전 2는 boto3 1.14.12 이상에서 작동하는데, 무신사에서 사용하던 버전은 1.13.4이기 때문에 버전 업그레이드가 필요했습니다.
  2. IAM Role 권한 상속: 기존 Apache Airflow에서 사용하던 AWS IAM Role에서 SageMaker 수행이 가능한 IAM Role을 상속해주는 과정이 필요합니다.
  3. 네트워크 설정: Apache Airflow에서 SageMaker코드를 실행하기 위해서는 해당 서비스의 엔드포인트와 네트워크 연결이 필요합니다. 다음은 AWS 서울 리전의 서비스 기준으로 작성된 엔드포인트입니다. 자세한 정보는 AWS 웹사이트를 참고해주세요.
    • api.sagemaker.ap-northeast-2.amazonaws.com
    • runtime.sagemaker.ap-northeast-2.amazonaws.com
    • aws.sagemaker.ap-northeast-2.studio

검수 자동화 결과

이렇게 후기 이미지 검수를 자동화 함으로써 무신사에서는 다음과 같은 비즈니스 효과를 얻을 수 있습니다.

  1. 업무 효율성 증가 – 현재 서비스가 적용된 카테고리 내에서 76%의 후기를 자동 검수하며, 검수 정확도는 약 98%입니다.
  2. 일관성 있는 후기 적립 정책 – 대부분은 명확한 기준으로 적립을 진행하나, 검수자의 개인적인 판단으로 유사한 케이스에 대해 다르게 적립이 되는 경우가 있습니다. 하지만 모델은 일관된 규칙으로 결과를 산출하기 때문에, 조금 더 일관성 있는 후기 정책을 운영할 수 있는 이점이 있습니다.
  3. 휴먼 에러(Human Error) 감소 – 사람이 작업하는 일이기 때문에 실수가 발생할 수 있습니다. 간혹 상품 후기에 대해 스타일 후기 기준을 적용하는 등의 휴먼 에러가 발견되었습니다. 하지만 자동 검수 모델을 이용하면 이런 부분에서 발생하는 휴먼 에러를 줄일 수 있는 장점이 있습니다.

특히, 후기 이미지 검수 작업을 자동화하기 위해서 SageMaker를 도입함으로써 아래와 같은 효과를 얻을 수 있었습니다.

  1. 모듈화된 프로세스로 빠르게 모델을 만들고 테스트가 가능한 환경 구축 – SageMaker를 이용하면서 느낀 점은 모듈화가 잘 되어 있어서 빠르고 쉽게 서비스를 만들고 테스트할 수 있다는 것이었습니다. 물론 SageMaker라는 서비스를 처음 사용하면서 학습에 들인 시간은 있었으나, 그 이후부터는 업무에 빠르게 적용할 수 있었습니다. 무신사 스토어처럼 새로운 서비스를 빠르게 적용하는 비즈니스에 적합한 기능이라는 생각이 듭니다.
  2. SageMaker Ground Truth를 이용한 신뢰성 있는 인풋(input) 수집 – 최근에는 모델링보다 인풋 데이터가 머신러닝에서 더 중요한 요소가 되어가고 있습니다. 머신 러닝 분야가 급속도로 발전하면서, 별다른 튜닝 없이도 pre-trained 모델들의 성능도 굉장히 좋아지고, 더 나아가서는 Auto ML 등을 통해 코드 없이도 모델링이 가능해졌기 때문인데요. 따라서, 인풋 데이터를 좋은 퀄리티로 충분히 확보하는 것이 중요하며, 이를 위해 SageMaker Ground Truth와 같은 레이블링 서비스를 적재적소에 이용하는 것이 필요할 것 같습니다.

마무리

앞으로 개선하고 싶은 방향은 모델 서빙 뿐 만 아니라 트레이닝도 자동화된 배치 작업으로 처리하는 것입니다. 이미지나 분류하고자 하는 라벨을 추가했을 때 자동으로 최적화된 하이퍼 파라미터 값을 찾고, 그 모델로 학습을 진행하는 스텝으로 구성할 예정입니다. 또한 위와 같은 자동화된 트레이닝 작업으로 모델 성능을 지속적으로 개선해나갈 예정입니다. 모델 성능이 개선된다는 것은 커버리지(recall) 및 정확도(precision)가 향상되는 것을 의미합니다. 더 높은 커버리지로 검수되는 후기 수를 늘려 업무 절감 효과를 증대시키면서, 더 높은 정확도를 통해 후기 서비스에 대한 고객 만족도 향상으로 이어나가고자 합니다.

여러분의 비즈니스 문제를 기계학습으로 해결하고 싶은 분들은 Amazon SageMaker를 활용하는 방법에 대해 자세히 알아보시기 바랍니다. 그리고, AWS Machine Learning News에서 AWS의 기계학습 관련 최신 소식을 확인할 수 있습니다.

이 게시물의 내용과 의견은 제3자 작성자의 것이며, AWS는 이 게시물의 내용이나 정확성에 대해 책임을 지지 않습니다.

박지혜
박지혜님은 무신사의 Data Scientist로 데이터 분석과 모델링 업무를 담당하고 있습니다. E-Commerce처럼 일상에서 쉽게 접할 수 있는 데이터 다루는 것을 좋아합니다. 모델링이 주 업무이지만, 데이터 엔지니어링에도 관심이 많습니다.
김성민
김성민님은 AWS의 솔루션즈 아키텍트 입니다. Startup 고객들과 협력하여 비즈니스 성과를 실현하는데 도움을 드리고 있습니다.

이 글은 AWS Machine Learning 블로그의 Develop an automatic review image inspection service with Amazon SageMaker 한국어 번역입니다.