2021. 12. 9. 10:07ㆍBACKEND
안녕하세요! 오늘은 Capstone design 프로젝트였던 Ruvve 개발 후기를 적어볼까 합니다.
기간은 개발을 시작한 기준인 3월부터해서 10월까지 진행했어요.
사용 기술은 Spring Boot를 이용한 Rest API Server, Deep Learning을 이용한 DeepSORT 개체 추적 기술입니다.
저는 팀장으로 기획, 디자인, 백앤드를 담당하여 진행했어요!
자세한 내용은 아래 포스팅에 담았습니다 ☺️
지난 포스팅 "Service.log" 은 기획한 서비스 내용과, 진행 과정에 대한 내용을 담았습니다.
이번 두 번째 포스팅인 "Backend.log" 에 개발과 관련된 내용을 담을 예정입니다 😉
| 개발 진행 과정 |
Ruvve를 진행할 때 가장 중요하게 여긴 것은 소통과 기록이었습니다.
소통을 하면서 팀원 각자의 개발 현황을 공유하고, 어떤 점이 부족하고 보완해나아갈 수 있을지 알아보는 것이 중요하다고 생각했습니다. 그래서, 잘 정리되어진 노션을 참고해서 프레임을 제작하고 정리해 나아갔어요. 매 회의 때마다 회의 내용들을 서로 적어 가며 기록을 남기기도 했습니다.
개발을 진행하면서도 계속해서 기록해 나아갔습니다.
그래서 개인 노션 페이지에도 개발을 어떻게 진행했는지, 어떤 에러가 발생했고 어떻게 해결해나아갔는지를 적었습니다.
기록은 정말 강력한 것 같아요. 다음에 보면 이런 내용이 있었나..? 싶은 것들도 읽다보면 다시 돌아오더라구요.
만약 기록을 하지 않았다면 매번 새로운 내용들이 되었겠죠.
Object-Tracking.log
Ruvve에서 사용하는 개체 추적은 DeepSORT를 사용하였습니다.
DeepSORT는 SORT (Simple Online Realtime Tracking)에 Deep Learning을 접목시킨 기술입니다.
SORT는 개체 추적 기능이 좋았지만, Occulusion 문제나 ID Switching 문제로 인해 Deep Learning을 도입하게 되었고, 그게 바로 DeepSORT입니다.
위 그림이 DeepSORT의 구조도 입니다.
사용하고자하는 기술이 어떤 내용을 담고 있는지 알아야 해서 여러 가지 논문을 정독하고 다양한 알고리즘에 대해 알게 되었어요.
오랜 시간이 걸렸지만, 그만큼 배운 것들이 많아서 의미있는 시간이었습니다.
자세한 내용은 지난 포스팅(DeepSORT, 제대로 이해하기)에 적었는데요.
구글에 DeepSORT를 검색하면 무려 첫 번째로 뜨게 되는 영광을... ㅜㅠ 얻을 수 있었습니다.
내용은 지난 포스팅에서 작성했으니, 오늘은 이슈들과 어떻게 해결해 나아갔는지에 대해 얘기해보고 싶어요.
ISSUE 1. 실시간 탐지 📽
Difficulty ●●○○○
어려웠던 부분 중 하나는 실시간 탐지를 소형 하드웨어에서 돌려야한다는 점이었습니다.
처음에 의심없이 라즈베리파이에 실시간 탐지를 돌리려고 했지만 YOLO v4의 개체 학습 조차 불가능했습니다 🤦🏻♀️
그래서 성능이 더 나은 LattePanda를 구매하게 되었고, 성능이 좋진 않지만 경량 버전의 YOLO v4는 감당할 수 있게 되었습니다.
ISSUE 2. 개체 탐지 → 개체 추적
Difficulty ●●●●○
YOLOv3로 개체 탐지 개발이 끝나고, 알림 기능을 도입할 때 문제점이 발생했습니다.
각 프레임마다 새로 등장한 개체 / 계속 탐지되고 있는 개체 / 잠시 사라졌다가 다시 나타나는 개체 를 구분해서 알림을 주어야 하는 점이었습니다.
| 기존 데이터의 문제점 |
각 프레임마다 개체를 인식하면 그 결과를 Label Class 리스트로 저장했습니다. 즉, 한 프레임에 발견되는 개체가 사람과 자동차였다면, 프레임마다의 데이터가 [‘person’, ‘car’]로 표시되는 것이었습니다.
문제가 잘 안느껴지시나요?
frame #21 → [‘person’, ‘car’]
frame #22 → [‘person’, ‘car’]
frame #23 → [‘person’, ‘car’, ‘bench’]
frame #24 → [‘person’, ‘car’, ‘bench’, ‘person’]
데이터가 위와 같이 저장이 되어서, 새로 등장하는 벤치와 사람에 대해 알림을 주는 기준을 정하지 못하는 점입니다. 그래서 처음에는 각 개체마다의 분류classification를 도입해야겠다는 해결책이 떠올랐고, 해결법으로 개체를 추적해야겠다고 판단했습니다.
그래서 찾아본 것이 DeepSORT였습니다. 기존에 사용했던 YOLO와의 호환성도 좋았고, 비교적 빠르게 개발하면서 성능이 우수한 알고리즘이었습니다. 개발 과정은 한글 자료는 거의 없지만 영문 자료나 불어, 중국어로 설명해둔 내용이 자세하게 되어있어서 번역기를 열심히 돌리며 …ㅎㅎ 영어가 반가워지더라구요 ,,, 대학원생 존경합니다,, 알고리즘을 이해할 수 있었습니다.
결과적으로 ! DeepSORT 를 사용해서 각각 라벨링된 데이터를 만들어 Track Class로 개체를 담았습니다.
해결 후 데이터는 아래와 같습니다.
frame #21 → [‘person-1’, ‘car-3’, ‘bench-2’, ‘person-5’]
"""
Track Class Attributes
----------
mean : ndarray
covariance : ndarray
track_id : int
hits : int
age : int
time_since_update : int
state : TrackState
features : List[ndarray]
"""
ISSUE 3. Docker와 로컬 환경 연결
Difficulty ●●●●○
개발 환경의 macOS 와 Latte Panda의 WindowOS의 차이에서 발생할 수 있는 문제를 없애기 위해 Docker를 사용하기로 했습니다.
dockerfile을 이용해 이미지를 생성하고 Docker hub에 업로드를 할 계획이었습니다. 테스트 동영상으로 개체 추적이 성공적으로 이루어지고 웹캠을 연결해서 실시간 추적을 시도하려고 했지만,
로컬에서 받아오는 영상 정보를 도커로 전달하는 기능이 필요했습니다. 관련된 소프트웨어가 있었지만, 설치형으로 번거롭다고 생각해서 다른 방법을 모색했지만, 다양한 시도 끝에 Github를 이용하여 프로젝트 환경 세팅을 Anaconda 환경으로 바로 실행하는 게 더 빠른 길이라고 판단해서 Anaconda 환경과 실행 쉘스크립트를 작성하여 해결할 수 있었습니다.
API-Server.log
API 서버는 Spring Boot를 이용해서 제작했습니다. 사실 API 서버가 할 일이 마땅히 없었어요. 우선순위 개발을 따지자면 유저를 관리하는 것과 알림을 위한 디바이스 토큰을 발급해주는 일 뿐이었습니다. 서비스가 더 확장되면 추천 경로 기능을 주고 싶었는데, 시간이 없어서 제작을 하지 않기로 했어요.
그래서 아쉬운 마음에 CICD 구축 경험이라도 쌓아보자라는 마음으로 Jenkins를 이용한 CICD를 구축하고 Let's Encrypt에서 SSL 인증서를 발급받아 HTTPS 보안 설정을 하며 의미있는 경험을 해보았습니다.
HTTPS
HTTPS 설정을 해보았습니다.그 과정을 지난 포스팅(HTTPS, TLS/SSL 어렵지 않게 등록하기) 에 적어두었어요!
자세하게 적어두어서 이번 포스팅에는 적을 게 별로 없네요 🤣
도메인 ruvve.net 으로 HTTPS 통신을 할 수 있었어요!
CICD
사실 큰 이슈는 없고 중간중간 에러들은 있었는데, 구글링을 하면서 해결해 나갔어요.
Blue Ocean 플러그인을 사용하는데 GUI로 잘보여져서 굉장히 편리했습니다.
음 후기를 말하자면 CICD을 구축한다는 과정이 재밌었어요. Jenkins 설정하는 과정이랑, EC2에 AWS CLI를 설치해 CodeDeploy를 설정하는 과정이 신기하기도 했고 재밌었어요. 머리속에 그려진 위의 그림이 실제로 작동되는 것에 재미를 느낀 것 같아요.
EC2 내에 AWS CLI를 설치해서 CodeDeploy를 사용했는데, AWS CLI를 써볼 수 있는 경험이 되어서 아주아주 만족스러웠습니다 🥰
APNs+FCM.log
정말 놀라웠던 사실,, Apple 개발자 계정을 갖고 있던 것이었습니다..ㅎㅎ
1년 전쯤 iOS 개발을 했었는데, 나중에 보니까 제가 Apple 개발자 계정을 갖고 있더라구요 🤭
그래서 이번 기회에 APNs과 FCM을 사용해서 Push Notification을 구현하고, Background Notification을 구현했습니다.
FCM 서비스를 오랜만에 사용하면서 다시 그 과정이 새록새록 기억나서 의미있는 경험이었습니다.
iOS Setting
iOS 개발하는 팀원이 다른 이슈로 전시날까지 알림을 구현하지 못할 예정이었어요.
그래서 얘기해보고 iOS 프로젝트를 받아 직접 설정했어요.
아래의 과정을 통해 설정해 나아갔습니다!
Apple Developer 페이지에서 프로젝트에 설정한 Bundle로 Identifiers 인증서를 발급받기
→ 해당 iOS 프로젝트 내 userNotificationCenter 를 통해 Device Token을 얻기
→ FCM에서 발급받은 .plist 설정
FCM Setting
FCM에 프로젝트 개설 → iOS 앱 등록하기 → APNs 인증서 발급받아서 앱에 적용
Server Setting
FCM 에서 API Key(Secret Key)가져와서 FCM Admin에 세팅
API Key과 디바이스 토큰으로 메세지 전송 !
이 때 둘 다 공개되면 안돼서 따로 파일 분리해서 적용했습니다.
마지막으로,,, 멋진 콘솔 창 자랑하고 마무리 하겠습니다
'BACKEND' 카테고리의 다른 글
TimeZone, 어렵지 않게 이해하기 (0) | 2022.05.05 |
---|---|
CIDR, 어렵지 않게 이해하기 (0) | 2022.05.01 |
RUVVE, Service.log (0) | 2021.12.09 |
HTTP/2, 제대로 이해하기 (4) | 2021.11.12 |
HTTPS, TLS/SSL 어렵지 않게 등록하기 (0) | 2021.04.25 |
Backend Software Engineer
𝐒𝐮𝐧 · 𝙂𝙮𝙚𝙤𝙣𝙜𝙨𝙪𝙣 𝙋𝙖𝙧𝙠