PsychoPy Builder
ステップアップ
モジュール活用&視線計測編
視覚実験プログラミングワークショップ2018
講師:十河宏行 内藤智之
このセッションの目標
• Standalone PsychoPyにパッケージを組み込む
• オリジナルのコンポーネントをBuilderに組み込む
• psychopy_tobii_controllerを使う
2
Standalone PsychoPyに
パッケージを組み込む
• Pythonのパッケージはpipなどでインストールするように作られ
ているものが多い。
• Standalone PsychoPyの場合、pipがうまく機能しない場合がある。
公式ドキュメントには以下の二つの方法が紹介されいる。
• PsychoPy設定ダイアログの「パス」を使う
• .pthファイルを使う
3
PsychoPy設定ダイアログの「パス」を使う
PsychoPyの設定ダイアログにはパスという項目
がある。
ここに書いたパスにパッケージをインストー
ルすると、PsychoPyから利用できるようになる。
4
.pthファイルを使う
Pythonがモジュールを検索するパスの
どこかに拡張子.pthのテキストファイル
を置いておくと、そのファイル内に書
かれたパスも検索する。例えば
C:¥Users¥foo¥Desktop¥mylib
という内容をmylib.pthという名前で保存
してPythonのsite-packagesフォルダに入
れておくと、上記フォルダ内に置かれた
パッケージも使用できるようになる。
WindowsのStrandalone PsychoPyなら
C:¥Program Files(x86)¥PsychoPy2¥lib¥site-packages
MacOSならパッケージの内容を表示して
Contents/Resources/lib/python2.7/site-packages
などですね。
5
設定ダイアログの
「パス」
.pthファイル
〇 ×
PsychoPyの設定ファイルに保存
されるのでStandalone PsychoPy
を再インストールしても影響
されない。
Standalone PsychoPyを再
インストールすると.pth
ファイルを設置しなおす
必要がある。
PsychoPyをimportしない
と使えない。
PsychoPyをimportしなくても使
える。
導入するパッケージをPsychoPy以外からも使用したい場合は.pthの
方がいいだろう。
6
オリジナルのコンポーネントを
Builderに組み込む
PsychoPyの設定ダイアログにはコンポーネント
フォルダという項目がある。
ここに書かれたフォルダにコンポーネントを
配置するとコンポーネントを追加することが
出来る。
7
Builder用コンポーネントは1.84で大きく変化し、互換性がない。
まず1.84以降のコンポーネントのファイル構成を示す。
MyComponent
__init__.py
MyStim.py
MyStim.png
モジュールの読み込みに必要
コンポーネント本体
コンポーネントのアイコン
8
例えばC:/Users/foo/DocumentsにMyComponentをコピーしたとする。この
場合、PsychoPyの設定ダイアログのコンポーネントフォルダに
'C:/Users/foo/Documents/MyComponent'
を追加する。Windowsでもパスの区切り文字に / が使える。
Builder、Coderを一度すべて終了して再び起動すると、MyComponent
フォルダの中にさらにMyComponentフォルダが作られて、大元の
MyComponentフォルダの中身がコピーされている。
とっても変な感じだが、これが正常な動作なのでコピーされたファイル
等を削除してはいけない。
9
中には最初から以下のような構成になっているBuilder用コンポーネント
もある。この場合は同名のフォルダのうち上位のフォルダをPsychoPyの
設定ダイアログのコンポーネントフォルダに追加する。
MyComponents
__init__.py
MyComponents
__init__.py
MyStim.py
MyStim.png
同名のフォルダがある
コンポーネントの本体
10
1.83およびそれ以前のバージョンのコンポーネントは、フォルダを多重
にしない。また、__init__.pyは不要なので含まれていない。
MyComponents
MyStim1.py
MyStim1.png
このフォルダを
設定ダイアログに指定する
MyStim2.py
MyStim2.png
__init__.pyは不要
11
コンポーネントの読み込みに成功すると、
Builderのコンポーネントペインにアイコン
が追加される。
既存のカテゴリに含まれるか独自のカテゴ
リが追加されるかは、コンポーネント側の
定義による。
12
練習
GazeParserとコンポーネントを組み込む
http://gazeparser.sourceforge.net/
オープンソースのアイトラッカーSimpleGazeTrackerをPsychoPyから利用できる
パッケージ。Builderのコンポーネントがついていて、アイトラッカー無しで
も動作確認が出来るダミーモードが備わっている。
13
PsychoPyのバージョン 用意するもの
1.82.01より前
GazeParser 0.8.1
Components0.8.1-PsychoPy1.82.01.zip
1.82.01~1.83系
GazeParser 0.10.0
(GazeParserComponents1.83を使用)
1.84.0~
GazeParser 0.10.0
(GazeParserComponentsを使用)
PsychoPyの仕様変更のため、1.82.01より前のバージョンを使っている場合は
0.8.1および専用のコンポーネントを使う必要がある。1.83までと1.84以降は
先述のとおりフォルダ構成が異なるため、それぞれに用意されたものを使う
必要がある。
14
一般的なPythonパッケージのソースには
setup.pyというファイルが含まれている。
setup.pyが含まれる階層にあるモジュール
名のファイルまたはフォルダがモジュー
ルの本体であることが多い。
モジュールと
同名のフォルダ
setup.py
特殊なハードウェア用のモジュールや、
高速化のためにコンパイル済みの共有
ライブラリを利用するモジュールなど
にはさまざまなケースがある。
モジュールがフォルダになっている場合はその中に
__init__.pyというファイルがあるはずです
15
作業しましょう!
C:¥
Users
Foo
MyPyLib
GazeParser
GazeParser-0.8.1
GazeParser
モジュールを置く
フォルダを作る
1
モジュールを
コピーする
2
設定ダイアログに
入力する
3
フォルダのパスはPythonの
シーケンスとして入力します
16
作業しましょう!
設定が済んだらCoderウィンドウ下部の
「シェル」から
ImportError: No module named GazeParser
と言われたらどこかで失敗している。
import GazeParser
GazeParser.__version__
GazeParser.__file__
を実行してみる。さらに
を実行して、バージョンやファイルの
位置が正しいことを確かめる。
17
作業しましょう!
続いてGazeParser Builderコンポーネント
を配置してみる。
C:¥
Users
Foo
MyComponent
GZPComponents
コンポーネントを置く
フォルダを作る
1
コンポーネントを
コピーする
2
設定ダイアログに
入力する
3
1.84以降は自動コピーに
頼るか同名フォルダ重ね
1で作ったフォルダではなく2で
コピーしたフォルダを指定!
18
作業しましょう!
設定を済ませたらBuilder、Coderを一度すべて
終了して再び起動する。
GazeParserのコンポーネントアイコンが表示さ
れていれば設定完了である。
右図のようにCoderの「出力」にエラーが
表示される場合は、バージョンに合った
コンポーネントを使っていないか、コン
ポーネント自体に何か問題(バグなど)が
ある。
19
PsychoPyが起動すらしなくなったときは…
設定に誤りがあり、なおかつ起動時にBuilderを開くように設定されて
いると、最悪の場合PsychoPyが何も表示されずに終了されてしまう。
本当はコンソールにエラーが出力されているのだが、
実行環境によっては確認するのは不可能。
※
設定ファイルを直接編集するか、設定ファイルを初期化する。
20
設定ファイルは以下の場所にある。
Linux, MacOS ~/.psychopy2
Windows %APPDATA%¥psychopy2
設定ファイルは以下の2つである。上記フォルダには、他にモニター
の設定や、初回実行時の動作テスト結果をまとめたHTMLファイルなど
がある。
appData.cfg
ウィンドウの位置や最後に使った
ファイル名の情報など
userPrefs.cfg 設定ダイアログの内容
21
# Settings for the Builder window[builder]
# whether to automatically reload a previously open experiment
reloadPrevExp = False
# if False will create scripts with an 'easier' but more cluttered namespace
unclutteredNamespace = False
# folder names for custom components; expects a comma-separated list
componentsFolders = C:¥Users¥Foo¥MyComponent¥GazeParserComponents,
UserPrefs.cfgの以下の行が先ほど設定した項目に対応している。これらの
行を修正すればよい。
# General settings[general]
# which system to use as a backend for drawing
winType = pyglet # the default units for windows and visual stimuli
units = norm # full screen is best for accurate timing
fullscr = False # enable subjects to use the mouse and GUIs during experiments
allowGUI = True # 'version' is for internal usage, not for the user
version = "" # Add paths here to your custom Python modules
paths = C:/Users/Foo/MyPyLib,
22
UserPrefs.cfgとappData.cfgは、PsychoPy起動時に存在しなければ
初期設定の値で自動的に再構築される。
なので、PsychoPyが起動しない時や動作がおかしい時には、
UserPrefs.cfgとappData.cfgのバックアップをとってから削除して
PsychoPyを再起動するとよい。
バックアップを取っておいて再構築された
ファイルと比べると理由がわかるかも知れ
ませんよ
23
psychopy_tobii_controllerによる
tobiiとpsychopyの連携
https://github.com/hsogo/psychopy_tobii_controller/releases
Tobii Pro SDKをPsychoPyから利用するためのwrapperパッケージ。
Builderのコンポーネントが付属している。
24
Psychopy_tobii_controllerはGazeParserと同様の方法でインストール
できるが、使用するにはさらにtobi-researchというパッケージが
必要である。
インストールにはpipを使うか、PyPIのtobii-researchのページから
自分のOSとPythonに合致したwhlファイルをダウンロードして展
開して「パス」の設定を使う方法か.pthを使う方法でPsychoPyに
組み込む。
25
次のスライドからWindows版での作業例を
示します。
ubuntuなどでは単にpip install tobii-research
を実行するだけでOKです。
26
https://pypi.python.org/pypi/tobii-research
ブラウザでPyPIのtobii-researchのページを開く。
27
tobii_research-1.3.1-cp27-cp27m-win32.whl
自分のシステムに適合するファイルを選んでダウンロードする。
パッケージ名
パッケージの
バージョン
Pythonの
バージョン
Pythonの動作環境
ポイントは2点です。2018年2月9日現在、Standalone PsychoPyは
Python2.7系を採用しているのでPythonのバージョンはcp27です。
また、Windowsを使っている方は、Windows版Standalone PsychoPyが
32bit版のPythonを採用しているのでwin32用を使う必要があります。
Windowsが64bitだからってwin_amd64用を使ってはいけません。
2018年2月9日現在の話です。
将来的はWin版も64bitになると思われます。
28
whlファイルを展開して必要なファイルを取り出す。
whlファイルはZip形式なので拡張子を
Zipに変更すれば普通に展開できます。
Zipファイル内のpurelibという
フォルダの内容がパッケージ
の本体です。
PsychoPyの設定の「パス」や.pthファイルで
指定したフォルダコピー
ptc_init
Psychopy_tobii_controllerを初期化する。
実験にひとつ必要。
ptc_cal
Tobiiのキャリブレーションを行う。
画面は自動的に描画される。
ptc_rec 配置されたルーチンで視線の計測を行う。
ptc_message
データファイルにメッセージを挿入する。
計測中のみ有効。
ptc_getpos
最新の視線座標を取得する。
計測中のみ有効。
psychopy_tobii_controllerのBuilderコンポーネント
29
ptc_init ptc_cal ptc_rec
必要に応じて
繰り返し
必要に応じて
繰り返し
必要に応じて使う
一般的なフロー
30
課題
アンチサッカードを計測してみよう
Ready?
画面中央に点が表示され、実験参加者はその点を固視する。点が
左右どちらかの枠へジャンプしたら、実験参加者は反対側の枠へ
出来るだけ早くサッカードを行う。
スペースキーを押す 1.0, 1.5, または2.0秒 開始から3.0秒まで
31
画面描画とキー押し検出をBuilder
で作成。
これにpsychopy_tobii_controllerの
コンポーネントを追加していく。
32
Step1
初期化とキャリブレーションを行う
まず初期化とキャリブレーションの
コンポーネントを組み込む。
初期化は一度しか行わないのでルー
プの外側にルーチンを新規作成して
そちらに置く。
初期化とキャリブレーションのコンポーネント
は専用のルーチンに置くことをお勧めします。
33
基本
Tobii eyetracker ID
装置のIDを整数で指定する。1台しか接続して
いなければ通常は0である。
Tobii_controller Data File
Tobiiのデータを保存するファイルの名前を指
定する。
高度
Embed event
チェックするとデータファイルにてイベント
が眼球運動データの中に埋め込まれて出力さ
れる。
ptc_initコンポーネントのプロパティ
34
基本
Show status
チェックしておくと、キャリブレーション開始前にス
テータス画面を表示する。
Calibration points
キャリブレーションのターゲット位置をリストで指定
する。単位はPsychoPyの設定に従う。
Shuffle
チェックしておくと、キャリブレーションターゲット
位置がシャッフルされる。
ptc_calコンポーネントのプロパティ(1)
35
基本
Enable mouse operation
チェックするとキャリブレーション画面でマウ
ス操作が可能となる。
Start key
キャリブレーション開始キーをPsychoPyのキー
名で指定する。
Decision Key
キャリブレーション確認画面での決定キーを
PsychoPyのキー名で指定する。
Text color キャリブレーション画面の文字色を指定する。
Motion duration
キャリブレーションターゲットの外側の円が収
縮するアニメーションの時間を指定する。
ptc_calコンポーネントのプロパティ(2)
36
initルーチン(追加する)
• ptc_initコンポーネントを設置し、Tobii_controller Data Fileに以下の値を設定する。
• ptc_calコンポーネントを設置する。
$expInfo['data file']
実験の設定ダイアログ
• 「基本」タブの「実験情報ダイアログ」にdata fileというフィールドを追加して、
初期値をdata.tsvにする。
37
作業しましょう!
Step2
計測を行う
視線計測を行うルーチンにコンポー
ネントを追加する。
ただrecコンポーネントを設置する
だけでよいが、イベントを設定して
おくとデータ管理に便利である。
38
高度
Event (start)
計測開始時に挿入するイベントテキストを
指定する。
Event (stop)
計測終了時に挿入するイベントテキストを
指定する。
ptc_recコンポーネントのプロパティ
※ このコンポーネントの「基本」タブは「名前」のみである。
39
trialルーチン
• ptc_recコンポーネントを設置する。このコンポーネントは通常ルーチン内で他の
コンポーネントとの順番を考慮する必要はないが、Codeコンポーネントで設定し
た値をptc_recで使用する場合などには注意を要する。
• ptc_recのEvent (Start)に以下の値を設定する。
$'Trial {} Start'.format(trials.thisN+1)
• ptc_recのEvent (End)に以下の値を設定する。
$'Trial {} End'.format(trials.thisN+1)
これでデータファイルにおいて各試行の視線データの最初と最後に
Trial 1 StartやTrial 1 Endといったイベントが入ります
40
作業しましょう!
Step3
イベントを記録する
PsychoPyとTobiiは別々の時計を使用
しているので、両者のタイムスタン
プは一致しない。
イベントを記録しておくと、両者の
時刻合わせが容易になる。
イベントの記録には、ptc_message
コンポーネントを用いる
41
基本
time イベントを記録する時刻を指定する。
time type
時刻指定方法を選択する。PolygonやTextなどの
「開始」で選べるものと同じである。
Event イベントとして挿入するテキストを指定する。
ptc_messageコンポーネントのプロパティ
42
trialルーチン
• ptc_messageコンポーネントを設置する。このコンポーネントは通常ルーチン内で
他のコンポーネントとの順番を考慮する必要はないが、Codeコンポーネントで設
定した値をptc_messageで使用する場合などには注意を要する。
• ptc_messageのtimeに以下の値を設定し、Time typeを「時刻(秒)」にする。
これでターゲット出現時刻にTarget at [0.5, 0]のように
イベントが記録されます。
• ptc_messageのEventに以下の値を設定する。
$'Target at {}'.format(target_pos)
43
stim_on
作業しましょう!
Step4
視線位置マーカーを描画する
アンチサッカード実験としては不要
なStepだが、実験中にリアルタイム
に視線データを使いたい場合の例と
して視線位置に黄色い円を描画する。
ptc_getposコンポーネントを用いる
と、フレーム毎に最新の視線位置の
座標データをTobiiから取得できる。
44
基本
Binocular Data
Averageならば両眼の座標の平均値、LRならば左眼と
右眼の座標を並べたリストが得られる。Averageで片
眼のみ検出できている時には検出できた眼の座標と
なる。
Filler
視線が検出できなかったときに代わりに用いられる
値を指定する。
ptc_getposコンポーネントのプロパティ
45
trialルーチン
• ptc_getposコンポーネントを設置する。フレーム毎にこのコンポーネントを実行す
ることによって視線の座標が更新されるので、座標を利用するコンポーネントは
このコンポーネントの下に配置されるべきである。
• Pollygonコンポーネントを置き、名前をmarkerとする。
• 「終了」を「時刻(秒)」にし、値を3にする。
• 「頂点数」を64に、「サイズ[w,h]」を[0.2, 0.2]とする。
• 「位置[x,y]」の値をptc_getposコンポーネントの「名前」と一致させる。
• 「位置[x,y]」を「フレーム毎に更新」にする。
• 「塗りつぶしの色」をNoneに、「輪郭線の色」を$[1,1,-1]にする。
46
作業しましょう!
練習問題
• 現在の視線の座標値をTextコンポーネントで表示できるように
せよ。
• 視線が左右の枠に近づいたら枠内を塗りつぶすようにせよ。
• ヒント:Step4のマーカーを透明にして描画しないようにし、overlaps()
メソッドを使ってマーカーと枠が重なったら枠内を塗りつぶす。
47

PsychoPy Builder:モジュールの組み込みと視線計測