"콕콕"의 두 판 사이의 차이
(→구성원 및 추진체계) |
(→프로토타입 사진 혹은 작동 장면) |
||
(같은 사용자의 중간 판 45개는 보이지 않습니다) | |||
124번째 줄: | 124번째 줄: | ||
===설계사양=== | ===설계사양=== | ||
====제품의 요구사항==== | ====제품의 요구사항==== | ||
− | + | [[파일:콕콕 프로젝트 요구사항.png]] | |
+ | |||
====설계 사양==== | ====설계 사양==== | ||
− | + | ||
+ | [[파일:Artroadmap.png]] | ||
+ | |||
+ | 데이터 수집 : iOS 디바이스, watchOS 디바이스 | ||
+ | |||
+ | API 서버 : django 기반 구현 Amazon EC2 서버 | ||
+ | |||
+ | 스윙 분류 및 분석 : scikit-learn, MoveNet, pandas | ||
+ | |||
+ | 데이터 저장 : Amazon S3 Storage, Amazon RDS | ||
===개념설계안=== | ===개념설계안=== | ||
− | |||
− | === | + | ====스윙 분석 기능==== |
− | + | 사용자의 하이클리어 스윙 과정 영상과 IMU 데이터를 수집 | |
+ | 수집한 데이터를 분석해 정량적인 점수로 변환 | ||
+ | 사용자의 스윙 장단점을 분석해 피드백을 제공 | ||
+ | 기록되어 있는 스윙들의 점수 추이를 그래프로 표현해 사용자의 실력 변화를 시각화 | ||
+ | |||
+ | ====경기 기록 기능==== | ||
+ | 사용자의 배드민턴 경기 동안의 IMU 데이터와 운동 데이터를 수집 | ||
+ | 수집한 데이터를 분석해 스윙이 일어난 시점과 스윙의 종류를 구분하고 평가 | ||
+ | 경기가 끝나면 운동 데이터, 스윙 횟수 등을 시각적으로 표현 | ||
+ | |||
+ | ====요약 페이지==== | ||
+ | 사용자의 한 달 동안의 운동 기록을 시각적으로 표시 | ||
+ | 사용자의 운동 기록을 업적으로 변환해 운동에 대한 지속적인 동기 부여 | ||
===상세설계 내용=== | ===상세설계 내용=== | ||
− | + | ====데이터베이스 ERD==== | |
+ | [[파일:콕콕 데이터베이스 ERD.png]] | ||
+ | |||
+ | ====유즈케이스 다이어그램==== | ||
+ | [[파일:콕콕 유즈케이스.png]] | ||
+ | |||
+ | ● 계정 관련 기능 | ||
+ | :• 회원가입 및 로그인 | ||
+ | ::사용자가 소셜 계정으로 서비스에 로그인하면서 시작된다. | ||
+ | ::시스템은 Firebase로부터 발급된 토큰을 식별 및 검증하고, 토큰이 일치하면 회원가입 또는 로그인 페이지로 넘어간다. 사용자가 처음 로그인했다면 본인의 기본정보를 입력하고, 이후 앱의 기능을 사용할 수 있다. | ||
+ | :• 회원정보 수정 및 탈퇴 | ||
+ | ::사용자가 앱의 '마이 페이지' 탭을 열면서 시작된다. 시스템은 사용자의 기본 정보를 표시하고, 다양한 기능을 제공한다. 시스템은 사용자가 다음 사항 중 하나를 선택하도록 한다. | ||
+ | :::• 로그아웃 | ||
+ | :::• 기본 정보 수정 | ||
+ | :::• 캐시 삭제 | ||
+ | :::• 데이터 삭제 | ||
+ | :::• 회원 탈퇴 | ||
+ | |||
+ | |||
+ | |||
+ | ● 요약 | ||
+ | :• 최근 경기 요약 조회 | ||
+ | ::사용자가 앱을 열어 요약 탭을 열면서 시작된다. 시스템은 사용자의 최근 한 달간의 경기를 분석하여 다음 사항에 대한 통계 정보를 그래프와 함께 보여준다. | ||
+ | :::• 경기 수 | ||
+ | :::• 경기 시간 | ||
+ | :::• 스윙 종류와 횟수 | ||
+ | :::• 승률 | ||
+ | :::• 이동 거리 | ||
+ | :• 업적 달성 및 조회 | ||
+ | ::요약 탭에서 최근 달성 업적과 전체 업적이 표시된다. 사용자가 경기를 기록하면 시스템은 경기 통계를 바탕으로 사용자의 업적 달성 정보를 자동으로 갱신한다. 사용자는 업적의 달성 여부와 달성 날짜를 확인할 수 있다. | ||
+ | |||
+ | |||
+ | |||
+ | ● 스윙 분석 | ||
+ | :• 스윙 업로드 및 삭제 | ||
+ | ::사용자가 스윙 분석 탭의 스윙 업로드를 눌러 스윙을 기록할 수 있다. 사용자는 절차에 따라 스마트폰과 스마트 워치에서 스윙 분석 기능을 수행하고, 서버에 스윙을 업로드 할 수 있다. | ||
+ | ::Alternate flow : 업로드 된 스윙이 분석 불가능할 경우 시스템은 사용자에게 오류 내용을 표시 | ||
+ | ::사용자가 업로드한 스윙 분석 결과를 삭제할 수 있다. | ||
+ | :• 스윙 결과 및 피드백 확인 | ||
+ | ::사용자가 스윙 분석 탭의 스윙을 선택하여 결과를 확인할 수 있다. 시스템은 사용자에게 스윙구간(임팩트 전, 임팩트 시점, 임팩트 후)별 점수와 장단점을 그래프와 함께 표시하고, 영상과 자세에 대한 장단점을 표시한다. | ||
+ | |||
+ | |||
+ | |||
+ | ● 경기 기록 | ||
+ | :• 경기 업로드 및 삭제 | ||
+ | ::사용자가 스마트 워치에서 경기 기록을 선택하면서 시작된다. 시스템은 사용자의 손목 움직임을 기록하면서 경기 중의 운동 정보, 점수판 등을 표시하고, 사용자는 경기 중 그것을 제어할 수 있다. 경기가 종료되면 사용자는 기록 종료를 선택하여 서버에 경기를 업로드한다. | ||
+ | ::Alternate flow : 스마트 워치가 인터넷에 연결되어 있지 않으면 기기 내부에 경기 기록을 임시저장하고, 추후 인터넷에 연결되면 자동으로 업로드한다.사용자가 업로드한 경기 분석 결과를 삭제할 수 있다. | ||
+ | :• 경기 분석 결과 확인 | ||
+ | ::사용자가 경기 분석 탭의 경기를 선택하여 결과를 확인할 수 있다. 시스템은 사용자에게 운동정보와 경기 통계, 스윙 종류별 점수와 횟수 등을 그래프와 함께 표시한다. | ||
+ | |||
+ | |||
+ | |||
+ | ====클래스 다이어그램==== | ||
+ | |||
+ | * iOS | ||
+ | |||
+ | [[파일:콕콕 IOS 다이어그램.png]] | ||
+ | |||
+ | :ModelData<br> | ||
+ | :앱 내의 전체 데이터를 가지고, 변경 사항을 UI에 즉각 반영한다. | ||
+ | |||
+ | :AuthenticationManager<br> | ||
+ | :회원가입과 로그인, 로그아웃 등의 기능을 담당한다. APIManager의 기능들을 사용하여 서버와 통신하고, 받아온 사용자 데이터를 ModelData에 전달한다. | ||
+ | |||
+ | :SwingRecordManagerPhone<br> | ||
+ | :'스윙 분석' 기능을 위한 두 개의 클래스 중 하나이다. WCSession을 이용하여 watchOS와 상호작용하여 녹화 상태를 통제하고, 녹화중인 화면을 watchOS로 전송하며, 데이터를 DataManager를 사용하여 저장하거나 불러오고, APIManager를 이용하여 서버에 업로드한다. | ||
+ | |||
+ | :APIManager<br> | ||
+ | :실제 서버와 상호작용하는 클래스이다. 모든 서버 관련 기능은 이 클래스를 통해 이루어진다. | ||
+ | |||
+ | :DataManager<br> | ||
+ | :파일 처리를 위한 클래스이다. 파일 인코딩과 디코딩은 이 클래스를 통해 이루어진다. | ||
+ | |||
+ | |||
+ | * watchOS | ||
+ | |||
+ | [[파일:콕콕 watchOS 다이어그램.png]] | ||
+ | |||
+ | :WorkoutManager<br> | ||
+ | :'경기 기록' 기능을 위한 클래스이다. HKWorkoutSession을 이용하여 사용자의 운동 상태를 모니터링하고 기록하며, CMMotionManager클래스를 이용하여 사용자의 손목 움직임을 기록한다. | ||
+ | |||
+ | :SwingRecordManagerWatch<br> | ||
+ | :'스윙 분석' 기능을 위한 두 개의 클래스 중 하나이다. iOS와 제어 신호를 주고받으며 손목 움직임을 기록하고, 녹화된 손목 움직임을 iOS로 전송한다. iOS로부터 녹화되고 있는 영상 스냅샷을 전송받아 화면에 표시한다. | ||
+ | |||
+ | :WCSessionDelegate<br> | ||
+ | :실제 iOS와 상호작용하는 위임자 클래스이다. iOS로부터 받은 신호를 처리하고, 연결 상태를 체크한다. | ||
+ | |||
+ | :APIManager<br> | ||
+ | :실제 서버와 상호작용하는 클래스이다. 모든 서버 관련 기능은 이 클래스를 통해 이루어진다. | ||
+ | |||
+ | :DataManager<br> | ||
+ | :파일 처리를 위한 클래스이다. 파일 인코딩과 디코딩은 이 클래스를 통해 이루어진다. | ||
+ | |||
+ | |||
+ | * django 서버 | ||
+ | |||
+ | [[파일:콕콕 django 서버 다이어그램.png]] | ||
+ | |||
+ | :APIView<br> | ||
+ | :GET,POST와 같은 Method가 포함된 HTTP 요청을 처리하기 위한 Class Based View이다. | ||
+ | |||
+ | :PlayerInfo,AchievementList, PlayerAchievementList<br> | ||
+ | :각각 계정, 업적, 유저 개개인 별 업적 관련 유즈케이스를 구현하기 위한 클래스이다. | ||
+ | |||
+ | :LimitOffsetPagination<br> | ||
+ | :GET 요청 시 제시된 limit, offsetparameter를 인자로 받아 그에 따른 Objects들을 반환하는 클래스이다. 예를 들어<ServerURL>?limit=3&offset=2일 때, object(2)부터 3개를 반환한다. | ||
+ | |||
+ | :PlayerMotionList<br> | ||
+ | :영상 데이터 분석 & IMU 데이터 분석을 통해 사용자의 스윙 실력을 점수화하고 피드백을 제공해주는 클래스이다. 영상 데이터 분석은 MoveNet 클래스의 progress_video()를, IMU 데이터 분석은 SwingAnalysis 클래스의 analysis() 메서드를 사용한다. | ||
+ | |||
+ | :MatchRecordList<br> | ||
+ | :HTTP 요청에 따라 경기 데이터를 저장하거나 조회하는 클래스이다. 이 때, 경기데이터에IMU 데이터가 포함되었다면 SwingClassification 클래스의 classification()와 makeAnalysisData() 메서드를 통해 데이터를 분석하여 사용자에게 제공한다. | ||
+ | |||
+ | :SwingClassification<br> | ||
+ | :IMU데이터의 Peak를 찾아 특정 스윙 구간을 추출하고 이를 KNN 알고리즘을 통해 분류한 후,analysis() 메서드를 통해 스윙에 대한 점수를 매긴다. SwingAnaylsis가 선언되어야 올바르게 기능할 수 있다. | ||
+ | |||
+ | :SwingAnalysis<br> | ||
+ | :마찬가지로 IMU데이터의 Peak를 기준으로 스윙 구간을 추출한 후, 모범 데이터와의 편차를 통해 스윙에 대한 점수를 매긴다. | ||
+ | |||
+ | :MoveNet<br> | ||
+ | :영상 데이터를 프레임 별 배열로전처리한 후, 이를 movenet을 통해 분석하여 17개의 관절 좌표를 추출한다. 관절 좌표들을 활용하여 스윙에 중요한 요소들을 계산하고 이를 제공한다. | ||
+ | |||
+ | ====상태 다이어그램==== | ||
+ | |||
+ | * SwingRecordManagerPhone | ||
+ | |||
+ | [[파일:SwingRecordManagerPhone.png]] | ||
+ | |||
+ | |||
+ | 녹화 시작 신호를 받거나 직접 녹화를 시작하면 watchOS로 녹화 시작 신호를 보내며 녹화를 시작한다. 영상을 저장한 이후, recieving 상태가 되면 watchOS로부터 IMU데이터를 수신받고, 영상과 함께 서버에 업로드한다. | ||
+ | |||
+ | * SwingRecordManagerWatch | ||
+ | |||
+ | [[파일:SwingRecordManagerWatch.png]] | ||
+ | |||
+ | 녹화 시작 신호를 받거나 직접 녹화를 시작하면 iOS로 녹화 시작 신호를 보내며 녹화를 시작한다. 녹화가 종료되면 iOS로 IMU데이터를 전송한다. | ||
+ | |||
+ | * WorkoutManager | ||
+ | |||
+ | [[파일:WorkoutManager.png]] | ||
+ | |||
+ | 경기 기록 중 기록을 일시정지할 수 있다. 운동 정보와 경기 정보를 저장하면 IMU 데이터를 메타데이터와 함께 서버에 '지연 업로드' 한다 | ||
+ | |||
+ | 지연 업로드 | ||
+ | |||
+ | [[파일:콕콕 지연 업로드.png]] | ||
+ | |||
+ | IMU 데이터와 메타데이터 파일을 우선 내부 스토리지에 저장하고, 서버에 업로드를 시도한다. 서버에 업로드하였다면 이후 남은 파일을 삭제하고, 업로드하지 못했다면 내부에 저장하고 상태를 종료한다. | ||
+ | 이후 자동으로 서버와의 연결을 체크하여 업로드 가능하다면 위 작업을 다시 시도한다. | ||
+ | |||
+ | ====최종 시퀀스도==== | ||
+ | |||
+ | * 스윙 분석 시퀀스 | ||
+ | |||
+ | [[파일:콕콕 스윙 분석 시퀀스.png]] | ||
+ | |||
+ | |||
+ | iOS 앱과 watchOS앱에서 각각 스윙 분석을 선택하면서 시작된다. | ||
+ | |||
+ | :애플워치에서 스윙 분석 열기 | ||
+ | ::사용자는 iOS 앱에서 '애플워치에서 콕콕 앱 열기'를 선택하여 watchOS에서 원격으로 스윙 분석을 실행할 수 있다. | ||
+ | |||
+ | :스윙 녹화 | ||
+ | ::iOS와 watchOS에서 3-way-handshake를 수행하면서 시작된다. 어떤 기기에서든 시작하거나 종료할 수 있다. 녹화가 시작되면 iOS는 영상 녹화를, watchOS는 IMU 데이터 수집을 시작한다. | ||
+ | ::녹화 중에는 사용자가 카메라의 영상을 확인할 수 있도록 watchOS로 영상 스냅샷이 전송된다. | ||
+ | ::녹화를 종료하면 watchOS에서 iOS로 IMU 데이터를 전송하고, iOS는 영상과 함께 서버로 전송할 준비를 한다. | ||
+ | |||
+ | :스윙 업로드 및 처리 | ||
+ | ::사용자는 촬영된 영상을 확인하고 서버로 업로드하여 스윙 분석을 요청한다. 업로드된 영상 데이터, IMU 데이터를 S3 스토리지에 저장한다. 이후 스토리지에 저장된 위치의 URL을 추출한다. 영상 데이터는 MoveNet을 활용하여 분석하고, IMU 데이터는 SwingAnalysis 알고리즘을 통해 분석한다. 스윙 분석 결과가 산출되면 이를 MySQL에 저장한다. 저장된 데이터를 조회하여 서버에 전송한다. 서버는 이를 IOS에 전송한다. | ||
+ | ::이후 iOS는 사용자에게 스윙 분석 결과를 표시한다. | ||
+ | |||
+ | |||
+ | * 경기 기록 시퀀스 | ||
+ | |||
+ | [[파일:콕콕 경기 기록 시퀀스.png]] | ||
+ | |||
+ | |||
+ | :사용자 정보 받아오기 | ||
+ | ::최초 1회에 한해 iOS로부터 사용자 정보를 받아온다. 이후 작업은 iOS 없이 독립적으로 수행 가능하다. | ||
+ | |||
+ | :경기 기록 | ||
+ | ::사용자는 watchOS에서 경기 기록을 선택하여 기록을 준비한다. 최초 1회에 한해 사용자로부터 운동정보 수집을 위한 동의를 받는다. | ||
+ | ::경기 기록 중에는 운동 세션을 설정하여 사용자의 운동 정보와 손목 움직임을 기록한다. | ||
+ | ::경기가 종료되면 메타데이터와 IMU데이터를 내부에 임시 저장한다. | ||
+ | |||
+ | :경기 업로드 및 처리 | ||
+ | ::경기가 종료되면 watchOS가 서버에 파일을 업로드한다. 이때 iOS에서 받아온 사용자 정보가 메타데이터에 포함된다. | ||
+ | ::업로드에 성공하면 임시 저장된 파일들을 지우고 기록을 완료한다. | ||
+ | ::업로드에 실패하면 파일을 반영구적으로 저장하고, 이후 인터넷이 연결되면 업로드한다. | ||
+ | ::업로드에 성공했을 때, IMU데이터를 S3 storage에 저장한다. 저장된 위치에 대한 URL를 추출하여 서버에 임시 저장한다. | ||
+ | ::IMU데이터를 SwingClassification 알고리즘을 수행하여 각 스윙 별 종류와 점수를 산출한다. 산출된 데이터와 메타데이터를 MySQL에 저장한다. | ||
+ | ::저장된 데이터를 조회하여 서버에 전송하고, 서버는 이를 받아 iOS에 전송한다. | ||
+ | ::이후 iOS는 사용자에게 경기의 분석 결과를 표시한다. | ||
==결과 및 평가== | ==결과 및 평가== | ||
===완료 작품의 소개=== | ===완료 작품의 소개=== | ||
====프로토타입 사진 혹은 작동 장면==== | ====프로토타입 사진 혹은 작동 장면==== | ||
− | + | ||
− | ==== | + | |
− | + | [[파일:콕콕 iOS 메인화면.png]] | |
+ | |||
+ | [[파일:콕콕 스윙분석페이지.png]][[파일:콕콕 스윙분석1.png]][[파일:콕콕 스윙분석2.png]][[파일:콕콕 스윙분석3.png]] | ||
+ | |||
+ | |||
+ | [[파일:콕콕 경기기록1.png]][[파일:콕콕 경기기록2.png]] | ||
+ | |||
+ | |||
+ | [[파일:콕콕 스윙수.png]][[파일:콕콕 승률.png]] | ||
+ | |||
+ | ====한국정보과학회 논문==== | ||
+ | |||
+ | [[파일:콕콕 한국정보과학회 논문.png]] | ||
===관련사업비 내역서=== | ===관련사업비 내역서=== | ||
− | + | ||
+ | |||
+ | [[파일:콕콕 프로젝트 개발사업비.png]] | ||
===완료작품의 평가=== | ===완료작품의 평가=== | ||
− | + | ||
+ | [[파일:콕콕 프로젝트 평가.png]] | ||
===향후계획=== | ===향후계획=== | ||
− | |||
− | === | + | ◇ 추가 데이터 수집 후 알고리즘의 보완 |
− | + | ||
+ | ◇ 분석 영상 좌표 3D 환산 | ||
+ | |||
+ | ◇ 서버 모듈화 및 컨테이너 활용 | ||
+ | |||
+ | ◇ 부가 기능 추가 | ||
+ | |||
+ | ==비고== | ||
+ | |||
+ | ===참고문헌 및 참고사이트=== | ||
+ | |||
+ | [1] J Lin,CW Chang, TU Ik, YC Tseng, "Sensor-based badminton stroke classificationby machine learning methods." 2020 ICPAI. IEEE, 2020. | ||
+ | |||
+ | [2] Z Chu, MLi, "Image recognition of badminton swing motion based on single inertialsensor." Journal of Sensors 2021 : 1-12, 2021. | ||
+ | |||
+ | [3] I Ghosh,SR Ramamurthy, A Chakma, N Roy, "Decoach: Deep learning-based coaching forbadminton player assessment", Pervasive and Mobile Computing 83, 2022 | ||
+ | |||
+ | [4] HY Ting,H Yong, KS Sim, and FS Abas. "Kinect-based badminton movement recognitionand analysis system." International Journal of Computer Science in Sport14.2: 25-41, 2015. | ||
+ | |||
+ | [5] 정상훈, "배드민턴 하이클리어 동작에 대한 여자 중학교 학생선수와 일반학생 간 운동역학적 비교 분석", 2020. | ||
+ | |||
+ | [6] 이재환, 권태용, 김용운, "배드민턴 하이클리어 동작 시 숙련도에 따른 상체 및상지 움직임의 역학적 비교 분석", 2020. | ||
+ | |||
+ | [7] 김창범, 유재광 "여자중학생 배드민턴 하이클리어 동작의 운동학적 분석", 2002. | ||
+ | |||
+ | |||
+ | ===소프트웨어 프로그램 소스=== | ||
+ | |||
+ | |||
+ | 1. iOS & watchOS 어플리케이션 소스 | ||
+ | https://github.com/wldnd9904/Cokcok | ||
+ | |||
+ | 2. django & 분석 알고리즘 소스 | ||
+ | https://github.com/straipe/cokcok | ||
+ | |||
+ | 3. '스마트기기를 활용한 배드민턴 스윙 분석' 논문 코어 코드 | ||
+ | https://github.com/rkdthdah/cokcok_data_core | ||
+ | |||
+ | 4. 프로젝트 데모 페이지 | ||
+ | https://wldnd9904.github.io/Cokcok/ |
2023년 12월 18일 (월) 20:16 기준 최신판
프로젝트 개요
기술개발 과제
국문 : 스마트 기기를 활용한 배드민턴 스윙 분석 서비스
영문 : Badminton Swing Analysis Service Using Smart Devices
과제 팀명
콕콕
지도교수
김민호 교수님
개발기간
2023년 9월 ~ 2023년 12월 (총 4개월)
구성원 소개
서울시립대학교 컴퓨터과학부 20189200** 신*영(팀장)
서울시립대학교 컴퓨터과학부 20189200** 강*모
서울시립대학교 컴퓨터과학부 20189200** 임*욱
서울시립대학교 컴퓨터과학부 20189200** 최*웅
서론
개발 과제의 개요
개발 과제 요약
◇ 스마트 기기를 활용해 배드민턴 스윙 자세의 영상과 IMU 데이터 수집
◇ 수집한 데이터를 분석해 사용자의 스윙 자세에 대한 피드백 제공
◇ 스마트 기기를 활용해 배드민턴 경기 전체의 운동 데이터와 IMU 데이터 수집
◇ 수집한 데이터를 분석해 사용자의 경기 전반에 대한 피드백 제공
개발 과제의 배경
◇ 입문하기는 쉽지만 피드백을 받기 어려운 스포츠
배드민턴은 대부분 사람들이 중고등학교 시절 체육 시간에 접해본 적이 있고, 장비가 많이 필요하지 않기 때문에 진입장벽이 낮은 스포츠이다. 그러나 입문한 이후에 숙련되는 과정에서 동호회에 소속되거나 전문적인 레슨을 받지 않으면 자신의 자세나 경기에 대한 피드백을 얻기 어렵다는 문제점을 가지고 있다. 해당 과제의 핵심 기능을 통해 시공간적 한계나 여러 문제로 인해 피드백을 제공받기 어려운 환경에 있는 사람들에게도 피드백을 제공할 수 있다.
◇ 잘못된 자세와 습관으로 인한 문제
운동에서 올바르지 않은 자세나 습관이 잡히면 실력 향상에 방해가 되거나 부상의 위험이 높아지는 문제가 발생하게 된다. 그러나 배드민턴 동호회를 통해 조사해본 결과 자신의 자세가 잘못되었다는 사실을 알지 못하는 채로 운동을 하는 사람들이 60%정도로 굉장히 많다. 해당 과제의 핵심 기능을 통해 이러한 사람들에게 전문가의 자세와의 유사도와 피드백을 제공할 수 있다.
개발 과제의 목표 및 내용
◇ 스마트 기기를 활용하여 사용자의 운동 데이터를 수집해 서버로 전송하는 어플리케이션 기능 구현
- • 사용자가 운동하는 과정에서 발생하는 움직임을 영상, IMU 등 다양한 방법으로 수집하여 서버로 전송한다.
◇ 운동 데이터를 분석하고 결과를 도출하는 서버 기능 구현
- • 운동하는 과정에서 수집한 데이터를 서버로 전송하면 서버는 알고리즘 연산을 통해 해당 데이터들을 분석하고 사용자에게 그 결과를 전송한다.
◇ 서버에서 분석한 운동 데이터를 요약해주는 어플리케이션 기능 구현
- • 서버에서 전송한 분석된 데이터를 요약해 사용자에게 피드백을 제공한다.
관련 기술의 현황
관련 기술의 현황 및 분석(State of art)
- 전 세계적인 기술현황
◇ 배드민턴과 같은 라켓 스포츠에서 스윙의 형태를 구분하고 실력을 측정하는 연구는 컴퓨터 비전 분야에서 꾸준하게 이루어져 왔음.
- • J. Lin은 음향, IMU 센서를 장착한 라켓을 이용해 관성 데이터를 추출한 후 다양한 머신 러닝을 이용해 스윙의 종류를 구분해내는 모델을 제안함.
- • Z. Chu는 IMU 센서를 고정한 배드민턴 라켓을 활용해 스윙의 종류를 식별하기 위한 방법으로 향상된 LSTM 알고리즘을 제안함.
- • I. Ghosh는 위의 연구들이 하체의 움직임을 고려할 수 없다는 점을 극복하기 위해 4가지의 위치에 IMU 센서를 장착하고 데이터를 수집한 후 CNN (Convolutional Neural Network)을 활용해 선수들의 경기력 평가를 예측하는 모델을 제시함.
- • H. Y. Ting은 마이크로소프트 키넥트를 이용해 2D 스켈레톤 데이터를 얻은 후 DTW를 이용해 전문가와 일반인의 스윙을 비교하는 방법을 제안함.
◇ 그러나 이러한 연구들은 실력 차이보다는 배드민턴 스윙 구분을 목적으로 하는 경우가 대다수이며, 많은 데이터 수를 요구하고 전문적인 장비를 요구한다는 점을 가지고 있다.
- 특허조사 및 특허 전략 분석
- 기술 로드맵
◇ Python을 이용한 분석 알고리즘 개발
◇ Django를 이용한 분석 연산 서버 구축
◇ Swift를 이용한 iOS, WatchOS 어플리케이션 개발
시장상황에 대한 분석
- 경쟁제품 조사 비교
◇ Clutch
- • 배드민턴과 테니스에서 AI를 활용해 경기 전반에 대한 분석을 제공하는 어플리케이션.
- • 필요한 장비가 휴대폰 카메라와 삼각대 두개이므로 장비적인 제약이 적다.
- • 분석을 위해 경기 전체를 촬영해야 하기 때문에 시간적 제약이 크다.
- • 배드민턴 대회와 같은 구도(코트가 전부 화면에 잡히도록 높이 최소 3m 요구)로 촬영을 진행해야 하기 때문에 공간적 제약이 크다.
- • 경기 전체를 촬영한 이후 분석에 영상의 길이 수준의 시간이 소요되고 분석이 불가능하다는 정보도 경기가 끝난 이후에 알 수 있기 때문에 불편함이 존재함.
- • 분석 기능을 사용하기 위해서 인 앱 결제를 필요함.
◇ SwingVision
- • 테니스에서 AI를 활용해 촬영한 경기를 실시간으로 분석해 편집된 경기 영상과 샷 피드백을 제공하는 어플리케이션
- • 필요한 장비가 휴대폰 카메라와 삼각대 두개이지만 외부에서 경기를 촬영할 경우 회사에서 판매하는 촬영 도구를 구매하지 않으면 분석 결과가 부정확하게 나올 수 있기 때문에 장비적인 제약이 크다.
- • 분석을 위해 경기 전체를 촬영해야 하기 때문에 시간적 제약이 크다.
- • 코트가 전부 화면에 잡히도록 충분히 거리와 높이가 확보되어야하기 때문에 공간적인 제약이 크다.
- • 경기 전체를 촬영하고 나면 바로 분석 결과와 특정 부분만 잘라서 보거나, 내가 원하는 장면을 검색할 수 있는 기능을 제공하기 때문에 편의성이 높다.
- • 스윙에 대한 분석 이외의 기능(경기 편집 하이라이트, 영상 화질 HD...)은 인앱 결제를 요구함.
- 마케팅 전략 제시
◇ 10대 ~ 20대를 중심으로 마케팅을 진행해 초기 사용자를 확보한다.
- • 2022년 한국갤럽에서 조사해 발표한 연령대별 스마트폰 사용 브랜드를 보면 iOS가 유의미한 점유율을 보이는 연령대는 18~29세임을 확인할 수 있다. 릴리즈 1.0 버전은 iOS와 WatchOS로만 개발되기 때문에 상대적으로 iOS 점유율이 높은 연령대인 10대와 20대를 중심으로 마케팅을 진행한다.
◇ 학교 동아리나 연합 동호회를 통해 홍보를 진행한다.
- • 주 사용자층으로 예측되는 20대 이하의 배드민턴 동호인들은 주로 학교 동아리나 연합 동호회에서 활동하고 30대 이상의 동호인들은 주로 지역 동호회를 통해 활동하는 경향이 있다. 따라서 동아리나 동호회를 통해 초기 홍보를 진행하는 것을 목표로 한다.
◇ 사용 시나리오를 두 가지로 나누어서 각각에 맞는 마케팅을 진행한다.
- • 경기 기록을 일기 기능처럼 활용하려는 라이트 유저의 시나리오와 자신의 경기를 전반적으로 평가받기 원하는 헤비 유저의 시나리오 두 가지로 나누어서 초심자가 많은 동호회에서는 라이트 유저 시나리오를 중심으로, 경기를 많이 하거나 대회를 나가는 것을 목표로 하는 동호회에서는 헤비 유저의 시나리오를 중심으로 홍보를 진행하여 양쪽의 유저 층을 한번에 잡는 것을 목표로 한다.
개발과제의 기대효과
기술적 기대효과
◇ 기존 대비 접근성이 높은 장비를 활용해 모션 데이터를 활용하는 방법을 제안한다. ◇ 배드민턴 실력 분석에서 적은 데이터를 통해서 높은 정확도를 제공할 수 있는 모델을 제안한다.
경제적, 사회적 기대 및 파급효과
◇ 배드민턴을 가볍게 즐기는 사람들에게 자신의 운동을 기록할 수 있는 플랫폼을 제공함으로서 배드민턴에 대한 흥미를 유지할 수 있도록 함. ◇ 배드민턴 실력을 기르고자 하는 사람들에게 기존 대비 접근성이 높은 방법을 제공함.
기술개발 일정 및 추진체계
개발 일정
구성원 및 추진체계
◇ 강송모 : 배드민턴 스윙 & 경기 분석 알고리즘 설계 및 구현 ◇ 신도영 : MoveNet 활용 영상 데이터 분석 & 운동 데이터 분석 서버 구축 ◇ 임재욱 : 프로젝트 기획, 발표 & 한국정보과학회 제출용 논문 작성 ◇ 최지웅 : 데이터 수집용 & 배포용 iOS, WatchOS 어플리케이션 개발
설계
설계사양
제품의 요구사항
설계 사양
데이터 수집 : iOS 디바이스, watchOS 디바이스
API 서버 : django 기반 구현 Amazon EC2 서버
스윙 분류 및 분석 : scikit-learn, MoveNet, pandas
데이터 저장 : Amazon S3 Storage, Amazon RDS
개념설계안
스윙 분석 기능
사용자의 하이클리어 스윙 과정 영상과 IMU 데이터를 수집 수집한 데이터를 분석해 정량적인 점수로 변환 사용자의 스윙 장단점을 분석해 피드백을 제공 기록되어 있는 스윙들의 점수 추이를 그래프로 표현해 사용자의 실력 변화를 시각화
경기 기록 기능
사용자의 배드민턴 경기 동안의 IMU 데이터와 운동 데이터를 수집 수집한 데이터를 분석해 스윙이 일어난 시점과 스윙의 종류를 구분하고 평가 경기가 끝나면 운동 데이터, 스윙 횟수 등을 시각적으로 표현
요약 페이지
사용자의 한 달 동안의 운동 기록을 시각적으로 표시 사용자의 운동 기록을 업적으로 변환해 운동에 대한 지속적인 동기 부여
상세설계 내용
데이터베이스 ERD
유즈케이스 다이어그램
● 계정 관련 기능
- • 회원가입 및 로그인
- 사용자가 소셜 계정으로 서비스에 로그인하면서 시작된다.
- 시스템은 Firebase로부터 발급된 토큰을 식별 및 검증하고, 토큰이 일치하면 회원가입 또는 로그인 페이지로 넘어간다. 사용자가 처음 로그인했다면 본인의 기본정보를 입력하고, 이후 앱의 기능을 사용할 수 있다.
- • 회원정보 수정 및 탈퇴
- 사용자가 앱의 '마이 페이지' 탭을 열면서 시작된다. 시스템은 사용자의 기본 정보를 표시하고, 다양한 기능을 제공한다. 시스템은 사용자가 다음 사항 중 하나를 선택하도록 한다.
- • 로그아웃
- • 기본 정보 수정
- • 캐시 삭제
- • 데이터 삭제
- • 회원 탈퇴
- 사용자가 앱의 '마이 페이지' 탭을 열면서 시작된다. 시스템은 사용자의 기본 정보를 표시하고, 다양한 기능을 제공한다. 시스템은 사용자가 다음 사항 중 하나를 선택하도록 한다.
● 요약
- • 최근 경기 요약 조회
- 사용자가 앱을 열어 요약 탭을 열면서 시작된다. 시스템은 사용자의 최근 한 달간의 경기를 분석하여 다음 사항에 대한 통계 정보를 그래프와 함께 보여준다.
- • 경기 수
- • 경기 시간
- • 스윙 종류와 횟수
- • 승률
- • 이동 거리
- 사용자가 앱을 열어 요약 탭을 열면서 시작된다. 시스템은 사용자의 최근 한 달간의 경기를 분석하여 다음 사항에 대한 통계 정보를 그래프와 함께 보여준다.
- • 업적 달성 및 조회
- 요약 탭에서 최근 달성 업적과 전체 업적이 표시된다. 사용자가 경기를 기록하면 시스템은 경기 통계를 바탕으로 사용자의 업적 달성 정보를 자동으로 갱신한다. 사용자는 업적의 달성 여부와 달성 날짜를 확인할 수 있다.
● 스윙 분석
- • 스윙 업로드 및 삭제
- 사용자가 스윙 분석 탭의 스윙 업로드를 눌러 스윙을 기록할 수 있다. 사용자는 절차에 따라 스마트폰과 스마트 워치에서 스윙 분석 기능을 수행하고, 서버에 스윙을 업로드 할 수 있다.
- Alternate flow : 업로드 된 스윙이 분석 불가능할 경우 시스템은 사용자에게 오류 내용을 표시
- 사용자가 업로드한 스윙 분석 결과를 삭제할 수 있다.
- • 스윙 결과 및 피드백 확인
- 사용자가 스윙 분석 탭의 스윙을 선택하여 결과를 확인할 수 있다. 시스템은 사용자에게 스윙구간(임팩트 전, 임팩트 시점, 임팩트 후)별 점수와 장단점을 그래프와 함께 표시하고, 영상과 자세에 대한 장단점을 표시한다.
● 경기 기록
- • 경기 업로드 및 삭제
- 사용자가 스마트 워치에서 경기 기록을 선택하면서 시작된다. 시스템은 사용자의 손목 움직임을 기록하면서 경기 중의 운동 정보, 점수판 등을 표시하고, 사용자는 경기 중 그것을 제어할 수 있다. 경기가 종료되면 사용자는 기록 종료를 선택하여 서버에 경기를 업로드한다.
- Alternate flow : 스마트 워치가 인터넷에 연결되어 있지 않으면 기기 내부에 경기 기록을 임시저장하고, 추후 인터넷에 연결되면 자동으로 업로드한다.사용자가 업로드한 경기 분석 결과를 삭제할 수 있다.
- • 경기 분석 결과 확인
- 사용자가 경기 분석 탭의 경기를 선택하여 결과를 확인할 수 있다. 시스템은 사용자에게 운동정보와 경기 통계, 스윙 종류별 점수와 횟수 등을 그래프와 함께 표시한다.
클래스 다이어그램
- iOS
- ModelData
- 앱 내의 전체 데이터를 가지고, 변경 사항을 UI에 즉각 반영한다.
- AuthenticationManager
- 회원가입과 로그인, 로그아웃 등의 기능을 담당한다. APIManager의 기능들을 사용하여 서버와 통신하고, 받아온 사용자 데이터를 ModelData에 전달한다.
- SwingRecordManagerPhone
- '스윙 분석' 기능을 위한 두 개의 클래스 중 하나이다. WCSession을 이용하여 watchOS와 상호작용하여 녹화 상태를 통제하고, 녹화중인 화면을 watchOS로 전송하며, 데이터를 DataManager를 사용하여 저장하거나 불러오고, APIManager를 이용하여 서버에 업로드한다.
- APIManager
- 실제 서버와 상호작용하는 클래스이다. 모든 서버 관련 기능은 이 클래스를 통해 이루어진다.
- DataManager
- 파일 처리를 위한 클래스이다. 파일 인코딩과 디코딩은 이 클래스를 통해 이루어진다.
- watchOS
- WorkoutManager
- '경기 기록' 기능을 위한 클래스이다. HKWorkoutSession을 이용하여 사용자의 운동 상태를 모니터링하고 기록하며, CMMotionManager클래스를 이용하여 사용자의 손목 움직임을 기록한다.
- SwingRecordManagerWatch
- '스윙 분석' 기능을 위한 두 개의 클래스 중 하나이다. iOS와 제어 신호를 주고받으며 손목 움직임을 기록하고, 녹화된 손목 움직임을 iOS로 전송한다. iOS로부터 녹화되고 있는 영상 스냅샷을 전송받아 화면에 표시한다.
- WCSessionDelegate
- 실제 iOS와 상호작용하는 위임자 클래스이다. iOS로부터 받은 신호를 처리하고, 연결 상태를 체크한다.
- APIManager
- 실제 서버와 상호작용하는 클래스이다. 모든 서버 관련 기능은 이 클래스를 통해 이루어진다.
- DataManager
- 파일 처리를 위한 클래스이다. 파일 인코딩과 디코딩은 이 클래스를 통해 이루어진다.
- django 서버
- APIView
- GET,POST와 같은 Method가 포함된 HTTP 요청을 처리하기 위한 Class Based View이다.
- PlayerInfo,AchievementList, PlayerAchievementList
- 각각 계정, 업적, 유저 개개인 별 업적 관련 유즈케이스를 구현하기 위한 클래스이다.
- LimitOffsetPagination
- GET 요청 시 제시된 limit, offsetparameter를 인자로 받아 그에 따른 Objects들을 반환하는 클래스이다. 예를 들어<ServerURL>?limit=3&offset=2일 때, object(2)부터 3개를 반환한다.
- PlayerMotionList
- 영상 데이터 분석 & IMU 데이터 분석을 통해 사용자의 스윙 실력을 점수화하고 피드백을 제공해주는 클래스이다. 영상 데이터 분석은 MoveNet 클래스의 progress_video()를, IMU 데이터 분석은 SwingAnalysis 클래스의 analysis() 메서드를 사용한다.
- MatchRecordList
- HTTP 요청에 따라 경기 데이터를 저장하거나 조회하는 클래스이다. 이 때, 경기데이터에IMU 데이터가 포함되었다면 SwingClassification 클래스의 classification()와 makeAnalysisData() 메서드를 통해 데이터를 분석하여 사용자에게 제공한다.
- SwingClassification
- IMU데이터의 Peak를 찾아 특정 스윙 구간을 추출하고 이를 KNN 알고리즘을 통해 분류한 후,analysis() 메서드를 통해 스윙에 대한 점수를 매긴다. SwingAnaylsis가 선언되어야 올바르게 기능할 수 있다.
- SwingAnalysis
- 마찬가지로 IMU데이터의 Peak를 기준으로 스윙 구간을 추출한 후, 모범 데이터와의 편차를 통해 스윙에 대한 점수를 매긴다.
- MoveNet
- 영상 데이터를 프레임 별 배열로전처리한 후, 이를 movenet을 통해 분석하여 17개의 관절 좌표를 추출한다. 관절 좌표들을 활용하여 스윙에 중요한 요소들을 계산하고 이를 제공한다.
상태 다이어그램
- SwingRecordManagerPhone
녹화 시작 신호를 받거나 직접 녹화를 시작하면 watchOS로 녹화 시작 신호를 보내며 녹화를 시작한다. 영상을 저장한 이후, recieving 상태가 되면 watchOS로부터 IMU데이터를 수신받고, 영상과 함께 서버에 업로드한다.
- SwingRecordManagerWatch
녹화 시작 신호를 받거나 직접 녹화를 시작하면 iOS로 녹화 시작 신호를 보내며 녹화를 시작한다. 녹화가 종료되면 iOS로 IMU데이터를 전송한다.
- WorkoutManager
경기 기록 중 기록을 일시정지할 수 있다. 운동 정보와 경기 정보를 저장하면 IMU 데이터를 메타데이터와 함께 서버에 '지연 업로드' 한다
지연 업로드
IMU 데이터와 메타데이터 파일을 우선 내부 스토리지에 저장하고, 서버에 업로드를 시도한다. 서버에 업로드하였다면 이후 남은 파일을 삭제하고, 업로드하지 못했다면 내부에 저장하고 상태를 종료한다. 이후 자동으로 서버와의 연결을 체크하여 업로드 가능하다면 위 작업을 다시 시도한다.
최종 시퀀스도
- 스윙 분석 시퀀스
iOS 앱과 watchOS앱에서 각각 스윙 분석을 선택하면서 시작된다.
- 애플워치에서 스윙 분석 열기
- 사용자는 iOS 앱에서 '애플워치에서 콕콕 앱 열기'를 선택하여 watchOS에서 원격으로 스윙 분석을 실행할 수 있다.
- 스윙 녹화
- iOS와 watchOS에서 3-way-handshake를 수행하면서 시작된다. 어떤 기기에서든 시작하거나 종료할 수 있다. 녹화가 시작되면 iOS는 영상 녹화를, watchOS는 IMU 데이터 수집을 시작한다.
- 녹화 중에는 사용자가 카메라의 영상을 확인할 수 있도록 watchOS로 영상 스냅샷이 전송된다.
- 녹화를 종료하면 watchOS에서 iOS로 IMU 데이터를 전송하고, iOS는 영상과 함께 서버로 전송할 준비를 한다.
- 스윙 업로드 및 처리
- 사용자는 촬영된 영상을 확인하고 서버로 업로드하여 스윙 분석을 요청한다. 업로드된 영상 데이터, IMU 데이터를 S3 스토리지에 저장한다. 이후 스토리지에 저장된 위치의 URL을 추출한다. 영상 데이터는 MoveNet을 활용하여 분석하고, IMU 데이터는 SwingAnalysis 알고리즘을 통해 분석한다. 스윙 분석 결과가 산출되면 이를 MySQL에 저장한다. 저장된 데이터를 조회하여 서버에 전송한다. 서버는 이를 IOS에 전송한다.
- 이후 iOS는 사용자에게 스윙 분석 결과를 표시한다.
- 경기 기록 시퀀스
- 사용자 정보 받아오기
- 최초 1회에 한해 iOS로부터 사용자 정보를 받아온다. 이후 작업은 iOS 없이 독립적으로 수행 가능하다.
- 경기 기록
- 사용자는 watchOS에서 경기 기록을 선택하여 기록을 준비한다. 최초 1회에 한해 사용자로부터 운동정보 수집을 위한 동의를 받는다.
- 경기 기록 중에는 운동 세션을 설정하여 사용자의 운동 정보와 손목 움직임을 기록한다.
- 경기가 종료되면 메타데이터와 IMU데이터를 내부에 임시 저장한다.
- 경기 업로드 및 처리
- 경기가 종료되면 watchOS가 서버에 파일을 업로드한다. 이때 iOS에서 받아온 사용자 정보가 메타데이터에 포함된다.
- 업로드에 성공하면 임시 저장된 파일들을 지우고 기록을 완료한다.
- 업로드에 실패하면 파일을 반영구적으로 저장하고, 이후 인터넷이 연결되면 업로드한다.
- 업로드에 성공했을 때, IMU데이터를 S3 storage에 저장한다. 저장된 위치에 대한 URL를 추출하여 서버에 임시 저장한다.
- IMU데이터를 SwingClassification 알고리즘을 수행하여 각 스윙 별 종류와 점수를 산출한다. 산출된 데이터와 메타데이터를 MySQL에 저장한다.
- 저장된 데이터를 조회하여 서버에 전송하고, 서버는 이를 받아 iOS에 전송한다.
- 이후 iOS는 사용자에게 경기의 분석 결과를 표시한다.
결과 및 평가
완료 작품의 소개
프로토타입 사진 혹은 작동 장면
한국정보과학회 논문
관련사업비 내역서
완료작품의 평가
향후계획
◇ 추가 데이터 수집 후 알고리즘의 보완
◇ 분석 영상 좌표 3D 환산
◇ 서버 모듈화 및 컨테이너 활용
◇ 부가 기능 추가
비고
참고문헌 및 참고사이트
[1] J Lin,CW Chang, TU Ik, YC Tseng, "Sensor-based badminton stroke classificationby machine learning methods." 2020 ICPAI. IEEE, 2020.
[2] Z Chu, MLi, "Image recognition of badminton swing motion based on single inertialsensor." Journal of Sensors 2021 : 1-12, 2021.
[3] I Ghosh,SR Ramamurthy, A Chakma, N Roy, "Decoach: Deep learning-based coaching forbadminton player assessment", Pervasive and Mobile Computing 83, 2022
[4] HY Ting,H Yong, KS Sim, and FS Abas. "Kinect-based badminton movement recognitionand analysis system." International Journal of Computer Science in Sport14.2: 25-41, 2015.
[5] 정상훈, "배드민턴 하이클리어 동작에 대한 여자 중학교 학생선수와 일반학생 간 운동역학적 비교 분석", 2020.
[6] 이재환, 권태용, 김용운, "배드민턴 하이클리어 동작 시 숙련도에 따른 상체 및상지 움직임의 역학적 비교 분석", 2020.
[7] 김창범, 유재광 "여자중학생 배드민턴 하이클리어 동작의 운동학적 분석", 2002.
소프트웨어 프로그램 소스
1. iOS & watchOS 어플리케이션 소스 https://github.com/wldnd9904/Cokcok
2. django & 분석 알고리즘 소스 https://github.com/straipe/cokcok
3. '스마트기기를 활용한 배드민턴 스윙 분석' 논문 코어 코드 https://github.com/rkdthdah/cokcok_data_core
4. 프로젝트 데모 페이지 https://wldnd9904.github.io/Cokcok/