例題18-1:PsychoPyはどうだ?

B: こんにちわー! Aさんお久しぶりです!

A: おう、久しぶり。この夏はどこか行ってきたか?

B: ええ、ちょっと実家に帰省していまして。いいもん食って帰ってきました。

A: そりゃ何より。今のうちに親孝行しておきたまえ。

B: 実はこの夏は超貧乏でおとなしくしてるつもりだったんですが、実家から帰って来いって旅費が振り込まれまして。

A: ふむ。親の愛情だのう。いい話じゃ。

B: いや、それがいい話でもなんでもなくて。パソコンの調子が悪いから戻ってきて直してくれって親父がいうんですよ。詳しい知り合いがいるんだけど恥ずかしいんでその人には頼みたくないんだそうで。まったく見栄っ張りというか、何が恥ずかしいんだか意味がわかりません。

A: んー。そういう方はいるよなあ。恥ずかしいってのは私にもよくわからんが、いろいろと思い当たる方々が。おっと、これ以上は自粛。

B: で、呼びつけるんなら旅費くらい出してよって交渉して。そんで焼肉やらなんやら食わせてもらって。

A: まあでも、パソコンの調子が悪いからってのも口実かも知れんなあ。親父さんはA君に会いたいから帰ってこいっていうのが恥ずかしかったからパソコンを口実にしたのかも知れん。

B: …うちの親父に限ってそれはないと思いますが。Aさんらしくないなあ。

A: いや、私も年をとったということだよ。すっかりおっさんになった。

B: Aさんは初めてお会いした時からどこから見てもおっさんだったと思いますが。

A: ほっとけ。で、パソコンはどうだったんだ。

B: いや、HDDがダメになっていたんですが、PCがWindows98のやつで、もう合うHDDが地元のショップに売ってないんですよね。だから買い換えさせちゃいました。

A: ふーん…って、ちょっと待て。Win98世代のPCが不要になったんだな? そのころのPCならディスプレイはCRTか?

B: え、ええ。それが何か。

A: まだ捨ててないんならそのCRT売ってもらえないか? 着払いで送ってもらえればいい。

B: あー。残念ながら、新しいのを買った時に引き取ってもらったんでありません。

A: くっ、それは残念。

B: CRTが要るんですか? Aさんが前に言ってた明るさの切り替わりの速さがどうこういう話ですか?

A: ディスプレイの輝度変化の時間特性の話ね。関連なくはないけどちょっと違う。実はVisionEggでswap_buffers()してから実際に画面が更新されるまでの時間差についてちょっと深入りしててな。問題を切り分けるためにLCDとCRTで比較したかった。まあCRTは他をあたるからいいよ。

B: また濃い話題が…。話が濃すぎて読者が引いているという苦情が届いていますが。

A: 届くってどこからだよ。とにかく、VisionEggを使った場合とPsychoPyを使った場合で遅延が微妙に異なる。場合によっては今後PsychoPyへの切り替えも検討せねばならん。

B: PsychoPy。以前にちらっと聞きましたね。なんでしたっけ?

A: 例題15-2でubuntuへのVisionEggのインストールの話をした時だな。VisionEggと同様に心理実験の開発を支援するpythonパッケージ、というかむしろpythonアプリケーションというべきかも知れん。

B: アプリケーション? わざわざ言い直すってのはパッケージと何か違うんですか?

A: もちろん違う。VisionEggは基本的に自分でスクリプトを書いて、そのスクリプトの中でimportして使うものだ。それに対してPsychoPyはWordやExcelみたいにマウスやキーボードを使って操作するソフトウェアだ。

B:

A: 見てもらった方が早いだろう。そら。

../_images/18-1-01.png

B: うわ、なんだか市販ソフトみたい。これ、pythonのスクリプトを書かずに実験できるんですか?

