研究の全てをgitで管理してたら( ・∀・)イイ!!

ここ1ヶ月半くらいかな,研究データの全てをgitで管理してみるようにしました.

画像系の研究なので,テスト画像だったり,テスト画像毎の処理結果だったり,実験を走らせるためのスクリプトだったり,プログラムだったり.
今まではreadme的なテキストファイルに「これはいついつこういう目的でやった実験だよ!(>ヮ<*)」と書いてるだけだったんですが,時間軸方向の管理能力には限界があったのです.

全てをひとつのリポジトリにぶっ込むとリポジトリが肥大化しすぎて(それこそ画像数万枚の実験を何百回となく行うので,バイト数でいうとLinuxカーネルどころじゃない),速度的にさすがに問題が出てくるので,ひとまとまりの実験をひとつのリポジトリにして,全体はsubmoduleとして管理します.
特定の実験のためのアドホックなプログラムはさらにそいつのsubmoduleで,みたいな.

まだ日は浅く管理してる要素の数もそれほどですが,
ドジっ子おさかなさんはしょっちゅう実験ミスするので,こういう形であらゆる実験結果を検証できるようにしておくと非常によいです.

みなさんもいかがでしょうか?

標準入力の数値列から統計量(総和とか平均とか分散とか)を計算するコマンドaccを作った

問:カレントディレクトリより下の階層にある全ての.cppファイルの平均サイズをバイト単位で求めよ

解答例(こういうのあまり得意ではないのでヘンかもしれませんw許してくださいw):

% du -ab | grep "\.cpp\$" | grep -o "^[0-9]\+" | acc --mean -f "%.0f"

研究の仮のデータ集計とかにこういうUNIXライクな小さいプログラム,欲しかったけどありそうでなかったので書きました.
accコマンドと名付け,githubに公開しています.

https://github.com/sakanazensen/acc_command

入力は数値がずらずらとstdinにやってくればOK.double型の範囲を超えないように.
現時点では,総和,最小値,最大値,平均値,分散,中央値の出力ができるようになっています.
中ではboost::accumulatorに計算を丸なげしてるだけです.
よって,boost::accumulatorにない項目(最瀕値や標準偏差)には当面対応できません.
計算量等の問題についてはboost::accumulatorのマニュアルを参照してください.

当然無保証です.MITライセンスとします.
本記事コメントで対応はする考えはあります.pull requestがあれば反応するかもしれません.

実装に対するツッコミもあったら嬉しいかも.
あまり自分のコードを人に見せたことがなくてよくない.

HTC Jに機種変したのでゆるゆるレビュー

auさんが素敵なキャンペーン.
IS03をお使いのあなたに,HTC Jに変えるなら1万円値引きします!と言われたので飛びついて,5月に発表されたばかりのHTC Jに変えました.

ということで,そろそろ2週間経つので簡単にレビュー.
スペックの詳細は他を当たってください.使用感中心.IS03との比較中心.

Continue reading

OpenCV+IPP

Linux版OpenCVを,30日限定評価版のIPP付きでビルドする手順.
IPPとはマルチメディア処理ライブラリIntel Performance Primitivesのことで,intel製CPUを使ったマシンにおいてタスクによって2倍から10倍の性能向上があるとのこと.
事例をぐぐったかんじ,それほど誇張のある数字でもなさそう.

IPPのダウンロードとインストール
  1. http://software.intel.com/en-us/articles/intel-ipp/からダウンロード

    1. 登録が必要になります
    2. ライセンスファイルを添付したメールが届きます
    3. 僕はx86なので現在最新のl_ipp_7.0.7.319_ia32.tgzを落としました
  2. IPPのインストール

    1. 落としたアーカイブを展開
    2. % sudo ./install.sh
    3. あとは質問に答えるだけ

      1. ライセンスファイルのフルパスを入力するところがあります
      2. 正式サポート対象外のディストロの場合(Ubuntu等)では警告されますが無視で
