인간이 배우는 스킬은 크게 두 가지로 나눌 수 있다. 첫 번째는 가치를 발견하는 통찰력, 대인 관계 능력 등의 추상적인 능력인 소프트스킬이고, 두 번째는 직무 스킬과 같이 증명하기가 쉬운, 하드스킬이다. Coursera의 딥러닝 Specialization 과정을 수료한 이후, 곰곰히 생각해보니, 나의 하드스킬이 굉장히 부족하다고 판단했다. 머신러닝과 딥러닝이 정확히 무엇이고, 어떻게 활용이 가능한지, 미래에 어떠한 가치를 지니게 될지 등의 추상적인 개념의 학습은 충분히 되었지만, 그러한 아이디어를 직접 프로그래밍 코드에 녹여내어, 배포하는 단계가 여전히 막막하게 느껴졌기 때문이다.

 

 그도 그럴것이, 이제껏 주먹구구식으로 코드를 짜깁기하면서, 프로그래밍 언어를 체계적으로 공부한 적이 없었으므로, 다시 Python을 기초부터 차근차근 닦아나가기로 마음먹었다. Python은 문법이 직관적이서 배우기가 쉽고 수많은 머신러닝/딥러닝 라이브러리를 지원하기 때문에 데이터사이언스에서 주축이 되는 언어이다. 

 수업은 미시건 대학교의 Python Specialization을 택해 수강했고, 동시에, 웹을 통해 배포하는 방법을 배우기 위해, 같은 대학의 Django Specialization도 함께 수강했다.

 

 이것 저것 수업을 듣다보니 퍼즐 조각이 하나하나 맞추어지는 느낌이었다. 내가 모르던 부분을 알게되고, 내가 궁금해하던 부분을 해결하게 되면, 한 단계 더 나아간 새로운 아이디어가 생겼다. 어느 한 수업을 듣다가도 다른 수업에서 들었던 내용과 연관된 아이디어가 떠올랐다. 마치 눈 앞의 시야가 점차 확장되는 느낌이었고, 이 느낌은 다시 학습의 원동력이 되었다.

 

 내 손으로 직접 구현할 수 있는 부분이 많아지자, 개인 프로젝트의 아이디어도 떠올랐다. '딥러닝을 이용하여 사람의 얼굴을 평가해 보면 어떨까?' 라는 재미난 생각이 들었다. 어느정도 머신러닝, 딥러닝도 배웠겠다, 프로그래밍도 그럭저럭 할 줄 알겠다, 웹을 구축해서 어플리케이션 배포도 할줄 알겠다. '이건 각이 나온다' 라는 생각이 들었다. 

 그런데 웬걸, 준비과정부터가 만만치가 않았다. '서버는 어떻게 만들지?, 데이터는 어디서 구하지?, 데이터의 분류는 어떻게 하지?, 리눅스는 대체 왜이래?'

 

 내가 하고 싶었던건 세련된 머신러닝, 딥러닝이었는데 실상은 거기까지 가기도 전에 지쳐버리는 상황이 온 것이다. 리눅스 서버를 돌리기 위해 라즈베리파이를 구입했는데, 근 일주일을, 호환되는 라이브러리를 찾아서 설치하고 개발환경을 세팅하는데에 썼었던 것 같다. 사실, 말이 좋아 세팅이지, 정말, 수도 없는 에러를 만나 구글링을 하면서 리눅스와 개발환경에 대해 몸으로 배워가는 시간이었다.

 

 드디어 딥러닝에 대해 생각할 수 있는 단계가 오자, 그 동안 내가 온실 속 화초였다는 것을 느끼게 된다. 강의에서 내주던 과제에서는 십수만개의 데이터 세트가 미리 분류된 레이블값과 함께 항상 깔끔하게 준비되어 있었다. 하지만, 현실은데이터셋을 구하기는 커녕, 레이블도 내가 직접 메기어야 하는 상황이었다. 

 

 나의 경우엔, 사람들의 얼굴을 평가하는 딥러닝 모델을 만들기 위해서, 사람들의 얼굴 사진과, 이에 대한 점수값을 딥러닝 모델에 학습 데이터로 넣어주어야 했다. 직접 사진을 수집하면서 많은 문제점들을 발견하게 된다. 곰곰히 생각해보면, 사람은 사실, 사람의 얼굴을 평가할 때 그 사람의 얼굴만을 평가하지는 않는다. 즉, 그 사람이 입은 옷, 그 사람의 체격, 헤어스타일, 그 사람이 유명한 사람일 경우 그 사람의 평판, 사진을 찍은 곳의 배경 등, 얼굴자체와는 관련이 없는 정보들 또한 사람의 의사결정에 영향을 미치게 된다. '그럼 내가 컴퓨터한테 어떠한 정보를 전달해야 객관적인 얼굴평가가 이루어 지도록 학습시킬 수 있을까?' 라는 생각이 자연스레 들수밖에 없다. 뿐만아니라, 모델은 학습데이터의 레이블을 메기는 사람의 주관대로 학습이 될수밖에 없다는 한계점도 깨닫게 된다. 즉, 같은 얼굴을 두고도, 눈이 높은 사람은 점수를 낮게 메길 것이고, 눈이 낮은 사람은 점수를 높게 메길수도 있다. 따라서 레이블을 제공한 사람의 주관이 그대로 모델로 흡수된다는 것이다.

 

 결국 주관이 개입된다는 점은 어쩔수 없기에, 얼굴 이외의 정보를 최대한 배제시킨 후 모델을 학습시키기로 했다. 수집한 사진에서 얼굴만을 크롭해서 크롭된 얼굴사진만을 가지고 학습을 시작하는 것이다. 

 이를 위해, Python opencv 라이브러리를 통해 얼굴을 자동인식하여 크롭하는 과정을 전처리 과정에 추가하고, 딥러닝 모델은 컴퓨팅 성능이 제한적인 라즈베리파이에서 사용하기 위해, MobilenetV2를 이용하여 약 500 장의 사진으로 학습시켰다. 적은 데이터셋을 바탕으로 최대한의 효율을 내기 위하여, 성별 구분 모델을 얼굴평가 모델 앞에 추가하였고, 각 레이블별 데이터 수를 똑같이 수집하여 Imbalanced dataset이 되지 않도록 데이터셋을 구축했다.

 결과는 꽤나 놀라웠다. 사실 데이터 샘플의 수가 500장 정도밖에 되지 않기 때문에, 유의미한 성능을 기대하지는 않았다. 그러나 테스트 이미지를 넣어보니 내가 판단하는 점수와 크게 다르지 않아서, 딥러닝의 잠재력을 다시금 깨닫게 되었다.

 위의 프로젝트는 웹으로 배포하고 있으며 http://charliethewanderer1.ddns.net/faceeva/

 

