Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

56 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

  • ๋‡Œ์กธ์ค‘ ๋ฐ ์žฌํ™œ ์น˜๋ฃŒ ํ™˜์ž์˜ ๊ณ ์œ ์ˆ˜์šฉ๊ฐ๊ฐ ํ‰๊ฐ€ ๋ฐฉ์‹์€ ์ฃผ๊ด€์ ์ธ ๊ด€์ฐฐ์— ์˜์กดํ•˜์—ฌ ์ •ํ™•๋„๊ฐ€ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ ์ž Kinect์™€ Unity๋ฅผ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๊ณ ์œ ์ˆ˜์šฉ๊ฐ๊ฐ ํ‰๊ฐ€ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.
  • 20๊ฐœ์˜ Skeleton point๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ธ์ฒด์˜ ์›€์ง์ž„์„ ์ •๋Ÿ‰์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์ž์„ธ๋ฅผ ์ธก์ •ํ•˜๊ณ  ์ƒ‰์ƒ ๋ณ€ํ™”๋กœ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์—ฌ, ์žฌํ™œ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Scikit-learn์„ ํ™œ์šฉํ•˜์—ฌ 4๊ฐ€์ง€ ์ž์„ธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ํ™˜์ž๋“ค์ด ์ž์‹ ์˜ ์žฌํ™œ ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•˜๋ฉฐ ์น˜๋ฃŒ์— ๋Œ€ํ•œ ๋ชฐ์ž…๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ด๋‹น ์ธ์› : 1๋ช…


์ฃผ์š” ๊ธฐ๋Šฅ ๋ฐ ๊ธฐ์—ฌํ•œ ์—ญํ• 

1. ์‹ค์‹œ๊ฐ„ ์ž์„ธ ๊ฐ์ง€ ๋ฐ ์‹œ๊ฐํ™”

  • Kinect ์„ผ์„œ๋ฅผ ํ†ตํ•ด ํ™˜์ž์˜ ์›€์ง์ž„์„ ๊ฐ์ง€ํ•˜๊ณ , Unity๋ฅผ ํ†ตํ•ด ์•„๋ฐ”ํƒ€๋กœ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ํ™˜์ž๋Š” ์ž์‹ ์˜ ์ž์„ธ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ฉ”์ธ ํ™”๋ฉด

    ์‹œ์ž‘ ํ™”๋ฉด

2. ์ž์„ธ ํ‰๊ฐ€ ๋ฐ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต

  • ํ™”๋ฉด์˜ ๋ณ„ ์ƒ‰์ƒ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ž์„ธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ์ž์„ธ ๊ฐ๋„ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ ์ ˆํ•œ ๊ฐ๋„ โ†’ โญ ๋…ธ๋ž€์ƒ‰
    • ๊ฐ๋„๊ฐ€ ๋‚ฎ์Œ โ†’ โšซ ๊ฒ€์€์ƒ‰
    • ๊ฐ๋„๊ฐ€ ๋†’์Œ โ†’ ๐Ÿ”ด ๋นจ๊ฐ„์ƒ‰
  • ์ด 4๊ฐ€์ง€ ์ž์„ธ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์–‘ํŒ”, ์–‘๋‹ค๋ฆฌ).

3. ์ž์„ธ ๋น„๊ต ๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„(Paired T-test)

  • ๊ฐ๋„ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๋น„๊ตํ•˜๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ์˜ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์‚ฌ๋žŒ๋“ค์˜ ๊ฐ๋„ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ csv ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์คŒ

  • Paired T-test๋ฅผ ํ†ตํ•ด ์‹คํ—˜ ๊ฒฐ๊ณผ ๋ถ„์„: - ๋ˆˆ์„ ๋œฌ ์ƒํƒœ์™€ ๊ฐ์€ ์ƒํƒœ ๋น„๊ต - ์œ ์˜ ์ˆ˜์ค€ p-value = 0.05 ๊ธฐ์ค€ - Right Arm(0.03), Left Arm(0.02) โ†’ ์œ ์˜๋ฏธํ•œ ์ฐจ์ด ํ™•์ธ

    ์‹คํ—˜ ๊ฒฐ๊ณผ ํ‘œ

4. ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋ฐ˜ ์ž์„ธ ๋ถ„๋ฅ˜

  • Scikit-learn์„ ํ™œ์šฉํ•˜์—ฌ Decision Tree & Random Forest ๋ชจ๋ธ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ตœ๊ณ  ์„ฑ๋Šฅ 96%, ์ตœ์ € ์„ฑ๋Šฅ 81% ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ˆˆ์„ ๋œจ๊ณ  ์ง„ํ–‰ํ•œ ๋ฐ์ดํ„ฐ์—๋Š” open์˜ ๋ผ๋ฒจ๋ง์„ ํ•˜๊ณ  ๋ˆˆ์„ ๊ฐ๊ณ  ์ง„ํ–‰ํ•œ ๋ฐ์ดํ„ฐ์—๋Š” close๋กœ ๋ผ๋ฒจ๋ง์„ ์ง„ํ–‰ ํ›„ ๋ถ„๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ๋จธ์‹ ๋Ÿฌ๋‹ ์„ฑ๋Šฅ ์ง€ํ‘œ


๐Ÿ“Œ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์ฝ”๋“œ ๊ฐœ์„ 

์„ฑ๋Šฅ ์ธก์ •์€ ์œ ๋‹ˆํ‹ฐ ๋‚ด๋ถ€์˜ Profiler๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ๋ฐœ๊ฒฌ ๋ฐ ๋ถ„์„

  • Kinect๊ฐ€ ์‚ฌ๋žŒ์˜ Skeleton Point๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ, ํ”„๋ ˆ์ž„ Peak(์ตœ๋Œ€ ๋ถ€ํ•˜ ์‹œ ์ˆœ๊ฐ„์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜) ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์ž„

  1. ์„ฑ๋Šฅ ์ตœ์ ํ™” ํšจ๊ณผ
ํ•ญ๋ชฉ ๊ฐœ์„  ์ „ ๊ฐœ์„  ํ›„ ํšจ๊ณผ
์ตœ๋Œ€ ๋ถ€ํ•˜ ์‹คํ–‰ ์‹œ๊ฐ„(KinectManager.Update() ) 30.98ms 25.62ms โฌ 17% ๋‹จ์ถ•
GC ํ˜ธ์ถœ ํšŸ์ˆ˜ 98 64 โฌ 35% ๊ฐ์†Œ (๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”)
์‹ค์‹œ๊ฐ„ ์•„๋ฐ”ํƒ€ ์ œ์–ด ์‹œ์Šคํ…œ FPS 29.3 FPS 33.3 FPS โซ 15% ํ–ฅ์ƒ
์ตœ์†Œ ๋ถ€ํ•˜ CPU ์‚ฌ์šฉ๋Ÿ‰ 51.7% 47.5% โฌ 4.2% ๊ฐ์†Œ (์•ˆ์ •์„ฑ ์ฆ๊ฐ€)

1. CPU ๋ถ€ํ•˜ ๋ฐ GC ํ˜ธ์ถœ ์ตœ์ ํ™”

๐Ÿ”น ๊ธฐ์กด ์ฝ”๋“œ (๋น„ํšจ์œจ์ ์ธ List<uint> ์‚ฌ์šฉ)

  • ๋ฌธ์ œ: List.Contains() ๋ฐ List.Remove() ํ˜ธ์ถœ๋กœ ์ธํ•ด O(N) ๊ฒ€์ƒ‰ ๋ฐœ์ƒ โ†’ ์„ฑ๋Šฅ ์ €ํ•˜.
  • ์ถ”๊ฐ€ ๋ฌธ์ œ: new ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ โ†’ GC ํ˜ธ์ถœ ์ฆ๊ฐ€.
// ๊ธฐ์กด ์ฝ”๋“œ: O(N) ๊ฒ€์ƒ‰์œผ๋กœ CPU ๋ถ€ํ•˜ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐœ์ƒ
List<uint> allUsers = new List<uint>();

for (int i = allUsers.Count - 1; i >= 0; i--) 
{
    uint userId = allUsers[i]; // O(N)
    RemoveUser(userId);
}

โœ… ์ตœ์ ํ™” ์ฝ”๋“œ (HashSet<uint> ์‚ฌ์šฉ)

  • ํ•ด๊ฒฐ: HashSet<> ์‚ฌ์šฉ์œผ๋กœ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ O(N) โ†’ O(1) ๊ฐœ์„ .
  • ํšจ๊ณผ: CPU ๋ถ€ํ•˜ ๊ฐ์†Œ & GC ๋ฐœ์ƒ ์ตœ์†Œํ™”.
private HashSet<uint> allUsers = new HashSet<uint>();

foreach (uint userId in allUsers)
{
    RemoveUser(userId); // O(1)
}
allUsers.Clear(); // HashSet ๋น„์šฐ๊ธฐ

2. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ์ ์šฉ (CPU ๋ถ€ํ•˜ ๊ฐ์†Œ & ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”)

