Hatena::ブログ(Diary)

明日とロボット このページをアンテナに追加 RSSフィード

2011-07-22

kinectの骨格追跡データで行動を認識する

Kinect関連記事

概要

方法

  • 10秒間、kinectの前で歩く、走る、スキップする、などの行動を行い、0.1秒ごとの骨格の動きを学習させる。
  • それぞれのjoint同士の距離で学習させ、少しだけ汎用性を効かせる。
  • タイマーの使い方
    • タイマーはDispatcherTimerを利用。
DispatcherTimer timer;
timer = new DispatcherTimer(DispatcherPriority.Normal);
timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
timer.Tick += new EventHandler(timer_Tick);
  • このように宣言、初期化し、0.1秒ごとに呼ばれるtimer_Tick関数も作る。
private void timer_Tick(object sender, EventArgs e)
{
    actionTimeRemain -= 1;
    if (actionTimeRemain <= 0)
    {
        timer.Stop();
    }
}

デモ

  • 歩き×2、走り×2、スキップ×2と学習させ、それぞれを正しく認識できるかテストした。

D

Kinect関連記事

2011-07-11

kinectとk近傍法で物体認識

復習

implementation

  • 前回は、NearestNeighborクラスで、最小の誤差のデータを選んだが、今回は、最も近似した3つのデータの中で多数決を行い、答えを推測する。
  • 色々な方法はあるが、以下のフィールドを持つクラスを作って値を突っ込み、ソートすることにした。
    1. 観測地とデータの誤差
    2. 推測された名前index
public class IndexAndDifference: IComparable
{
    public int index;
    public double difference;
    public IndexAndDifference(int _index, double _difference)
    {
        index = _index;
        difference = _difference;
    }
    public int CompareTo(object obj)
    {
        IndexAndDifference Compare = (IndexAndDifference)obj;
        if (this.difference < Compare.difference)
            return -1;
        else if (this.difference > Compare.difference)
            return 1;
        else
            return 0;
    }
}
  • ソートの際に、オブジェクトの比較が行われるため、IComparableインターフェースを実装
    • CompareToをオーバーライドする。
  • 全ての格納されたデータに対してこのクラスオブジェクトをArrayListにいれた後、Listの関数のSort()でソート。
  • そして、最小3つを取り出し多数決を以下のように行った
if (sorted.Count < 3)//データが2つ以下なら多数決を取れないから
{
    index = ((IndexAndDifference)sorted[0]).index;
}
else if (((IndexAndDifference)sorted[1]).index == ((IndexAndDifference)sorted[2]).index)
{
    index = ((IndexAndDifference)sorted[1]).index;
}
else
{
    index = ((IndexAndDifference)sorted[0]).index;
}
return index;
  • こんな感じで、少しは精度上がったかな。
    • データの量に応じてkの数を増やすようにした方がいいのかも。

Kinect関連記事