SSEとAVXで高次元ベクトルの内積計算を高速化してみた

世界最速のお魚と言えばカジキ類で,泳ぐ速度は時速100km/hを超えるとか.55ノット程になるのでこれはMk-48魚雷にも匹敵するほどです.
一方ちょっとチートな高速お魚としては,お馴染みトビウオが飛行中に最大70km/hほどに達するとか.
今日はそんな若干チートな高速化のお話(?)ということで,SSE組み込み命令について.

SSEやAVXといえばお馴染みSIMD命令で,それをプログラムから構造体と関数の形式で高移殖に記述する方法がSIMD組み込み関数(SIMD Intrinsic)なわけですが,これを使ってごく典型的なベクトルの内積計算を高速化してみました.

ベクトルの内積の高速化と言えば星の数ほどもされてる話なわけで,いまさら魚の情報なんか役に立つ気は全くしないのですが,純粋に自分でやらないとわかんない>< ということで,

  • とにかく書いてみよう
  • 効果の程はいかに?

を調べてみたくて,やってみました.
もちろん完全に最適化されたコードでもなく,この記事の内容は無保証です.

参考は主に
SSE.浮動小数点演算手動最適化は本当に効果的なのか – デー
インテル(R) Advanced Vector Extensions (インテル(R) AVX) の組み込み関数
です.

Continue reading

MATEデスクトップ環境のマルチディスプレイ設定

お魚の目にはDHAって物質がたくさん含まれてて,その神経細胞に与える影響のおかげで,魚の目を食べると頭良くなるとかって言うんだそうですね.
IQの不足を実感する今日この頃であります.

さて,Linux Mintのデスクトップ環境の一つであるMATEですが,マルチディスプレイにしたときのデスクトップ周りの設定があまりなかったのでメモ.

基本的にはさかな前線 » Xfceのマルチディスプレイ設定をXfceからMATEにした話です.

表示する位置関係の設定

2枚のディスプレイの物理的配置と論理的配置を整合させる設定.
[メニュー]→[設定]→[モニタの設定]をクリック.

で,表示されてるディスプレイをD&Dして適切に配置しなおして,適用.
ま,この設定はググれば普通にでてきてくれますw

20130125_monitor_setting

パネルの表示位置

パネル(下のバー)はデフォルトでは「0番目のディスプレイ」に表示されます.
ディスプレイの配置によっては「0番目として認識されたディスプレイ」が適切な位置にないことも普通にあるので,パネルをどのディスプレイに表示するか設定します.

[メニュー]→[システムツール]→[設定エディタ]から設定エディタを開き,下のスクショのように[apps]→[panel]→[toplevels]→[panel0]へと辿ります.
そこにあるmonitorの項目が,何番目のディスプレイにパネルを表示するかの設定なので,0から1や2など適切な番号に変えることで,意図した配置になります.

20130125_setting_editor