๐Ÿ”น ๊ธฐ์กด ์ฝ”๋“œ (FindObjectOfType() ๋ฐ˜๋ณต ํ˜ธ์ถœ)

  • ๋ฌธ์ œ: FindObjectOfType<KinectManager>()๋Š” ์”ฌ ๋‚ด ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํƒ์ƒ‰ โ†’ CPU ๋ถ€ํ•˜ ์ฆ๊ฐ€.
  • ์ถ”๊ฐ€ ๋ฌธ์ œ: Awake()์—์„œ ์ค‘๋ณต ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ.
public static KinectManager Instance
{
    get
    {
        return FindObjectOfType<KinectManager>(); // ๋งค๋ฒˆ ๊ฒ€์ƒ‰ ๋ฐœ์ƒ (๋น„ํšจ์œจ์ )
    }
}
.
.
.
private void Awake()
{
    instance = this;
		DontDestroyOnLoad(gameObject);
}

โœ… ์ตœ์ ํ™” ์ฝ”๋“œ (์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ์ ์šฉ)

  • ํ•ด๊ฒฐ: ํ•œ ๋ฒˆ๋งŒ FindObjectOfType<KinectManager>()์„ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํƒ์ƒ‰ ์ œ๊ฑฐ.
  • ํšจ๊ณผ: CPU ๋ถ€ํ•˜ ๊ฐ์†Œ & ์ค‘๋ณต ์ธ์Šคํ„ด์Šค ๋ฐฉ์ง€.
// ์ตœ์ ํ™”๋œ ์‹ฑ๊ธ€ํ†ค ์ ์šฉ: ํ•œ ๋ฒˆ๋งŒ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์บ์‹ฑ
private static KinectManager instance;

public static KinectManager Instance
{
    get
    {
        if (instance == null)
        {
            instance = FindObjectOfType<KinectManager>();
        }
        return instance;
    }
}
.
.
.
private void Awake()
{
    if (instance == null)
    {
        instance = this;  // ์‹ฑ๊ธ€ํ†ค ์ดˆ๊ธฐํ™”
        DontDestroyOnLoad(gameObject);  // ์”ฌ ๋ณ€๊ฒฝ ์‹œ ์ธ์Šคํ„ด์Šค ์œ ์ง€
    }
    else
    {
        Destroy(gameObject);  // ์ค‘๋ณต ์ธ์Šคํ„ด์Šค ๋ฐฉ์ง€
    }
}

์š”์•ฝ

  • KinectManager.Update()์˜ ์ตœ๋Œ€ ๋ถ€ํ•˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ 17% ๋‹จ์ถ•
  • GC ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ 35% ๊ฐ์†Œ โ†’ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ œ๊ฑฐ
  • ์‹ค์‹œ๊ฐ„ ์•„๋ฐ”ํƒ€ ์ œ์–ด ์‹œ์Šคํ…œ์˜ FPS๋ฅผ 15% ํ–ฅ์ƒ
  • ์ตœ์†Œ ๋ถ€ํ•˜ ์ƒํ™ฉ์—์„œ๋Š” CPU ๋ถ€ํ•˜๋ฅผ 4.2% ๊ฐ์†Œ โ†’ ์•ˆ์ •์ ์ธ ์‹œ์Šคํ…œ ๊ตฌํ˜„

๐Ÿ“Œ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

1๏ธโƒฃ Unity ์ตœ์‹  ๋ฒ„์ „์—์„œ GUIText ์˜ค๋ฅ˜

๐Ÿฅต๋ฌธ์ œ ์ƒํ™ฉ

  • ์ตœ์‹  Unity์—์„œ Kinect-SDK ์‚ฌ์šฉ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ

    'GUIText' is obsolete: 'GUIText has been removed. Use UI.Text instead.'

  • Unity์˜ GUIText๋Š” ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ตœ์‹  Unity UI ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜

๐Ÿ˜ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • UI.Text๋กœ ๋ณ€๊ฒฝ
  • ๊ธฐ์กด ์ฝ”๋“œ (GUIText ์‚ฌ์šฉ - ์ง€์› ์ข…๋ฃŒ๋จ)
using UnityEngine;

public class Example : MonoBehaviour
{
    public GUIText guiText; // ์ง€์› ์ข…๋ฃŒ๋œ ๋ฐฉ์‹

    void Update()
    {
        guiText.text = "Score: " + Time.time;
    }
}

๊ฐœ์„  ์ฝ”๋“œ (UI.Text ์‚ฌ์šฉ)

  • Unity์˜ Canvas + UI.Text ์‹œ์Šคํ…œ ์ ์šฉ
  • GUIText ๋Œ€์‹  Text ์‚ฌ์šฉ ๋ฐ RectTransform ๊ธฐ๋ฐ˜ UI ๋ฐฐ์น˜ ๊ฐ€๋Šฅ
