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

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

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

서비스는 아래와 같이 5가지 단계로 진행된다.
각 단계별 프로세스 설계 당시 고려했던 사항은 아래와 같다.
1. PC/Mobile에서 사용자의 두피 사진 업로드
2. 설문조사 진행(두피 타입 선택, 두피 고민/질환 선택, 추천 제품 선택)
3. 사용자 사진을 통한 두피 진단(6가지 증상, 3단계 중증도를 확률로 출력)

4. OpenAI를 통한 ChatGPT로 원인, 특징, 관리 방법 안내
5. 진단 결과 및 설문에 따른 제품 추천 및 증상에 유효한 성분 안내
제품을 추천하는 로직은 아래 4단계를 거친다.

해당 로직을 통해 사용자에게 '두피 타입 진단', '두피 증상 진단', '증상에 유효한 제품 추천', 총 3가지를 제공한다.
이를 위해 '두피 타입 - 증상 - 유효성분'을 대한화장품협회 등에서 정보를 수집하여 리스트업했다.

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

모델 테스트와 경우의 수를 고려해보니 예외 케이스가 발생할 수 있었다.
우선 1번은 정상적으로 분석이 가능한 경우이다.
하지만 2번처럼 모두 같은 중증도를 가질 때는, 사용자 설문 결과를 반영하도록했다. 또한, 3번처럼 여러가지 증상을 갖는 경우도 있다. 이럴 때는 진단 증상과 관련된 모든 제품을 추천하도록 설계했다. 예를들면, 각질과 탈모 증상을 모두 진단받는 경우, 각질과 탈모에 좋은 제품을 모두 추천하는 방식으로 설계했다.

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

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

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

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

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

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

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

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

정확도 정체 원인을 찾기 위해, 학습과정에서 에포크 마다 오분류 되는 이미지를 CSV 파일로 저장하도록 코딩하여 재학습을 진행했다.
이를 통해 그래프로 분석한 결과, 모낭홍반농포의 사례처럼 정답이 각각 중등도, 양호, 중증이지만 모두 오답인 경증으로 판단하는 경우가 56.44%가 된다는 것을 확인했다. 실제 이미지를 확인해보니 육안으로도 판단이 어려운 케이스가 많다는 것을 확인했다.

또한, 경증 데이터 수가 지나치게 많아 데이터 불균형 문제가 발생할 수 있다고 추론했다. 그래서 이를 해결하기 위해 아래 2가지를 실행했다.
덕분에 탈모 모델을 기준으로 79%까지 정확도를 향상시켰다. 하지만 대부분 1~2% 내외의 향상만있을뿐 아직 신뢰할만한 정확도는 아니라고 판단했다.

이전과 마찬가지로 다시 오분류 목록을 시각화해서 분석했다. 분석을 통해 특히 모델이 헷갈려하는 클래스(중증도)를 병합하기로 결정했다. 이를위해 각 증상별 헷갈려하는 클래스(중증도)를 확인하는 작업을 선행했다.
클래스 병합 후, 모낭홍반농포의 경우 정답이 양호인데 틀리는 경우가 약 81% 감소했으며, 정답인 중증을 틀리는 경우가 약 59% 감소했다.
비록 클래스1과 2를 헷갈려하는 경우(421건)는 늘었지만, 증상의 정도보다 유무를 더 정확하게 판단하는게 중요하다고 생각하여 병합을 결정했다.

위와같은 과정에서 피지과다 증상은 모든 테스트에서 경증으로 판단하는 문제가 있었다. 이를 해결하기위해 아래와 같은 과정으로 진단을 결정했다.
다시 오분류 CSV파일을 근거로 오분류 내역을 분석했다. 확인해보니 클래스1, 2를 오분류하는 경우가 72%가 된다는 것을 확인했다. 물론 두 클래스 모두 증상이 있는 경우이기 때문에, 앞서 결정한 것과 같이 우선 증상 유무는 잘 판단한 것이다. 하지만 오답률이 지나치게 높았다. 또한 정성적으로 분석한다면 해결책을 찾을 수 있을지몰라 추가 분석을 진행했다.
분석결과 미세각질/비듬/피지과다 증상은 모두 '명암'을 기준으로 증상 부위와 아닌 부위가 구분된다는 특징이 있었다. 이러한 정성적 분석 결과를 바탕으로 그레이스케일을 적용한 결과 약 2% 정도의 정확도 개선이 이루어졌다.
전반적으로 정확도는 올랐지만, 클래스 병합의 이슈로 데이터 불균형 이슈는 여전했다. 이를 개선하기위해 학습과정에서 이미지 수를 기준으로 클래스별 가중치를 동적으로 조정하는 코드를 반영하여 재학습을 진행했다. 하지만 아쉽게도 탈모 모델에만 효과가 있어, 해당 모델만 반영하였다.

결과적으로 위 그림과 같은 정확도를 얻어냈고, 두피 관련 커뮤니티에서 확보한 사진과 실제 촬영한 지인들의 사진으로 테스트를 진행한 결과 비교적 높은 정확도를 나타냈다. 뿐만아니라 총 5페이지안에 증상진단~제품추천까지 올인원으로 가능하다는 점에서 만족스러운 서비스를 구현한 것 같다.
무엇보다 교육과정 전체를 아우르는 파이널 프로젝트에서 최우수상(1위)을 수상했다는 점이 보람되고 기쁘다!(현직 대학교수님, 강사님, 동료 평가로 선정). 데이터 분석, 딥러닝 모델링, 통계적 검정 등 다양한 방법론을 적용해서 서비스를 구현해보니 한 발 더 데이터 분석과 머신러닝에 가까워진 것 같다는 기분이 든다.