2020년 1학기 교내 데이터 사이언스 세미나에서 진행했던 프로젝트입니다.
현대자동차 디자인 센터에서, 딥러닝 모델을 활용하여 휠 유사도 검증 과정에 도움을 달라는 의뢰를 받았습니다. 소비자들이 다양한 차종을 요구함에 따라, 신차가 출시되는 데 소요되는 기간이 점차 짧아지는 경향을 보였습니다. 이에 따라 디자인 프로세스 또한 효율화 될 필요가 있었습니다.
휠은 중요한 자동차 디자인 요소입니다. 그러므로 기존에 출시된 자동차의 휠들과는 차별화 된 디자인을 하는 것이 중요합니다. 새로운 휠 출시 과정에서, 기존 휠들 중에 유사한 휠이 있는 지의 여부를 판단해야 합니다. 디자인 센터에서는 이러한 휠 유사도 검증 과정을 육안으로 진행하고 있었습니다. 이미지 처리 모델을 구축한다면, 유사도 검증 과정을 자동화하여 시간과 비용을 감소할 수 있을 것으로 기대하였습니다.
휠 유사도 검증 자동화를 통해 유사도 검증 과정에서 발생하는 시간과 비용을 감소
기술적으로, 다음과 같은 프로세스를 거쳐서 진행하였습니다.
- 데이터 수집 - 데이터 전처리 - 학습 모델 구축 - 유사도 계산(코사인 유사도 활용)
여기 에 단계별로 코드를 정리해두었습니다.
새로운 휠 이미지를 넣으면, 기존에 보유하고 있는 휠 이미지들과 비교하여 유사도를 계산하여 유사, 비유사 여부를 판별해줍니다. 가장 유사한 상위 이미지 5개를 뽑아서 보여줌으로써, 얼마나 차별화가 이루어졌는지 확인할 수 있습니다.
만들어진 결과물은 코사인 유사도를 활용하여 임의로 유사도를 매긴 것이기 때문에, 실제 사람의 시각과는 맞지 않을 수 있습니다. 그러므로 사람의 시각을 반영하여 추가로 학습할 수 있게 발전시킨다면 더욱 유용할 것입니다.
구상한 디자인 프로토타입입니다. 실제로 구현한 것은 아니며, 프로젝트가 제공하는 서비스를 이해하기 쉽도록 시각화 한 것입니다.
2020년 5월 1일 ~ 2020년 7월 3일에 진행되었습니다. 총 7명의 인원이 참여하였습니다.
각자 기여한 부분 이외에도, 모든 인원들이 필요한 작업이 있을 때마다 함께 참여하였습니다.
- 모든 코드는 python으로 작성되었습니다.
- 데이터 수집 : beautifulsoup, selenium, fake_useragent, pyautogui
- 데이터 전처리(이미지 처리) : cv2, PIL, matplotlib, keras
- 모델 구축 : keras
- 휠 유사도 판별 : sklearn(scikit-learn), skimage(scikit-image)
- GCP(Google Cloud Platform)
데이터 수집과 모델 구축 과정에 주로 기여하였습니다.
- 데이터 수집 : selenium과 fake_usergent를 활용한 동적 이미지 크롤링 코드 링크
- 모델 구축 : keras를 활용한 딥러닝 모델 구축. Trasnfer Learning 기법을 활용하여, 기존에 있는 ResNet50 모델 구조를 이용해 프로젝트에 맞게 학습 모델을 구축 코드 링크
크롤링을 하는 과정에서, 사이트에서 계속해서 크롤링하는 것을 방지하였습니다. 웹사이트마다 지나친 크롤링으로 사이트가 과부하되는 것을 방지하기 위해, 봇 탐지 기능을 걸어둔 것이었습니다.
봇 탐지 기능을 우회하기 위해, 다음 두 가지 해결책을 고안했습니다.
기술적으로, 이미지 크롤링은 원격으로 server side에 이미지를 다운로드 하겠다고 request를 보내는 것입니다. 만약 동일한 user-agent와 ip 주소를 가진 사용자가 계속해서 동일한 요청을 보낸다면, 봇 탐지에 쉽게 노출될 것입니다. 그러므로 fake_useragent 라는 라이브러리를 활용해서, 일정 숫자 이상의 이미지를 다운받으면 Selenium driver를 재실행시키면서 useragent도 임의로 바꿔주었습니다.
다운로드가 지나치게 빠르게 계속된다면, 봇 탐지 기능에 걸려서 사이트가 막히는 현상이 발생했습니다. 이에 time sleep 기능을 활용하여 임의로 동작 간의 시차를 주어서 탐지에 걸리지 않도록 만들었습니다.
그 결과 크롤링 기능이 확연하게 개선되었습니다. 도중에 프로젝트 방향이 변경되어 계속 활용하지는 않았지만, 문제를 해결하는 재미를 느낄 수 있었습니다.
개념적으로만 알고 있었던 신경망을 실제로 구축하는 것은 쉽지 않은 일이었습니다. keras의 공식 문서와 블로그를 찾아보고, 많은 페이지를 구글링하면서 예제 코드를 찾았습니다. 이후 프로젝트의 상황에 맞게 코드를 수정하여 활용했습니다. 함께 작업하는 팀원들과 협업하기 위해 최대한 주석을 길게 달아주었습니다. 코드 블럭을 하나씩 실행시켜보면서 에러가 발생하면 바로 공식 문서에 검색해서 문제를 이해하고, 해결하였습니다.
장기간 프로젝트를 해본 경험이 처음이었습니다. 수업 중 조별 과제를 하는 것보다는 함께 작업할 일들이 훨씬 많았습니다. 팀 작업을 하면서, 주어진 일을 잘 수행하는 것 못지 않게 중요한 건 결과물을 이해하기 쉽게 공유하는 것임을 알 수 있었습니다. 작업의 템포를 맞추지 않고 혼자서만 잘 하는 것은 위화감을 조성할 뿐이었습니다. 이 점을 이해한 다음부터는, 다른 팀원의 진행 상황을 먼저 파악하고 그에 맞추어서 공유하기 위해 노력했습니다. 다른 작업의 일손이 부족하면 함께 처리하고, 때로는 제가 맡은 작업에 대해서도 도움을 요청하면서 함께 템포를 맞추어 나갔습니다. 기술적으로 더욱 알게된 것보다도 훨씬 중요한 교훈이었다고 생각합니다.
저에게는 첫 프로젝트였던 만큼 시행 착오도 많았던 것 같습니다. 코딩에 대해 잘 모르는 상태에서 예제 코드를 이해하고, 프로젝트에 맞게 코드를 작성하는 일은 분명 쉽지 않은 일이었습니다. 밤도 많이 샜습니다. 그러나 그 만큼 배운 것들도 많았습니다. 가장 값진 결과로, 필요한 내용을 스스로 찾아서 공부하는 방법을 터득할 수 있었습니다. 어떤 문제에 부딪혀도 해결할 수 있다는 자신감을 얻을 수 있었습니다.
한편으로는 팀 작업을 할 때 효과적인 의사소통의 중요성을 알 수 있었습니다. 코드 작업을 할 때에는 최대한 자세하게 주석을 달아주어야 한다는 것을 깨달았습니다. 또한 같은 프로젝트를 하더라도 저마다의 처한 상황과 이해도가 다르기 때문에, 그 점을 고려해서 의견을 주고 받을 수 있게 되었습니다.
프로젝트를 하면서 코딩에 흥미를 느끼게 되었고, 이후로도 꾸준히 관심을 놓지 않았습니다. 포트폴리오를 작성하는 지금까지 오게 된 가장 큰 계기가 이 프로젝트라고 생각합니다.