๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/HandTris

[HandTris] #1. ๋ชจ๋ธ ์„ ์ • ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

seungineer = seungwoo + engineer 2024. 6. 20. 04:41

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
    });
...

์˜ค๋ฅธ์ชฝ์„ pointingํ•˜๊ณ  ์žˆ์Œ์„ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

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๋กœ ๋ถ€ํ„ฐ ๊ฐ€์ ธ์™€ ๋‚˜์™€ ๊ตฌ๋ถ„๋  ๊ฒฝ์šฐ(=๋‹ค๋ฅผ ๊ฒฝ์šฐ)๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์• ์ดˆ์— ์„œ๋ฒ„์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฉ”์•„๋ฆฌ์ฒ˜๋Ÿผ ๋Œ์•„์˜ค์ง€ ์•Š๋„๋ก ํ•  ๊ฒฝ์šฐ ์„œ๋ฒ„ ๋ถ€ํ•˜๋„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€๊ธ‰์  ํ›„์ž์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค.

2024.06.21 - [๐Ÿงญ KAIST JUNGLE/HandTris] - [HandTris] #2. ํ”„๋กœํ† ํƒ€์ž… ํ†ต์‹  ํ…Œ์ŠคํŠธ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

 

[HandTris] #2. ํ”„๋กœํ† ํƒ€์ž… ํ†ต์‹  ํ…Œ์ŠคํŠธ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

2024.06.20 - [SEUNGWOO + ENGINEER] - [HandTris] #1. ๋ชจ๋ธ ์„ ์ • ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ) [HandTris] #1. ๋ชจ๋ธ ์„ ์ • ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ

seungineer.tistory.com