壁紙をディスプレイに応じて変えることはできないのか(´・ω・`)

MATEデスクトップ環境では調べた限りできないみたいですね・・・

google-glogで最低限使いたい,ただ1つの機能 〜自動スタックトレース出力〜

もう10年以上も前になりますけども,近場の漁港によく連れて行ってもらって魚釣りしていました.
ちょうどアジは西日本の日本海側が本場ということもあって,僕の地元では岸壁に立ってサビキをすると小アジがたくさん釣れました.

さて,google-glogと言えばgoogle謹製のログライブラリ.
Google Japan Blog: C++ のプログラムのデバッグを楽にする方法にて概要が紹介されていて,ドキュメントには簡単なチュートリアルがあります.基本的には使い方に難しいところは何も無いです.

お魚さん的には学部卒論のときから使っててもはや手放せないんですが,作業が切羽詰ってくるとあんまり律儀にログを出す余裕がなくなってきますw
そんな時でもただ一ついつでも使ってたのが,「落ちた時にスタックトレースを吐く機能」です.
ということで今回はそれに絞って紹介.まとまった記事を書くには今時間的余裕がない><

Continue reading

cv::SurfDescriptorExtractorの拡張ディスクリプタを無効にする

魚類というのは分類学的にどうなるのか調べてみたら,昔は「綱」だったけどそうも言えないことがわかって,今は魚類をひっくるめた分類というのはない(生物学的には意味がなくなってしまう)んだそうですね.

さて,局所特徴量のSURFと言うと64次元だよね!という認識が一般的だと思います.
実際には原著(*1)の段階から特徴量を128次元で記述する拡張ディスクリプタ(extended descriptor)についても言及されていて,OpenCVの実装ではSURF特徴記述を行うcv::SurfDescriptorExtractorにおいてデフォルトで有効となっています.

cv::SurfDescriptorExtractor extractor;
std::cout << extractor.descriptorSize() << std::endl;  //128と出力されます

本来の64次元で使うには,特徴記述処理を行う前にこれを無効にします.
SurfDescriptorExtractorのコンストラクタのextendedをfalseにすればおkなんですが,
ぐぐって見つかるリファレンスでは最新のバージョンに同期されてなくて,でもコンパイルは通るので一瞬困惑します.

コンストラクタで指定するよりは,

cv::SurfDescriptorExtractor extractor;
extractor.extended = false;
std::cout << extractor.descriptorSize() << std::endl;  //64と出力されます

とすれば,その他のコンストラクタの他のデフォルトはそのままにいけます.少し汚いですが.

*1: H.Bay et. al., “Speeded-Up Robust Features (SURF),” ECCV2006

ssh -Xでevinceが動かない場合の対処

ぶっちゃけるとわりと最近までそれほど魚食べるのは好きじゃなかったんですね.
でも魚キャラを2年かそこらくらいやってて,自分の中に変化が….
というわけでお魚食べたいです.お魚.

さて,sshのX転送は便利でよく使わしてもらってるんですが,アプリによっては特有のエラーで使えなかったり.

Ubuntu系ディストロにて標準で使えるevince(PDFのドキュメントビューア)もそんなアプリの一つで,ssh -Xで普通に実行すると次のようなエラーが出ます(ちゃんと環境変数設定してても).

% DISPLAY=localhost:10.0 evince hogehoge.pdf
(evince:xxxxx): EggSMClient-WARNING **: Failed to connect to the session manager: None of the authentication protocols specified are supported
                Cannot parse arguments: ディスプレイをオープンできません:

ぐぐると,日本語の情報はあんま見つかんなかったのですが,
My Meaningless Scribbles …: Evince would not start over SSH X-forwarding
で解決法が紹介されました.エラーメッセージだけでぐぐるとこれは見つからなかったですね.
これしてからsshで入った先で,

% sudo ln -s /etc/apparmor.d/usr.bin.evince /etc/apparmor.d/disable
% sudo /etc/init.d/apparmor restart

を実行すると,他のアプリと同様にX転送してくれるようになって(゚д゚)ウマーです.

おっと論文書いてることバレるぞ(違

sshプロキシ設定

あけましておめでとうございます.
蛇年ですね.年男ですが,今年も魚でやっていきます.

さて,ラボのLAN内の自分のマシンに学外からsshで入りたいです.
そのためには,ラボのゲートウェイを超える必要があって,多段SSHをする必要があります.

家PCから,ラボGWにsshして,そこからラボPCにssh,これを,SSHプロキシ機能で一度にやってくれる設定.
いわゆるport forwardingではなくて,ncとかも不要で原理もわかりやすく設定もラクです.

基本的にはこのあたりを参考にしてるというかそのままです.
The Weight @northeye: sshコマンドだけで多段ログインする
あとこのやり方の手がかり?は@ton1517が教えてくれました.thx!

家PC,ラボGW,ラボPCどれもLinuxです.

家PCの自分のssh設定を記述します.$HOME/.ssh/configを編集してください.

  • 家PCホスト名: HOMEPC
  • ラボGWホスト名: LABGW (外から普通にsshできる完全な名前で)
  • ラボPCホスト名: LABPC
  • ラボPCに入るときのユーザ名: labgw_name
  • ラボGWに入るときのユーザ名: labpc_name

として,

% cat ~/.ssh/config
Host LABPC
    Hostname        LABPC
    User            labpc_name
    ProxyCommand    ssh labgw_name@LABGW -W %h:%p

ホスト名はIPアドレスでもおkです.

何段階かのGWを経る必要がある場合はHostのホスト名やプロキシ先を変えながら経由するGWの分だけ線形リストのように書き足して行けるようです.

これで,家PCにて

HOMEPC% ssh LABPC

でラボPCに一気につながります.ユーザ名修飾も不要で(゚д゚)ウマーです.
また,

HOMEPC% ssh -XY LABPC

としてXの転送もできて超(゚д゚)ウマーです.

以上,2013年最初の記事は完全に自分用メモでした.

私事ですが,こうしてラボ外からでも自由に研究できるようにしないとヤバい状況です.なんという年明け.
研究という名のエクストリームスポーツ.

BundlerによるStructure from MotionでKAZE局所特徴量を使ってみた

一応お魚キャラとしてやっているわけですが,私のアイコンの魚を前からみるとどうなるの?とときどき聞かれます.
回答としては,このお魚は”幅を持たない”形状をしています.二次元です。

さて,大量の未整列な多視点画像からの三次元形状復元ついでにカメラの内外部パラメータの推定まで一気にしちゃう手法のことをStructure from Motion(SfM)と言い,結構長いこと研究されているホットな話題であります.

そんなSfMを行うためのツールにBundlerがあります.r○byのbundlerとは全く関係ありません.
Bundlerは局所特徴量を用いたsparseな画像間対応からSfMをするもので,一般的にはSIFTが使われていますが,対応付けは独立プログラムに委譲されてるので,うまくやればどんな局所特徴量でもSfMをお楽しみいただける設計になっています.

ということで,Computer Vision Advent Calendar 2012で書いたさかな前線 » ECCV2012で発表されたKAZE局所特徴量を試してみたの続きという事で,KAZE特徴量を用いたBundlerでのSfMを試してみました.実用的な例がほしかったのでw
CVAdventCalendarの@yasutomo57jpさんの記事の二番煎じです…

Bundler(やPMVS)のアルゴリズムについては他に譲ります(←

20121209_bundler_example_pmvs

※結論から言うとやり方がまずいのでto be continuedです…

Continue reading

CV勉強会@関東に参加してきました.ついでに少ししゃべりました.

フグといえば山口県ということで僕の地元でして,県としては対外的にはフグのことを福とかけて「フ」と言ってるわけですが,ぶっちゃけ一般市民はそう読んでなくてフク雑な気持ちになります.

さて,2012/12/16に慶応大矢上キャンパスにて@takminさん主催でコンピュータビジョン勉強会@関東ECCV2012読み会が開催されまして,就活ついでに行ってきたついでに発表までしてきました.

簡単に感想だけ.

Continue reading

cv::Matとcv::Mat_<T>の画素アクセスの速度

近くのスーパーに秋は国内産の鮭が売っててよく買ってたんですが最近は輸入のサーモンばっかしです少し寂しいです.

OpenCVでちょっと気になって,画素単位のアクセスをするときcv::Matのat()による方法とcv::Mat_のoperator()による方法でどっちが速いかなと思って調べてみました.
星の数ほどされてる議論のようなするけどぱっと見た範囲で見当たらなかったのでやってみた.
参考までに画像ピクセル値へのアクセスと計算速度 | OpenCV.jpもあります.

結論から言うと,全く同じでした.

コードはこんなかんじ.時間計測はオレオレライブラリで高精度な計測ができます.

実行結果はこんなかんじ.

% ./a.out
cv::Mat::at<T>() -> 9.82353ms/回
cv::Mat_<unsigned char>::operator() -> 9.69412ms/回

大きさ(w,h)によらず同じくらいの模様.

あと気になる生配列とのアクセス速度の差ですが,上述プログラムと同じ処理を書いちゃうと最適化で全部消えちゃうしそうならないくらい複雑なプログラムは面倒だったので断念.
最適化しなければ,cv::Matの方が3割くらい遅いくらいでした.最適化するとどうなるやら.

  • CPU: i7 870 (2.93GHz)
  • OS: Ubuntu 11.10 x86
  • gcc: 4.7.0
  • option: -std=c++0x
  • OpenCV: 2.4.3

追記:
Ivy Bridge速すぎワロタw

  • CPU: i5 3570 (3.40 GHz)
  • OS: Linux Mint 13
  • gcc: 4.6.3
  • OpenCV: 2.4.3
% ./a.out
cv::Mat::at<T>() -> 2.34902ms/回
cv::Mat_<unsigned char>::operator() -> 2.34902ms/回

ECCV2012で発表されたKAZE局所特徴量を試してみた

先日ちょっと膝をケガしてしまいまして,ギプスに松葉杖です.けっこうリアルさかなに近づけたんじゃないかと思うのですがいかがでしょう?
折しも12/6で私も23歳を迎えました.できれば無事健康体で迎えたかったこの日.

この記事はComputer Vision Advent Calendar 2012の12/7担当分として書かれたものです.
主催者でありながら華麗に遅刻をキメました.これはひどい.
高専時代の後輩でもある@blue_jamくん,お疲れ様でした.そして誕生日メッセージありがとうございます.

さて,コンピュータビジョンにおける極めて重要な要素のひとつに画像特徴量があります.
これまでにたくさんの特徴抽出手法が提案されてきているわけですが,この度は最近の国際会議で発表されたばかりの新しい手法の実装が公開されていたので,それを試して見ることにしました.

Continue reading