読者です 読者をやめる 読者になる 読者になる

人生成り行き

立川談志とイチローに憧れるソフトウェアエンジニアの日記

Mac+PythonでKinect v2 for Windows

WindowsだとKinect SDKで比較的簡単にKinect for windowsが使えるが, Macだとちょっとややこしいので書いておく. 最初にライブラリのインストール方法を書いて,次にPythonでの使用法を書く.

libfreenect2のインストール

Macでも無料で使えるライブラリlibfreenect2を使う. 元ページはここ. GitHub - OpenKinect/libfreenect2: Open source drivers for the Kinect for Windows v2 device

先に依存ライブラリをインストール.今回はhomebrewを使うことを前提とする. それぞれ読み替えて下さい.

brew update
brew install libusb
brew tap homebrew/versions
brew install glfw3

TurboJPEG,CUDA,OPENNI2などを使いたい場合には先にそれらをインストールしておく. 詳しくは元ページ参照.

で,libfreenect2のインストールとテスト. Kinect v2を繋いで(USB接続→ACアダプタ接続という順序じゃないとデバイス認識をしてくれないので注意),

 git clone https://github.com.OpenKinect/libfreenect2.git
 cd libfreenect2
 mkdir build && cd build
 cmake ..
 make
 make install
 ./bin/Protonect

これでKinect v2の取得映像がストリーミング表示されるようになれば成功.

pythonでの使用

pythonからKinect v2を利用したい場合には,pylibfreenect2が使える. 元ページはここ. GitHub - r9y9/pylibfreenect2: A python interface for libfreenect2 for python 2.7, 3,4 and 3.5

このライブラリはpipからインストールできる.

 pip install pylibfreenect2

テストには元ページのexamples/selective_streams.pyを使う. Kinect v2を繋いで(USB接続→ACアダプタ接続の順序),下コードを動かせればOK.

 wget https://raw.githubusercontent.com/r9y9/pylibfreenect2/master/examples/selective_streams.py
 python selective_streams.py

基本的な画像・映像処理が分かってれば,selective_streams.pyを参考にすれば結構簡単に使い方は習得出来そう.

推薦システム概要資料とPythonでの協調フィルタリング参考記事

推薦システム概要

「推薦はとりあえず協調フィルタリングやればいいんでしょ?」という適当な認識を改めるために,手法サーベイ
基本的には朱鷺の杜Wikiでも有名な神嶌先生のこの資料を参考にする.
わかりやすい上にかなり網羅的.

取り敢えず協調フィルタリングが重要なのは間違ってなかったようなので,練習をしてみよう.

協調フィルタリング実装済みのPythonライブラリ

ということでpython協調フィルタリング実装済みのライブラリは無いかなと探してみると,

qiita.com

このサイトでいくつか紹介してくださっている.

基本的には後学の為にSparkをいじってみたいので,Spark + MLlibを使う予定.

Spark+MLlibで協調フィルタリング

qiita.com

そのものズバリの記事を発見.
記事の中で使っているデータセットもMovieLensだし.
これを次回あたり自分でも動かしてみよう.

おまけ

サーベイしててNMFって何だっけ?となったので,調べてみたところ,このサイトの説明が分かりやすかった.
abicky.net

一応画像認識をちょっとかじっている身としては覚えとかないと駄目だったかな...

デュアルブートしていたLinuxのパーティションをWindows7側から削除したら動かなくなった.→ MBRをWindows8.1の回復ドライブの作成で修復

以前から使っていたLet's NoteにデュアルブートしていたArchLinuxのパーティションWindows7側からフォーマットしたところ,起動しなくなった.(GRUB2 rescue画面でbootディレクトリが見つからない...)

GRUB2でデュアルブート処理を行っていたが,そのブートローダがArchLinuxパーティション内に保存されていたらしく,それもまとめて消してしまったらしい.

色々復元方法を試みたが,最終的に参考にして成功したのは以下のサイトの手順.

コマンドプロンプトからWindowsを復旧する4つの方法 (Vista/7/8/8.1/10) - ぼくんちのTV 別館

MBRの回復は修復ディスクが手元になかったので諦めていたが,別PC内のWindows8.1の「回復ドライブの作成」を試しに使ってみようとやってみたらうまく行った.

