[포트폴리오] 달당 프로젝트

2021. 1. 24. 01:34후니의 프로젝트

[소프트웨어 마에스트로 10기] 달당 프로젝트

 

역할: PM, 백엔드(공공데이터 활용 경진대회), 인공지능 모델 제작, 가벼운 프론트(리액트), 영상처리

 

달당 프로젝트는 사과(부사)를 촬영하여 당도를 측정하는 프로젝트이다. 

달당 프로젝트의 시작 이유

 필자의 아버지는 약 30년간 과일 장사를 하고 있으시다. 아버지가 퇴근 후 가져오는 과일을 먹다보면 왜 학교나 다른 집에서 먹는 과일이랑 맛의 차이가 많이 날까라는 고민을 많이했다. 이때 인공지능 공부를 하고 있어서 인공지능을 사용해 해결해볼 수 없을 까라는 고민을 하다가 프로젝트 아이디어로 생각하게 되었다.

 

 처음에는 사용성이나 제한된 사용자로 아이디어로 부족할거 같아서 말을하지 않았었는데 면접장에서 있으셨던 구름 CEO이신 류성태 멘토님이 면접 때 내가 말했던 아이디어를 기억하셨다가 멘토링 시간에 이 아이디어 좋던데 이번에 해보는게 어때요? 라고 하길래  걱정을 가득 안고 달당 프로젝트를 시작하게 되었다.

 

프로젝트 시작 단계

우선 프로젝트를 시작하는데 있어서 과일 중에서도 한국 사람들이 가장 많이 먹는 사과, 사과 중에서도 가장 많이 생산되는 부사 품종을 기준으로 프로젝트를 시작하게 되었다. 

 

프로젝트를 시작하기 앞서 팀원들과 나의 생각

 

이게 가능해?

 

솔직히 말해서 사과를 촬영하는 것만으로 당도가 측정 가능한지 아무도 몰랐다. 즉 상당히 도전적인 주제였고 성공할지도 몰라서 마지막 까지 걱정과 고민으로 지냈던 프로젝트였다. 

 

우선 멘토님의 권유로 관련된 논문들을 찾아 읽어 보았고 외국 및 한국의 기사를 찾아보았다. 이것 저것 찾아보는 도중 일본에서 사진 촬영으로 맛을 측정하는 프로젝트를 진행한 사례를 보았고 아 그래도 가능은 하겠구나해서 다양한 시도를 해보았다. 

 

우선 찾아본 시나리오 

논문에서도 그랬지만 가장 많이 이용한 것은 색이었다. 색 RGB를 통해서 당도를 측정하는 방법을 생각했었다. 그래서 우선 이미지에서 배경을 제거하고 사과만의 색을 추출하는 작업을 시행했어야 한는데 이는 OpenCV를 이용해 했어야했다. OpenCV를 공부하며 블로그에 기록한건 카테고리에서 볼 수 있다. 

 

OpenCV를 이용해서 사과의 색의 범위를 정해 사과의 범위를 벗어나는 색인 경우 값을 가져와서 기존 이미지에 빼주는 방식으로 배경을 제거 해주었다. 하지만 현재 방법에는 몇가지 단점이 존재하는데 우선 사과를 사진의 가운데로 맞추어서 촬영해야하고 빛이 반사하는 부분은 사과가 아닌데 사과로 인식하는 경우가 있었다. 

 

-> 이 문제는 배경을 제거해주는 인공지능 모델을 개발해서 사용하는 것이 좋을 것 같다. 

 

이러한 방법으로 사과 만의 RGB를 추출하여 평균을 내주었다. 

 

 

 전체적인 사과의 비율을 구해주었다. 가운데 점에서 72도씩 사과의 길이를 구해주었다. 72도씩 구한 사과의 길이를 5번 돌리면 결국 360도 모든 길이를 구해서 가장 큰 길이에서 나누어 준 다음 평균을 내주었다. 

 

위와 같은 파라미터를 이미지로 부터 구해준 후에 훈련을 돌려서 평균적으로 아래와 같은 결과가 나오게 되었다.  

 

소마에서의 내용은 여기까지였다. 이 프로젝트 진행 후에 농림축산 식품부에서 주최하는 공공데이터 활용대회가 있어서 대회 성격에 맞추어 아이디어를 변형한 뒤 출전하게 되었다. 

 

우선 이 대회에서는 백엔드 포지션을 맡아서 진행했다. 우선 이전에 공부했던 nginx, 도커, Go, Jenkins, swagger  같은 것을 대거 활용하여 서버를 만들었다. 서버의 전체적인 구조도는 아래와 같다. 

우선 각 요소들을 배포하기 편하게 만들기 위해서 docker를 활용하여 배포했다. 

 

우선 각각이 어떤 역할을 했는지 설명하겠다. 

 

