깃허브 주소 : github.com/tatittato/test_jaeum
1. 프로젝트를 시작하게 된 이유
- 수면장애는 전세계 45%, 대한민국의 110만명이 겪고 있는 문제이며 계속 증가하는 추세
- 슬립테크 시장은 급속하게 성장, 2026년에는 321억 달러 규모를 예상
- 기존 수면 어플들은 물리적 통증의 원인을 파악하기 어려움, 이에 따라 AI 영상인식을 활용하여 원인을 파악하고자 함
2. 프로젝트 개요
프로젝트 명: 재움
인원 : 4명
사용기술 및 개발환경
- Front-end : HTML5(웹표준), BootStrap, Jinja2
- Back-end : Python, openCV, FastAPI
- tool : VScode
- DB : mySQL
- API : MediaPipe, ChatGPT 3.5 API
- 관리 : github, notion
- server : docker, aws
ERD

3. 프로젝트 프로세스 및 기능
프로세스

주요기능
- 모든 기능 공통
- 닉네임이 없을 시 사용 불가능
- 메인페이지
- 닉네임 생성
- 촬영페이지
- 실시간 촬영
- 촬영 시작 시 수면 유도음악 재생
- 수면 중 자세인식 및 분석
- 촬영정보 및 수면정보 DB저장
- 수면 종료 후 ChatGPT 수면 피드백 확인
- 촬영 중 처음으로 인식한 자세의 수면이벤트와 이미지를 저장 이후에 동일한 자세일 경우 저장하지 않음
- 다른 자세로 3번 연속 인식했을 경우 바뀐 자세의 수면이벤트와 이미지를 저장
- 이미지 저장 시 개인정보 보호를 위해 얼굴 모자이크 처리



- 수면점수페이지
- 4가지 수면기준을 토대로 DB데이터를 사용하여 일일 점수 계산
- 일일 점수 그래프 및 수면 피드백 확인


- 타임라인페이지
- DB데이터를 사용하여 일일 총 수면시간과 수면이벤트 시간을 그래프로 확인 가능
- 해당 날짜의 수면이벤트 이미지 확인 가능


- 수면통계페이지
- DB데이터를 사용하여 일, 주, 월, 연단위로 각종 수면 통계자료 확인 가능
4. 나의 역할
(공통)
AI 모델을 활용한 자세분류
딥러닝 모델 Mediapipe의 pose estimation를 활용하여 신체의 랜드마크를 인식하고 랜드마크의 점들을 각도로 계산하여 실시간으로 라벨링 하여 자세분류
ChatGPT 3.5 API prompt를 활용한 수면 피드백
Prompt engineering 하여 DB에 수면 데이터를 통해 수면 피드백 제공
(개인)
메인페이지
- 닉네임 저장 : input text에 닉네임을 입력하고 생성버튼을 누르면 javaScript fetch를 사용하여 엔드포인트 /record/create_user get메소드로 서버에 전송하여 DB에 저장
촬영페이지
- 실시간 촬영 : 촬영버튼을 눌렀을때 javaScript의 mediaStream을 사용하여 웹캠 실행
- 닉네임과 촬영시작시간 DB저장: url의 닉네임과 촬영 버튼을 눌렀을때의 현재시간을HH:MM:SS으로 추출하여 클라이언트에 시작시간을 저장하고 fetch를 사용 엔드포인트 /record/create_sleep_info post메소드로 서버에 전송하여 저장
- 촬영 중 10초마다 캡처이미지를 서버에 전송 : javaScript의 canvus를 활용하여 이미지 캡처 후 이미지를 blob 형태로 변환하여 전송
- 전달 받은 캡처 이미지의 자세인식 후 라벨링 : Mediapipe를 통해 이미지의 자세를 인식하여 라벨링 후 다시 클라이언트로 리턴
- 이미지 저장 시에 개인정보보호를 위해 Mediapipe의 face detect와 openCV를 사용하여 얼굴 영역 인식 후 모자이크 처리
- 처음 전송 받은 라벨링된 이미지는 fetch를 사용 엔드포인트 /record/event_save post메소드로 수면이벤트와 이미지를 DB에 저장
- javaScript에서 조건문을 통해 이전 라벨과 현재 라벨을 비교하여 3번 이상 바뀌었을 시 새로운 sleep_event를 저장
- 촬영 종료시 HH:MM:SS 형식으로 시간을 추출하고 종료시간 저장, 수면 시작시 저장된 시작시간과의 차이를 계산하여 총 수면시간 계산 후 fetch를 사용 엔드포인트 /record/update/${nickname} put 메소드로 DB에 업데이트
- 촬영 종료 후 DB의 수면정보테이블과 수면이벤트테이블을 join하고 select하여 필요데이터(수면 시작 시간, 수면 종료시간, 총 수면시간, 수면이벤트, 수면 이벤트 발생시간) 추출
- chatGPT prompt에 전달할 데이터로 가공(수면 시작 시간, 수면 종료 시간, 수면이벤트, 나쁜 수면 자세 시간) : 나쁜 수면 자세 시간은 바른자세를 제외하고 각 수면이벤트의 시간을 계산하여 합산
- chatGPT prompt에서 전달받은 답변을 fetch를 사용 엔드포인트 /feedback/&{nickname} put 메소드를 통하여 DB에 업데이트
- chatGPT prompt의 답변을 촬영페이지 하단에 표기
5. 느낀 점
AI 모델과 최근 화제인 chatGPT API를 활용해 볼 수 있는 기회가 주어져 소중한 경험을 쌓을 수 있었습니다. MediaPipe를 이용하여 자세를 인식하고 원하는 라벨을 추출하는 과정, 그리고 prompt를 작성해 점차 원하는 답변을 얻어내는 과정에서 느꼈던 성취감은 매우 기억에 남습니다.
영상촬영 페이지에서 필요한 수면데이터를 javaScript와 fastAPI를 사용하여 서버로 전달하고 DB에 저장했어야 했는데 422 에러를 특히 많이 접하게 되었습니다. 클라이언트에서 보내는 값과 서버가 다시 리턴해주는 값들을 하나씩 확인하면서 문제점을 파악할 수 있었고 데이터의 타입과 key value값의 중요성을 알 수 있었습니다.
'프로젝트' 카테고리의 다른 글
스프링 프레임워크 프로젝트(UpRe) (0) | 2023.07.05 |
---|
댓글