[서비스 개발] CNN 딥러닝을 통한 두피진단 및 제품 추천 서비스 개발

공장장·2024년 11월 14일

  • 서비스 페이지 접속은 아래 STREAMLIT 버튼을 눌러주세요.


들어가는 말

최근 모 업체의 조사에 따르면 우리나라 20~50대 성인의 약 60%는 두피 문제를 고민하고 있습니다. 이 중에서 약 1/4은 정보 부족 때문에 관리의 어려움을 호소합니다. 하지만 전문 시설을 통한 두피 진단은 번거로울 뿐 아니라 많은 비용이 발생합니다. 간편한 증상 진단과 제품 추천을 통해 두피 관리에 대한 진입장벽을 낮추고자 서비스를 개발했습니다.





목차

  1. 프로젝트 소개
  2. 서비스 소개
  3. 데이터 소개
  4. 모델링 과정
    📜 출처




1. 프로젝트 소개

두피케어 시장은 나날이 성장하고 있다. 23년도 기준 두피 관리 기기 글로벌 시장규모는 약 126억 달러로, 전 세계 장난감 시장에 비해 약 26% 큰 규모로 알려져 있다. 24년부터 31년까지 예상 성장 규모는 약 200억 달러로 약 58% 성장이 예상된다고 한다. 그만큼 두피관리에 대한 소비자 관심과 니즈가 커지고 있음을 알 수 있다.


특히, 아시아 시장에서 두피 제품에 대한 관심이 큰데, 두피 고민 = 탈모라는 고정관념에서 벗어나 다양한 두피 고민을 해결하기 위한 간편 서비스 제공의 필요성을 절감했다.





2. 서비스 소개

2-1. 서비스 개요

서비스는 아래와 같이 5가지 단계로 진행된다.

  1. PC/Mobile에서 사용자의 두피 사진 업로드
  2. 설문조사 진행(두피 타입 선택, 두피 고민/질환 선택, 추천 제품 선택)
  3. 사용자 사진을 통한 두피 진단(6가지 증상, 3단계 중증도를 확률로 출력)
  4. OpenAI를 통한 ChatGPT로 원인, 특징, 관리 방법 안내
  5. 진단 결과 및 설문에 따른 제품 추천 및 증상에 유효한 성분 안내

각 단계별 프로세스 설계 당시 고려했던 사항은 아래와 같다.

1. PC/Mobile에서 사용자의 두피 사진 업로드

  • 전문가가 아닌 사용자가 사진을 업로드하는 만큼, 적절한 촬영 가이드 명시 (색상에 영향을 많이 받는 증상의 오진단 방지를 위한 안내 포함)

2. 설문조사 진행(두피 타입 선택, 두피 고민/질환 선택, 추천 제품 선택)

  • 사용자가 두피 타입을 모를수도 있다는 가정하에, 타입에 대한 설명 명시.
    ※ 만약 모델 진단과 사용자 선택이 다를 경우 모델이 진단한 두피 타입을 기준으로 분석하도록 설계

3. 사용자 사진을 통한 두피 진단(6가지 증상, 3단계 중증도를 확률로 출력)

  • 업로드한 사진의 진단결과와 증상별 대표이미지를 통해, 사용자가 직관적으로 증상을 이해할 수 있도록 설계
  • 진단 결과는 중증도를 3단계 구분하여, 각 단계를 확률로 출력. 이를 통해 사용자가 증상을 더 정확히 이해할 수 있도록 설계.

4. OpenAI를 통한 ChatGPT로 원인, 특징, 관리 방법 안내

  • 각 증상 개선을 위해서는 제품뿐아니라 생활 습관 개선 등이 필요하다고 판단.
  • 진단 증상에 대한 상세 정보를 OpenAI를 통한 ChatGPT로 안내받도록 설계.

5. 진단 결과 및 설문에 따른 제품 추천 및 증상에 유효한 성분 안내

  • 제품 추천 과정에서는 리뷰수와 별점이 가장 높은 제품을 기준으로 추천하도록 설계(구매건수가 낮지만, 별점만 높은 상품이 추천되는 것을 방지)
  • 또한, 제품을 추천하는 로직인 사용자가 진단받은 '증상에 유효한 대표 성분'을 명시하여 제품 추천의 명확한 근거와 정보 제공

2-2. 제품 추천 로직

제품을 추천하는 로직은 아래 4단계를 거친다.

  1. 각 증상과 증상에 유효한 성분 매칭(+두피 타입 진단)
  2. 올리브영에서 크롤링한 제품의 전성분과 비교
  3. 유효 성분이 1개 이상 있는 제품 = 추천 상품 후보
  4. 리뷰수와 별점을 고려해서 1~3위까지 선별하여 추천 페이지 출력

