내 중고물품을 분류 해주는 모델 서빙하기(feat. Keras & Flask)

모든 코드는 https://github.com/JeonCS/keras-flask-deployment에서 확인 해주세요

안녕하세요 당근마켓 인턴 jeon입니다.

앞서 이미지만으로 중고물품의 카테고리를 분류해주는 모델의 구축, 훈련 그리고 성능 측정까지 마쳐봤어요. 이제 열심히 훈련한 모델을 서빙하여 사용자가 이미지를 올릴때 모델이 해당 이미지가 어떤 카테고리인지 실시간으로 분류해주는 서버를 만들어 볼까해요.

1. 서버 구축

저는 훈련된 모델이 얼마나 빠르고 정확하게 사용자가 올린 이미지의 카테고리를 분류하는지 알고 싶어 간단한 데모 서버를 만들었어요.

우선 전체적인 구조를 먼저 살펴볼게요.

1. s3에서 모델 다운로드 2. 로컬 디스크에서 모델 로드 3. 웹 서버 구동

전체적인 flow를 간략하게 설명하자면:

  • Sever-side
  1. 웹 호스팅을 위하여 ec2 instance를 생성
  2. ec2 instace에 필요한 dependencies(pip, keras, boto3, 등)을 설치
  3. Flask 앱 가동

3.1 s3에서 모델 다운로드 (혹은 모델이 디스크에 있으면 생략)

3.2 디스크에서 모델 로드

3.3 지정한 포트로 웹 서버 가동

  • Client-side
  1. 클라이언트(모바일, 데스크탑)에서 사진을 찍어 업로드
  2. 업로드시 웹 서버에 post request 전송

2. 추론 데모

그럼 이제 http://ec2 instance의 퍼블릭 ip/dns 주소:지정한 포트 로 들어가면 아래와 같은 페이지를 볼 수 있어요.

카테고리 분류 추론 데모 웹사이트 홈 페이지

사진 선택을 누르면 컴퓨터 디스크에 있는 사진(데스크탑)/ 앨범에 있는 사진(모바일)을 고르거나 바로 사진을 찍어서 업로드를 할 수 있어요. 업로드시 서버에 POST 요청이 전송됩니다. 전송된 post request는 웹 서버를 통하여 flask app으로 보내집니다. Flask app은 요청 이미지 파일을 바이트 어레이 형식으로 변환, 이미지 채널을 3개로 변환, 이미지 크기를 모델 네트워크 입력 크기(224x224)로 변환 등의 전처리를 한 후 모델에 입력을 해요. 모델은 전처리된 입력 어레이를 받고 추론을 시작하며 추론한 상위 3개의 카테고리 와 각 카테고리별 확률을 결과값으로 반환을 해요. 반환한 json형태의 결과값을 다시 웹 서버를 통해 클라이언트에 응답하게 되고, 클라이언트에서 ajax를 통해 비동기로 응답를 받아 파싱하여 아래와 같이 결과값을 출력합니다.

지금 글 쓰고 있는 소파 위에서 휴대폰 카메라로 찍어봤어요. 가구/인테리어가 96프로로 정확한 추론을 한 것을 볼 수 있네요!

신기하니까 다른 물건도 몇개 더 찍어볼게요.

왼쪽: 스탠드 바 의자 중간: 샤오미 공기청정기 오른쪽: 사무실 모니터

오! 결과가 상당히 정확해요. 스탠드 바 의자를 가구/인테리어, 공기 청정기를 디지털/가전 그리고 컴퓨터 모니터를 디지털/가전으로 높은 확률로 예측하는 것을 볼 수 있네요.

왼쪽: 잘 안 읽는 책 중간:저의 최애 컨버스 신발 오른쪽: 사무실 냉장고

이번도 결과가 좋네요. 핸즈 온 머신러닝 책을 도서/티켓/음반으로 잘 분류하고. 컨버스 신발(남성)을 남성패션/잡화로 잘 분류하고 확률이 다소 낮지만 사무실 냉장고를 디지털/가전으로 모델이 잘 분류해주고 있네요!


3. 추론 속도

모델이 추론을 잘 하는것을 확인했으니까 얼마나 빠르게 추론하는지 확인해야 겠죠? 아래는 서버에서 이미지 전처리 시간, 그리고 추론 시간을 계산해서 출력해본 값이에요.

이미지 처리 시간은 이미지 크기나 화질에 따라 다르겠지만 대략적으로 약 200ms이내로 처리가 되네요. 가장 흥미로운것은 추론 처리 시간은 약 200ms으로 굉장히 빠르게 추론을 해주는 것을 볼 수 있네요. 이정도 처리 시간이면 거의 실시간으로 느껴지는 속도에요!

4. 마치며

앞서 만든 이미지 분류기의 성능을 눈으로 확인하고자 웹 어플리케이션을 만들어 웹 서버에 띄워봤어요. 직접 사진을 찍어 올려 추론 결과를 바로 받아 볼 수 있어 실 사용자가 느낄 경험을 최대한 살려 봤어요. 훈련을 마친 모델은 매우 좋은 성능을 보였고 추론 속도도 실시간에 가깝게 매우 빨랐어요.

마지막으로 만약 나중에 더 좋은 성능의 모델이 만들어지면 간편하게 s3에서 다운로드 받아 model만 바꿔서 로딩하면 돼서 매우 편리한 모델 교체가 가능해요.


당근마켓 서비스에서 머신러닝은 중요한 역할을 맡고 있어요. 머신러닝을 통해 사용자는 더 다양한 컨텐츠를 좀 더 쉽고 편하게 접할 수 있어요. 또한 당근마켓만의 따뜻한 문화를 유지하는데 머신러닝은 큰 역할을 하고 있어요. (당근마켓에서 딥러닝 활용하기)
당근마켓에서 서비스가 성장하면서 생기는 여러 문제를 같이 해결할 머신러닝 개발자를 찾고 있어요.