http://charliethewanderer1.ddns.net/faceeva/

 

charliethewanderer1.ddns.net

누구나 방문하여 이용해 볼 수 있도록 서버를 항시 켜 놓고 있다. 참고로 말하지만, 해당 프로젝트는 겨우 사진 500장으로 학습되어 정확한 값을 예측 못할 수 있으니, 이상하게 나오더라도 실망하지 말자.

 

프로젝트 이후에 느낀점은 다음과 같다.

 우선, 내가 얼마나 부족한지 깨달았다. 항상 Coursera 수업에서 들어왔던 내용이지만, 쉽게 지나쳤던 내용들이 내 뼈를 때리는 경우가 많았다. 특히 데이터를 다루는데에 있어서, Skewed data가 무엇인지, dev set과 test set의 차이점, feature engineering이 무엇인지 등 매우 기본적인 개념들이 가장 중요하다는 것을 깨달았다. 사실 데이터를 다루는 첫 단추가 꼬여버리면 아무리 좋은 컴퓨터와 딥러닝모델을 써도 시간과 전기세만 낭비하는 셈이 되어버리니까.

 

 둘째로는, 딥러닝은 모델아키텍처가 아닌, 데이터셋이 제일 중요하다는 것이다. 즉, 데이터셋을 구할 수 없으면, 아무리 좋은 아이디어와, 딥러닝 모델 아키텍처도 그림위의 떡이다. 데이터 자체는 자동화하여 수집할 수 있다고 하더라도, 각 데이터 샘플에 대응되는 레이블 할당은 일부를 제외하면 자동화가 불가능하다. 사람이 하나하나 노가다로 레이블을 부여할 수밖에 없는 것이다. 따라서 프로젝트를 계획할 때, '내가 데이터셋을 구하거나, 추출 하는 것이 가능한가?' 라는 질문을 우선시 하게 되었다.

 

 마지막으로, 데이터사이언스는 개발자마인드가 필수적이라는 것이다. 즉, 프로그래밍과 개발환경세팅에 친숙해야 하며, 리눅스도 잘해야 한다. 요리의 레시피를 줄줄 외우고 있으면 뭐하는가? 정작 재료를 어디서 살 줄도 모르고, 손질도 할 줄 모르면 요리를 못하는데. 또한 요리를 하는데 들어가는 시간의 대부분은 조리가 아닌, 재료를 구입하고, 손질하는데에 들어가지 않는가? 데이터사이언스도 마찬가지로 보면 되는 것 같다.

 이처럼 학습과, 배운내용의 실행을 반복하는 Empirical cycle을 반복하는 것이 데이터사이언스의 핵심이라는 것을 깨닫고, 데이터의 전처리를 체계적으로 배우기 위해, 또다시 미시건 대학교의 Data Science Specialization 을 수강하게 된다.

블로그 이미지

찰리와마약공장

,