A: んー、実は使い込んでないからよく知らないんだわ。YouTubeに開発者ご本人出演のチュートリアルを見てくれ。ええと、PsychoPyのホームページ( http://www.psychopy.org/ )にリンクがあったはずだ。…と、 http://www.youtube.com/watch?v=VV6qhuQgsiI だ。そら

B: 英語なんですね…(涙)

A: まあ言葉はよくわかんなくても大体雰囲気はわかるだろ。こんな感じでpythonのスクリプトをゴリゴリ書かなくても実験ができるというのがVisionEggとの最大の違い。

B: PsychoPyを使ったら今まで覚えてきたことは無駄になるんでしょうか…。

A: いや、個人的にはこの手のGUIはちょっと複雑なデザインの実験をしようとすると途端に難しくなるという 偏見 があるし、仮に十分に習熟したら複雑なデザインの実験を作ることができるとしても、 ひとつのアプリケーションの習熟に時間をかけるのはもったいない と思う。PsychoPyのGUIの使い方をいくら訓練しても心理実験にしか役に立たないが、pythonのスクリプトを書く訓練を積めばデータの解析もできるし、学科の先生方から出していただいた文書のフォーマットがバラバラなのを整えたり、記入し忘れておられる先生を見つけたり、学科で実施した学生アンケートのデータを数年分まとめて推移をグラフ化したりとか、あんなことやそんなことにも応用できるんだッ!(注:この話は フィクション です)

B: …後半、どんどん声が小さくなっていくんですが。

A: 学科のサーバにwebアプリをいれたりとかさぁ、確かにpythonはweb関係でもよく使われているけどそのアプリはpython関係ないじゃん。そもそも…(注: フィクション ですってば、ホント)

B: まあまあ、元気を出してくださいよ。

A: はっ、いかんいかん。ついあちらの世界へ行ってしまった。とにかく私はあまり好きじゃないんだ。機会があれば解説するかもしれないけど、あまり期待しないでおいてくれ。PsychoPyのこのグラフィカルな実験作成画面をBuilder Viewというんだが、PsychoPyには私のような人向けに直接pythonのコードを書ける動作モードも用意している。

../_images/18-1-02.png

B: なんだかただのエディタみたいですね。

A: 単なるエディタと違って、直接スクリプトを実行したり、中でシェルが走っているのでIPythonのように使うことも出来る。これをCoder Viewという。

B: ふうん。なんだかよい感じがするというか、Aさんのくせに珍しく褒めているっぽい口調のような気がしますが。

A: 「Aさんのくせに」とはなんだ。私はどちらかというとまずは褒めるタイプだぞ。

B: えー。じゃあ僕のことも褒めてみてくださいよ。

A: ふむ。飲み会の時にB君を連れて行っておけば料理を注文しすぎても残ることがない。きれいさっぱり食べつくす食いっぷりは見事だ。

B: …それだけ?

A: (無視して)さて、こういう似たような機能のモジュールが二つあるとなると、当然初心者のかたから「どちらが良いのか」聞かれる。だが、一概にどちらが良いというのは難しい。ここでは私の独断でVisionEggとPsychoPyを比較してみよう。

PsychoPy

VisionEgg

GUIによる実験作成

あり

なし

実験データの保存

Excelのxlsx形式などに出力する機能がある。

すべて自前で。

音声刺激との同期

現状はpygameを利用しているがpyaudioなどへの切り替えが進行中。

特にサポートしていないのでpygameなどを適当に利用

刺激としてムービーを使用

pygletがサポートする各種形式の動画

MPEG1、QuickTime(制限あり、 例題16-5 参照)

テクスチャ刺激

高速なテクスチャ表示のためには256x256、512x512などの正方形のテクスチャを使う必要がある。

PsychoPyのような制約はない。

インストール

スタンドアローンインストーラー(単一のインストーラですべてのモジュールがインストールされる)、debパッケージなどが提供されている。モジュールのバージョンなどを選んでインストールしたい場合は関連パッケージが多くて面倒。

pythonのsetuptoolsを使ったインストール。パッケージを自分でインストールする場合はこちらの方が関連パッケージが少なくて楽。

座標系

スクリーン中心の座標が(0,0)。単位としてピクセルの他にスクリーン高さ、幅を1.0に正規化した座標や、事前に登録しておいたスクリーンの寸法や観察距離から換算した視角なども使える。

スクリーン左下の角の座標が(0,0)。単位は標準ではピクセルだがViewportの設定に依存する。

開発状況

活発。

2009年に1.2.1がリリースされたのを最後にstableリリースは発表されていない。pyopengl関連の問題が放置されっぱなしなのが気になる。

ハードウェアのサポート

一部の輝度計やキーボックス、CRSのbits++などをサポート。

特になし、自前で。

B: んんん? 全体的に見てPsychoPyの方が有利なのかな?

A: そうだな。特に開発が活発というのは大きいと個人的には思っている。不具合があった時にパッチがリリースされるのが早いということだし、新たな機能が追加されることも期待できる。実際、PsychoPyはどんどん新しい機能が追加されている。

B: PsychoPyの方がハードウェアのサポートが充実してるってのは大きいですかね?

A: んー。どうかなあ。サポートされているハードウェアを持ってりゃありがたいだろうがね。私はひとつも持ってないんで全く関係ないな。CRSのBits++なんかはコアな知覚研究をしている人たちは持っているかも。

B: 後はよくわかんないなあ。てっとり早く、Aさんのお勧めはどちらなんですか?

A: 難しいことを聞くなあ。 個人的な好みを言えばVisionEggの方が好きだ。だが、そういう好みの話は抜きにどちらがお勧めできるのかと言われるとPsychoPyなのかな、と思う。

B: すごい嫌そうな顔して言いますね。PsychoPyがお勧めってのはどうして。

A: まず、VisionEggが名前通り視覚刺激のコントロールに特化しているのに対して、PsychoPyは音声刺激をサポートするメソッドやrating scaleを描画するメソッドを含んでいたり、データ保存機能もパッケージに含んでいたりするなど、総合的な心理実験サポートパッケージという色彩が濃い。幅広い人が恩恵を受けられると思う。これがまず一点。

B: ふむふむ、これは便利そうだぞ。

../_images/18-1-03.png

A: あと、開発が活発である、変化し続けているということは、ハードウェアやOSの世代交代が進んだ時に対応してくれるかも知れないということだ。開発が止まっていると、いずれは新しい技術に環境についていけず消えていくかも知れない。

B: なんだか生物みたいですね。

A: そうだな。変化し続けた結果、昔のものとはすっかり変わってしまって、名前は一緒だけど昔のバージョン向けに書いたスクリプトは動かないなんてこともあるかも知れない。将来のことは誰にもわからん。ただ、現時点ですでにVisionEggはOpenGLの変化についていけていない面がある。

B: えっ、それはどういうことですか?

A: 最初に言った表示タイミングが違うという話と関係があるんだが、それはかなりマニアックな話なのでいずれ詳しく。わかりやすい点を挙げれば、PsychoPyは何もしなくても垂直同期信号に同期した描画が出来るマシンで、VisionEggだとドライバの設定で強制的に同期するように設定しないと同期描画が出来ないケースがある。VisionEggのソースのどこに問題があるのか見当はつけてあるが、どう直したらいいのかわからんので手を出していない。

B: うーん。表を見ていると「自前で」って項目がVisionEggには多いですし、全面的にPsychoPy有利ですかね?

A: いや、繰り返すが私の好みとしてはVisionEggの方が合うんだ。例えばViewportにあたるものがPsychoPyにはないが、私はかなりViewportを活用するんで困る。あとPsychoPyはPatchStimの機能が多機能すぎてわかりにくい。

B: PatchStim?

A: VisionEgg.Texturesに含まれるような刺激描画クラスをひとつに統合したようなクラスだな。後で詳しく触れるとして、後はテクスチャの扱いがPsychoPyは面倒くさい。さっき出てきたPatchStimにテクスチャを貼り込む方法とSimpleImageStimというクラスを使う方法があって、前者は処理速度が速いがテクスチャが256x256や512x512などの2のn乗の正方形以外の形だと猛烈に遅くなる。後者は2のn乗の正方形以外のテクスチャでもそこそこの速度で動作するが、VisionEggのような動的なテクスチャをするのは厳しい。

B: うーむ。

A: なお、PatchStimはやはり複雑すぎると開発者も思っていたようで、つい最近リリースされたバージョンだとGratingStimとImageStimに分割されている。PatchStimはdeprecatedだってさ。

B: あがが、わけがわからなくなってきました。

A: さらに言うとだな。

B: まだあるんですか。

A: Windows版でVisionEggのTarget2D、FilledCircleにあたるRect、Circleという刺激を描画すると、ポリゴンのつなぎ目に隙間が出来てきれいに塗りつぶされない。最悪なことにひとつでもRectやCircleを描画するとテクスチャ刺激なども影響を受けてポリゴンのつなぎ目に隙間が出来てしまう。どういう状態か想像するのが難しいだろうから例を出すと、こんな具合にテクスチャ刺激の対角線上に細い隙間が空いて背景の黒が見えている。

../_images/18-1-04.jpg

B: え、これ元画像に細い黒線が引いてあるんじゃないんですか?

A: 違う違う。

B: うーん、こりゃ使い物にならないかも。

A: まったく同じスクリプトをUbuntuで動かすと問題ないんだけどね。そんなわけで全面的にPsychoPy有利とは言えないのさ。

B: むむー。

注釈

  • 2012/09/19 追記: この問題はCircleやRectのコンストラクタの引数にinterpolate=Falseを指定すると回避できるようです。使用しているグラフィックボードやドライバに依存するようなので、まず引数interpolateなし(Trueを指定したのと同じになる)で実行してみて、ポリゴンのつなぎ目の線が見えるようでしたら、interpolate=Falseを指定して実行するようにするといいでしょう。

A: さて、具体的なサンプルを紹介する前からいきなりディープな世界に突っ込みすぎたな。ちょうどこのマシンにPsychoPyをインストールするところだから、PsychoPyのインストールを解説してとりあえず例題18-1は終わりにしよう。先ほど出てきたPsychoPyのページへアクセスして、右の"Quick links"のDownloadをクリックすれば配布ページへ移動できる。インストール方法の解説は以下のURL。

B: いっぱいファイルがあってどれをダウンロードするのかわからないんですが…。

A: うむ。VisionEggと違って、PsychoPyには Standalone distribution というものがある。必要なpythonのモジュール等をまとめて一気にインストールできるインストーラだな。WindowsならStandalonePsychoPy-x.xx.xx-win32.exe、MacOS XならStandalonePsychoPy-x.xx.xx-OSX.dmg。あ、x.xx.xxにはバージョン番号が入る。

B: これは便利ですね。

A: まあ便利っちゃあ便利なんだが、個人的にはお勧めしない。

B: へ? なんで?

A: 例えばWindows版の場合、Standalone distributionでPsychoPyをインストールすると標準ではない場所にpythonがインストールされる。すでに公式インストーラでpython本体をインストールしていた場合、同一マシン内に二つのpythonが存在することになってしまう。当然、 コマンドラインからpythonインタプリタを立ち上げたり、拡張子.pyのファイルをダブルクリックした時にはどちらか一方のpythonが起動する 。また、 pythonのパッケージをインストールするとどちらか一方のpythonにだけしかインストールされない 。今自分が使っているpythonがどちらのpythonなのか、今インストールしたパッケージがどちらのpythonにインストールされたのか。わかっていて使うのならそれは個人の自由だと思うが、今こう言われてわからない人は避けた方がいい。

B: …やめておきます。

A: Standalone distributionを使わないのであれば、VisionEggと同じように個々のパッケージを手動で入れていくしかない。2012年9月14日現在、PsychoPyが依存するパッケージは以下の通り。強調しているものはVisionEggをインストールしていればすでに入っているはず。

  • setuptools (distribute)

  • numpy

  • scipy

  • pyglet

  • pygame

  • pywin32(Windowsのみ)

  • wxPython(version 2.8)

  • Python Imaging Library

  • matplotlib

  • winioport (Windowsでパラレルポートを使う場合のみ)

  • lxml

  • openpyxl

B: うへー、多いなあ。

注釈

  • 2012/11/13 追記: 大学の計算機室のPCなど、PythonをインストールできないWindows機で作業したい方向けに Windows用Portable VisionEgg/PsychoPy を用意しています。

  • 2013/01/09 追記: Standalone版の利点や利用時の注意点について 例題19-3 で触れています。現在は「実験のために特殊な拡張モジュールを必要としない限り、初心者にはStandalone版がお勧め」と考えています。

A: 例題14とかを試してくださった方はscipy、matplotlibあたりもすでに入っているんじゃないかな。注意すべき点というか、インストールのためのアドバイスを二つ、いや、三つかな。

  • pyglet、lxml、openpyxl、psychopyなどはsetuptoolsをインストールすると追加されるコマンドであるeasy_installを使うとよい。

  • pygletをeasy_installでインストールするとavbinがインストールされない(Windowsで確認済み)ので http://code.google.com/p/avbin/ でavbinも入手してインストールする。

  • Windowsで手動インストールするとPsychoPy Builder(GUI)へのショートカットが作製されないので、pythonインストールディレクトリのlib/site-packagesの中からpsychopyディレクトリを探し、appディレクトリの中にあるpsychopyApp.pyへのショートカットを作成してデスクトップなど好みの場所へ置いておく。

B: うーん、ややこしいなあ。easy_installってなんですか? ダブルクリックでポン!なインストーラは配布されていない?

A: pygletなんかは公式にインストーラが配布されているが、 最新バージョン1.1.4の公式インストーラにバグがあってpython2.7にインストールできない (2012年8月現在、Windows版で確認)。easy_installでならpython2.7にも何の問題もなくインストールできる。

B: だからそのeasy_installっていうのが良くわからないんですが。

A: setuptoolsについてくるpythonパッケージのインストールを簡単にするためのツールだ。pythonインストールディレクトリのScriptsディレクトリの中にある。Windowsを使用している人はC:\Python27とC:\Python27\Scripts(Python2.7の場合)を環境変数のPATHに加えておくことをお勧めする。

B: はあ。

A: で、Scriptsへのパスが通っているとすると、以下のように入力すると勝手にeasy_installがパッケージの配布元を探してくれてインストールの作業をしてくれる。

easy_install psychopy

B: おお、すごいすごい、探してくれている。

A: ちょっと注意が必要なのは、Windowsインストーラでインストールしていないので、Windowsのコントロールパネルの「プログラムの追加と削除」にリストアップされない点だ。アンインストールするには以下のように入力してからパッケージの実体を削除する。ちょっとハードルが高いね。

easy_install -mxN psychopy

B: え、手作業で削除しないといけないんですか。

A: 残念ながら。最近はpipというpythonパッケージ管理ツールが開発されていて、そっちを使ってインストールすると削除も出来るらしい。ま、残しておいてもほんのちょびっとディスク容量を食うだけだから放置しておいてもいいと思う。

B: うー。

A: ちなみにUbuntuやDebianを使っているのなら、パッケージが提供されているので以下のようにaptを使ってインストールできる。もちろんSynapticのようなパッケージ管理GUIを使っても良い。

sudo apt-get install psychopy

B: ううー。や、ややこしい…。

A: さて、以上でセットアップの解説はおしまい。Windowsの場合は先ほどショートカットを作ったpsychopyApp.pyを実行、UbuntuやDebianの場合はメニューのプログラム一覧にPsychoPyが出現しているはずなのでそれを選択するか、コマンドシェルからpsychopyと入力して実行すれば、BuilderかCoderが起動するはず。

B: MacOS Xの場合は?

A: …それを私に聞くのかね。

B: えー、でもAさんmac mini買ったでしょ? 知ってるんですよ?

A: げげ、どうしてそれを。

B: 実験室の隅にmac miniの空き箱がありましたが。まさか隠したつもりだったんですか?

A: あー、えー。うむ。確かに買ったのは買った。

B: じゃあ観念してMacOS Xもきちんと解説してくださいよ。

A: うるさいな。まだ忙しくて手を付けてないんだよ。実験室の隅に隠したのは空き箱じゃなくて中身が入っとる。

B: えっ、あんな無造作に置いてあるのに?

A: これでも私は忙しいんだよ。今回はこのくらいにして、次回からサンプルを見ていくことにしよう。

B: なんだか強引に終わらせようとしていますね。

A: そ、そんなことはないぞ。じゃあ、またねー。

補足

本文で述べたとおり、UbuntuやDebianならばaptからインストールすれば一気にインストールが完了します。ただ、aptでインストールされるパッケージは本家の更新頻度に比べて相当ゆっくりなので、バグフィックスされたバージョンを使いたければ結局easy_installなどを使って手動でインストールする必要があります。