우선 Nginx는 이 서버에서 load Balancing을 담당하고 있다. 각각의 요청을 잘 분배하여 뒤의 컨테이너에 전송해준다. 실제로 배포할 서버라서 HTTPS를 활용할 계획이었다. 그래서 Open SSL을 활용해주었다. 따라서 클라이언트에서 아전하게 데이터를 전송할 수 있었다. 

 

 작년에 Go언어를 처음 공부하기 시작해서 처음 서버를 제작하는데 사용했다. Go언어를 사용해보니 Go Routine의 장점을 알 수 있었다. 공공데이터 허브에서 각 지역별 요일별로 나누어 정보를 가져올 필요가 있었는데 이 때 지역별로 나누어서 Go Routine을 활용해 병렬적으로 활용해서 빠르게 원하는 데이터를 업데이할 수 있었다. 요일별도 나누어서 진행하고 싶었지만 공공데이터 서버에서 한번에 너무 많은 요청을 보낸다고 거절해버렸다. 이를 메인 서버와 다른 cron을 활용해 매일 특정시간만 따로 데이터베이스를 업데이트 해주는 서버를 만들어 주었다. 

 

 테스트 코드나 오류 체크에 있어서 훨씬 간편했다. 기본적으로 제공하는 함수들의 반환 값에 무조건 error라는 타입의 변수가 반환되기 때문에 if err != asdasd  이런식으로 확인을 해주어야 했다. 

 

 각각의 요청 API를 클라이언트 개발측에서 빠르게 보고 테스트 할 수 있게 만들기 위해 Swagger를 활용하여 제공해주었다. 

 

 Go 뿐만 아니라 python의 flask도 사용했는데 이는 인공 지능 모델을 Go에서 작동하는 방법을 찾지 못했고 openCV코드가 python으로 구현되어 있어서 그랬다. 따라서 flask에서는 openCV와 인공지능 모델을 작동하기 위한 서버로 만들었다. 

 

 백엔드의 각 요소를 모드 도커화 하여 편리하게 배포할 수 있었다. 아직 배포하기전 클라이언트 측에서 테스트를 진행하고 싶다고 하여서 도커 실행 명령어가 담겨 있는 .sh 파일과 이미지를 전송해주어서 편하게 테스팅 할 수 있었다. 또한 각 key, 보안 정보들은 docker의 secrets라는 것을 활용하여 편하게 보호할 수 있었다. 이는 GCP내에서도 동일했다. GCP Compute Engine에서도 동일하게 .sh파일 명령어를 사용해서 편하게 배포할 수 있었다. 하지만 배포 방법은 추후에 Jenkins으로 바꾸게되었다. 

 

 물론 도커를 활용하여 편하게 배포할 수 있게되어 편리했지만 매번 push해줄 때 마다 매번 업데이트 해주는 것이 너무 귀찮아서 찾아보는 중 Jenkins였다. Jenkins를 활용해서 깃의 deploy 브랜치에 배포해주면 자동으로 Jenkins가 새롭게 업데이트 된 버전으로 업데이트 해준다. 또한 이러한 과정 중에서 테스트 코드를 통해 테스트를 진행해 통과하면 성공적으로 배포해주었다. 다음에도 편하게 사용할 수 있을 것 같다.

 

 

전체적인 서비스의 흐름도

 

지금까지 내가 활용한 백엔드 부분에 대해서 설명했다. 전체적인 흐름도를 나타내겠다. 

 

1-1. 카메라를 활용하여 사과를 촬영한 다음 서버에 전송한다. 

1-2. 서버에서 이미지 처리를 통해 색과 전체적인 비율을 구해준다. 

1-3. 이를 활용해 회귀모델에 입력하여 당돌르 측정해준다. 

1-4. 측정한 당도, 날짜, 색을 보고서 데이터 베이스에 저장해준다. 

 

2-1. 매일 밤 12시에 공공데이터 정보를 데이터 베이스에 자동으로 업데이트 해준다. 

2-2, 2-3, 2-4. 가격, 날씨 등의 각종 정보를 클라이언트에서 요청해주면 전송해준다.

 

 

달당 프로젝트의 의의 

 

달당 프로젝트는 개인적으로 가장 도전적이고 생각을 많이했던 프로젝트였다. 그리고 내 역할군 뿐만 아니라 팀장의 역할을 맡아서 전체적인 프로젝트의 속도, 진행 과정, 발표 등을 맡아 힘들었던 프로젝트 과정이었다. 이를 버틸 수 있었던 이유는 좋은 팀원, 멘토님들 덕분이다. 그리고 이 프로젝트를 하면서 다양한 기술들을 새롭게 활용해보고 실제로 배포해보는 등의 활동까지 할 수 있어서 많이 배울 수 있었다. 

 

이 아이디어를 통해 대회에서는 최우수상인 농촌진흥청장상을 받았다. 운이 좋았다. 

'후니의 프로젝트' 카테고리의 다른 글

후니의 포트폴리오(개발자)  (0) 2021.03.19