Windows用Portable VisionEgg/PsychoPy

Pythonで心理実験 例題15-1で触れた、Portable PythonにVisionEggを導入したものです。 同様の手法でPsychoPyを導入したものも用意しました。 大学の情報処理室のWindows機など、PythonをインストールできないマシンでもVisionEggやPsychoPyを使用することが出来ます。

一応、十河の研究室のPCおよび所属部局の端末室のPCで動作確認をしていますが、皆さんが使用しているPCでの動作は保証できません。

使用するPCがvsyncへの同期に対応していない場合(Intelの統合グラフィックス搭載の端末など)はswap/flipの周期が予想できませんので、swap/flipの回数で時間を制御するような実験スクリプトを書くのは避けるべきです(60Hzのリフレッシュレートを前提として100ms刺激を提示するために6回swap/flipを行うなど)。

なお、MoveStim2(BuilderのMovieコンポーネントのopenccvバックエンド)を使う場合は別途Portable版のVLC Media Player ( http://portableapps.com/apps/music_video/vlc_portable )が必要です。ダウンロードして、Portable PsychoPyを入れているドライブのルートに展開してください。例えばPortable PsychoPyが入っているUSBメモリがG:ドライブとして認識されているならば、G:\の直下に展開してください(G:\VLCPortableとなるようにする)。

更新履歴

  • 2016/10/28

    • PsychoPy 1.84.2 を導入しました。 多忙のため十分なテストが行えていません。不具合に気づかれた方は十河までご連絡ください。
  • 2016/05/11

    • PsychoPy 1.83.01 を導入しました。
  • 2015/09/30

    • PsychoPy 1.82.02 を導入しました。単に1.82.01plusに1.82.02のZipを入れただけです。もはや1.79.01、1.80.06を使う理由はないと思いますのでこれに伴ってサーバーから削除しました。
  • 2015/06/22

    • PsychoPy 1.82.01 を導入し、レポジトリの最新の更新を一部反映させたものを用意しました(バージョン名にplusと入っているのはそのため)。BuilderやCoderのメニューの日本語化、MovieStim2への対応など、大きくバージョンアップしています。アイトラッカーやI/Oボードなどのハードウェアを必要とするものは動作確認していません。また、残念ながら音声、動画関係の機能はPCによって動作したりしなかったりします。
  • 2014/08/11

    • PsychoPy1.80.06を 1.79.01 に差し替えたものも用意しておきました。Routineパネルの表示の乱れさえなければ1.79.01はよいバージョンだと思います。これに伴って1.75.01、1.78.01をサーバーから削除しました。
  • 2014/08/11

    • PsychoPyのバージョンを 1.80.06 にしました。Builderがかなり強化されていますが、 動画を再生すると左右反転されてしまうというバグがある ので動画を刺激として使う人は注意してください。

    • 以下のパッケージを導入しました。これでioHubのサンプルのうち、アイトラッカーやI/Oボードなどのハードウェアを必要としないものが動作するようになりました。

      • pyserial 2.7
      • pyparallel 0.2.5
      • pyyaml 3.11
      • psutil 2.1.1
      • msgpack-python 0.4.2
      • numexpr 2.0.1
      • pytables 2.4.0
      • pyhook 1.5.1
      • gevent 1.0b1
      • greenlet 0.4.0
  • 2013/11/21

    • PsychoPy Builderを実行した時にpygameがないというエラーが出るので pygame1.9.2a0 を組み込みました。公式でpygame依存はもうやめると宣言が出て久しいですが完全移行にはまだまだ時間がかかるのかもしれません。
    • PsychoPy BuilderとIPythonを起動するためのランチャーを作りました。アイコンで区別できるのでバッチファイルよりは多少わかりやすいと思います。機能的にはバッチファイルのものと違いはありません。
  • 2013/11/08

    • PsychoPyのバージョンを 1.78.01 にしました。iohubの依存パッケージをインストールしていないので、iohubの機能は使用できません。とりあえず簡単な動作確認はしていますが、思わぬ不具合があるかも知れません。念のため旧バージョン(1.75.01)も残しておきます。
  • 2012/11/19

    • PsychoPy公式インストールガイドのDependenciesにPyOpenGLは含まれていないのですが、PyOpenGLがないとMonitor Centerが開かないので PyOpenGL 3.0.2 を追加しました。
    • PsychoPy Builder/Coderの設定ファイルをコピーする動作を追加したバッチファイル(psychopy_copyconfig.bat)を作成しました。
    • ファイルのダウンロードおよび展開の負担を軽減するためにpycファイルを削除しました。初回の実行時には余分に時間がかかりますが、2回目以降は11/13バージョンと同様の速度で起動するはずです。
  • 2012/11/13

    • とりあえず公開。使用しているパッケージは以下の通りです。

      • VisionEgg

        • Portable Python1.1_py2.5.4
        • setuptools 0.6c9
        • pyopengl 2.0.2.01
        • VisionEgg 1.2.1
      • PsychoPy

        • Portable Python 2.7.2.1
        • distribute 0.6.30
        • pyreadline 2.0_dev1
        • ipython 0.13.1
        • pyglet 1.1.4 + avbin-5
        • lxml 2.3.0
        • openpyxl 1.6.1
        • psychopy 1.75.01

使い方

ダウンロードしたzipファイルを展開してUSBメモリなどにコピーしてください。 書き込み速度が遅いUSBメモリを使用している場合はまずHDD上で展開してからUSBメモリにコピーすることをお勧めします。

展開すると、以下のようにPortable Pythonが格納されたディレクトリとIPythonを起動するバッチファイルがあるはずです。 PsychoPy版の場合はPsychoPy.bat、PsychoPy_copyconfig.batというバッチファイルもあるはずです。

../_images/portable01.png

(注: 最初Zipファイルを展開した時にはpsychopy2というディレクトリはありませんが、PsychoPy_copyconfig.batを実行すると自動的に作成されます。)

PsychoPy 1.78.01版ではバッチファイルの代わりにランチャーが入っています。アイコンで見分けやすいようにexe化しただけで、バッチファイル版と機能は同じです。

../_images/portable02.png

PsychoPyのBuilderやCoderを使う場合は、PsychoPy.batをダブルクリックするとBuilderまたはCoderが起動します。 特に最初の起動には時間がかかりますので気長にお待ちください。

PsychoPyの仕様上、Preferencesで設定した内容はPC本体の%AppData%\psychopy2というディレクトリに保存されてしまい、USBメモリには残りません。 設定ファイルを一緒に持ち運びたい場合はPsychoPy.batの代わりにPsychoPy_copyconfig.batを使ってPsychoPyを起動してください。 このバッチファイルでは、PsychoPyを起動する前にまずPsychoPy_copyconfig.batと同じディレクトリにあるpsychopy2というディレクトリを%AppData%に保存します。 そしてPsychoPyが終了したときに%AppData%\psychopy2をPsychoPy_copyconfig.batと同じディレクトリにコピーします。すでに設定ファイルがPCにある場合でも何もメッセージを出力せずに上書きしてしまいますのでご注意ください。上書き確認をするようにしたい場合は、バッチファイルを編集して以下の例のようにxcopyの/Yというオプションを/-Yに変更してください。

xcopy /D /E /S /-Y psychopy2 %AppData%\psychopy2\
"Portable Python 2.7.2.1\App\python.exe" "Portable Python 2.7.2.1\App\Lib\site-packages\PsychoPy-1.75.01-py2.7.egg\psychopy\app\psychopyApp.py"
xcopy /D /E /S /-Y %AppData%\psychopy2 psychopy2\

VisionEggを使う場合や、PsychoPyでもCoderを使わず直接スクリプトを実行したい場合などは、IPython.batをダブルクリックしてIPythonを起動し、run foo.pyという具合にrunコマンドでスクリプトを実行します。 この方法を使う場合はスクリプトが終了しても自動的にVisionEggやPsychoPyのウィンドウが閉じないので、必ずスクリプトの中でcloseメソッドを使ってウィンドウを閉じるようにしてください。 スクリプトのエラーなどによりウィンドウをcloseする前に停止してしまった場合は、Alt+Tabなどを利用してIPythonのウィンドウをアクティブにし、IPythonから直接closeを実行してウィンドウを閉じてください。

In [1]: screen.close()
#VisionEggでscreen = VisionEgg.Core.get_default_screen()としてウィンドウを作成した場合

In [1]: win.close()
#PsychoPyでwin = psychopy.visual.Window()としてウィンドウを作成した場合

IPythonから実行すると上手く動作しない場合は、コマンドプロンプトを起動して直接実行することも出来ます。例えば、

  • zipファイルを展開したUSBメモリがFドライブとしてマウントされている
  • カレントディレクトリがF:\
  • F:\PortablePython_1.1_py2.5.4にPortable Pythonが展開されている
  • F:\foo.pyが実験用のスクリプトである

という状況ではコマンドプロンプトから以下のコマンドを実行すれば実験用スクリプトを走らせることが出来ます。 Windows7のコマンドプロンプト(cmd.exe)の場合、途中までパスを入力してTabを押すとパス名を補完する機能がありますので利用すると楽です。

F:\> PortablePython_1.1_py2.5.4\App\python.exe foo.py

パスの中に空白文字を含む名前がある場合は” “でくくります。例えば上の例でPortable Python 2.7.2.1というディレクトリ(PortableとPythonの間にスペースが入っている)にPortable Pythonが展開されている場合は

F:\> "Portable Python 2.7.2.1\App\python.exe" foo.py

という具合にします。

最大4台のwebカメラの映像をひとつの動画ファイルにまとめて保存するmultiwebcam (Windows用)

題名の通りです。pythonで心理実験 例題17-3 からの派生です。本来py2exeとかを使ってpythonをインストールしていないマシンでも使えるexeファイルを作ろうとしていたのですが、VideoCaptureが問題となってうまくいかなかったので数時間で挫折しました。というわけで、python2.x本体(3.xは不可)と以下のモジュールをインストールしておく必要があります。

また、ffmpegの実行ファイルが必要ですのでダウンロードしておいてください。ffmpegは公式にはWindowsバイナリが配布されていないと思いますが、こちら( お気に入りの動画を携帯で見よう )で配布してくださっています。動作確認にはrev.31420を使用しています。

以下のファイル(multiwebcam.py)を適当な場所に保存してください。ffmpegの実行ファイルはパスが通った場所に置くか、multiwebcam.pyと同じ場所に置いてください。

multiwebcam.py (最終更新日:2012/2/17)

更新履歴

  • 2012/2/17

    • とりあえず公開。

使い方

起動すると次のようなダイアログが表示されます。設定してOKボタンを押すと撮影が始まります。撮影時間が終了するかESCキーを押すと撮影した時間、保存したフレーム数、平均FPS、平均フレーム間時間が表示されます。なお、 時間的精度はあまり高くありません。このスクリプトの使用によって生じるいかなる結果に関しても責任を負いかねます 。ご了承ください。

../_images/multiwebcam01.png
1camera: 320x240 システムに接続されている最初のwebカメラの映像を320x240の解像度で保存します。
1camera: 640x480 システムに接続されている最初のwebカメラの映像を640x480の解像度で保存します。
2cameras: 640x240 (320x240x2) システムに接続されているwebカメラ2台から320x240の解像度で撮影して並べて保存します。
3cameras: 640x480 (320x240x3) システムに接続されているwebカメラ3台から320x240の解像度で撮影して並べて保存します。
4cameras: 640x480 (320x240x4) システムに接続されているwebカメラ4台から320x240の解像度で撮影して並べて保存します。
Render time チェックされていれば保存された動画の左上にプログラム開始からの時刻を出力します(単位:秒)。
FPS 動画のFPSを指定します。動画保存形式(H.264)でサポートされていない値を指定すると保存できません。。
Bitrate 動画のビットレートを指定します。デフォルトで入力されている‘500k’のkはキロのkです。
Capture duration 動画を撮影する時間を指定します(単位:秒)。負の値を指定するとESCキーを押すまで記録し続けます。なお、Capture durationに正の値を指定した場合でもESCキーを押せば直ちに終了することが出来ます。
Save to 保存ファイル名を指定します。日本語のファイル名を入力することは考慮していません。

注意点

USB2.0の帯域幅にご注意ください! 特に320x240の解像度に対応していないカメラの場合、ひとつのUSBホストコントローラに複数台のwebカメラを接続するとデータ転送量がUSB2.0の限界を超えてしまい撮影が出来ません(真っ暗な画面のまま無反応になります)。使用するPCのどのUSBポートがどのホストコントローラに接続されているかわからない場合は、いろいろ接続ポートを変えて試行錯誤するしかありません。経験上、デスクトップPCでは背面のポートと前面のポートは別のホストコントローラに接続されていることが多いように思いますが、必ずそうとは限りません。

動画の画質が悪い場合はBitrateを上げてください。ただし、Bitrateを上げるとPCの処理が追いつかなくなる可能性が高くなります。時間分解能が低くても問題ない場合はfpsの値を下げてください。Core i7 920のPCで15fps/500kbpsはやや余裕がありますが、30fps/500fpsは時々追いつきません。10fps/1500kbpsもやや厳しいです。

pygameの画面更新が垂直同期信号に同期 していない ことを前提に作成してあります。時々コマ落ちするので実際の平均fpsは設定したfpsよりやや低めの値になってしまいます。低時間的精度はそれほど高くないので正確さが必要な場合はRender timeにチェックしておいて動画に出力された時刻を確認してください。気が向いたらVisionEggを使う形に書き換えて時間的精度を向上させたバージョンを作成するかもしれません。

カメラで撮影されてからPCに転送され、動画に出力されるまで数msから数十msのラグが生じます(pythonで心理実験 例題17-3参照 )。複数のカメラの映像間の同期は比較的信頼できますし(カメラのfps設定による)、動画のフレーム間で左上に表示されている時刻の も比較的信頼できますが、それ以外のものとの間の同期はあまり信用出来ません。

使用しているwebカメラが指定した解像度での撮影に対応していない場合、解像度の設定に失敗したことを警告するダイアログが表示されます。この場合、カメラの標準解像度で撮影を行い、スクリプト内で指定した解像度に変換して保存します。

2次元Fourier変換で遊ぶFFT2demo

2次元Fourier変換を授業でどう説明したらいいかと困っていたところ、大澤先生のデモ( http://www.youtube.com/watch?v=pCVdNYvORVw=plcp )をYouTubeで拝見して、触発されてpythonでそれっぽいものを作ってみました。 機能面、特に速度はかなりしおしおですが、私が授業で使う分にはまあ許容範囲ですし、高速化して…とか言ってるといつまでかかるかわかんないので公開します。

FFT2demo.py (最終更新日:2012/10/13)

動作にはpython本体に加えて以下パッケージが必要です。

更新履歴

  • 2012/10/13

    • とりあえず公開。

使い方

FFT2demo.pyを起動すると、ファイルを開くダイアログが表示されます。適当な画像ファイルを選択してください。PILが対応しているフォーマットなら読めるので、PCで扱える一般的な画像なら大抵読めるはずです。

../_images/fft2demo01.png

画像を開くと以下のようなプロットが表示されます。(1)は選択した画像をグレースケールに変換したものです。速度を稼ぐため、画像が大きい(横幅256px以上)場合は横幅が256pxになるように縮小します。(2)は(1)を2次元Fourier変換したものです。この(2)のプロット内でマウスを左クリックすると、クリックした位置に対応する正弦波が(3)のプロットに表示されます。(2)のさまざまな位置をクリックするとそのたびに(3)は更新されます。(4)は今までにクリックした位置に対応する正弦波を重ね合わせたものです。

../_images/fft2demo02.png

速度が非常に遅いので アレ なんですが、マウスの左ボタンを押しっぱなしにして(2)のプロット内でマウスを動かすと、次々と点が追加されていきます。 とても遅いのでゆっくり動かしてあげてください 。小さくて非常に見えにくいのですが、(2)のプロットでクリックした位置には赤い点が重ね書きされます。

../_images/fft2demo03.png

まどろっこしくてこんなのやっていられない!という場合は キーボードのCtrlキーを押しながら (2)のプロット内でマウスの左ボタンをクリックしてください。クリックした位置の周辺の矩形領域がまとめて追加されます。Ctrlキー+左ボタン押しっぱなしでマウスを動かすと次々と矩形領域が追加されていきます。

../_images/fft2demo04.png

「あ、低周波数から高周波数領域までごっそり選択しちゃったけど、低周波数領域を除去したいなあ」 とか思ったら、(2)のプロット内でマウスを 右ボタン をクリックしてください。マウスカーソルの位置の選択が解除されます。左ボタン同様、押しっぱなしでマウスを動かすと連続的に解除出来ますし、Ctrlキーを同時に押すとマウスカーソル近傍の矩形領域がまとめて解除されます。

終了させる時はウィンドウの閉じるボタンをクリックしてください。 「デモに使用するPCの性能が低くて動作が遅くてお話しにならない!」という場合はFFT2demo.pyをテキストエディタで開いて冒頭のmaxWidth = 256の値を小さく(128とか64とか)にしてみてください 。かなり画質は寂しくなりますが多少速くなると思います。

PsychoPyからTobiiを使うTobiiController (Tobii Pro SDK対応版)

PsychoPy/VisionEggからTobiiを使用するTobiiControllerというモジュールを公開していましたが、Tobii SDKが従来のものとは互換性がないTobii Pro SDKに更新されたので、Tobii Pro SDK対応版を新たに作成しました。githubに置いていますのでそちらからダウンロードしてください。

使用するためにはPsychoPyとtobii_researchが必要です。tobii_researchはpipを使ってインストールすることが出来ます。

旧バージョン (Tobii SDK 3.0対応)

旧バージョンも一応残しておきます。