計算機工学実験
人体動画像トラッキングマニュアル
2001/01/17(水) 更新

1. はじめに
    人間の動作を測定する方法としては、既にモーションキャプチャーやデータグローブなどが市販されています。しかし、これらの方法は,装置が大がかりになる上、人体にマーカーや特殊な器具を取り付けなければならないなどの不都合がありました。本研究室の研究
グループにより提案された動画像解析法では、ビデオカメラの映像から、人体の動作を3次元的に測定することが可能です。道具としては、CADモデリングで作る人体のモデルと、コンピュータビジョンの動画像処理のところで述べた時空間勾配法です。

2. トラッキングの概要
   この方法は,人体像にモデルの投影像を一致させることにより行なわれます。追跡対象の人体モデルはCADモデラ(ソルバ)により作成しておきます。このモデルは、対象を関節で分解し、その各セグメントごとにソリッドモデルとして作成したものです。このセグ
メントを部位と呼び、各部位は各々の座標系を持ち、その原点は各関節の位置に置きます。時空間勾配法によって、運動パラメータを推定し、モデルを移動させれば、次のフレームでもモデルは人体に一致します。この作業をフレーム順に繰り返し行なえば、動画像の
人物の動きを追跡することができます。

3. トラッキング方法

3.1 ソルバデータファイルの用意
   トラッキングする映像のスタートフレームとエンドフレームの姿勢は、手動で与えます。この作業をフィッティングと呼んでいます。

1. ソルバモデルを読み込む
   人体のモデルを用意しておきましたので、CADモデラ(xsolver)を起動させ、そのモデルデータを読み込んで下さい。モデルは~vision/test/modelにありますので、自分のところにコピーして下さい(以下いくつかコピーをしたり、ファイルを保存したりしますが、すべて同じディレクトリに置いて下さい)。
  メニュー(図1)のFileからLoadDataを選びmodelと入力して読み込みます。xsolver canvasウィンドウ上で右クリックし、BodyListのbodyを選びましょう。モデルが表示されます。ViewメニューのSetFGColorでモデルの色を変更できます。redと入力し、右クリックでbodyを選択しなおすと、モデルが赤くなります(white,blackも可)。同様に、SetBGColorでは背景色が変わります。
 
 

図1:メニューウィンドウ

   このモデルデータは下記のような親子関係で結ばれていて、親の物体が動けば、子の物体も一緒に動きます。しかし、子の移動は親とは独立しています(例えば「rua」が動けば「rla」も一緒に動きますが、「rla」が動いても「rua」は動きません)。また、「body」と「body2」がありますが、名前が違うだけで、全く同じ物体です。「body」はスタートフレーム、「body2」はエンドフレームにフィッティングさせます。

            図2:CADモデル

物体名は以下のようになっています。

あたま → head
首 → neck
胴 → body
腰 → koshi
右上脚 → rul (right upper leg)
右下脚 → rll (right lower leg)
左上脚 → lul (left upper leg)
左下脚 → lll (left lower leg)
右上腕 → rua (right upper arm)
右下腕 → rla (right lower arm)
左上腕 → lua (left upper arm)
左下腕 → lla (left lower arm)

2. スタートフレームの画像を読み込む
   メニューボタンのViewからSetImageを選択し、自分が追跡する映像の一番最初の画像のある場所を入力します。皆さんが追跡する画像は ~vision/jikkenimg/在籍番号/ の下にあります。 自分の在籍番号のディレクトリの下にある画像を使用して下さい。ここでは、sample00000.rasをスタートフレーム、sample00080.rasをエンドフレームとして説明して行きます。(※スタートフレームは、なるべく両手両足がみえている(隠れていない)フレームにすることをお勧めします。)

図3:画像のセッティング(※皆さんは~vision/jikkenimg/・・・と入力)

画像を読み込むとモデルが消えます。右クリックしてbodyを選び、モデルを再表示しましょう。

3. モデルをフィッティングさせる(その1)
   モデルが極端に追跡対象の人物と合わない場合は、モデルの各部位のパラメーターのサイズを変更します。これはmodelファイルの先頭部分の数値を変えることで可能となります。例えば、胴体の高さを変更したい場合は、#define body_hi 35 の行の数値を、#define
body_hi 40 などに変更します。各部位のパラメーターの説明は下記のとおりです。

#thanks for Yagishita →変更しない
#define kosi_yoko 24 →腰の底面の横幅
#define kosi_tate 20 →腰の底面の縦幅
#define kosi_hi 17 →腰の高さ
#define mune_yoko 24 →胸の横幅
#define mune_tate 20 →胸の縦幅
#define body_hi 35 →胴体の高さ
#define waist_haba 24 →胸の上面の縦幅
#define waist_tate 20 →胸の上面の縦幅
#define ua_r1 6 →上腕の上面の半径
#define ua_r2 4 →上腕の底面の半径
#define ua_len 23 →上腕の長さ
#define ua_moguri -5 →変更しない
#define ude_sideoff -2 →変更しない
#define jikuoff_ude1 2 →変更しない
#define la_r1 4 →下腕の上面の半径
#define la_r2 3 →下腕の底面の半径
#define la_len 22 →下腕の長さ
#define la_moguri 1 →変更しない
#define jikuoff_ude2 -1 →変更しない
#define ul_r1 7 →上脚の上面の半径
#define ul_r2 5 →上脚の底面の半径
#define ul_len 33 →上脚の長さ
#define ul_moguri 3 →変更しない
#define jikuoff_ashi1 0 →変更しない
#define ll_r1 5 →下脚の上面の半径
#define ll_r2 3 →下脚の底面の半径
#define ll_len 35 →下脚の長さ
#define ll_moguri 1 →変更しない
#define jikuoff_ashi2 -1→変更しない
#define head_tate 11 →頭の長さ
#define head_yoko 10 →頭の縦幅
#define head_off 0 →変更しない
#define neck_hi 4 →首の高さ
#define ude_off 0 →変更しない
#define kataoff_y 0 →変更しない
#define kataoff_z 0 →変更しない
 

4. モデルをフィッティングさせる(その2)
  大体あわせ終わったら、モデルを対象人物に一致させます。メニューボタンのEditからMovingを選ぶと、図2のようなウィンドウが開きます。

   図4の青の破線で囲まれた部分以外は使いません。kind of Move メニューの中で、モデルの各物体を並進させるか、回転させるかを選びます。並進はPositionParent、回転はPoseParent を選びます。Move Objectメニューで回転又は並進させる物体名を選びます。X , Y , Zの数値を変えるか、マウスの中クリックで、コントロールバーをスライドしてモデルの各物体を動かし、画像上の人物にフィットさせます。ただし、「body」以外の物体を並進させると親と子の位置関係がくずれてしまうので絶対に動かさないでください。

図5:フィッティング

5. スタートフレームの姿勢を保存する
  スタートフレームの画像上の人物にモデルをフィッティングできたら、姿勢を保存しましょう。メニューのFileからSavePoseを選びます。例ではファイル名を「000」として保存しました。

※ここまでの1〜5の作業を「フィッティング」と呼んでいます。

6. 同様にエンドフレームのフィッティングをする。
   同様にして、エンドフレームのフィッティングも行いましょう。エンドフレームには「body2」をフィッティングします。エンドフレームの画像を読み込み、「body2」を直接動かしても良いのですが、操作の過程で、間違って「body」を動かしてしまった!などどいうことになると面倒ですので、画像のみを変え、1〜5の作業と全く同じことをし、7で説明する方法を行うことをお勧めします。ま
た、補足で説明するキーフレーム操作をする場合を考えると、こちらの方が都合が良いです。body2を直接動かした方は、FileからSavePoseを選び、ファイルを別名で保存して下さい。例では「0_80」とします。(7をとばして下さい)

7. 新しい姿勢データファイルをつくる
   メニューのFileからInitを選ぶと、モデルがすべてクリアされます。Initしてから1〜5の作業と全く同じことをします。エンドフレームの姿勢データファイル名は、仮に「080」とします。
   いったんソルバから離れます。Muleやvi などのテキストエディタを開き、ファイル「000」と「080」を開きます。ファイル「000」のbody2〜lll2の部分を削除し、ファイル「080」のbody〜lllの部分を「000」の削除した部分にカット&ペーストします。貼り付けた部分の物体名の後ろに「2」を書き加えます。出来上がったファイルを別名で保存します。ここでは「0_80」とします。「0_80」はスタートフレームとエンドフレームの姿勢データを保存したファイルとなります。

8.ファイル0_80を読み込みバイナリで保存する
   次に、ファイル0_80をトラッキングソフトで使える状態に保存し直すためにソルバに戻ります。Initで今読み込まれているデータをすべてクリアして下さい。モデルデータmodelを読み込んだ後、同じくLoadDataで0_80を読み込みます。body , body2を表示してみましょう。それぞれスタートフレームとエンドフレームの姿勢になるはずです。この状態を確認したら、FileからSaveDataを選びます。これでバイナリ形式で保存されます。名前は適当で良いです。ここでは拡張子「.b」をつけて「0_80.b」とします。

※ これで、トラッキングにおいて最も重要なモデルフィッティング作業が終わりました。このパートは一番根気がいる部分ですので、皆さん頑張って下さい。フィッティングがいいかげんだと、うまく追跡ができません。
 

3.2 body_refファイルを用意する
   body_refファイルは追跡する際に、モデルの動きに制約をつけるためのファイルです。例えば、今回皆さんが追跡するような歩行動作は、進行方向と体の上下動の二軸方向のみと考えられます。進行方向がx軸方向の動き、上下動がz軸方向の動きだとすると、y軸方向の追跡の分は無駄な計算をすることになります。計算量が多いということは、それだけ追跡の時間も長くなるということです。さらに、それだけなら良いですが、雑音などを追跡してしまい、追跡結果そのもに影響を与える場合もあります。「時間がかかる上、結果も悪くしてしまうようなら、計算させないようにしよう。」ということで、body_refファイルの登場です。以下、書き方の説明です。

Body_refファイルの書き方
 サンプルを~vision/test/body_refに用意しました。先頭行から以下のとおりです。
1. イメージの名前
 追跡する画像の場所をフルパスで書く
     pwdコマンドで確認。例)/home/home113/faculty/vision/jiikenimg/在籍番号/在籍番号_0
2. 追跡する画像の拡張子を書く。.gifとか.ras
 皆さんは .ras
3. ソルバーのデータファイル名
 フィッティング作業をして作ったもの。
 このマニュアルの例では ./ 0_80.b
4. 画像のエッジ抽出の際の閾値
 0か1を書いておく。
 皆さんはどちらでもいいです。この行は気にしないで下さい。
5. 表示を何フレームおきにするか
 追跡の際の表示。1でいいでしょう。
6. 単純予測をするかどうか
 0,0と書いておく。ここも気にしないで下さい。
7. ソルバーでのカメラ名
 例ではtcam
8. 空行
 今回の追跡には関係ない行です。何かを書いておいてもいいです。
9. モデルのセグメント数
 皆さんが使うモデルは12個。
10. 物体の名前
 headとかluaとかのことです。
11. どの関節を動かすかのフラグ
    ここで、上行に書いた物体を動かすか動かさないか(計算するかしないか)を指定します。指定方法は後述。
12行目以降→10、11行目の繰り返し。

[どの関節を動かすかのフラグ] 
    2進数で考えて、最下位ビットからx並進、y並進、z並進,lx軸回転、y軸回転、z軸回転を表します。その運動を計算するなら、そこを「1」にして、それを16進数で書きます。(ちなみに今回はbodyだけX 並進、Z並進、Y軸回転、その他の物体はY軸回転のみでいいと思います。)

[例]
  x並進、z並進、y軸回転 の場合  0001 0101  なので  15  と書く

[16進数]
0010→2
0011→3
0100→4
0101→5
0110→6
0111→7
1000→8
1001→9
1010→a
1011→b
1100→c
1101→d
1110→e
1111→f


 
 

3.3 key_refファイルを用意する
 key_refファイルはこちらで用意したものをそのまま使って下さい。~vision/test/key_refにありますので、コピーして下さい。
 

3.4 トラッキングする
 これで、トラッキングする際の最低限のファイルがそろいました。では、実際にトラッキングを行ってみましょう。トラッキングのソフトは~vision/bin/の下にあります。
[使い方]

% 3d_tracking [[end_flame] [start_flame]] [options]

※ エンドフレームが先で、以下スタートフレーム、オプションの順です。

    [オプション]
 -b <ファイル名> → body_refファイルの指定
 -k <ファイル名> → key_refファイルの指定
 -m <ファイル名>    → movedataファイルの指定

    movedataファイルは、追跡した結果を保存するファイルです。適当なファイル名を入れてください。上記をふまえると、0〜80フレームを追跡する場合、movedataファイル名をmdata0_80とすると

  % 3d_tracking 80 0 -b body_ref -k key_ref -m mdata0_80

となります。実行すると、図8のようなウィンドウが現れます。
 
 

図8:トラッキングメニューバー

    Start No. がスタートフレームを、End No. がエンドフレームを表します。Settingで設定状況を変更、確認できます。(図9)
Trackでトラッキングを開始します。quitで終了です。Viewでトラキング結果を確認できます。その他のメニューは使いません。

図9:セッティング







   もし、うまく追跡できない場合はスタートフレームの画像を変更する、追跡するフレーム数を減らすなどしてください。(オプションの "-k key_ref" を外すのもいいかも知れません)
 

3.5 トラッキングしたものを再生してみる
 ソルバーでトラッキングしたものを再生することができます。Initでデータをクリアした後、新たにmodelを読み込みます。そしてスタートの姿勢データ(ファイル「000」)を読み込みます。メニューのEditからMotionを選んで下さい。図10のウィンドウが開きます。
 
 

図10:モーションウィンドウ

    Body_ref Fileにbody_ref_solと入れてください。(body_ref_solファイルはこちらで用意したものを使って下さい。~vision/test/にあります。)Movedata Fileにmovedataファイル名を入力して下さい(例ではmdata0_100)。Fromにはスタートフレームを、Toにはエンドフレームを入力して下さい。Do Motionボタンで再生されます。カメラをたくさんつくっておけばいろいろな角度から見ることができます。トラッキングの結果を検証し、おかしなところをみつけたら、再度トラッキングして下さい。
 

4. キーフレームについて
 追跡フレームが長くなったり、激しい運動の追跡であったりした場合には、正確な測定が難しくなります。これは、追跡開始フレームでの人体像とモデルのフィッティングエラーや、運動パラメータの推定誤差が累積されるためです。このような場合には、キーフレーム追跡を行ないます。これは、モデルが人体像と大きく離れた時点を新たな追跡開始時刻とし、モデルと人体像のフィッティングを新たに行ない、追跡を再開する手法です。
 歩行動作を真横からみると、どうしてもカメラの視界から消える部分、いわゆる「隠れ」が発生します。「隠れ」が発生すると、どうしてもトラッキングの精度は落ちます。悪いときは、全く追跡できなくなります。このような場合に、キーフレーム追跡を行ないます。100フレームを一気に追跡するのではなく、「隠れ」が発生してる間だけ10フレームおきにするとか、単純に20フレームずつ追跡していって、後でmovedataをつなぎあわせます。20フレームづつ区切っていくなら、最初の区分のエンドフレームを、次の区分のスタートフレームに流用します。このように「キーフレーム」を入れていけば、トラッキング結果は滑らかになるでしょう。しかし、あまりキーフレームを使い過ぎると、フィッティング作業の時間が多くなり、逆に時間がかかってしまいますので、気をつけて下さい。movedataをつなぎあわせは、ファイルを開いてカット&ペーストでひとつにします。(何千フレームといった追跡の場合には、こんなことをしていられませんが、100フレーム位ならたいした作業ではないと思います。頑張って下さい。)
 

5. 提出課題
    レポートの詳細はここを見てください
 

6. アドバイス
   たくさん追跡したい人は次の方法でフィッティングとトラッキングをするとできるかもしれません。

(0フレームから100フレームまで追跡する例)
1.    0_10.b, 10_20.b, 20_30.b, ... , 90_100.b を作成する(即ちスタートフレームとエンドフレームの間隔を10フレームにする)
2.   各ファイルをトラッキングして mdata0_10, mdata10_20, mdata20_30, ... , mdata90_100 を作成する
3.   「~vision/bin/mjoint mdata0_10 mdata10_20 mdata20_30 ... mdata90_100 > movedata」を実行し、 movedataを1つにまとめる
 
 

2001/January 山本研究室