回復ドライブの作成に関しては以下のサイトが役に立った.

Windows8.1 回復ドライブの作成と復元(リカバリ)手順 : 下手の横好き!

 

初めは「GRUB2のブートローダWindows7パーティション内にインストールすればいいんでしょ?イケるっしょ.」という感じだったが,割りと泥沼化.

その後ArchLinuxのインストールUSBを使ったり,UbuntuのインストールUSBを使ったり.完全に迷子.本質的な問題を把握できてないからこんなことになるんです.

FreeDOSにも手を出したが最後,GRUB2 rescue画面ですら遠い彼方へ.

で結果,今回紹介した方法になんとかたどり着いて助かったけど,もうちょっと早く気付けたかな.(別バージョンの回復ドライブでうまくいくとは.)

演劇「みんなしねばいいのに」- うさぎストライプ 感想

友人に誘われて京都のアトリエ劇研で鑑賞した「みんなしねばいいのに」- うさぎストライプの簡単な感想を.

演劇を観に行ったのは初めてで,雰囲気が楽しめればいいかなぁという軽い気持ちで行った.

演劇に慣れてなくて内容に集中しきれたわけではないので,解釈はかなり間違っていると思いますが,予めご了承を.

あらすじ

霊が出ると曰く付きの,病院の女子寮が舞台.

主人公がふと呟く「みんなしねばいいのに」という言葉に共鳴するかのように,世界が狂気に満ちていく.

女子寮に住む3人の看護婦たちの,その世界への三者三様の反応.

 

本作では世界が狂気に満ちていくことの象徴として,終わらないハロウィンを舞台にしており,その中では仮装して常識から解放された人々が軽々しく他人を傷つけている.

世紀末的な世界を生きながら,主人公はそれまでの息苦しい生活から解き放たれ,それまで自身の心の奥底に押し込めてきた感情を大衆に向かって吐露する.

その一方で,そんな世界の中でも男と結ばれ,幸せを見つける女性と,世界とともに狂っていく彼氏(多分,医者)を持ち,気持ちが荒んでいく女性が描かれている.

ラストでは,主人公自身も命の危機に晒され,死と向き合う.

主人公は部屋に住まう霊との対話の中で,生きているのと死んでいるのはほとんど同じだということを聞く.

感想

世界系みたいな話は映画評論でよく聞くけど,本作はまさにそれで,世界が主人公の希望するものに変容する.

最終的には彼女は地獄のような生活に向き合うことができたのだろうか.

正直つかめていない.

 

ただ個人的な感想としては,メインのストーリーというよりは,この作品がコメディ的に演出されていることが非常に面白く感じた.

特に,主人公が「みんなしねばいいのに」と呟くシーンとかは,強調しなくてはならないはずなのに,一方で同じ舞台の上で非常に笑えるやりとりがなされている.

このシーンには鳥肌が立った.

映画とかだと,セリフは脳内で分割しづらくて,並列的に出来事を並べるというのが出来ないけど,一方で演劇だと舞台が空間的な広がりを持っているせいか,上手く脳内で並列に処理してくれる.

演劇一般に使われる手法なのかもしれないけど,僕には新鮮で,感動した.

word2vecをwikipediaコーパスで学習

作業動機

今更ながら練習として映画推薦サービスを作ってみようかなと思った.

とりあえず

MovieLens | GroupLens

をいじってみようと思ってダウンロード.

内容はこんな感じ.

  • genome-scores.csv: タグと映画の関連性
  • genome-tags.csv: タグID
  • links.csv: 別データ・セットとの映画ID対応表
  • movies.csv: 映画ID・タイトル・ジャンル(複数)
  • ratings.csv: ユーザの,映画に対する評価値(悪0.5~5良)と評価した時刻.
  • tags.csv: ユーザが映画に対してつけたtagとその時刻.

ぱっと思い浮かんだのは,ユーザに幾つかの映画に対する評価をしてもらい,ratingから似た評価をしているユーザを取ってきて,そのユーザの評価が高い映画を薦めるという能動学習的な方法.

その方法だときっちりユーザ登録型のWebサイト運営出来てないとキツいと思うので,出来ればその他のTwitterのツイートとか見せてもらうとかしてユーザの趣向を取ってきて,推薦したい(出来なさそうだけどとりあえず).

