안녕하세요 피부 질환 병명 분류 모델을 맡은 조예지입니다 저는 피부 질환 병명을 분류 학습하기 위해 vertex ai의 automl이 적합하다고 판단하였습니다. 그 이유로는 편리성, 적은 데이터 보유, 그리고 공정성이 있습니다.automl은 코드 없는 간편한 사용자 환경을 갖추고 있어 편리합니다. 또, 저희가 보유한 피부 질환 병명 데이터는 수가 적고, 피부색의 차이에 영향을 받을 가능성이 큽니다. 적은 데이터 세트를 사용함에도 효과적으로 빌드가 가능하고, 피부색의 차이를 인지하여 차별적인 학습을 하지 않게 하고자 automl로 학습을 진행하였습니다. 저희가 사용한 데이터는 캐글의 skin-cancer-mnist 이미지 데이터입니다 이 이미지 데이터에는 3가지의 문제점이 있었습니다. 첫 번째는 레이블링이 되어 있지 않다는 점입니다. 한 폴더에 10000장 가량 되는 이미지가 섞여 있어 이미지가 어떤 피부 질환인지 알 수 없다는 문제가 있었습니다. 두 번째는 이미지에 대응하는 jsonl 파일이 없어 직접 코드를 짜서 파일을 생성해야하는 문제가 있었습니다. 세 번째로는 가장 많은 레이블이 6000장 가장 적은 레이블이 100장으로 이미지 불균형이 심각하다는 문제가 있었습니다.
가장 먼저 첫 번째 문제, 레이블링이 되어 있지 않은 문제를 해결하기 위해 skin_type_metadata.csv 파일을 활용했습니다. 이 csv 파일은 여러 컬럼이 있는데 그 중 image_id와 dx라는 컬럼에 주목하였습니다. image_id는 이미지 파일의 이름, dx는 피부 질환 병명이기에 이 두 컬럼을 추출하여 image_id에 대응하는 폴더를 생성하여 피부 질환 병명별로 파일들을 폴더링하는 작업을 거쳤습니다.
두 번째 문제인 jsonl 파일 생성 과정입니다. 앞서 분류한 폴더를 바탕으로 각각의 폴더를 label로 인식하여 대응되는 jsonl 파일을 생성하는 코드를 작성하였습니다.
세 번째 문제인 이미지 불균형 해결 과정입니다.이 문제를 해결하고자 각각의 레이블마다 training/test/validation 비율을 자체적으로 조정 하였습니다 6000개 가량의 매우 큰 데이터인 nv는 4:3:3 비율을 부여했고, 1000개가 넘은 2개의 레이블은 6:2:2, 1000개가 되지 않는 작은 데이터는 7:1.5:1.5로 비율을 부여하였습니다. 세 문제를 모두 해결하여 모델을 학습한 결과 2일 7시간정도 시간이 소요되었습니다. 저희가 프로젝트 기간이 길지 않고 모델을 여러번 학습하여 예측률을 보완해야하는데 노드 8로 설정했음데도 너무 시간이 많이 걸려서 이 부분을 어떻게 해결할 수 있을까 고민해본 결과, 이미지 불균형 때문에 시간이 많이 걸린 게 아닌가? 라는 가설을 세우게 되어 바로 두 번 째 모델을 준비하였습니다.
두 번째 모델에서는 두 가지 고민이 있었습니다. 첫 번째는 적은 레이블 수입니다. 8개의 레이블은 많은 피부 질환을 예측하기에 부족함이 있다고 생각하였습니다. 두 번째는 여전한 이미지 불균형입니다. 앞서 비율 조절로 이 문제를 해결해보고자 했지만, 다른 방안이 필요하다고 판단하였습니다
먼저, 첫 번째 문제를 해결하고자 추가적인 데이터셋을 다운받았습니다. 총 16개의 레이블로 구성하였는데 기존 데이터셋에서도 추가적인 데이터셋에서도 여전히 이미지 수가 균등하게 분포하지 않는다는 문제점이 있었습니다.
이러한 이미지 불균형을 해결하고자 먼저 1000개가 넘는 이미지 데이터를 전부 1000개로 줄이는 과정을 거쳤습니다. 그리고 1000개가 되지 않은 적은 데이터는 이미지 증강을 적용하였습니다. 제가 채택한 이미지 증강 방법은 fast auto augmentation입니다
이 기법에 대해 말씀드리기 전 auto augmentation에 대해 설명하겠습니다. auto augmentation은 자동적으로 알아서 데이터셋에 적절한 data augmentation을 찾아내는 방법입니다. 하지만 여기에는 이미지 증강의 소요 시간이 매우 길다는 단점이 있어 저는 비교적 짧은 소요시간이 걸리는 fast auto augmentation을 적용하였습니다.
학습 결과 노드 8로 설정했음에도 1시간 44분이라는 매우 적은 시간이 소요되어서 원인이 이미지 불균형이라는 걸 확신할 수 있었습니다.
이 모델은 정밀도 88.7%, 재현율 81%로 나쁘지 않은 예측률을 보이고 있는데요. 조금이나마 개선하기 위해 남은 시간동안 모델을 더 돌려볼 생각입니다.
다음은 모델 테스트 결과입니다 화상 데이터를 넣어본 결과 예측률은 0.892, 감염성 데이터의 결과는 0.980의 결과가 도출되었습니다.
모델을 전부 학습한 후 모델을 잘 만든다고 해도 계속해서 성능 개선이 필요할텐데 의료 이미지 데이터를 학습 데이터로 계속해서 이용하려면 개인을 식별하지 못하게 이미지를 가공해야하고, 법적인 문제도 얽혀 있어 데이터를 적재하지 쉽지 않겠다는 생각을 하였습니다.
지속적으로 모델의 성능을 개선하고자 저는 유저의 metadata를 이용하기로 했습니다 유저의 metadata는 유저의 성별. 나이, 피부질환부위 등을 말합니다. 이러한 정보로는 개인을 식별할 수 없어 법적으로 큰 문제가 없습니다.
따라서 저는 유저의 성별, 나이, 피부질환부위를 수집해서 정보를 빅쿼리에 적재하는 방식으로 구현하였습니다
이 과정에서 사용한 기능은 firebase입니다 firebase는 다양한 모바일 프로그래밍 언어의 클라이언트 라이브러리가 통합되어 있는 모바일 앱 플랫폼입니다 저는 firebase에서 웹 호스팅과 cloud function을 이용하였습니다 먼저 firebase에서 웹을 만들고 배포하였습니다. 유저가 성별, 나이, 피부질환 부위를 각각 선택한 후 제출하게 되면 이 정보가 json 파일로 넘어가게 됩니다. 이 파일을 빅쿼리에 하나의 행으로 실시간 적재하기 위해 cloud funtion을 사용하여 구현하는 방식으로 진행하였습니다
이 과정에서 3가지 오류가 있었는데 이 부분에 대해서는 본 발표 가서 설명하기로 하고
다음으로 향후계획으로 넘어가겠습니다