using UnityEngine;
using UnityEngine.UI; // UI ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถ”๊ฐ€

public class Example : MonoBehaviour
{
    public Text uiText; // UI.Text ์‚ฌ์šฉ

    void Update()
    {
        if (uiText != null)
        {
            uiText.text = "Score: " + Time.time.ToString("F2");
        }
    }
}

์™œ UI.Text๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

  1. ์œ ์—ฐ์„ฑ
    • UI.Text๋Š” Canvas ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ํ•ด์ƒ๋„์™€ ํ™”๋ฉด ๋น„์œจ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • RectTransform์œผ๋กœ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์‰ฝ๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์Šคํƒ€์ผ๋ง
    • ํฐํŠธ, ์ƒ‰์ƒ, ์ •๋ ฌ, ์‰๋„์šฐ ๋“ฑ ๋‹ค์–‘ํ•œ ํ…์ŠคํŠธ ํšจ๊ณผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  3. ์„ฑ๋Šฅ
    • Canvas ์‹œ์Šคํ…œ์€ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋ฏธ๋ž˜ ํ˜ธํ™˜์„ฑ
    • GUIText๋Š” ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ, UI.Text๋Š” ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ Skeleton Point ์ธ์‹ ์˜ค๋ฅ˜

๐Ÿฅต๋ฌธ์ œ ์ƒํ™ฉ

  • ์‹ค์‹œ๊ฐ„ Skeleton Point ์ธ์‹ ์ค‘ ์ผ๋ถ€ ๊ฐ’์ด ๋น„์ •์ƒ์ ์œผ๋กœ ํŠ€๊ฑฐ๋‚˜ ๊ฐ์ง€๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • ์›์ธ ๋ถ„์„:
    • Skeleton ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์ถ”์ ๋˜์ง€ ์•Š์Œ
    • ์žฅ์• ๋ฌผ์— ์‚ฌ๋žŒ์ด ๊ฐ€๋ ค์ ธ ์„ผ์„œ๊ฐ€ ์ œ๋Œ€๋กœ ์ถ”์ ๋˜์ง€ ์•Š์Œ

๐Ÿ˜ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ์ด์ „ ์ขŒํ‘œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๊ฐ’ ๋ฐ˜ํ™˜
  • ๊ธฐ์กด ์ฝ”๋“œ (๋น„์ •์ƒ์ ์ธ ์ธ์‹ ๊ฐ€๋Šฅ)
private Vector3 GetRightHandPosition()
{
    KinectWrapper.NuiSkeletonPositionIndex joint = KinectWrapper.NuiSkeletonPositionIndex.HandRight;
    KinectManager manager = KinectManager.Instance;

    if (manager && manager.IsInitialized() && manager.IsUserDetected())
    {
        uint userId = manager.GetPlayer1ID();
        return manager.GetJointPosition(userId, (int)joint); // ๋ถˆ์•ˆ์ •ํ•œ ๊ฐ’ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
    }
    
    return Vector3.zero;
}

๊ฐœ์„  ์ฝ”๋“œ (์ด์ „ ๊ฐ’ ํ™œ์šฉํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๊ฐ’ ๋ฐ˜ํ™˜)

  • ์ด์ „ ํ”„๋ ˆ์ž„์˜ ์œ„์น˜(previousRightHandPosition)๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ฐ’์ด ํŠ€๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ
private Vector3 GetRightHandPosition()
{
    KinectWrapper.NuiSkeletonPositionIndex joint = KinectWrapper.NuiSkeletonPositionIndex.HandRight;
    KinectManager manager = KinectManager.Instance;
    Vector3 jointPos = Vector3.zero;

    if (manager && manager.IsInitialized())
    {
        if (manager.IsUserDetected())
        {
            uint userId = manager.GetPlayer1ID();

            if (manager.IsJointTracked(userId, (int)joint))
            {
                jointPos = manager.GetJointPosition(userId, (int)joint);
                
                previousRightHandPosition = jointPos;
                return jointPos; 
            }
        }
    }

    Debug.LogWarning("Right hand joint not tracked. Using previous position.");
    return previousRightHandPosition;
}

๊ฐœ์„  ํšจ๊ณผ

  • Skeleton Point๊ฐ€ ํŠ€๋Š” ๋ฌธ์ œ ๋ฐฉ์ง€
  • ์ด์ „ ํ”„๋ ˆ์ž„ ๋ฐ์ดํ„ฐ ํ™œ์šฉํ•˜์—ฌ ์—ฐ์†์„ฑ ์œ ์ง€
  • ๋ณด๋‹ค ์•ˆ์ •์ ์ธ Skeleton ํŠธ๋ž˜ํ‚น ๊ตฌํ˜„

