ruby-opencvの進捗の話(2014年2月版)
はじめに
なんか気がついたら2014年も1ヶ月が過ぎてますが、ruby-opencvのお話です。 前回からバージョンもだいぶ上がり、機能も地味にいろいろ追加されてるので、ちょっとだけ紹介します。
APIリファレンス的なものを(ようやく)用意しました
前からちょっとずつYARDで書いてたアレをようやくマージしました。 rubydoc.infoで見れるのでどうぞ。
微妙に網羅できてないのもありますが、よく使うやつはだいたい書いてあります。
FaceRecognizerを追加しました
FaceRecognizer #17 でご要望を頂いておきながらずーっと放っておいたFaceRecognizerが(v0.0.11から)使えるようになりました。 公式のチュートリアル Face Recognition with OpenCV に相当するサンプルも用意してあるので、興味のある方はぜひどうぞ。
https://github.com/ruby-opencv/ruby-opencv/tree/master/examples/facerec
FaceRecognizer(EigenFaces)のサンプルコード
せっかくなので、FaceRecognizerのEigenFacesを使って顔認識してみましょう。 Ubuntu 13.10 + Ruby 2.1.0-p0(x86_64-linux) + ruby-opencv 0.0.12 で動作確認していますが、だいたいどの環境でも同じように動くはずです。
1. 認識用の顔画像を AT&T Facedatabase から取ってくる
http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html から認識用の顔画像を取ってきて展開します。
$ wget http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip $ unzip att_faces.zip
2. テストデータを用意する
学習用に顔画像をラベルと対応付けたファイルを作成します。 OpenCV公式チュートリアルのこれを使ってもいいですが、 Ruby版のcreate_csv.rbも作ったので今回はこっちを使いましょう。
# create_csv.rb if ARGV.size != 1 puts "usage: ruby #{__FILE__} <base_path>" exit end BASE_PATH = ARGV[0] SEPARATOR = ';' label = 0 Dir.glob("#{BASE_PATH}/*").each { |dir| if FileTest::directory? dir Dir.glob("#{dir}/*") { |filename| puts "#{filename}#{SEPARATOR}#{label}" } label += 1 end }
画像ファイルのフォルダを引数で指定して実行します。 結果は標準出力に出るので、適当にリダイレクトしてください。
$ ruby create_csv.rb att_faces > at.txt
実行すると、下記のように 画像ファイル名;ラベル というフォーマットで対応付けのファイルが作成されます。
$ cat at.txt att_faces/s34/2.pgm;0 att_faces/s34/3.pgm;0 att_faces/s34/8.pgm;0 att_faces/s34/4.pgm;0 att_faces/s34/5.pgm;0 att_faces/s34/10.pgm;0 att_faces/s34/9.pgm;0 att_faces/s34/7.pgm;0 att_faces/s34/6.pgm;0 att_faces/s34/1.pgm;0 ...
3. 顔認識してみる
こんな感じのプログラム(eigenfaces.rb)を作ります。
# eigenfaces.rb require 'opencv' include OpenCV def read_csv(filename, sepalator = ';') images = [] labels = [] open(filename, 'r') { |f| f.each { |line| path, label = line.chomp.split(sepalator) images << CvMat.load(path, CV_LOAD_IMAGE_GRAYSCALE) labels << label.to_i } } [images, labels] end if ARGV.size < 1 puts "usage: ruby #{__FILE__} <csv.ext>" exit 1 end fn_csv = ARGV.shift output_folder = ARGV.shift # 顔画像を読み込む images, labels = read_csv(fn_csv); height = images[0].rows; # 識別対象の顔画像は学習対象とは別にしておく test_sample = images.pop test_label = labels.pop # Eigenfacesのモデルを作成して学習 model = EigenFaces.new model.train(images, labels) # 識別処理 # 識別結果のラベルと一致度が返ってくる predicted_label, predicted_confidence = model.predict(test_sample) # 結果を表示 puts "Predicted class: #{predicted_label} / Actual class: #{test_label}" puts "Confidence: #{predicted_confidence}" w1 = GUI::Window.new('Predicted') w2 = GUI::Window.new('Actual') w1.show images[predicted_label] w2.show images[test_label] GUI::wait_key
で、実行します。引数は2で作ったファイルのファイル名です。
$ ruby eigenfaces.rb at.txt
実行結果はこんな感じ(左が識別結果で右が実際の顔)。どうやらそれっぽく動いているようです。
そんなわけで
modern.IEで配布されているWindowsの仮想マシンを64bit版Ubuntuにインストールしようとした話
環境
- Ubuntu 13.04 64bit
- VirtualBox 4.2.12
なにごと?
マイクロソフトがIEでのWebページの検証のために、modern.IE というサイトで各種バージョンのIEが入った仮想マシンを配布しています。
Linuxでの検証用にはVirtualBoxのVMが配布されていたので、試しにIE10入りのWindows7をUbuntuにインストールしようとしてみたのですが…
$ wget -i https://az412801.vo.msecnd.net/vhd/IEKitV1_Final/VirtualBox/Linux/IE10_Win7/IE10.Win7.For.LinuxVirtualBox_2.txt $ ls IE10.Win7.For.LinuxVirtualBox.part1.sfx IE10.Win7.For.LinuxVirtualBox.part3.rar IE10.Win7.For.LinuxVirtualBox.part5.rar IE10.Win7.For.LinuxVirtualBox.part2.rar IE10.Win7.For.LinuxVirtualBox.part4.rar IE10.Win7.For.LinuxVirtualBox_2.txt $ chmod +x IE10.Win7.For.LinuxVirtualBox.part1.sfx $ ./IE10.Win7.For.LinuxVirtualBox.part1.sfx zsh: そのようなファイルやディレクトリはありません: ./IE10.Win7.For.LinuxVirtualBox.part1.sfx
IE10.Win7.For.LinuxVirtualBox.part1.sfxあるのに…
sfxファイルの中身を調べてみると
$ file IE10.Win7.For.LinuxVirtualBox.part1.sfx IE10.Win7.For.LinuxVirtualBox.part1.sfx: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
32bit用の実行ファイルのようです。 OSが64bitなので、32bitの実行ファイルを使えるようにライブラリをインストールします。
$ sudo apt-get update $ sudo apt-get install libc6:i386 libstdc++6:i386
で、もう一度試してみると…
$ ./IE10.Win7.For.LinuxVirtualBox.part1.sfx
RAR SFX archive
Extracting from ./IE10.Win7.For.LinuxVirtualBox.part1.sfx
Extracting IE10 - Win7.ova 0%
…
どうやらうまくいったっぽいです。 あとはできあがったovaファイルをVirtualBoxにインポートすれば仮想マシンが使えるようになります。
参考
ruby-opencvがRuby 2.0で使えるようになりました
というわけで
気がついたらだいぶ時間が開いてしまいましたが、ようやくRuby 2.0に対応しました。
ruby-opencv | RubyGems.org | your community gem host
動作環境は
- Ruby 1.9.3, 2.0.0
- OpenCV 2.4.5
となっております。 例によってWindows用にはmingw32,mswin32用のコンパイル済みパッケージも用意してあります。
Ruby 2.0対応以外の変更点は、バグ修正やFat gem作成機能追加ぐらいなので、そろそろ新しい機能も入れたいところですね。 中途半端に手を付けたFaceRecognizerを次回ぐらいで入れたいなー、 などと考えております。あとはリファレンスも進めなければ…。
開発は以下のリポジトリでやっていますので、お気づきの点やご要望、イケてるPull Requestなど、お待ちしております。
VirtualBoxでAndroidしてみる
VirtualBoxにAndroidを入れてみたくなったので
調べたらこんなプロジェクトがありました。
AndroVM | Running Android in a Virtual Machine
The "AndroVM" initiative aims at providing a "as good as possible" support to run Android in Virtual environments.
仮想環境でAndroidがうまく動くようにしよう、というプロジェクトのようです。
VirtualBox用の.ovaファイルが配布されているので、これを使ってインストールしてみます。
環境
- Ubuntu 12.10
- VirtualBox 4.2.6 (Linux AMD64)
ダウンロード
まずは http://androvm.org/blog/download/ からovaファイルをダウンロードします。 何種類かありますが…
Please note AndroVM comes in 3 different versions :
- vbox86p : Built for a "phone", 480×800 default resolution
- vbox86t : Built for a "tablet", 1024×600 default resolution
- vbox86tp : Built for a "tablet" with phone capabilities, 1024×600 default resolution
- vbox86p …携帯電話用 / 解像度 480×800
- vbox86t …タブレット用 / 解像度 1024×600
- vbox86tp …タブレット用(電話機能付き)/ 解像度 1024×600
という違いのようです。 また、末尾が「with gapps & houdini」となっているものは、Playストアのアプリが同梱されています。 というわけで今回は、vbox86tp version with gapps & houdini の最新版 androVM_vbox86tp_4.1.1_r4-20121119-gapps-houdini-flash.ova(Android 4.1.1相当) をダウンロードします。
インストール
VirtualBoxを起動し、メニューから [ファイル]→[仮想アプライアンスのインポート] でダウンロードした.ovaファイルをインポートします。
ドキュメントにはインポート後、仮想マシンのネットワーク設定で「ホストオンリーアダプタ」を設定するように書いてあるのですが、これだけだと外部のネットワークに繋げられないので、NAT接続も追加しておきます。今回は
- アダプタ 1: NAT
- アダプタ 2: ホストオンリーアダプタ
という設定にしました。
動かしてみる
VirtualBoxでインポートしたVMを起動し、Googleアカウント等の設定をすると…
いい感じに動いています。Playストアからアプリも問題なくインストールできました。
また、Superuserが同梱されているので、Android Terminal Emulatorなどの端末エミュレータを入れれば、そのまま $ su -
でrootになれます。
ボタン操作は?
Some special (hardware) keys :
To unlock screen, press the "Home" or "F1" key The android "back" button is mapped to the physical "Esc" key
スクリーンのアンロックは Homeキー または F1キー、バックボタンは Escキーにマッピングされています。 ホームボタンも Homeキー にマッピングされているようです。
Kindleアプリは…書籍がダウンロードできない
Kindleストアで購入した書籍をダウンロードしようとすると、ダウンロード終了間際に「問題が発生したため、Amazon Kindleを終了します」 というエラーメッセージが出て、ダウンロードに失敗します。Kindleアプリは十分に使えなさそうな雰囲気です。
まとめ
というわけで微妙に動かないアプリもありますが、割と簡単にVirtualBoxへAndroidをインストールすることができました。 ノーリスクでroot権限付きAndroidが手に入るので、Androidで遊ぶにはちょうど良さそうです。
ruby-opencvをようやくRubyGems.orgに登録しました
というわけで
ようやく $ gem install ruby-opencv
するだけでruby-opencvがインストールできるようになりました!
ruby-opencv | RubyGems.org | your community gem host
インストールするには?
必要なもの
- Ruby 1.8.7 または 1.9.3
- OpenCV 2.4.3
Linux/Macの場合
$ gem install ruby-opencv -- --with-opencv-dir=/path/to/opencvdir
/path/to/opencvdirには、OpenCVがインストールされているディレクトリを指定してください(指定しない場合は /usr/local を見に行きます)。
Windowsの場合
Windows版はmingw32とmswin32用のコンパイル済みパッケージが用意されています。
- OpenCVをインストール
- OpenCVのdllが格納されたフォルダにパスを通す(例えばOpenCVをC:\opencvにインストールした場合、mswin32ならC:\opencv\build\x86\vc10\bin, mingw32ならC:\opencv\build\x86\mingw\binにパスを通してください)
- 以下のコマンドでruby-opencvをインストール
$ gem install ruby-opencv
今後の展開とか
とりあえず
- Ruby 2.0だと動かないっぽいので直す(ruby-opencv v0.0.8時点)
- さっさとリファレンスを作る(一応、documentationブランチで作業中)
- OpenCV 2.xの機能に対応させる
あたりを中心に進めたいと思っています。
動かない!とかこんな機能が欲しい!とかコードがイケてない!など、お気づきの点がございましたら、 ぜひともGitHubのIssuesページよりお知らせください。Pull Requestも大歓迎ですよー。
年末なのでEmacsの設定ファイルを見直しますよ
年末ですね
大掃除の季節なので、普段使っているEmacsの設定ファイルを整理してみました。 ついでに前から気に入らなかった部分を直したり、便利そうなものを追加したので、いくつかピックアップして書いておきます。
全体の設定ファイルはGitHubに置いてあります。
設定ファイルを分割してinit-loader.elで読み込み
今までは.emacs.elに設定を全部書いていたのですが、いい加減見通しが悪くなってきたので分割することに。
分割したファイルの読み込みのため、指定したディレクトリ内にある設定ファイルを読み込んでくれる便利ツール init-loader.el(オリジナルに改良を加えたもの) を導入しました。 エラーがあったファイルは無視して他のファイルの設定を続行してくれるのが素敵です。
デフォルトでは起動時にログバッファが表示されてエラーなどの状況がわかるようになっているのですが、毎回表示されるのはさすがにアレなので、エラーがあったときだけ表示するようにしています。
(require 'init-loader) (setq init-loader-show-log-after-init nil) ; 起動時のログバッファを表示しない (init-loader-load "~/.emacs.d/config") (if (not (equal (init-loader-error-log) "")) ; エラーがあったときだけログバッファを表示 (init-loader-show-log))
package.elでパッケージ管理
Emacs 24から標準搭載されたパッケージ管理システム package.el を使うようにしました。 GNUのだけだとパッケージが少ないのでMELPAとMarmaladeのリポジトリを追加しているのですが、それでも微妙に欲しいパッケージが無かったりするので、そういうのは手動で。
(require 'package) (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/")) (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
tabbar.elでタブエディタ化
前からEmacsにもタブが欲しいと思っていたので、この機会に tabbar.el でタブをつけてみました。 さすがにバッファ全部がタブで表示されると邪魔なので、*scratch*バッファ以外の * で始まるバッファはタブに表示しないように設定しています。
(require 'tabbar) (tabbar-mode 1) (defun my-tabbar-buffer-list () (delq nil (mapcar #'(lambda (b) (cond ;; Always include the current buffer. ((eq (current-buffer) b) b) ((buffer-file-name b) b) ((char-equal ?\ (aref (buffer-name b) 0)) nil) ((equal "*scratch*" (buffer-name b)) b) ; *scratch*バッファは表示する ((char-equal ?* (aref (buffer-name b) 0)) nil) ; それ以外の * で始まるバッファは表示しない ((buffer-live-p b) b))) (buffer-list)))) (setq tabbar-buffer-list-function 'my-tabbar-buffer-list)
まとめ
そんなわけで、Emacsの設定ファイルを整理しました。
JavaScriptでK-means法してみた
集合知プログラミング勉強会でK-means法を勉強したので
復習とJavaScriptの練習を兼ねて、クラスタリングの定番アルゴリズム「K-means法」をビジュアライズしてみた - てっく煮ブログのJavaScript版を作ってみました。
K-Means clustering Visualiser - jsdo.it
PointsとKの値を適当に変えて[Initialize]ボタンを押した後、[Step]ボタンを押すと各クラスタが更新されていきます。 Firefox 16とChrome 22あたりなら動くはず。
ソースコードはGitHubに置いてあります。 ser1zw/k-means-visualiser-js