07 Aug 2017, 11:58

PyTorchでDCGAN

PyTorchとMNISTをつかって、DCGANで手書き数字を生成してみた。

前回のつづき。

GANでは、あまりよい結果が得られなかったので、DCGANの論文を読んで、実装してみた。

Deep Convolutional Networkを GANに使うにあたって、以下の改良点が提案されていた。

  • すべてのプーリングレイヤを strided convolutions(discriminator)と fractional-stirided convolutions(generator)に変更する。
  • generator と discriminator に batchnormを使う。
  • 全結合隠れ層を取り除く。
  • ReLU 活性関数を generatorで使う。ただし、output層は tanhを使う。
  • LeakyReLU活性関数をdiscriminatorのすべての層で使う。

もとい!

PyTorchのチュートリアルに DCGANの実装コードが公開されているので、それを参考に実装する。

結果

GANよりも、数字がくっきり浮き出た!

結果その2

ぺけぺけ女優10000人の顔写真をDMMからスクレイピングして収集し、それを題材にDCGANで顔写真の生成をしてみた。

スクレイピングは、この記事を参考にしました。

やっぱりぺけぺけ女優なので、モザイクがかかっています。

06 Aug 2017, 07:36

PyTorchを初めて使ってみた!GANを実装

fast.ai Lesson10のテーマはGAN.

課題は、PyTorchで書かれたWGANを改善せよとのこと。さすがは、Cutting Edgeだ。GANもDCGANも通り越して、WGANに行ってしまう。

PyTorchもGANもよくわからない自分にはツライ。まずは、WGANの前にPyTorchとGANからはじめることにした。

まずは、GANの開祖である以下の論文に目を通した。

PyTorch first inpression

軽くPyTorchのチュートリアルと fast.aiの Jupyter Notebookを眺めたあと、PyTorchに挑戦!numpyを扱うみたいで書きやすい。

PyTouchの特徴は以下のようだ。

Kerasだと、簡単に書くために細かい部分はライブラリに覆い隠されているけれども、PyTorchは多少なりともむき出しになっているので、細かいカスタマイズがしやすそうない印象を受けた。Kerasと PyTorch、両方使えるようになりたい。

GANを実装してみる

GANの実装は、Kerasバージョンがfast.aiから提供されている。

これをPyTorchに置き換える。パラメータを参考にしつつ、また 公式の DCGANチュートリアルの実装も参考にしつつ、実装してみた。

ぜんぜんダメじゃん、ジェレミー先生!

これを mode collapse というらしい。

なんど試してみても、損失関数の D値が0に収束、G値が大きくなっている。

Dは Discriminaterを表し、GのGeneratorが生成したものが本物か偽物かを判定する役割があるのだが、今起こっている状況は、Generator が生成した画像がほとんどの確率で偽物と判定されている。

GANを改善してみる

How to Train a GANというNIPS2016での発表があって、ここにGANの改善方法がまとまっている。