해당 로직을 통해 사용자에게 '두피 타입 진단', '두피 증상 진단', '증상에 유효한 제품 추천', 총 3가지를 제공한다.

이를 위해 '두피 타입 - 증상 - 유효성분'을 대한화장품협회 등에서 정보를 수집하여 리스트업했다.


예를들어, 각질로 진단받은 사용자는 건성두피로 진단하는 로직이다.


2-3. 제품 추천 로직(예외사항 처리)

모델 테스트와 경우의 수를 고려해보니 예외 케이스가 발생할 수 있었다.
우선 1번은 정상적으로 분석이 가능한 경우이다.

하지만 2번처럼 모두 같은 중증도를 가질 때는, 사용자 설문 결과를 반영하도록했다. 또한, 3번처럼 여러가지 증상을 갖는 경우도 있다. 이럴 때는 진단 증상과 관련된 모든 제품을 추천하도록 설계했다. 예를들면, 각질과 탈모 증상을 모두 진단받는 경우, 각질과 탈모에 좋은 제품을 모두 추천하는 방식으로 설계했다.





3. 데이터 소개

3-1. AI Hub

3-1-1. 이미지 데이터

모델 학습을 위한 이미지 데이터는 약 10만여 장이다. 각 증상별 train과 validation으로 구분되어있다. (약 2만여 명의 두피 위치별 사진)


참고로 해당 이미지들은 각 증상별로 총 6가지 종류로 나눠져있고, 각 증상의 특징은 위 이미지와 같다. 모델 학습 간에 모델의 성능도 향상을 위해 정성적인 분석이 필수적이었고, 이를 위해 해당 증상의 공통적인 특징을 파악위해 노력했다.


라벨값이 포함된 어노테이션 데이터는 각 증상별 총 4개의 클래스(중증도)로 구분되어 있다.


3-1-2. 메타 데이터

확보한 데이터에는 약 2만여 명의 두피관련 설문조사 항목이 포함되어 있었다. 이 데이터 EDA를 통해 아래 인사이트를 추출했고, 서비스 설계에 반영했다.

  • 두피 자극을 불러일으키는 모발이식을 포함한 헤어스타일링에는 20-30대가 1, 2위를 차지하고 있다. 따라서, 모바일로도 편하게 진단할 수 있도록 서비스 구현 방향을 잡았다.
  • 소비자들은 샴푸 선택에서 가격보다 기능을 우선시 한다.
  • 특히 여성의 경우 머릿결에 대한 니즈가 있었다. 따라서, 머릿결에도 도움을 주는 카테고리를 함께 크롤링했다.

3-2. 올리브영

올리브영의 총 7가지 카테고리에서 총 1,261개의 상품을 크롤링했다. 앞서 메타데이터 설문조사와 정성적 분석과정을 통해 필요한 카테고리 제품을 포함했다.





4. 모델링 과정

4-1. 제한사항

4-1-1. 정확도 향상

완성된 모델을 만들기까지 약 60회에 거쳐 모델 테스트를 진행했다. 진행과정에서 가장 큰 어려움은 '진단 정확도 향상'이었다. 특히, 각 증상을 진단하더라도 중증도를 정확하게 진단하지 못하는 경우가 많았다.


4-1-2. 모델 변경

데이터에는 모델학습을 위한 코드가 포함되어있었는데, 모델이 'efficientnet-b7'으로 크기가 굉장히 큰 모델이었다. 일반 사용자가 간편하게 진단하고 제품 추천을 받기 위해서는 웹 구현이 필수적이다. 하지만 지나치게 큰 모델은 구현 속도, 비용 등에 제한이 많을 것으로 예상했다. 그래서 최종적으로 'efficientnet-b1'으로 모델을 변경하여 학습을 진행했다.


4-2. 개선 과정

4-2-1. 1차

테스트 과정의 일부를 나타내는 그림과 같이 Resnet, A100 등의 다양한 모델을 기준으로 파인튜닝, 에포크 조정, 데이터 증강, 러닝 레이트 등 하이퍼파라미터 값들을 조정하며 테스트를 진행했다. 하지만 70% 초반에서 크게 변화가 없었다.


4-2-2. 2차

정확도 정체 원인을 찾기 위해, 학습과정에서 에포크 마다 오분류 되는 이미지를 CSV 파일로 저장하도록 코딩하여 재학습을 진행했다.

