HOME > SGT Toolboxで視線計測

SGT Toolboxで視線計測

※2015年頃の情報を備忘録として載せています。すでに古くなっている内容もあると思いますので,ご注意ください。

ここで書いているシステムを使った研究成果が論文になりました。

SGT Toolboxとは

SGT Toolboxは,オープンソースの視線計測ソフトウェアGazeParser (Sogo, 2013) の計測コンポーネントSimpleGazeTracker (SGT) を,Psychophysics Toolbox (PTB) (Brainard, 1997) から利用するためのライブラリです。つまり,Octave/MATLAB + PTBの心理学実験環境で視線計測をするための,無料で利用可能なソフトです。カメラなどハードウェアを自分で用意する必要がありますが,低コストで視線計測環境が実現できます。

筆者(新美)はPTBで実験をしていたので,SGT Toolboxにより普段の実験環境に視線計測機能を加えることができました。実際に導入してみると,すばらしく簡単かつローコストであり,データをOctaveから直接取れるのも大変便利で,ここにご紹介する次第です。なお,このページの記述は SGT Toolbox 0.2.2 および SimpleGazeTracker 0.6.6 for OptiTrack に基づいています。プルキニエ像を使ったビデオベースの視線計測の原理やPTBそのものの使い方についてはここでは説明しません。

GazeParserプロジェクトは十河宏行氏(愛媛大学法文学部)が立ち上げ,SGT Toolboxも氏が開発されています(本稿執筆時)。感謝。筆者は,ありがたく使わせてもらっているいちユーザです。

SGT Toolboxを使うときの構成をおおざっぱに図示するとこのようになります。

機器構成図

Host PCは接続されたカメラの映像から瞳孔とプルキニエ像を検出して視線データを吐き出し続け,そのデータをClient PCがTCP/IPを介して随時読み出す,というイメージです。TCP/IP通信での遅延については十河(2014)を参照のこと。

今回の実装例

カメラ OptiTrack V120 Slim (120fps, USB2.0, NaturalPoint Inc.)
レンズ 1/2型用 50mm F1.4 Cマウントレンズ
赤外線照明 890nm LED x 28 (12V 2.44W)
または
850nm LED x 24 (12V 1.84W)
Host PC SimpleGazeTracker 0.6.6 for OptiTrack,
Windows Vista (32bit),
Intel Core 2 Duo E7500 + Q43 Express Chipset,
PC2-6400 4GB RAM,
AMD RadeonHD5450
Client PC SGT Toolbox 0.2.2,
Psychtoolbox 3.0.11,
Octave 3.2.4,
Ubuntu 12.04 LTS (32bit),
Intel Core 2 Duo E8600 + X83 Express Chipset,
PC2-6400 4GB RAM,
AMD FireProV3900

PCを除き,8万円弱でできました(上表中のカメラ,レンズ,赤外線照明の材料費およびカメラスタンド,ACアダプタ等の関連用品)。これで120Hzのアイトラッカーが実現できます。1人1台も夢ではない,といったところでしょうか。※費用はカメラとレンズの値段が大部分ですので,よりよいカメラとレンズを選べば高くなりますし,逆にWEBカメラのような安価なものを使えばもっと安くなります。

以下,備忘録も兼ねて今回の導入事例を詳しめに記録しておきます。ご参考まで。

カメラ

GazeParserのサイトにあるカメラ一覧を参考にして下さい。

今回は価格のわりに120fpsと高速なOptiTrack V120 Slimにしました。製品として世に出ているアイトラッカーのサンプリング周波数は30, 60, 500Hz等さまざまですが,これは主にカメラの性能で決まります。筆者の場合,サッケードの動的特性を詳細に検討したりするわけではなく,どこを見ていたかという注意の空間分布を調べるのが主なので,60Hz出れば必要十分。120Hzなら余裕です。

V120 SlimのPCとの接続はUSB2.0です。……あれ,モノクロとは言えUSB2.0の帯域で120fps送れるのかな?と思いましたが,単純計算でデータ量はモノクロ8bit×横640ピクセル×縦480ピクセル×120fps=約295Mbpsなので,確かにUSB2.0 High Speedの規格値480Mpbsを下回ってはいます。ただ,当然ながら実効値として480Mbps出るわけではないので,厳しそうに思えます。実際には,V120 Slimにはいくつかの転送モードがあり,画像をJPEG圧縮するモード,解像度を320x240に下げたモードなどでデータ量を減らして使用することもできます。SGT ToolboxのOptiTrack版では画像は圧縮しません(RAWモード)が,解像度は640x480と320x240の両方をサポートしているそうです。解像度はappdataフォルダ(たとえば c:\Users\(ユーザ名)\AppData\Roaming\ )内の SimpleGazeTracker フォルダにある CONFIG というファイルの中(CAMERA_WIDTH と CAMERA_HEIGHT の値)を書き換えることで変えられます。ちなみに今回の場合,640x480では動作しませんでしたので320x240で使用しています。 オンボードのUSBコントローラがイマイチなのかしらんと思い,USBインタフェースボードを増設してそちらのUSBポートを使ったところ無事640x480で動作しました。このへんはHost PCのスペックに依存するようです。

本体のほか,ケースと800nm赤外線フィルタ,M12マウントアダプタも購入。可視光をカットするため,赤外線フィルタは必須です。OptiTrackのようにオプションでフィルタがあれば楽ですが,ない場合も市販のフィルタを使えばOKです。ちなみにOptiTrackシリーズは本来モーションキャプチャ用の製品です。3DCGがテレビ等でどんどん使われるようになったため,モーションキャプチャシステムは映像産業で結構普及し,製品も増えたんですね。

レンズ

V120 SlimはM12, C, CSマウントのレンズが使えます。こういったレンズは監視カメラ用としてよく売られています(いわゆるCCTVレンズ)。ただ,広角の(焦点距離fが短い)製品が多く(何せ監視カメラ用なので),望遠(fが長い)のものは少ないです。視線計測に適切な焦点距離は,カメラから被験者の目までの距離や使用するカメラの撮像素子(イメージセンサ)サイズによって違ってきますが,望遠で,近くにピントが合うものを選びましょう。このへんは最終的には試行錯誤です。

今回はまず f = 25mm のM12マウントレンズを試しましたが,赤外線照明の試作零号機(後述)が非力だったこともあり,映像がとても暗い。M12のレンズは口径が小さいので,どうしても暗くなります。そこで,赤外線照明のパワーアップを図るとともに(後述),口径の大きいC/CSマウントレンズを使うことにしました。また,今回の実験環境で想定される撮影距離40~50cmで試すともう少し倍率が欲しかったので,より望遠のレンズを探しました。

結局,f = 50mm のCマウントレンズを,C/CSマウントアダプタでV120 Slimのケース(CSマウント)にとりつけました。しかし40~50cm程度の近距離だとピントが合いませんでした。(マクロって書いてあったんだけどなぁ……) そこで,写真のようにC/CSマウントアダプタをもう1本つけて,つまりエクステンダとして使い,数10cmの距離でピントが合うようにできました。CマウントとCSマウントはネジ径は同じなので,実はC/CSアダプタってのは単なる5mm延長筒なんですね。

レンズとカメラの接続

補足説明。撮像素子サイズが同じなら焦点距離が長いほど,焦点距離が同じなら素子サイズが小さいほど望遠になります。また,近距離の被写体の像はレンズの後方遠くに,遠い被写体の像はレンズの近くにできます(説明の図)。レンズ鏡筒のフォーカスリングを回すと,基本的にはレンズと撮像面(フィルムや撮像素子の位置)までの距離が変化してピントの合う対物距離が変わります。そのため,レンズと撮像面の間にリングをはさんで撮像面までの距離を長くすれば,ピントの合う被写体の範囲が近くなるわけです。反面,遠くにピントを合わせられなくなりますが,視線計測をする上では問題ありません。なお,レンズと撮像面の距離を長くすると,像(イメージサークル)の中央一部しか使わないことになるので(説明の図)像は拡大され,暗くなり,解像度(ピクセル数ではなく光学的な分解能のこと)は落ちます。暗くなることや分解能の低下はデメリットですが,強い赤外線照明を使えば暗さは補えます。また,視線計測ではシャープな写真を撮ることが目的ではないですし,多少ボケていても瞳孔やプルキニエ像の位置はとれますから,そんなに高いレンズ解像度は必要ありません。というか,超高解像度の撮像素子と超高解像のレンズで空間精度の高い視線計測をしようとしても,キャリブレーションの誤差の方がずっと大きいと思われます。

というわけで,望遠で,近くにピントが合わせられることがレンズの要件です。これを満たせば,高いレンズでなくても大丈夫でしょう。用途から言ってレンズ解像度はそんなに必要ないですし,像の歪みも大きな問題ではありません(どうせキャリブレーションするので)。色収差も問題にはならないでしょう(スペクトルのうちLEDが出す狭い範囲の光しか使わないので)。ある程度の明るさは必要ですが,暗めのレンズでも赤外線照明を強力にすれば使えます。

なお,今回使ったレンズは1/2型撮像素子用です(V120 Slimの素子サイズは実質約3.8×2.9mmなので,本当は1/3型用でも十分)。レンズは,使用するカメラの素子サイズを確認して選びましょう。小さい素子用のレンズだと像の周辺が欠けます(いわゆるケラレ)。大きい素子用のレンズは使用可能ですが(大は小を兼ねる),像の中央一部しか使わないことになるので,本来より望遠に,また暗くなり,分解能も落ちます。

赤外線照明

今回は自作しましたが,市販品もあります(監視カメラ用の赤外線投光器など)。ただ,視線計測では照明距離が短く(数10cm),しかも計測する目の付近だけ照らせればよいので(今回は片目計測を想定しています),監視カメラ用照明の強力さは不要に思えました。そこで,必要十分な光量でコンパクトな照明を作ってみることに。赤外線照明が必要な理由についてはこちらを参照のこと。

一般にビデオカメラの撮像素子は近赤外域にも感度がありますが,やはり可視光域(~780nmくらい)から遠ざかるほど感度は落ちます。赤外線LEDにはピーク波長が950nmといった製品もありますが,これだとあまり有効な照明にならなさそうです。一方で,ピーク波長が可視光域に近い赤外線LEDは,点灯すると肉眼でも赤く光って見えるので,視覚実験ではじゃまになる可能性があります。結局,V120 Slimの分光感度特性も参考にし,ピーク波長890nmのLEDを使うことにしました。

試作零号機(12灯,電源はUSBバスパワー5V)は光量不足でした。そこで,指向性の高いLED(半値幅±10度)を使い,しかも21灯に増やした初号機を作成。使用LEDは Vishay TSHF5210,直列7灯×3並列。電源はACアダプタからのDC 12V。長時間つけっぱなしにすることを考慮し,無理せず定格の半分くらいの電流(約50mA)になるようにしました。上述のCマウントレンズ(f = 50mm)と合わせて試すと,40~50cmの距離で十分な明るさの映像を得られました。ついでに,28灯で縦型の弐号機も量産。

ちなみに,OptiTrackシリーズの赤外線照明つきカメラ製品(Flex 3等)で使われているのは850nm LEDです。というわけでやっぱり850nmの照明だとどんなものか気になってしまい,秋○電子で売っていた850nm LED(OptoSupply OSI3CA5111A)を24個使った参号機を製作。電流やLEDの指向性が違うので直接比較は難しいですが,やはりこちらの方が映像は明るく,消費電力のほぼ同じ初号機の時に比べてカメラの露出時間は4分の1程度で足りました。ただ,予想された通りに肉眼では点灯時に結構赤く鮮やかに光って見え,暗室での実験だと気になりそうです。800nm赤外線パスフィルタをかぶせて可視光成分をカットするのがいいでしょう。というわけで,最も効率的な赤外線照明は「850nm LEDに800nmフィルタをかぶせる」かも知れません(今回は作っていませんが)。

カメラテストと設置

OptiTrackのCamera SDKをインストールすると,Sample Viewer Appというアプリケーションがあるので,これでカメラテストができます。PCにV120 SlimをUSBで接続し,赤外線照明をつけて実際に像を映し,明るさやピント,想定の距離で十分に目が大きく映るかなどを確かめます。左右のカーソルキーでビデオモードを変えられます。F2 ,F3キーで露出時間が変わるので,明るさを調整できます。うまくいけば下のように映ります。

実験机にカメラと赤外線照明を設置します。今回は視覚実験での一般的な観察距離57cm程度を想定しており,刺激提示用ディスプレイの手前にカメラを置くと被験者の目まで40~50cm程度です。カメラと照明はそれぞれ自由雲台に乗せて方向を変えられるようにしました。雲台はケチらずにいいものを買いましょう。安定感と微調整のしやすさが違います。2つの雲台はホームセンターで売っているようなジョイント金具に固定,金具はカメラスタンド(監視カメラを天井などに設置するための土台つき雲台。なくてもいい気がします)に蝶ナットで止めてあります。カメラスタンドは端材の合板に木ネジで固定してあり,この板をクランプで机に固定すれば完成。

なお,雲台などで使われるカメラネジは一般的なミリネジ(Mネジ)ではなく,インチネジ。1/4-20 UNC というやつです。これのボルトは外径6.35mmなので,金具は7mmくらいの穴が開いているのが最適。手回し用ノブつきカメラネジはカメラ用品店等で売ってますが,はさみこむ金具の厚さ+4.5mm(カメラネジの規格長)を目安に適切な長さのものを選びましょう。今回はちょうどいい長さの六角ボルトに別途購入のノブスター(M6ネジ用)を取りつけて使っています。

The camera unit (eyecamera and IR illumination)   The camera unit (eyecamera and IR illumination)   Components of the camera unit

この写真では,左目での計測に合わせて左寄りに設置しています。左の写真では赤外線照明が初号機,他の2枚では弐号機。

ついでにあご台も作ってみました。あごを乗せる部分はヘルメット用のチンカップ(あご当て)を流用してます。

PCの準備

Host PC

OptiTrack Camera SDKをNaturalPointのダウンロードページから入手してインストール。インストーラ任せです。続いてSimpleGazeTrackerをこの説明を参考にしてインストール。SGT ToolboxからSimpleGazeTrackerを使うだけなので,GazeParser本体やPython関係は不要。SimpleGazeTracker-○○○.msiというファイルだけインストールします(○○○はバージョンや使用するカメラによって違います)。

Client PC

すでにOctave/MATLAB + PTBの環境があるとして,そこへSGT Toolboxをインストールします。Downlod and setup sgttoolboxの指示に従い,sourceforgeからSimpleGazeTracker.msgttbx_net.c をダウンロードします。Octaveでこれらのファイルのあるフォルダに移動し,

mex sgttbx_net.c
と実行するとビルドされて sgttbx_net.mex ができます。

次に,この.mexファイルと SimpleGazeTracker.m のあるフォルダにOctaveのパスを通しておきます(以下,Octave + Ubuntuの例で説明します)。Octaveは起動時にユーザのホームフォルダにある .octaverc というファイルの中身を実行してくれるので,ここにパスを追加するコマンドを書きます( .octaverc がないときは,新しく作成します)。なお .octaverc は隠しファイルなので,ファイルブラウザでは「表示」→「隠しファイルを表示する」をすると見えるようになります。テキストエディタで .octaverc を開き,仮に上記SGT Toolboxのファイルがあるフォルダが /home/(ユーザ名)/sgttoolbox ならば,

addpath('/home/(ユーザ名)/sgttoolbox');
という行を加えます。Octaveを再起動してからpathコマンドを実行し,新しいパスが加わっていることを確認します。

TCP/IP接続

Host PC と Client PC がTCP/IPで通信できるようにします。まず,1本のLANケーブルで両者を直接つなぎます。P2P(ピア・ツー・ピア)ってやつですね。普通のストレートケーブルではなく,クロスケーブルを使います。(でも最近はピンを自動認識してストレートケーブルでもいけるらしい……ま,買っちゃったんで,素直にクロス使ってます。)

続いて,それぞれに固定IPを割り当てます。Windowsならこのへんを参考にしてTCP/IPv4のプロパティを開き,IPアドレスの自動取得ではなく,アドレスを直接入力します。Ubuntuでは「システム設定」の「ネットワーク」→「オプション」ボタン→「IPv4設定」タブで設定できます。使うのはプライベートIPアドレスです。たとえば Host PC が 192.168.0.1 で Client PC が 192.168.0.2 といった具合です。サブネットマスクは 255.255.0.0 としておきます。 【注意】この作業は大学などのネットワークに接続したまま行っていはいけません。必ず既存のネットワークから外し,Host PCとClient PCだけがクロスケーブルでつながれた状態で行ってください。この設定をした後に,そのまま大学等のネットワークにつないでもいけません。必ず元の設定(典型的には,DHCPによるIPアドレス自動取得)に戻してから,ネットワークに接続してください。

設定できたら,相手のIPアドレスにpingして通信できているか確かめましょう。例えば Host PCのコマンドプロンプトで

ping 192.168.0.2
と打って,「0%の損失」とか出ればOKです。※ネットワーク共有の設定やセキュリティソフトの設定によっては,P2Pがきちんとできていてもpingが通らないことがあります。

SGTを使ってみる

カメラが接続されたHost PCでSimpleGazeTrackerを立ち上げると,カメラの映像を元に瞳孔とプルキニエ像を検出してくれます。まずカメラと照明を目に向け,ピントを合わせます。次にSGTのパラメータ調整です。瞳孔検出の閾値,プルキニエ像検出の閾値,プルキニエ像の探索範囲などを調整し,安定して計測できるようにします。詳しくはGazeParserサイトの記事Adjusting cameraや,Calibration procedureを参照。うまくいくと,下右の画像(Host PCのスクリーンショット)のようにSGTが瞳孔とプルキニエ像をとらえてくれます。

SGT and subject with his gaze measured   Screen shot, sgt is detecting the pupil and Purkinje reflection

これでほとんど完成。あとはSGT Toolboxを使ったプログラムを書いて実験をするだけです。本家サイトのコマンドリファレンスサンプルプログラムを参考にしましょう。サンプルプログラムはキャリブレーションから計測,gaze-contigentな表示までやってくれます。キャリブレーションの方法はCalibration procedureを参照のこと。

カメラのテストやプログラムのデバッグ時,自分の目を映しながらカメラやPCを操作するのは無理なので,被験者役が欲しくなりますが,生身の人間を使うほどではないという場合がほとんどです。そんな時はダミー君にお願いしてみましょう。A4の紙に印刷し,あご台にでもはりつけて下さい。

プログラムが完成したら,いよいよ実際に人間でテストです。被験者役のI君に「写真が10秒間出てくるので好きにながめてくださいね,でもアイトラッカーのテストなので一点を見続けるんじゃなくて目を動かしてみてね」とお願いして試したところ,下のようにきちんと視線計測できました! I君ナイスサッケードありがとうございました。

The gaze trace measured by SGT Toolbox

References

Last modified: 2020.2.7.
Copyright © 2009 Ryosuke NIIMI.