Skip to content

πŸ€ΈπŸ»β€β™‚οΈνƒœκΆŒλ„ pose-detection λ™μž‘ ν•™μŠ΅ AI μ›Ήμ„œλΉ„μŠ€

Notifications You must be signed in to change notification settings

TTuk-TTak/BlackBelt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation




μ†Œκ°œ

μš°λ¦¬λ¬Έν™” νƒœκΆŒλ„λ₯Ό 세계에 ν™λ³΄ν•˜κΈ° μœ„ν•œ μ›Ή 기반 AI μ²΄ν—˜ν˜• μ½˜ν…μΈ  μ„œλΉ„μŠ€, Black Belt: Master of Taekwondo

μ§‘μ—μ„œ 쉽고 재미있게 νƒœκΆŒλ„λ₯Ό ν•™μŠ΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
AI pose detection 기술이 μ˜¬λ°”λ₯Έ νƒœκΆŒλ„ λ™μž‘μ„ ν•™μŠ΅ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
μΆ©λΆ„ν•œ μ—°μŠ΅ ν›„μ—λŠ” ꡭ기원과 λ™μΌν•œ λ°©μ‹μœΌλ‘œ 심사λ₯Ό λ°›μ•„ λ³΄μ„Έμš”. 심사에 ν†΅κ³Όν•˜λ©΄ 단증을 νšλ“ν•©λ‹ˆλ‹€.
겨루기 κΈ°λŠ₯을 톡해 μƒλŒ€μ™€ 1:1둜 배틀을 μ§„ν–‰ν•˜μ—¬ 승패λ₯Ό 가릴 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€

νƒœκΆŒλ„ 짱이 되고 μ‹Άλ‹€λ©΄ μ§€κΈˆλΆ€ν„° BlackBelt둜 μˆ˜λ ¨μ„ μ‹œμž‘ν•˜μ„Έμš”!


λͺ©μ°¨

1. κ°œμš”

2. μ£Όμš” κΈ°λŠ₯

3. κΈ°μˆ μŠ€νƒ

​ 3-1. Front-end

​ 3-2. Back-end

​ 3-3. AI

4. λ©€λ²„μ†Œκ°œ


κ°œμš”

  • ν”„λ‘œμ νŠΈλͺ…: 검은띠 νœ˜λ‚ λ¦¬λ©° [Black Belt: Master of Taekwondo]
  • μ„œλΉ„μŠ€ νŠΉμ§•: AI λͺ¨μ…˜μΈμ‹μ„ ν†΅ν•œ νƒœκΆŒλ„ ν•™μŠ΅ web service
  • μ£Όμš” κΈ°λŠ₯
    • νƒœκΆŒλ„ λ™μž‘ ν•™μŠ΅ λͺ¨λΈ 기반 νƒœκΆŒλ„ μ—°μŠ΅ 및 심사
    • WebSocket을 ν†΅ν•œ 겨루기 맀칭
    • WebRtcκΈ°μˆ μ„ ν™œμš©ν•œ 겨루기 ν™”λ©΄
  • μ£Όμš” 기술
    • react 17.0.2
    • recoil 0.6.1
    • sockjs-client 1.6.0
    • styled-components 5.3.3
    • axios 0.26.1
    • teachablemachine-pose 0.8.6
    • spring boot 2.6.4
    • maven 3.8.4
    • nodejs 16.13.1
    • openjdk 11
    • ubuntu 20.04 LTS
    • mysql 8.0.28
    • docker + jenkins
  • μ°Έμ‘° λ¦¬μ†ŒμŠ€
    • openvidu - webRtc
  • 배포 ν™˜κ²½

μ£Όμš” κΈ°λŠ₯

πŸ₯‹ λ²ˆμ—­ κΈ°λŠ₯ 제곡

λ²ˆμ—­

  • κΈ€λ‘œλ²Œ μ„œλΉ„μŠ€λ₯Ό 지ν–₯ν•˜λŠ” 저희 λΈ”λž™λ²¨νŠΈλŠ”, λ²ˆμ—­ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€
  • λ„€λΉ„κ²Œμ΄μ…˜λ°”μ—μ„œ μ–Έμ œλ“ μ§€ μ›ν•˜λŠ” μ–Έμ–΄λ‘œ νŽΈν•˜κ²Œ 바꾸어보싀 수 μžˆμŠ΅λ‹ˆλ‹€