[https://www.youtube.com/embed/X1mUN6dD8uE]

以下を試してみた。

  • ReLU の 代わりにLeakyReLUを使う。
  • BatchNormalizationを使う。
  • Adam の 学習率を小さくする。
  • ノイズは正規分布からサンプリングする。
  • ネットワークのニューロン数を変更する。

結果。

おっ、それらしく古代文字っぽいものが浮き出てきたぞ。

単純なGANだと、あまり成果がでないことはわかっているので、実験は早めに切り上げて次のステップ DCGANに進むことにする。

04 Aug 2017, 08:38

Real-Time(Fast) Style TransferでノートPCのWEBカメラからの動画にゴッホのスタイルをとらんすふぁー

fast.ai cutting-edge-dl-for-coders-part2の Lesson9の課題で、Fast Style Transferを実装した。

[https://www.youtube.com/embed/tEUtFeF4v8Q?ecver=1]

はじめに

前回の続きです。Lesson8ではStyle Transferを試した。

今回は、その続き。

Lesson9の課題は、Perceptual Losses for Real-Time Style Transferという論文を読んで理解し、Fast Style Transferを実装せよとのこと。

概要

前回のNeural Style Transferでは、学習に時間がかかることが問題だった。

この論文で書かれた手法をつかうと、学習したネットワークに画像を入力すると、順伝搬のみの計算でStyle Transferができる。GPUだと一瞬で(CPUだと一瞬じゃなかった)できる。なので、Real-Timeな画像処理=動画作成ができる。

これはすごい!

ネットワークの全体像は以下のような感じ。論文より引用。

Image Transform NetworkLoss Network の2つのネットワークを組み合わせる。

Image Transform Networkのアーキテクチャは、以下のサブドキュメントが詳しい。

Loss Networkは、VGG-16を用いる(全結合層をとったもの)。Content Loss と Style Lossを足しあわせ(これを Perceptual Lossと定義している)、損失関数とする。やっていることは、Lesson8のStyle Transferに似ている。

この損失関数を使って Image Transform Networkを 誤差逆伝播法で最適化する。Loss Networkは学習させない(公開済みの重みを使う)、Image Transform Networkのみ学習させる。

学習には、MS COCOという画像データを論文では利用していたが、Lesson9では、ImageNetからの抜粋画像(http://files.fast.ai/data/)を利用した。

ちょっと言葉足らずなので、詳しくは以下の記事を参考に。とても詳しく書いてあって参考になった。感謝。

結果

今回も、与えられたJupyter Notebookをコピペして作成。コードの意味が理解できていないという情けない状況。がんばろう

ノートPCの webcamから動画を取り込んで、fast style transfer で変換して、再度出力するということをやったが、ノートPCの非力なCPUでは、リアルタイムでは行かなかった。

02 Aug 2017, 04:34

Neural Style Transerで京都渡月橋の写真にゴッホのスタイルをとらんすふぁー

fast.ai Part2

fast.ai の Cutting Edge Deep Learning for Coders を始めた。

Lesson8のテーマは Artistic Transfer。いわゆる Style Transfer。絵のスタイルをディープラーニングで抽出して、別の画像に転移させるというもの。

Part1は Practical(実践) という題名だった。その意味するところは、Kagglerになれ というものだった。

Part2は、Cutting Edge(最先端)という題名だ。その意味するところがわかった。それは、論文を読め ということだった。Part2では、論文を読んでそれを実装するというのが課題として課せられるようだ。英語も数学もツライのに、論文なんて読んだことないから、無理だよ!!挫折しそう。

Neural Algorithm of Artistic Style

Lesson8では、アート系のディープラーニングの先駆けになった論文、A Neural Algorithm of Artistic Styleを読んで、再実装して、さらには結果をブログに書いてねという課題が出された。

というわけで、実装してみた。

元となるコードはちゃんと提供されている。それを写経しただけ。Keras版と PyTouch版がある。

理論の方は、素晴らしく解説された記事があるので、それを紹介。

コンテンツとスタイルの特徴抽出

このNeural Style Transferという方法は、異なる画像からコンテンツとスタイルを別々に特徴抽出して、それらを足しあわせて一枚の画像を生成する。

まずは、元となるコンテンツ画像。京都嵐山の渡月橋。去年旅行で行ってきた。

このコンテンツ画像からコンテンツの特徴を抽出したものが以下。

スタイル画像は、定番のゴッホの星月夜。

スタイルの特徴を抽出した画像が以下。

結果

そして最後に、コンテンツとスタイルを合成した画像が以下。

おまけ

こんなこともできる。

29 Jul 2017, 06:53

Linuxの親指シフトでMozcが使える!oyainputが公開された・・・感動

Linuxの親指シフターにとって、感動的なソフトを発見してしまった。oyainput というソフト。

今までLinuxで親指シフトを利用しようとするときは、Anthyというあまり賢くないIMEを使うしかなかった。Google日本語入力のオープンソースであるMozcがつかえればいいのだが、これが今まで使えなかった。

それが、oyainputをつかうと、IMに Mozcを指定することができるのだ!これは感動的だ。感謝!!!

起動の不具合と解決方法2点

しかし、使おうとすると問題が発生。なんとか解決したのでメモ。

起動するとxmodmapの設定が無効になる

Linuxのキーボードのキーマップ(CtrlをCapsLockに割り当てるなど)を変更するために、xmodmapを利用しているのだけれども、その設定が oyainputを起動すると無効になってしまう。

なので、oyainputを叩いたあとに、

xmodmap ~/.xmodmap

を叩きなおすと、再度有効になった。ちょっと焦る。

起動するとキーボードが2つ検出される

multiple keyboard is detected.というメッセージがでる。Logicoolの BlueThoothマウスをつかっているのだが、これがキーボードとして認識されてしまう。なんとかしようとソースコードを調査。以下のコマンドを叩いて、キーボードを調べているようだ。

$ grep -E 'Name=|Handlers|EV=' /proc/bus/input/devices| grep -B2 'EV=1[02]001[3Ff]'
N: Name="AT Translated Set 2 keyboard"
H: Handlers=sysrq kbd event3 leds
B: EV=120013
--
N: Name="Logitech MX Anywhere 2"
H: Handlers=sysrq kbd mouse0 event5 leds
B: EV=12001f

なるほど、2つ現れる。ソースでは、正規表現でEV=120013,12001F,12001fの三種類をキーボードとして認識しているようだ。その部分を、120013のみ認識するように書き換えてコンパイル。

これはあまりよくない解決方法だけれども、これでmultiple keyboard is detectedというメッセージはでなくなった。

最後に自動起動設定

~/.profileに以下の二行を追加。

oyainput &
xmodmap ~/.Xmodmap

これで、立ち上がり時に自動起動するようになった。

27 Jul 2017, 15:30

Deep Learning に挑んだ半年間、そして今後の勉強計画について

はじめに

半年くらい前、まだ機械学習についてなにも知らなかったときに、書いた記事が炎上してとても恥ずかしい思いをした(記事は非公開にしました)。

この記事はただの日記です。

この半年で取り組んだこと

この半年で、機械学習の勉強はせずに、ディープラーニングと強化学習の勉強をした。

3月〜7月

上記記事を書いてモチベーションを高め、さあ機械学習のための数学をやろうと意気込んでいたのだけれども、すぐに気が変わって、機械学習の王道を進まずにディープラーニングに突っ込んでいった。なぜなら、Udacity で Deep Learning Nanodegree Foundationという4ヶ月の講座を受講し始めたからだ。

この講座に 3月から7月までの4ヶ月間取り組むことによって、

  • Deep Learningという学問分野の概要を学んだ(NN, CNN, RNN, GAN)
  • TensorFlowで実装できるようになった。

このDLND、超初心者向けな講座で、手取り足取り Deep Learningを教えてくれた。なので、数学が必要なかった(笑) あれ、おかしいな、ディープラーニングって、もしかして数学あんまり必要ない??統計とかほとんど出てこないよ。

4月〜5月

また、同時進行で Fast.aiのPractical Deep Learning for Coderという講座も受講したのだが、これがまたすごくいい講座。

この講座の理念は、Deep Learningの敷居を下げて、誰もがDeep Learningを簡単に使えるようにすること。もちろん、ここでも難しい数学は抜き!そして、ここで Keras という Deep Learningをおそろしく簡単にするライブラリを知ってしまう。これをしったら、numpyの実装はおろか、tensorflowですら面倒に感じてしまう。この講座によって、

  • Kerasでバリバリコーディングできるようになった。
  • Kaggler としてデビューし、画像系コンペなら、いい結果を出せるようになった。

というわけで、この2つの講座によって、この半年でバリバリのディープラーニングコーダーになったのだった。

6月〜7月

しかし転機はまたやってきた(コロコロ変わる…)。会社にAIの勉強をしてます!といったら、「うちにはAIの仕事はまったくないよ!」といわれ、さらには「そんな役に立たない勉強よりも、Javaの資格とらないとクビにするよ」という脅しまでされたのだった。

というわけで、AIとの付き合い方について、考えを見直さざるを得なくなってしまった。今の会社は、組込みソフトの受託開発がメインだ。組込みソフトと AIがどう関係するのだ???うーん、と悩んだところ、2つの答えにたどりついだ。

  • 強化学習
  • ロボティクス

というわけで、強化学習の勉強とLEGO Mindstormsを使ったロボット制御の勉強をはじめた。

これにより、

  • OpenAI Gymデビューし、強化学習問題が解けるようになった。
  • 強化学習やロボット制御の理論を LEGO Mindstormsで試すことができた。

これから取り組むこと

数学の苦手意識を克服

この半年間で、理論よりは実践重視でバリバリコーディングしてきたのだけれども、ディープラーニングが趣味レベルで中途半端にできるだけでは、仕事には生かせないし、なにもできない!!

そもそも、である。機械学習に興味を持った理由は、数学を使って現実問題を解決するところがかっこいいと思った憧れからである。そのために、大学では数学を専攻したはずだった。

大学を卒業して10年くらい経った。大学は情報系の専攻で、卒業研究は、情報理論 を学んだのだが(学部卒)、10年も経って数学から離れていたらすっかり忘れてしまった。なので、大学の数学を一から学び直したい。

また、やっぱり数学が壁で挫折したことが、この半年間でたくさんあった。

数学で撃沈した思いでをつらつらと並べたい。

  • 誤差逆伝播法が理解できず挫折。(これはデーィプラーニングがわかる数学という本によってようやく理解できた)
  • Udacity: Artificial Intelligence for Roboticsや確率ロボティクスでベイズ統計や確率が理解できず挫折。
  • Deep Learning Nanodegreeで学んだことの先にいこうとすると、論文を読んでいかないといけない。しかし、論文を開くと数式の羅列に意味が分からずフリーズ。
  • 深層学習(イルカ本)挫折。
  • Deep Learning Javaプログラミング 深層学習の理論と実装、挫折。生成モデル??
  • Siraj Ravalの The Math of Intelligence 挫折。

というわけで、数学、やります!

プログラミングのための30代からのやり直し数学である。

勉強の方針

大学生のころは、理学系だったので、数学の勉強は定理と証明の繰り返しだった。ソフトウェア開発者になると、数学に対する姿勢は工学系よりになる。

  • 理論よりも応用を考える
  • この定理がどう役に立つかを考える
  • 抽象性よりも、具体的イメージを
  • 証明の厳密性はほどほどに(理解できることに越したことはないが)

大学1,2年生の数学の復習

機械学習で必要な数学とはなにか、それは情報系の大学生が1,2年生で習う数学で十分という意見が多い。私は、情報系の専攻だったのだけれども、そこで習った数学は以下の4つ。

  • 線形代数
  • 解析学
  • 統計学
  • 離散数学

離散数学は、TopCoderなどのアルゴリズムコンテストにとても役に立ちそうな分野だ。機械学習との関係は、よくわからなかった。集合や代数的な知識は、線形代数を勉強することで、身につけられそう。離散数学の勉強は保留で。

基礎固めのための参考書はマセマで

やり直し数学ということで、最近大学生の間で評判の高いマセマシリーズで基礎固めをすることにした。高校数学から大学数学への考え方の移行がスムーズにいける、定理の証明に手を抜いていないのでガチ、コメントが多くページを遡って読みなおす必要がなく読みやすい、などの印象を受けた。

基礎ということで、以下の3つをすすめることにした。これで、まずは、大学の初等数学を復習する。

  • 線形代数
  • 微分積分
  • 統計学

基礎の補強と応用へ

マセマは数学をとても簡単に(でも手を抜かずに)書かれているけれども、知識を厚くし、また別の角度から知識を補強したい。そこで選んだのが「プログラミングのための〜」のシリーズ。

解析系がこのシリーズにないので、代わりに最適化数学をメニューに組み込む。また、機械学習ではベイズ統計が使われるので、メニューに組み込む。

  • プログラミングのための線形代数
  • プログラミングのための確率統計
  • これなら分かる最適化数学
  • Pythonで体験するベイズ推論 PyMCによるMCMC入門

数学を復習したら機械学習へ

数学力を強化したら、もともとの目標である機械学習の勉強に着手したい。まずは、はじパタから。

理論よりも実践を重視したいので、なるべくPythonとJupyter Notebookでプログラミングできる教材を使って勉強していきたい。

ココらへんまで来たら、Kaggleにもガンガン挑戦していきたい。Deep Learningの手法のみに頼らずに、いろんな手法から最適な方法を取捨選択できるようになりたい。

その他、情報理論を勉強したい。この本は、情報理論的な立場から機械学習を捉えているらしいので、気になっている。

読みたい本

目指すは、機械学習の登竜門、パターン認識と機械学習(PRML)

また、確率ロボティクスも挫折したので、数学力をつけて再挑戦したい。

その他の勉強

Deep Learning

今後はDeep Learningの勉強は抑えて他の勉強にリソースを割り当てる。

ただし、fast.aiの Deep Learning のオンライン講座 Cutting Edge Deep Learning for Coders は進める。この講座はほんとうによい講座なので、引き続き受講する。

Deep Learning Book の 本が翻訳されたら、勉強を再開しよう。

ロボティクスと強化学習

仕事で AI を活用するためには、この2つの分野の学習が必要なので、ここに力点をいれていく。

具体的には、Udacity Robotics Nanodegreeを半年間に渡って受講します。おそらく、これはかなりの負荷になるので、他のことをやる時間がとれなくなるかもしれない。

また、強化学習は 次期 MLPシリーズで発売が予定されているので、その本が発売されたら勉強を再開したい。

まとめ: 今年やること

まとめると、今年の残りの予定は以下の3つだ。

  • 機械学習のための数学力強化
  • Udacity Robotics Nanodegree
  • fast.ai Cutting Edge Deep Learning for Coders

26 Jul 2017, 03:34

UdacityでArtificial Intelligence for Roboticsを受けた

UdacityでArtificial Intelligence for Robotics(CS373)を受けた。

[https://www.youtube.com/embed/g-fk3RQiw5Q]

しかしながら、この講座はとても難しく、挫折した。

なので、簡単に内容の紹介と感想を書く。

動機

Udacityの Deep Learning Nanodegree を受講し終わったので、

次の講座として Robotics Nanodegreeの受講を考えている。

その間のつなぎの講座として、タイトル惹かれてこの講座を受けてみることにした。

また、最近 LEGO mindstormsを購入したので、学んだことを応用できればいいなと思っている。

内容

Googleの自動運転車の要素技術について学ぶ講座。この要素技術は、自動運転車に限らずあらゆるロボティクスについて応用できるとのこと。講座のタイトルが昔は Self Driving Car だったが今の AI for Roboticsに変わったようだ。

講師は、Udacityの創立者にしてGoogleカーのエンジニア、セバスチャン・スラン氏。すごい。

シラバスは以下のとおり。

Lesson1-3は自己位置推定(Localization)について、4,5は探索と制御について、6は地図生成だ。

  • Lesson 1: The Problem of Localization ・・・ヒストグラムフィルタについて学ぶ
  • Lesson 2: Kalman Filters ・・・ カルマンフィルタについて学ぶ
  • Lesson 3: Particle Filters ・・・粒子フィルタについて学ぶ
  • Lesson 4: Motion Planning ・・・経路探索について、幅優先探索、A*, 動的計画法について。
  • Lesson 5: PID Control ・・・経路の平滑化、PID制御について学ぶ。
  • Lesson 6: GraphSLAM ・・・ Lesson1-5まで学んだまとめ、おまけとしてGraphSLAMについて。

途中、よくわからなくなったので、参考書を買った。確率ロボティクス。スラン先生の本だ。

講座の進め方は、ミニクイズとPythonによるプログラミング課題が、説明のあとに出される。少しずつ難易度が上がっていくので、理解しやすい。そして、週の終わりにミニテストとプログラミング課題が出される。一応リポジトリを起こして、コードを書いた。

この講座、一番うれしいところは、すべての動画に日本語字幕がついているところだ。

その他、Forumが充実しているところもうれしい。が、講座が開講された2012年のころの投稿が多い。

感想

難しく、挫折した。一応、動画は最後まで目を通した。これが完全に理解できれば、君はスタンフォードの優等生だと講義でいっていた。むりだー。

少し飛ばしぎみで講義を進めていったので、深くは理解を深めようとしていないからかもしれない。

大体ひとLesson 5時間くらいかければ終わる。

無料の講座だとついつい気が緩んで真剣にとりくまないのかもしれない。

この講座は、今の Self-Driving Car NanoDegreeに内容が引き継がれているようだ。

DeepLearning Nanodegreeのあとの進路は、Self-Driving Car, Artificial Intelligence, Roboticsの3つに分かれるのだが、自分は 組込み屋なので、Roboticsに決めている。ただ、自動運転車の講座もおもしろそうだと思った、と同時に難しそうだと思った。自分には、Roboticsを挫折しないでやり遂げる能力があるのだろうか・・・。

挫折したことが悔しいし、確率ロボティクスの本も買ったことなので、いつかこの講座をやり直そう。ロボティクスでも、自己位置推定が扱われるようなので、そのときに振り返ることにする。

Path Planningや PID制御は LEGO Mindstormsで実際に試せそうだ。時間があればやってみよう。

25 Jul 2017, 21:55

(失敗) Leap Motionで Mindstorms EV3をリモートコントロールしてみた

(失敗) Leap Motionで Mindstorms EV3をリモートコントロールしてみた

うまくいかなかった。

前進、後退はうまくいくのだが、左右への旋回が失敗する。

動画

[https://www.youtube.com/embed/a_fWdyaC93A?ecver=1]

Code

25 Jul 2017, 13:23

MQTTでMindstorms EV3のロボットカーを パソコンのキーボードからリモコン操作

LEGO Mindstorms EV3 を パソコンのキーボードから操作してみます。

私は、LEGO Mindstorms EV3の教育版を買ったので、家庭版と違いリモコンがありません。でも、ラジコンのようにロボットカーを操作したい!そこで、MQTTというプロトコルを利用して、ノートPCのキーボードを使ってロボットカーを制御する方法を思いつきました。

まずは、結果をどうぞ!

[https://www.youtube.com/embed/kl_07BWGNWo?ecver=1]

環境

  • Publisher(PC) Ubuntu 16.04
  • Subscriber(ev3) ev3dev
  • Python 3.6
  • ev3dev-lang-python

ロボットの組み立て

この本に載っているtribotを作成しました。

Setup

MQTTという軽量な通信プロトコルを使った方法がev3devのサイトに紹介されていたので、それを参考にする。

MQTTではpublisher(出版者)が発するメッセージをbroker(仲介者)がsubscriber(購読者)へ配信する。今回は、publisherが ノートPC, brokerとsubscriberが ev3になる。

ev3に brokerサーバソフトをインストールする。mosquittoというソフトをインストール

sudo apt-get install mosquitto

インストールが完了すると、サービスが立ち上がる。

続いて、mqttをPythonで使うための pahoというソフトをノートPCと ev3の両方にインストール。

sudo apt-get install python3-pip
sudo pip3 install paho-mqtt

PC 側

pip3 install paho-mqtt

これで、MQTT で通信する準備は整った。

punput

Pythonで押されたキーボードのキーの取得をするために、punputというライブラリを利用する。

ラズパイカーで同じようなことを考えている人のブログ記事を発見した。これはありがたい。

コード

最後に、書いたコードが以下。これで、キーボードの十字キーを使ってロボットカーをリモコン代わりに操作することができた。

25 Jul 2017, 06:51

Leap Motion を Pythonから使う方法を調べた

Leap Motion を Pythonから使う方法を調べた。

環境

  • Ubuntu 16.04, 64bit
  • Leap Motion SDK 2.3.1
  • Python 2.7.13

Pythonは 2系でしか動かないようだ。私はAnacondaを利用して、2系の環境を構築した。

必要なファイルを揃える

まずは、前回の記事に従って、Leap Motion SDKをインストールする。

Linux用のtarファイルを解凍すると、LeapSDKというフォルダがあるので、そこに移動。

Leap Motionを Pythonから操作するためには、以下の3ファイルが必要。

  • lib/Leap.py
  • lib/x64/libLeap.so
  • lib/x64/LeapPython.so

(64bitはx64/32bitはx86フォルダ)

作業用ディレクトリを作成して、そこに3ファイルをコピーする。

mkdir -p ~/repo/leap
cp lib/Leap.py ~/repo/leap
cp lib/x64/libLeap.so ~/repo/leap
cp lib/x64/LeapPython.so ~/repo/leap

LeapSDKの中にSample/Sample.pyがあるので、まずはそれを作業用ディレクトリにコピーして動かしてみる。数値がたくさん現れれば成功。

cp samples/Sample.py ~/repo/leap/
cd ~/repo/leap/
python Sample.py

基本スニペット

Leap Motionのプログラムの書き方は、Listener型とPoling型がある。

Listener型は、Leap Motionのフレームワークで Loopがある場合、

Polingは Leap Motion以外のフレームワークで Loopがある場合に使う。

サンプルコードに従って、Listener型の基本スニペットを書く。

import Leap, sys

class SampleListener(Leap.Listener):
    def on_frame(self, controller):
        # Get the most recent frame and report some basic information
        frame = controller.frame()
        print "Frame id: %d, timestamp: %d" % (frame.id, frame.timestamp)

def main():
    # Create a sample listener and controller
    listener = SampleListener()
    controller = Leap.Controller()

    # Have the sample listener receive events from the controller
    controller.add_listener(listener)

    # Keep this process running until Enter is pressed
    print "Press Enter to quit..."
    try:
        sys.stdin.readline()
    except KeyboardInterrupt:
        pass
    finally:
        # Remove the sample listener when done
        controller.remove_listener(listener)


if __name__ == "__main__":
    main()

main関数は変更せずに、on_frame()メソッドの中身だけ修正すれば良さそう。

frameに現在の情報がすべて含まれているので、そこからいろいろ取り出す。

手の座標を取得

まずは、手の座標を取得してみる。

on_frameの中に以下を書き込む。

    hands = frame.hands
    hand = hands[0] # first hand
    print(hand.palm_position)

palm_positionで手のひらの中心の座標が手に入る。実験してみた結果、手の座標が、(x, y, z)のタプルで取得できた。

(41.2968, 119.34, -71.5027)
(40.8835, 122.556, -71.095)
(38.7474, 126.202, -69.3811)
(36.5977, 130.135, -66.6525)
(34.1101, 134.531, -63.37)
(31.7521, 137.867, -59.3138)
(28.9372, 141.859, -54.9556)
(27.5701, 145.658, -50.0342)
(25.3786, 149.093, -45.6736)
(23.8103, 152.436, -40.7532)
(21.8484, 156.879, -36.0352)

ジェスチャーを検出する

ジェスチャーは4種類ある。今回は、Key Tapというジェスチャを試す。

ジェスチャーの検出には、事前の登録が必要。on_connect() でジェスチャーを登録する。

def on_connect(self, controller):
    controller.enable_gesture(Leap.Gesture.TYPE_KEY_TAP);

on_frameに以下を追加。

for gesture in frame.gestures():
   if gesture.type == Leap.Gesture.TYPE_KEY_TAP:
        print "  Key Tap id:", gesture.id

ジェスチャーを以下のようにすると、反応する。

Key Tap id: 1
Key Tap id: 2
Key Tap id: 3
Key Tap id: 4

とりあえず、今日はここまで。