PsychoPyで試行ごとにランダムな位置に刺激提示2 - 井関龍太のページ

ホーム   編集 凍結 差分 バックアップ 添付 コピー 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

PsychoPyで試行ごとにランダムな位置に刺激提示2

Last-modified: 2017年08月25日 (金) 22:57:12 (452d)
Top > PsychoPyで試行ごとにランダムな位置に刺激提示2

画面内のランダムな位置に画像を配置したい

PsychoPyのBuilderをベースとして使って,Codeコンポーネントを利用することで試行ごとに画面内のランダムな位置に刺激を配置するサンプルについては以前に紹介しました(PsychoPyで試行ごとにランダムな位置に刺激提示)。
しかし,このときのサンプルでは,個別の刺激要素をTextコンポーネントやPolygonコンポーネントで指定した場合にはあまり問題はないのですが,Imageコンポーネントを使った場合には限界がありました。
具体的には,Imageコンポーネントの数が多いと刺激が表示されません。
環境にもよると思いますが,私が試したPCでは,3~4個程度の画像ならすべての刺激が問題なく表示されますが,5個を超えると背景しか表示されなくなりました。
一般に,画面内にランダムに刺激を配置したい場合は10個程度の刺激を提示したいのではないでしょうか(さまざまな研究目的があるので一概にはいえませんが,経験的な感覚です)。

そこで,別のアプローチを使ってもっとたくさんの画像をランダムに配置できるサンプルを作ってみました。
PsychoPyで試行ごとにランダムな位置に刺激提示のサンプルでは,わかりやすさのために,刺激ひとつひとつに対応するコンポーネントをルーチン上に作成するというアプローチを採用していました。
しかし,すでに述べた通り,Imageコンポーネントをたくさん配置すると処理負荷が高くなりすぎるようです。
今回のサンプルでは,画像一つずつに対してImageコンポーネントを逐一用意することをやめ,ルーチン開始時に刺激画像を直接読み込んで提示画面を生成することにしました。
このようにすれば,もとの画像は複数ありますが,PsychoPyのプログラム上では一枚の画像として扱われるので負荷は軽減されるだろうと考えたからです。
画面への提示と消去はCodeコンポーネント上で制御しています。
このようにすることで,10個以上の画像を要素としても試行ごとにランダムな位置に配置した画面を提示できるようになりました。

以前に公開していたバージョンでは提示時間を正しく制御できないことがわかったので,内容を修正して新たなバージョンをアップロードしました(2017-08-25)。

サンプルの概要

まず,サンプルのファイルをダウンロードしてください。
下のアイコンを右クリックして「対象をファイルに保存」を選んでください。
または,保存のポップアップから「ファイルを保存する」を選んでください。
プログラムはPsychoPy v.1.85.2で作成しています。

fileRandomPosition2.zip

ダウンロード対象はzipフォルダになっていますので,右クリックして「すべて展開」を選び,圧縮フォルダを展開してください。
PsychoPyで作成した実験ファイル(RandomPosition2.psyexp)のほかに,Excelファイルがひとつとpngファイルが6つ入っています。
これらは実験ファイルとリンクさせて使用する条件設定用のファイルと刺激として使用する画像ファイルです。
いずれのファイルも実験ファイルと同じディレクトリ(同じフォルダ)に配置してください。

サンプルの内容は,試行ごとに4つの刺激がランダムな位置に1秒間現れ,キーを押すたびに次の試行に移るというものです。
キーを押さない場合は,刺激画面は最大で3秒間表示されます。
ダウンロードしたフォルダ内には6つの画像ファイルがありますが,各試行ではそのうち4つを表示するように条件ファイルによって設定しています。
サンプルなので画像は少なめにしてありますが,10個以上に増やしても動作することは確認してあります。

disp1.png

上で説明した通り,ルーチン上にはCodeコンポーネントとKeyboardコンポーネントしかありません。

disp2.png

“実験開始時”のタブでrandomルーチンを呼び出しています。

disp3.png

“Routine開始時”のタブに画像を読み込んで画像を生成するためのコードを書いています。
基本的な構成は,PsychoPyで試行ごとにランダムな位置に刺激提示のサンプルと同じで,仮想グリッド上に刺激を配置しています。
ただし,今回はルーチン上にあるコンポーネントの位置を指定するのではなく,画像を直接読み込んで画面上に表示するように指定しています。
読み込む画像ファイル名は条件ファイルで指定しています。
最後に,各画像にAutoDrawを設定して自動で描画されるようにしています。

disp4.png

”フレーム毎”のタブには,試行開始から3秒以上経過したらAutoDrawをオフにして画面から刺激が消えるように指定しています。

disp5.png

3秒以内に反応がなされた場合,そのままでは刺激画面が消えないので,”Routine終了時”のタブにも同様の処理を指定しています。

カスタマイズの方針

読み込む画像の数を増やすには,Codeコンポーネントの“stimList”の要素を増やします。
この“stimList”の要素は,条件ファイルのヘッダ名(一行目)と一致させる必要があります。
その他については,基本的にPsychoPyで試行ごとにランダムな位置に刺激提示と同じです。
今回の例では,Routine開始時からすぐに刺激を提示していますが,注視点やブランク画面がしばらく現れてから刺激画面を出したいこともあるでしょう。
そのような場合には,”フレーム毎”のタブの内容を書き換えて,試行開始から一定の時間間隔のあいだだけ描画がなされるように指定するとよいでしょう。
たとえば,試行開始から1秒後に刺激画面を提示しはじめ,1秒経過したら消したい場合には,”t >= 1.0 and t < 2.0”のように条件文の内容を書き換えるとよいでしょう。
ただし,この方法を使ってごく短い時間で表示を切り替えるのは難しいようです(100~200 ms提示など)。
そのようなシビアな時間制御が必要とされる実験では,Coderを使ってプログラムを書いたほうが早いかもしれません。

TrackBack(0) | 外部リンク元 | このエントリーをはてなブックマークに追加

添付ファイル: filedisp5.png 148件 [詳細]   filedisp4.png 139件 [詳細]   filedisp3.png 205件 [詳細]   filedisp2.png 174件 [詳細]   filedisp1.png 194件 [詳細]   fileRandomPosition2.zip 226件 [詳細]