OpenCVのインストール
  1. http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/からダウンロード
  2. 展開
  3. 展開した中に”release”ディレクトリを作成
  4. そこにcd
  5. % cmake -D WITH_IPP=ON -D IPP_H_PATH=/opt/intel/ipp/include -D BUILD_SHARED_LIBS=OFF ..

    1. IPP関連のオプションだけつけた例です

      1. 最後のオプションがないとリンクエラーでます(´・ω・`)
      2. http://stackoverflow.com/questions/10508926/opencv-fails-to-build-with-ipp-support-enabled
    2. 必要に応じて他のオプションもつけて
  6. % make -s -j8
  7. % sudo make install

ついでに,OpenCVビルドのときのオプション全体
% cmake -D WITH_TBB=ON -D WITH_IPP=ON -D IPP_H_PATH=/opt/intel/ipp/include -D BUILD_SHARED_LIBS=OFF -D WITH_FFMPEG=OFF ..

  • TBB使います(objdetectとかimageprocモジュールの中とかで使ってるみたい)
  • FFMPEGがあるとなんかエラーでるので><
  • OpenMPはもはや使われない,んだそうですね.haartrainingの中ではふつーに使ってるんですが
IPPのライセンスの話

IPPを展開した場所にあるlicenseファイルとかNon-Commercial Software Download – Intel® Software Networkにあるとおり,非商用利用においては無料でライセンスを提供して頂けるそうです.
(ライセンスは変更される場合があります.自分で利用される際に再確認をお願いいたします)

「論文の書き方」

産総研 中田先生より.
やればできる 卒業論文の書き方

ちょうど大学院来て最初の論文執筆を始めたところなので,大いに参考になりそう.
というか多くの話は別に卒論に限ったことではないですね.

  • 「結論表」の話,こんなふうにちゃんとまとめて自分の研究を見返したことって,ハッキリ言って全くなかった.今まで何してたんだろう.
  • 「速く書く」話,よく聞く話もあるけど,ここまで具体的な指針に触れたのは初めて.ぜひこれでやってみたい.
  • いい論文とは,ダメな論文とは.耳が痛いよぅ><
  • 「金出先生流の推敲」言われてみれば当然なのに,実践できてないなぁ…

もっと詳しく知りたい方は,理系のための「即効!」卒業論文術―この通りに書けば卒論ができあがるを.
僕も読んでみたいです.

#はてブでやればいいのに的なブログ記事を連発してますね

研究者が知らなくてはいけない事や心構え

慶應・武藤研究室の直江さん(現在助教だそうです)より
情報系の研究者が研究・論文執筆をする際に知らなくてはならない事や心構え
(PDFです)

本文13ページの短い資料ですが,すごく納得できたり,耳が痛かったり.

耳が痛かった主な点

  • サーベイしろ

    • 学部んときのサーベイのしなささは異常でした
    • 何もないところからアイデアは出ません
    • 成果を出すために必要
    • 主体的に研究するために必要
  • CFP(Call for Paper)に注意しろ

    • そもそも自分の分野にどういう学会があるか十分把握してなかった
    • 聞いたことあっても何がトップ会議か知らなかったり

      • impact factorとか調べたこともない
    • 成果を出すために必要
    • 主体的に研究するために必要

第16回 名古屋CV・PRML勉強会が開催されました

こんばんは,名古屋のおさかなさんになって初めての記事です.

4月21日(土),今年度最初の名古屋CV・PRML勉強会が開催されました.
僕が幹事となって最初の勉強会でしたが,多くの方に参加をいただき,またいろいろな方のサポートもあって,個人的には非常に充実したイベントとなりました.

イベントページ: 第16回 名古屋CV・PRML勉強会 – PARTAKE
勉強会公式Twitterアカウント: @nagoyacv
勉強会Google Groups: 名古屋CV・PRML勉強会 – Google グループ
勉強会webページ: 名古屋CV・PRML勉強会

また,当日のツイートをまとめています.
第16回 名古屋CV・PRML勉強会ツイートまとめ – Togetter

今回はいろいろと節目であり,また初参加者の方が非常に多かったこともあって,今後の勉強会をどうしていけたらいいだろうというフリーディスカッションの時間を設けるという初の試みをしました.
この記事では,このときの議事録と,勉強会をはじめて主催しての感想をまとめたいと思います.

Continue reading

魚でもわかるRandom Projection

いきなり始まった「魚でもわかる」シリーズ.

今回は情報科学系の方向け.
次元削減のいち手法である「Random Projection」を簡単に紹介します.

具体的にやってること,できることはものっそ簡単で,こないだBoostアドベ記事を書き上げてから寝付けなかったのでふと思い立って取り組んでみたら一発ですごいちゃんとできたのでブログにまとめるに至った次第(そしてその日はそのまま寝付けずに昼間死ぬかと思ったという).
最初に知ったのはMIRU2011という,夏にあった学会でとある論文を読んだ時.

もちろんわかってると思いますが,ツッコミ待ちです!!

Continue reading

cuda-gdbがlibpythonのエラーで起動できなかったら

CUDA4.1に付属のcuda-gdbはlibpython2.6が必要なんだそうです。
ぼくはpython3.xネイティブなので2.xは使えませんとかそういうのはおいといて、身近なディストロの最新はだいたい2.x系としては2.7しか用意してないぽい。

% cuda-gdb
cuda-gdb: error while loading shared libraries: libpython2.6.so.1.0: cannot open shared object file: No such file or directory

自分でlibpython2.6を入手して手元でビルドしてもいいんですがそんなねぇ。

ごまかしちゃえばいいみたいです。

% sudo ln -s /usr/lib/libpython2.7.so.1.0 /usr/lib/libpython2.6.so.1.0
% sudo ln -s /usr/lib64/libpython2.7.so.1.0 /usr/lib64/libpython2.6.so.1.0

ちょ。
YOUこんなことしていいのかYO!

% cuda-gdb
NVIDIA (R) CUDA Debugger
4.1 release
Portions Copyright (C) 2007-2012 NVIDIA Corporation
GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(cuda-gdb)

        ∧∧
       ヽ(・ω・)/   ズコー
      \(.\ ノ
    、ハ,,、  ̄
     ̄

ちょっと使った範囲だと問題なく動いてはいます。

クラス内カーネル

CUDA 4.0の話です。古くてごめんなさい。

nvccは限定的ながらC++に対応してるということで、例えばクラスメンバがvirtualだったりするとダメとかみたいな制限はあるんですが、カーネル自体がクラスメンバになれないとは。

class ACUDAClass
{
	__global__ void kernel();
public:
	void func()
	{
		kernel<<<1, 1>>>();
	}
};

void ACUDAClass::kernel()
{
}

int main()
{
	ACUDAClass ob;
	ob.func();
}

こんなエラーが出ます。

% nvcc prog.cu
prog.cu(3): error: illegal combination of memory qualifiers

1 error detected in the compilation of "/tmp/tmpxft_00003d82_00000000-4_prog.cpp1.ii".

もちろん、こういう風にクラスメンバからカーネルを呼ぶのは何も問題ありません。

__global__ void kernel()
{
}

class ACUDAClass
{
public:
	void func()
	{
		kernel<<<1, 1>>>();
	}
};

int main()
{
	ACUDAClass ob;
	ob.func();
}

理由はどうも単純なもので、thisをカーネルに渡せないからクラスメンバとしては置けないよ!!というアレみたい。

ならばと思ってカーネルをstaticにしても同じエラーがでます。はて。
例えばグローバル変数(ホスト側にある)を参照するとundefined symbolってちゃんとエラー吐けてるから同じ程度の問題のような気もする。

ところが、__device__だとおっけーなんですね。
ふむ。わからん。

誰かホントのところ教えてくだしあ。
あと最初に言ったようにこれCUDA 4.0での話なので4.1ではどうなってるか未確認です。ごめんね∩(・ω・)∩