πŸ₯‹ λ©”μΈνŽ˜μ΄μ§€

λ©”μΈνŽ˜μ΄μ§€

  • μ—°μŠ΅λͺ¨λ“œ, 심사λͺ¨λ“œ, 겨루기둜 λ‚˜λ‰˜μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€
  • νƒœκΆŒλ„ μ˜μƒμ„ 배경으둜 두어 μ›…μž₯함을 λ”ν–ˆμŠ΅λ‹ˆλ‹€

πŸ₯‹ μ—°μŠ΅λͺ¨λ“œ

1. κΈ°λ³Έλ™μž‘

κΈ°λ³Έλ™μž‘

  • νƒœκΆŒλ„μ˜ 7가지 κΈ°λ³Έλ™μž‘λ“€μ„ ν•™μŠ΅ν•©λ‹ˆλ‹€
  • λ ˆλ²¨μ— 따라 μŠ€ν…Œμ΄μ§€μ˜ 잠금이 ν•΄μ œλ©λ‹ˆλ‹€
  • ν•΄λ‹Ή μŠ€ν…Œμ΄μ§€λ₯Ό 클리어 ν•˜λ©΄ 정확도에 따라 별을 1κ°œλΆ€ν„° 3κ°œκΉŒμ§€ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€
  • λ™μž‘ μΉ΄λ“œ μœ„μ— 마우슀λ₯Ό 올렀 λ™μž‘μ— λŒ€ν•œ κ°„λ‹¨ν•œ μ„€λͺ…을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€
  • μžμ„Έν•œ μ„€λͺ…은, μΉ΄λ“œλ₯Ό ν΄λ¦­μ‹œ μ—°μŠ΅ ν™”λ©΄μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€

2. μ—°κ²°λ™μž‘ & ν’ˆμƒˆ

μ—°κ²°λ™μž‘

  • ν•˜λ‚˜μ˜ ν’ˆμƒˆλ₯Ό 4λ‹¨λ½μœΌλ‘œ λ‚˜λˆ„μ–΄ μ—°μŠ΅ν•  수 μžˆλ„λ‘ μ—°κ²°λ™μž‘ μ½”λ„ˆλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€
  • μ—°κ²°λ™μž‘μ„ μ •ν™•νžˆ 읡힌 ν›„ ν’ˆμƒˆλ₯Ό μ—°μŠ΅ν•΄λ³΄μ„Έμš”!
  • μΉ΄λ“œλ₯Ό 눌러 μ—°μŠ΅ μŠ€ν…Œμ΄μ§€λ‘œ μž…μž₯ν•˜λ©΄, 상단에 λ™μž‘ μˆœμ„œκ°€ λͺ…μ‹œλ©λ‹ˆλ‹€
  • λͺ…μ‹œλœ λ™μž‘μ„ μ •ν™•ν•˜κ²Œ μ·¨ν•˜λ©΄ λ‹€μŒ λ™μž‘μœΌλ‘œ λ„˜μ–΄κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€

πŸ₯‹ 겨루기

Picture1 2

  • 겨루기 일반λͺ¨λ“œμ—μ„œλŠ” μ›ν•˜λŠ” μ‚¬μš©μžλ₯Ό 지정해 겨루어볼 수 μžˆμŠ΅λ‹ˆλ‹€

  • μƒλŒ€μ˜ λ‹‰λ„€μž„μ„ κ²€μƒ‰ν•˜κ³  겨루기 신청을 λ³΄λ‚΄λ³΄μ„Έμš”!

  • 단, μƒλŒ€κ°€ λ‹€λ₯Έ μ‚¬λžŒκ³Ό κ²¨λ£¨κΈ°μ€‘μ΄κ±°λ‚˜ λ‘œκ·Έμ•„μ›ƒμ΄κ±°λ‚˜ ν˜Ήμ€ 심사쀑인 경우, 겨루기 신청을 보낼 수 μ—†μŠ΅λ‹ˆλ‹€

  • μœ μ €μ˜ μƒνƒœλŠ” λ‹‰λ„€μž„ 검색을 ν•˜λ©΄ 이름 λ°”λ‘œ μ•„λž˜μ— λ‚˜νƒ€λ‚©λ‹ˆλ‹€

겨루기신청

  • μƒλŒ€κ°€ 겨루기 신청을 μˆ˜λ½ν•˜λ©΄, νŽ˜μ΄μ§€μ— μƒλŒ€μ˜ 정보가 λ‚˜νƒ€λ‚˜κ³  겨루기 μ‹œμž‘ λ²„νŠΌμ΄ ν™œμ„±ν™”λ©λ‹ˆλ‹€
  • 겨루기 μ‹œμž‘ λ²„νŠΌμ„ 눌러 겨루기λ₯Ό μ‹œμž‘ν•΄λ΄…μ‹œλ‹€!

겨루기배틀

  • μƒλŒ€λ°©μ— λŒ€ν•œ 예의λ₯Ό κ°–μΆ”κ³  νƒœκΆŒλ„ κΈ°λ³Έ μ€€λΉ„λ™μž‘μ„ μ·¨ν•˜λ©΄, 인곡지λŠ₯이 이λ₯Ό μΈμ‹ν•˜κ³  겨루기가 μ‹œμž‘λ©λ‹ˆλ‹€
  • λ°©μ–΄ λ™μž‘μ„ μ„±κ³΅ν•˜λ©΄ 상단에 λ…Έλž€μƒ‰ 방패 이λͺ¨ν‹°μ½˜μ΄ λ‚˜νƒ€λ‚˜λ©°, 곡격을 μ„±κ³΅ν•˜λ©΄ μƒλŒ€μ—κ²Œ 데미지 μ΄νŽ™νŠΈκ°€ λ“€μ–΄κ°‘λ‹ˆλ‹€
  • 30초 λ™μ•ˆ μƒλŒ€μ˜ 곡격을 λ§‰κ±°λ‚˜, 곡격을 ν•˜λ©΄μ„œ μ—΄μ‹¬νžˆ κ²¨λ£¨μ–΄λ΄…μ‹œλ‹€!

πŸ₯‹ λ§ˆμ΄νŽ˜μ΄μ§€

λ§ˆμ΄νŽ˜μ΄μ§€

  • λ‚΄ 정보λ₯Ό ν•œλˆˆμ— 확인할 수 μžˆλŠ” λ§ˆμ΄νŽ˜μ΄μ§€μž…λ‹ˆλ‹€
  • μ§€κΈˆκΉŒμ§€ νšλ“ν•œ 띠 및 단증을 확인할 수 있으며 겨루기와 κ΄€λ ¨λœ 전적을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€
  • ν”„λ‘œν•„μ‚¬μ§„ λ³€κ²½ 및 λ‹‰λ„€μž„ 변경도 κ°€λŠ₯ν•©λ‹ˆλ‹€

기술 μŠ€νƒ

μ•„ν‚€ν…μ²˜ ꡬ성도


🎨 FrontEnd

  • Reactλ₯Ό μ΄μš©ν•΄ μ›Ή νŽ˜μ΄μ§€λ₯Ό κ΅¬ν˜„ν•˜κ³  Recoil 및 React Queryλ₯Ό μ΄μš©ν•΄ μƒνƒœκ΄€λ¦¬λ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€
  • Styled Componentsλ₯Ό μ΄μš©ν•΄ cssλ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€
  • 겨루기λ₯Ό μœ„ν•œ μ›Ήμ†ŒμΌ“μ€ SockJSλ₯Ό μ΄μš©ν–ˆμŠ΅λ‹ˆλ‹€
  • Atomic λ°©μ‹μœΌλ‘œ κ°œλ°œμ„ μ§„ν–‰ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈμ˜ μž¬μ‚¬μš©μ„±μ„ 높이고 νŒ€μ›κ³Ό λ””μžμΈ 톡일성을 λ§žμ·„μŠ΅λ‹ˆλ‹€