3๏ธโƒฃ ๋จธ์‹ ๋Ÿฌ๋‹ ์„ฑ๋Šฅ ์ง€ํ‘œ ๋‚ฎ์Œ

๐Ÿฅต๋ฌธ์ œ ์ƒํ™ฉ

  • ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ–ˆ์œผ๋‚˜ ์„ฑ๋Šฅ ์ง€ํ‘œ๊ฐ€ ๋‚ฎ์Œ

  • ๋จธ์‹ ๋Ÿฌ๋‹ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ:

    • ์ตœ๊ณ  ์„ฑ๋Šฅ: 0.95
    • ์ตœ์ € ์„ฑ๋Šฅ: 0.17 โ†’ ์„ฑ๋Šฅ ํŽธ์ฐจ๊ฐ€ ์‹ฌํ•จ
  • ์›์ธ ๋ถ„์„

    1. 12๋ช…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์˜€๊ธฐ์— ๋งค์šฐ ์ ์€ ๋ฐ์ดํ„ฐ
    2. ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋ชป ๋˜์–ด ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์— ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ์ ˆํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ๊ณผ์ • ์žฌ์„ค๊ณ„
  • ๋ผ๋ฒจ๋ง ๊ธฐ์ค€ ์žฌ์ •์˜ ๋ฐ ์ •์ œ๋œ ๋ฐ์ดํ„ฐ์…‹ ํ™œ์šฉ
  • ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋Ÿ‰ ์ฆ๊ฐ€ํ•˜์—ฌ ์‹ ๋ขฐ์„ฑ ํ–ฅ์ƒ
  • ์ตœ๊ณ  ์„ฑ๋Šฅ 0.96 ๋ฐ ์„ฑ๋Šฅ ํŽธ์ฐจ ์•ˆ์ •ํ™”.

์„ฑ๊ณผ

  • ํ™œ์šฉ ๊ฐ€๋Šฅ์„ฑ

    • ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์‚ฌ๋žŒ 12๋ช…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘.
    • ํ™˜์ž๋“ค์˜ ์žฌํ™œ ์น˜๋ฃŒ์— ๋Œ€ํ•œ ์ฐธ์—ฌ๋„๋ฅผ ๋†’์ด๊ณ , ๋ฌผ๋ฆฌ ์น˜๋ฃŒ์— ์ข…์‚ฌํ•˜์‹œ๋Š” ๊ต์ˆ˜๋‹˜๊ป˜ ๋ฌธ์˜๋ฅผ ๋“œ๋ ค ์‹ค์ œ ์ž„์ƒ ํ˜„์žฅ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋กœ ๋ฐœ์ „ํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด์—ฌ์คŒ
  • ํ•™ํšŒ ๋ฐœํ‘œ

    • 2024๋…„๋„ ์˜๋ฃŒ์ •๋ณด๊ณตํ•™ํšŒ, 2024 IEEE BHI ํ•™ํšŒ ํฌ์Šคํ„ฐ ๋ฐœํ‘œํ•จ
  • ํ•™์ˆ ์ œ ๋ฐœํ‘œ

    • ์ˆœ์ฒœํ–ฅ๋Œ€ํ•™๊ต ์ œ 1ํšŒ ์œตํ•ฉ๋Œ€ํ•™ ํ•™์ˆ ์ œ ์žฅ๋ ค์ƒ ์ˆ˜์ƒ
  • SW ๋“ฑ๋ก

  • ๋…ผ๋ฌธ ํˆฌ๊ณ  (under reivew)


์‚ฌ์šฉ ๊ธฐ์ˆ 

  • C#: Kinect ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„์„ ์œ„ํ•œ ํ•ต์‹ฌ ์–ธ์–ด๋กœ ์‚ฌ์šฉ
  • Unity: ํ™˜์ž์˜ ์›€์ง์ž„์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ”ผ๋“œ๋ฐฑํ•˜๋Š” 3D ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ตฌํ˜„
  • Python, Scikit-learn: ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ํ†ตํ•œ ์›€์ง์ž„ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ๋ถ„๋ฅ˜
  • Git: ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ
  • Excel: ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ์œ ์˜์„ฑ ๊ฒ€์‚ฌ ๋„๊ตฌ๋กœ ์‚ฌ์šฉ

๋…ธ์…˜ ํฌํŠธํด๋ฆฌ์˜ค ์ •๋ฆฌ

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages