2016-06-15 24 views
0

私はPsychoPy/PyGazeを使って刺激を与え、EyeTribeアイトラッカーで眼の動きを追跡する実験をしています。この実験では、各フレーム(60 Hz)で2つの視覚刺激のサイズを更新します。あらかじめ各フレームを準備しておき、後にすべてのスクリーンオブジェクトをループして提示します。一方、連続音が鳴っています。この実験をダミーモードで実行すると(マウスの動きが注視位置のシミュレーションとして使用されます)、ビジュアルプレゼンテーションにタイミングの問題はありません。しかし、アイトラッキングを実行しながら実験を実行すると、視覚的提示のタイミングはもはや正確ではありません(フレームの持続時間の変動性が高い)。タイミング問題Psychopy PyGaze EyeTribeアイトラッカー(マルチスレッド)

私はもっと多くのスレッドを調べてみましたが、PyGazeのpytribeスクリプトでは、1つのスレッドがアイトラッキングスレッドからのイベントを待っているという証拠は見つかりませんでした。だから、私はどのようにタイミングの問題を引き起こしているか、またはこれを解決する方法を把握するためのアイデアはありませんか? (私は問題を十分に具体的に説明したいと思う)。

答えて

1

これは、アイトラック対刺激レンダリングのために別のスレッドを必要とするよりも悪いです。あなたが本当に必要とするものは、別のプロセスであり、python Global Interpreter Lock(GIL)を回避します。 GILは、異なるスレッドが異なるプロセッサ上で実行されるのを防ぎます。

時間精度を向上させるために、私は実際にpygazeからiohub(これはまた私が信じるeyetribeをサポートしています)に切り替えることをお勧めします。 iohubは可能な限り機械の別のコアで真に走りますので、刺激や目のデータを時間内に独立して処理でき、同期のすべてを処理できます。

+0

親愛なるジョンを。答えをありがとう。私はあなたのtimeByFramesのデモを実行し、アイオブを使って目を追跡するかどうかを調べました。アイトラッキングを使用しない場合、私は16.7ms(SD = 1.29)の平均フレームレートと0.4%のフレーム落ちを得ますが、アイトラッキングでは2%のフレーム落ちで平均13.6ms(SD = 2.18)私のCPU:Intel(R)Core(TM)i5-5300U CPU 2.30 GHz。ビジュアルプレゼンテーションのタイミングは、自分のモニターのリフレッシュレートよりも速くなりますか?垂直方向の空白の間隔は、目の追跡プロセスによって何らかの影響を受けますか? – Hanne

+0

誰かが同じ問題にぶつかることがあれば、このコメントを追加するだけです。 Spyderの代わりにコマンドプロンプトからスクリプトを実行すると、ビジュアルプレゼンテーションのタイミングがiohubで良好になります。 – Hanne

+0

情報ありがとうございました。私はいつも、スパイダーが人々のために遅くなることを心配していました。おそらく、デバッグを可能にするためにさまざまな追加の機能が実行されているからです。 ところで、上記の答えがあなたのために働くならば、あなたはそれを回答/正しいものとしてマークできますか?乾杯 – Jon

1

Jonの答えに追加する:Hanneも問題について電子メールを送り、Spyderから実験を実行していたことが分かりました。コマンドプロンプトから実行する場合、タイミングの問題はないはずです。 (明らかに、GILは依然として残っていますが、実際にはこれは画面のタイミングに影響しないようです。)

今後問題が発生するのを防ぐために、EyeTribeを並列で実行するクラスを追加しましたプロセス。参照:https://github.com/esdalmaijer/PyTribe/blob/master/pytribe.py#L365

使用例:

 
if __name__ == "__main__": 

    from pygaze.display import Display 
    from pygaze.screen import Screen 
    from pytribe import ParallelEyeTribe 

    disp = Display() 

    scr = Screen() 
    scr.draw_fixation(fixtype='cross') 

    tracker = ParallelEyeTribe() 


    tracker.start_recording() 

    disp.fill(scr) 
    disp.show() 
    tracker.log("Stimulus onset") 

    time.sleep(10) 

    disp.show() 
    tracker.log("Stimulus offset") 
    tracker.stop_recording() 

    tracker.close() 
    disp.close()