β”œβ”€β”€ _foundation
β”‚Β Β  β”œβ”€β”€ colors
β”‚Β Β  β”œβ”€β”€ icons
β”‚Β Β  β”œβ”€β”€ translation
β”‚Β Β  └── typography
β”œβ”€β”€ api
β”œβ”€β”€ components
β”‚Β Β  β”œβ”€β”€ atoms
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Buttons
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── GoogleButton
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Evaluation
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Icons
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Texts
β”‚Β Β  β”‚Β Β  └── Videos
β”‚Β Β  β”œβ”€β”€ molecules
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Carousel
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ DialogExtension
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Gyeorugi
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Layout
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Navbar
β”‚Β Β  β”‚Β Β  └── Stream
β”‚Β Β  β”œβ”€β”€ organisms
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ChangeNickModal
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ LoginModal
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ PushAlarm
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ SignupModal
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ TaekwondoModal
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Timer
β”‚Β Β  β”‚Β Β  └── VideoRoom
β”‚Β Β  └── templates
β”œβ”€β”€ hooks
β”œβ”€β”€ pages
β”‚Β Β  β”œβ”€β”€ Gyeorugi
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ GyeorugiStage
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── models
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Normal
β”‚Β Β  β”‚Β Β  └── Rank
β”‚Β Β  β”œβ”€β”€ MainPage
β”‚Β Β  β”‚Β Β  └── SlideInfo
β”‚Β Β  β”œβ”€β”€ Mypage
β”‚Β Β  β”œβ”€β”€ Practice
β”‚Β Β  └── Promotion
β”œβ”€β”€ recoils
β”œβ”€β”€ style
└── utils

πŸ“Š BackEnd

Web Socket

  • Spring Frameworkμ—μ„œ 더 μ•ˆμ •μ μΈ SockJS 라이브러리λ₯Ό μ„ νƒν•˜μ—¬ μ›Ήμ†ŒμΌ“ 톡신을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€
  • ν†΅μ‹ κ·œμ•½μ„ μœ„ν•΄ λ©”μ‹œμ§• ν”„λ‘œν† μ½œ STOMPλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€

μ†ŒμΌ“λ©”μ‹œμ§€ν”„λ‘œν† μ½œ2.png

  • λ™μž‘ 방식

    • httpβ†’ws 톡신 헀더 μš”μ²­μœΌλ‘œ ν”„λ‘œν† μ½œ upgrade

    μ›Ήμ†ŒμΌ“μ„œλ²„μ„€μ •.2png.png

    • ServerμΈ‘ endpoiont μ„€μ •
    • Client μΈ‘ 지정 endpoint둜 socket 객체생성
    • Server μΈ‘ μˆ˜μ‹ ν•œ 데이터 μž¬λ°œν–‰ν•˜λŠ” λ©”μ„œλ“œ μž‘μ„±
    • Client μ†ŒμΌ“λ°μ΄ν„° send, receive
  • WebSocket API

κΈ°λŠ₯ ν”„λ‘œν† μ½œ λ™μž‘ api λ©”μ‹œμ§€ Type
κ°œμΈμ„Έμ…˜ 생성 ws sub api/que/user LOGIN
겨루기 μ‹ μ²­ ws pub api/que/user/{게슀트 id} INVITE
μ‹ μ²­ 수락/거절 ws pub api/que/user/{호슀트 id} ACCEPT/REFUSE
λŒ€κΈ°λ°© μž…μž₯ ws pub api/que/user/{호슀트 id} ENTER
  • μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨ (겨루기-일반λͺ¨λ“œ)

    μ‹œν€€μŠ€λ‹€μ΄μ–΄κ·Έλž¨2.png


Server

  1. μ„œλ²„ 접속 정보

server ip : j6a506.p.ssafy.io
client id : ubuntu
client pw : pem파일둜 λŒ€μ²΄ (MMμ²¨λΆ€νŒŒμΌ 확인, νŒ€μ› 이외에 곡유 κΈˆμ§€)

  1. 포트 정보