이를 통해 그래프로 분석한 결과, 모낭홍반농포의 사례처럼 정답이 각각 중등도, 양호, 중증이지만 모두 오답인 경증으로 판단하는 경우가 56.44%가 된다는 것을 확인했다. 실제 이미지를 확인해보니 육안으로도 판단이 어려운 케이스가 많다는 것을 확인했다.


4-2-3. 3차

또한, 경증 데이터 수가 지나치게 많아 데이터 불균형 문제가 발생할 수 있다고 추론했다. 그래서 이를 해결하기 위해 아래 2가지를 실행했다.

  • Focal loss
  • Cosine Annealing LR Scheduler

덕분에 탈모 모델을 기준으로 79%까지 정확도를 향상시켰다. 하지만 대부분 1~2% 내외의 향상만있을뿐 아직 신뢰할만한 정확도는 아니라고 판단했다.


4-2-4. 4차

이전과 마찬가지로 다시 오분류 목록을 시각화해서 분석했다. 분석을 통해 특히 모델이 헷갈려하는 클래스(중증도)를 병합하기로 결정했다. 이를위해 각 증상별 헷갈려하는 클래스(중증도)를 확인하는 작업을 선행했다.

클래스 병합 후, 모낭홍반농포의 경우 정답이 양호인데 틀리는 경우가 약 81% 감소했으며, 정답인 중증을 틀리는 경우가 약 59% 감소했다.

비록 클래스1과 2를 헷갈려하는 경우(421건)는 늘었지만, 증상의 정도보다 유무를 더 정확하게 판단하는게 중요하다고 생각하여 병합을 결정했다.


4-2-5. 5차

위와같은 과정에서 피지과다 증상은 모든 테스트에서 경증으로 판단하는 문제가 있었다. 이를 해결하기위해 아래와 같은 과정으로 진단을 결정했다.

  • 피지와 각질은 지성과 건성피부의 대표적 증상
  • 두 증상은 모순된다고 판단하여 통계적 연관성 확인
  • 통계량 약 4만이상, p-value은 매우 작아 유의미한 연관성 확인
    ∴ 피지과다 증상이 있을 때, 미세각질 증상이 없는 경우가 97%라는 관계를 근거로 '피지과다 - 미세각질 관계'를 기준으로 피지과다 증상 판별하기로 결정

4-2-6. 6차

다시 오분류 CSV파일을 근거로 오분류 내역을 분석했다. 확인해보니 클래스1, 2를 오분류하는 경우가 72%가 된다는 것을 확인했다. 물론 두 클래스 모두 증상이 있는 경우이기 때문에, 앞서 결정한 것과 같이 우선 증상 유무는 잘 판단한 것이다. 하지만 오답률이 지나치게 높았다. 또한 정성적으로 분석한다면 해결책을 찾을 수 있을지몰라 추가 분석을 진행했다.

분석결과 미세각질/비듬/피지과다 증상은 모두 '명암'을 기준으로 증상 부위와 아닌 부위가 구분된다는 특징이 있었다. 이러한 정성적 분석 결과를 바탕으로 그레이스케일을 적용한 결과 약 2% 정도의 정확도 개선이 이루어졌다.


4-2-7. 7차

전반적으로 정확도는 올랐지만, 클래스 병합의 이슈로 데이터 불균형 이슈는 여전했다. 이를 개선하기위해 학습과정에서 이미지 수를 기준으로 클래스별 가중치를 동적으로 조정하는 코드를 반영하여 재학습을 진행했다. 하지만 아쉽게도 탈모 모델에만 효과가 있어, 해당 모델만 반영하였다.


4-3. 결과

결과적으로 위 그림과 같은 정확도를 얻어냈고, 두피 관련 커뮤니티에서 확보한 사진과 실제 촬영한 지인들의 사진으로 테스트를 진행한 결과 비교적 높은 정확도를 나타냈다. 뿐만아니라 총 5페이지안에 증상진단~제품추천까지 올인원으로 가능하다는 점에서 만족스러운 서비스를 구현한 것 같다.


무엇보다 교육과정 전체를 아우르는 파이널 프로젝트에서 최우수상(1위)을 수상했다는 점이 보람되고 기쁘다!(현직 대학교수님, 강사님, 동료 평가로 선정). 데이터 분석, 딥러닝 모델링, 통계적 검정 등 다양한 방법론을 적용해서 서비스를 구현해보니 한 발 더 데이터 분석과 머신러닝에 가까워진 것 같다는 기분이 든다.





📜 출처

  • AI Hub
  • 올리브영
profile
연장 대신 키보드 뚱땅거리며 분석하는 '데이터분석 공장 529'

0개의 댓글