ということで自然言語処理のノウハウが必要になってくるけど,とりあえずはWord2Vecでお茶を濁す.日本語wikipediaのデータを学習してみる.

参考にしたWebサイトは以下の通り.


qiita.com


tjo.hatenablog.com

作業手順

WikipediaのデータをWord2Vecで使える形式に変換

まずwikipediaのデータを取ってくる.

$ curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2

このままだとテキストデータではないので,変換する必要がある.

python環境でやっていく予定なので,WikiExtractor.pyが使える.

$ git clone https://github.com/attardi/wikiextractor
$ python3 wikiextractor/WikiExtractor.py jawiki-latest-pages-articles.xml.bz2

ここまでやるとtextディレクトリが作成されており,それらの下部には各ページのテキストが保存されている.

それらを一つにまとめるために,以下の処理を行う.

$ cat text/*/* > jawiki.txt

でword2vecに読み込ませる前にWord単位のセグメンテーションを行っておく必要がある.そこで,MeCabをhomebrewで入れてそれを使う.

$ brew install mecab
$ mecab -Owakati jawiki.txt -o data.txt

Word2Vecのインストールと実行

$ pip3 install gensim 

でipyhtonを使って学習.

from gensim.models import word2vec
data = word2vec.Text8Corpus("data.txt")
model = word2vec.Word2Vec(data, size=200)

modelが学習されるのに結構時間が掛かりそうなのでとりあえず今はここまで書いておく.

出力

後日,出力の確認をしてみた.
よく知られている例で,イチロー - 野球 + 本田 → サッカーっていう挙動をするってのがあるけど,今回のWikipediaのデータセットのみではそんな出力は出なかったので一応報告.
米googleの研究者が開発したWord2Vecで自然言語処理(独自データ) - Qiita
もちろん上サイトではfacebookデータセットを独自に作ってるみたいなので,挙動が異るのは当たり前.
実際にTwitterとかから映画のレビューを取ってくるときにはそれなりのデータセットを用意する必要がある.

out = model.most_similar(positive=["イチロー", "本田"], negative=["野球"])
for x in out:
    print(x[0], x[1])
天谷 0.5703838467597961
中嶋 0.5688130259513855
中澤 0.5668359398841858
赤木 0.565341055393219
青木 0.5472140908241272
梶谷 0.5470311641693115
斉藤 0.5417250990867615
佐山 0.541033923625946
石毛 0.5390052199363708
松井 0.5352978706359863

その他にもいくつか.

out = model.most_similar(positive=["女性", "王"], negative=["男"])
for x in out:
    print(x[0], x[1])
王族 0.5936665534973145
国王 0.5321540832519531
王室 0.5042459964752197
君主 0.49709588289260864
スルターン 0.4776388108730316
ムスリム 0.47091352939605713
王妃 0.4708373248577118
異教徒 0.4697801470756531
アノーヤター 0.4674013555049896
諸侯 0.4593404531478882

out = model.most_similar(positive=["イスラム教", "旧約聖書"], negative=["コーラン"])
KeyError: "word '旧約聖書' not in vocabulary"

前半の例では王妃が割りと上位に来てて期待通り.
そうでなくても,"王"関連のワードが出て来るWord2Vecの性能に驚き.
自然言語処理は僕の専門分野ではないので,どの程度の性能がでるのかは知らなかったけど,思っていたよりはよかったかな.
更にデータセット増やせば結構良い結果が得られそう.
一方後半の例ではエラーが発生.
ユダヤ教とかが出てほしかったけど,まさか"旧約聖書"が無いとは...
あれかな.多分MeCab分かち書きの分割が上手く行っていないorデータセットにそもそも含まれていないって感じだと思う.
前者の方があり得るかな.その辺も勉強しないとな.

Random Forestの特許

OpenCVとかscikit-learnとかで、Random Forestの手法名がそのままRandomForestじゃなくて、Random Trees、RanodomForestClassifierとかになってたのが気になって、調べてみた。

Is the random forest algorithm patented? Can anyone use it for commercial applications? - Quora

によると、Random Forestの集合学習あたりは別に特許が取られてるわけではなくて、

有力な特徴量の部分集合を求めるための技術が特許が取られてるみたい。(特許を詳しく読んではいないので何となくだけど。)