포트 번호 이름
22 SSH
53 DNS
80 Redirected to Port 443 by nginx (docker)
443 Redirected to Port 3000 by nginx (docker)
3000 Frontend (Docker)
5050 MySQL (Docker)
8000 Backend (Docker)
8080 Jenkins Controller Web UI
8447 openvidu server https (Docker)
8448 openvidu server http (Docker)
8888 kurento media server (Docker)
8888 jupyter notebook (λΉ„ν™œμ„±ν™”)
50000 Jenkins TCP Agent Listener Port (Docker)

  1. μ„œλ²„ 섀계 상세 λ‚΄μš©

πŸ’» AI

κ΅¬ν˜„ν•œ λͺ¨λΈ

  • κΈ°λ³Έλ™μž‘ - 13가지 κΈ°λ³Έλ™μž‘μ„ νŒλ‹¨ν•΄μ£ΌλŠ” 인곡지λŠ₯ λͺ¨λΈ

  • μ—°μ†λ™μž‘/ν’ˆμƒˆ - 1μž₯~8μž₯, κ³ λ €, κΈˆκ°• λ“± ν’ˆμƒˆλ³„ 4개의 κ΅¬κ°„μœΌλ‘œ λ‚˜λˆ μ„œ ν•΄λ‹Ή κ΅¬κ°„μ˜ λ™μž‘μ„ κ΅¬λΆ„ν•˜λŠ” 인곡지λŠ₯ λͺ¨λΈ

  • 겨루기 - 얼꡴막기, λͺΈν†΅μ§€λ₯΄κΈ°, 발차기 λ“±μ˜ λ™μž‘μ„ κ΅¬λΆ„ν•˜λŠ” 인곡지λŠ₯ λͺ¨λΈ

μ œμž‘ κ³Όμ •

aiml_1

  • μΈμ‹μ˜ 정확성을 높이기 μœ„ν•΄ Teachable Machine μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€
  • 각 λ™μž‘λ³„ 데이터λ₯Ό 직접 μˆ˜μ§‘ν•˜κ³  μ •μ œν•˜μ—¬ ν•™μŠ΅μ‹œμΌ°κ³ , 각 ν΄λž˜μŠ€κ°€ μ •ν™•ν•˜κ²Œ λ„μΆœλ˜λŠ”μ§€ κ²€μ¦ν–ˆμŠ΅λ‹ˆλ‹€
  • ν•™μŠ΅λœ λͺ¨λΈμ€ Frontend에 μ „λ‹¬ν•˜μ—¬ μ„œλΉ„μŠ€λ₯Ό μ™„μ„±ν–ˆμŠ΅λ‹ˆλ‹€

멀버 μ†Œκ°œ


μ—°μŠΉμ€
Frontend | Leader | Design


μ •μ§€μ˜
Frontend | Design


졜영운
AI

  • Figma λ””μžμΈ
  • κΈ°λ³Έ λ””μžμΈ μ»΄ν¬λ„ŒνŠΈ 생성
  • μ›Ήμ†ŒμΌ“ ν†΅μ‹ μœΌλ‘œ 겨루기 맀칭
  • Figma λ””μžμΈ
  • μΆ”κ°€μ˜ˆμ •
  • μΆ”κ°€μ˜ˆμ •
  • μΆ”κ°€μ˜ˆμ •
  • μΆ”κ°€μ˜ˆμ •
  • μΆ”κ°€μ˜ˆμ •


μ΄μ§€μš°
Backend | CI/CD


μž„μ˜νƒ
Backend


졜윀수
Backend

  • μ„œλ²„ 섀계 | μžλ™ λΉŒλ“œ&배포
  • DB 섀계 | ν”„λ‘œμ‹œμ € λ“± κΈ°μ΄ˆμž‘μ—…
  • 계정, WebRTC κ΄€λ ¨ API μž‘μ„±
  • μΆ”κ°€μ˜ˆμ •
  • μΆ”κ°€μ˜ˆμ •
  • μΆ”κ°€μ˜ˆμ •
  • DB & API 섀계
  • 겨루기 맀칭 μ‹œμŠ€ν…œ
  • μ›Ήμ†ŒμΌ“

About

πŸ€ΈπŸ»β€β™‚οΈνƒœκΆŒλ„ pose-detection λ™μž‘ ν•™μŠ΅ AI μ›Ήμ„œλΉ„μŠ€

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published