Hand Pose Detection
๋ชจ์ ๊ธฐ๋ฐ ๊ฒ์์ ๋ง๋ค๊ธฐ ์ํด์๋ ์น์บ ์ผ๋ก ๋ณด์ด๋ ์์ ํํ๋ฅผ ์ธ์ํ๋ ๋ชจ๋ธ์ด ํ์ํ๋ค. ๋ํ๊ต 3ํ๋ ๋ Object Detection์ ํ์ฉํ์ฌ ๋ง์คํฌ ์ฐฉ์ฉ ์ฌ๋ถ๋ฅผ ์ธ์ํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๊ณผ์ ๋ฅผ ํ๋ ๊ฒฝํ์ด ์์๊ธฐ์ ์ด๋ป๊ฒ ์์ํด์ผ ํ ์ง ๋ง๋งํ์ง ์์๋ค. ์ฌ๋ฌ Pose Detection ๋ชจ๋ธ ์ค '์น ๊ธฐ๋ฐ ๊ฒ์'์ ์ด๋ค ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ฒ ์ ํฉํ ์ง ํ ์คํธํด๋ณด๋ฉฐ, ์ต์ข ์ ์ผ๋ก Tensorflow.js์ Mediapipe Handpose ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค. ์ด ๋ชจ๋ธ์ ์ฑ๋ฅ์ด ์ข์, ์น ๋ธ๋ผ์ฐ์ ์์ ๋ฒ๋ฒ ์ผ ์ ์๊ฒ ๋ค๊ณ ์๊ฐํ๋ค. ์ฌ์ฉ์ ๊ฒฝํ์ ํค์น ์ ๋์ด๋ฉด, OpenPose ๋ชจ๋ธ์ Hand Detection๋ง ํ๋๋ก ์ ํํด ์ฌ์ฉํ๊ณ ์ ํ์๋ค. ๊ฒฐ๋ก ์ Mediapipe Handpose๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค. ์ฑ๋ฅ๋ฟ๋ง ์๋๋ผ ์น ๋ธ๋ผ์ฐ์ ์์ ๋งค์ฐ ์ ๊ตฌ๋ํ๊ธฐ ๋๋ฌธ์ด๋ค.
Mediapipe Handpose ๋ชจ๋ธ
Mediapipe๋ '๋ฉํฐ๋ชจ๋ฌ ๋จธ์ ๋ฌ๋ ํ์ดํ๋ผ์ธ'์ด๋ผ๊ณ ํ๋ค. ์ด๋ ๋ค์ํ(๋ฉํฐ) ์ ๋ ฅ ๋ฐ์ดํฐ(๋น๋์ค, ์ค๋์ค ๋ฑ)๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ฌ๋ฌ ๋ชจ๋ธ์ ์กฐํฉ(์์๋ธ)ํ ์ ์๋ ํ์ดํ๋ผ์ธ์ด๋ค. Mediapipe์ Handpose ๋ชจ๋ธ์ ์ ์ฉ์์ผ ์๊ฐํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
1. Multimodal
์์ ํฌ์ฆ๋ฅผ ์ถ์ ํ ๋๋ ๋น๋์ค ํ๋ ์(์น์บ ์ด๋ฏธ์ง)์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์์ ์์น์ ํฌ์ฆ๋ฅผ ์์ธกํ๋ค.
2. Machine Learning Pipeline
Handpose ๋ชจ๋ธ์ ์ด๊ธฐ BlazePalm ๋ชจ๋ธ๋ก ์ด๋ฏธ์ง ๋ด์ ์์ ๊ฒ์ถํ์ฌ bounding box๋ฅผ ์ฐพ๋๋ค. ์ดํ bounding box ๋ด์์ ์์ 21๊ฐ ๋๋๋งํฌ๋ฅผ ์์ธกํ๋ค. ์ด๋ ๊ฒ ์ปดํฌ๋ํธ๋ณ๋ก ๋ชจ๋ํํ์ฌ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ค.
์ ๊ตฌ์กฐ๋ก ์ด๋ฏธ ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Javascript ์ธ์ด๋ก ์ฆ์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค. ๐ซข ๋งค์ฐ ๋งค์ฐ ๋๋๋ค. ์ธ๋ถ์ ์ผ๋ก Detection, Tracking confidence, Model complexity๋ฅผ ์ต์ ์ผ๋ก ์ค์ ํ๋ ๋ถ๋ถ์ด ์์ง๋ง, ์ง์ ํ ์คํธํด๋ณด๋ฉฐ finetuning ํ๋ ์์ค์ ๊ทธ์น๋ค.
...
const hands = new Hands({locateFile: (file) => {
return `https://cdn.jsdelivr.net/npm/@mediapipe/hands/${file}`;
}});
hands.setOptions({
maxNumHands: 1,
modelComplexity: 1,
minDetectionConfidence: 0.9,
minTrackingConfidence: 0.7
});
...
Prototype
ํ์ฌ ํ๋กํ ํ์ ๋ชจ๋ธ์ ํด๋ผ์ด์ธํธ ๋ธ๋ผ์ฐ์ ์์ script๋ก Hand Pose๋ฅผ ์ธ์ํ๊ณ , ํ ํธ๋ฆฌ์ค ๋ธ๋ญ์ ์ด์ ๋ง๊ฒ ์ฎ๊ธฐ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ๋ํ๋ค. ์๋ฒ์์ ์ด๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ๋ก์ง์ด ํ์ํ ์ง ํ ๋ด ์๋ ผ์ ํด๋ณด์์ผ๋ ์จ๋ผ์ธ ๊ฒ์ ๋ฐฉ์์ด๊ธฐ์ ํ ๋ธ๋ผ์ฐ์ ๋ ํ ๋ช ์ user๋ง ๋ชจ์ ์ธ์์ ํ์๋ก ํ๋ฏ๋ก ํด๋ผ์ด์ธํธ์ธก์์ ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ ๋ซ๋ค๊ณ ํ๋จํ๋ค.
์ด ๋ชจ๋ธ์ ์ฌ์ฉํด์ ํ๋ฃจ๋ผ๋ ๋นจ๋ฆฌ ํ๋กํ ํ์ ์ ๋ง๋ค์ด์ผ ํ๋ค. ๊ฒ์์ด ์ด๋ป๊ฒ ์งํ๋๋์ง ์ค์ ๋ก ํด๋ด์ผ (์ฌ๋ฐ๊ฒ)๋ฐ์ ์ํฌ ๋ฐฉํฅ์ ์๊ฐํด๋ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Hand Pose Detection์ผ๋ก ๊ฒ์์ด ๋๋ ๊ฒ์ฒ๋ผ ๋ชจ์ฌํ ์์์ด๋ค. ์์ ๊ฐ์ด ๊ฒ์์ด ๋๋ ค๋ฉด, ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์ ํ ํธ๋ฆฌ์ค ํ๋ฉด์ด ๋ณด์ฌ์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์ ์์๊น์ง ๋ณด์ฌ์ผ ํ๋ค.
WebSocket with STOMP
๊ฒ์์ ํํ๋ฅผ ๊ฐ์ถ๊ธฐ ์ํด์๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์ ํ ํธ๋ฆฌ์ค ์ ๋ณด๋ฅผ ๋ฐ์์ ํ๋ฉด์์ ๋ณผ ์ ์์ด์ผ ํ๋ค. ์ด๋ฅผ ๋ ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธํ๊ธฐ ์ํด ๊ฐ ๋ธ๋ผ์ฐ์ ์์ WebSocket์ ์ฐ๊ฒฐํ๊ณ , STOMP๋ฅผ ํตํด ์๋ฒ์ ์ฐ๊ฒฐํ๋ค.
*STOMP?
STOMP(Simple(or Streaming) Text Oriented Messaging Protocol)๋ messaging protocol๋ก WebSocket์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๊ฒ ๋์์ค๋ค. STOMP๋ก ์๋ฒ์์๋ ์๋ํฌ์ธํธ๋ฅผ ๊ตฌ์ฑํ๊ณ , ํด๋ผ์ด์ธํธ์์๋ ํน์ topic์ด๋ queue์ ๊ตฌ๋ (subscribe)ํ๋ค. ํ ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด, ์๋ฒ๊ฐ ์ด๋ฅผ ๋ฐ์ topic or queue์ ๊ตฌ๋ ์ค์ธ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ค. STOMP๋ ๋ฉ์์ง ๋ผ์ฐํ ์ค๊ฐ ์ญํ ์ ํ๋ ๊ฒ์ด๋ฉฐ, peer to peer ์ฐ๊ฒฐ์ด ์๋ ์๋ฒ๋ฅผ ํตํ ๊ฐ์ ์ฐ๊ฒฐ์ด๋ค. ๋๋ถ์ด ์ ๋ฌ ๊ฐ๋ฅํ ์ต๋ message์ ํฌ๊ธฐ๋ 64KB๋ก ์๋ฌธ, ์ซ์, ๊ณต๋ฐฑ์ 1byte์ด๋ฏ๋ก ๊ฝค ๋ง์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋ค.
๋นํจ์จ ์ ๊ฑฐ
์๋ฅผ ๊ตฌํํ ๋ ๋ด๊ฐ STOMP๋ก ๋ณด๋ธ ๋ฉ์์ง๋ ๋ ์ค์ค๋ก ๋ฐ์ง ์๋๋ก sessionID๋ฅผ header๋ก ๋ถํฐ ๊ฐ์ ธ์ ๋์ ๊ตฌ๋ถ๋ ๊ฒฝ์ฐ(=๋ค๋ฅผ ๊ฒฝ์ฐ)๋ง ๋ฉ์์ง๋ฅผ ํ์ธํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ณ ์ ํ์๋ค. ์ด๋ ๊ฒ ํด๋ผ์ด์ธํธ์ธก์์ ์ฒ๋ฆฌํ ์๋ ์์ง๋ง, ์ ์ด์ ์๋ฒ์์ ๋ฉ์์ง๋ฅผ ๋ฉ์๋ฆฌ์ฒ๋ผ ๋์์ค์ง ์๋๋ก ํ ๊ฒฝ์ฐ ์๋ฒ ๋ถํ๋ ์ค์ผ ์ ์๋ค. ๊ฐ๊ธ์ ํ์์ ๋ฐฉํฅ์ผ๋ก ์ฒ๋ฆฌํ ์์ ์ด๋ค.
[HandTris] #2. ํ๋กํ ํ์ ํต์ ํ ์คํธ - (์ ๋์์ผ๋ก ํ๋ ์จ๋ผ์ธ ์น ํ ํธ๋ฆฌ์ค ๊ฒ์ ๋ง๋ค๊ธฐ)
2024.06.20 - [SEUNGWOO + ENGINEER] - [HandTris] #1. ๋ชจ๋ธ ์ ์ ๋ฐ ํ๋กํ ํ์ ์ ์ - (์ ๋์์ผ๋ก ํ๋ ์จ๋ผ์ธ ์น ํ ํธ๋ฆฌ์ค ๊ฒ์ ๋ง๋ค๊ธฐ) [HandTris] #1. ๋ชจ๋ธ ์ ์ ๋ฐ ํ๋กํ ํ์ ์ ์ - (์ ๋์์ผ๋ก ํ๋ ์จ๋ผ
seungineer.tistory.com