類似検索を更新した

よくなったけど俺以外には違いが分からない気がする。

花: http://flowers.libotama.so/

アニメ顔: http://animeface3.libotama.so/

やってることは前のままだけど、特徴点検出の閾値からVLADの次元、LMCAの学習アルゴリズムに至るまで、ざまざまなところに勘で決めてたパラメーターがあったのを実験により最適化するという地獄のような作業を行うことで精度が1割くらいマシになった。

相変わらずgithubに反映してないけど、もうマジでこれで固めるから……

あとやりたいのは

  • 説明書く
  • Windows用のバイナリ作る
  • Debianパッケージ(バイナリ)作る

くらい。

バイナリは便利というかソースコードからのコンパイルが面倒なので作りたいけど、POPCNT命令が使えるとN倍速いとかできれば有効にしたいCPU依存の処理があって、そういうのコンパイル時に判定するように作っているから、i686とか大きなターゲット向けだと使えない。どうするかなーと迷ってる。迷ってるというかこのへんの事情に詳しくないので調べないといけない。

そろそろ本気出す!!

一時のテンションは一瞬で消えたのと、3月の後半まではいろいろ忙しかったというのもあって完全に活動停止状態だったけど、ここ1週間くらいはゲームして本読んで寝るというクソみたいな生活を送っており危機感飽きてきたのでインターネット活動に戻ってこようと思う。
まずは下の記事に書いた画像検索関連のことをまとめて、余力があるならAnimeFace(検出器)の方で気になっているところをやりたい。
他にもいろいろあるけど、同時に色々やろうとすると短い期間で激鬱期に入ってすぐ死んでしまうのが分かったので、このあたりのことをもう一生気にしなくていい程度にまとめて、他のことをしてても常に気になって精神的につらい状態にならないようにするのを優先したい。

この日記は昨日書こうと思ったけど、エイプリルフールだったため今日書きました。

計量学習を用いた画像検索エンジンとアニメ顔類似検索v3について

まだgithubにはpushしていないのですが、さいきょうの組み込み型画像検索エンジンotamaに計量学習を用いて与えられたデータにあった画像間の距離関数を学習してそれを使って検索するというドライバを入れたので、先行的なデモとしてアニメ顔類似検索v3を作ってみました。
計量学習は、ベクトル間の距離の計り方を機械学習で決めるみたいな分野です。

アニメ顔類似検索v3

AnimeFace Search v3 - Otama LMCA_VLAD_HSV Driver

https://raw.github.com/nagadomi/misc-image/master/otama/animeface-1.png

randomボタンを押すと顔画像がランダムに出るのでどれかクリックするとそれをクエリに検索します。color weightは色の重みを調節するパラメーターで、1にすると色だけで検索します。0にすると形状やテクスチャだけで検索します。結果画像の上の数字は類似度的なもので、その横のgglは元画像をGoogle Search by Imageを使って検索するためのリンクです。
上のほうに例として見栄えのよさそうなクエリへのリンクを張っているので、それらをクリックすると大体の雰囲気が分かると思います。
検索中に変な領域に入ってしまうと、どれ選んでも変な感じになるので、全然ダメジャン!!と思ったら、一度randomをクリックしてリセットしてみてください。
あと、Chromeを使っている方は、翻訳バーが出てうざいかもしれません。ドメインに対して無効にしましょう。

今回のバージョンは汎用的な画像特徴量だけ使ってユーザーが主観で作ったラベル付きデータに合う画像検索エンジンを自動構築するという汎用的なもので、このウェブアプリケーションもotamaに添付しているexample-webappというサンプルプログラムを使っているだけなので、前のバージョンのような髪の色で検索できたり髪を強調する前処理を入れたりのアニメ顔専用の機能は入れていません。
データは前回(http://anime.udp.jp/face-search-v1/)と同じく、animeface-character-datasetで学習して、それとは全く関係のない 4chan /a/ をクロールして得た画像からImager::AnimeFaceを使って自動で切り取った顔画像約10万件が入っています。

花類似検索

それと、アニメ顔以外でも使えますよという例として花類似検索も作ってみた。

102flowers - Otama LMCA_VLAD_HSV Driver

https://raw.github.com/nagadomi/misc-image/master/otama/flowers-1.png

こっちは102 Category Flower Datasetというデータを半分使って学習して、全部を入れています。アニメ顔類似検索と違って学習に使ったクラス(花の種類)しか入っていないので、こっちのほうがうまくいっていると思うし正しい使い方です。

他に Stanford Dogs Dataset を使って犬類似検索も作ってみたけど、難しすぎてやばかったので公開は控えます(死

あらまし

表紙を写すと本のレビューが読めたりするHTML5アプリを作ってみた - デーで開発中の画像検索エンジンライブラリを紹介しました。
この記事は僕の書き方が悪かったというものあるけど、JavaScriptで動画が扱えてすごい!!みたいな反応が多かったのですが、これがやっていることはスマホで適当に本を撮影すると100万件を超える本のデータベースから該当の本を1秒くらいで検索できる(さくらVPS2G 1台で!!)というもので、100万件あればここ20年くらいに発売された本はだいたいカバーできるので(表紙だけに)、本を扱うアプリケーションの革命だ!!という事が言いたかったのです。ただこれは特定物体認識という分野で、真面目に研究している企業なども多いから、趣味ライブラリで対抗するのは無理ある感じするし、データもアレなので、これ以上深入りしないほうがいいかなと思って、じゃあ今後はどういう方向で開発していこうかなーと考えたところ、やはりここは僕の持ちネタであるところのアニメ顔類似検索しかない!!と思ったものの、アニメ顔類似検索専用ドライバみたいなの入れるとネタ色が強すぎるので、もう少し真面目な感じで、汎用的な特徴量から与えれたラベル付きデータに適した画像検索エンジンを作れるようにすれば、与えたデータによってアニメ顔類似検索にも花類似検索にも犬類似検索にもなる!! 今入っている汎用的な類似検索用ドライバ(sim)が適当な感じなのでこれを置きかえることもできる!! 最高!! と思ってこの機能を入れることにしました。

それで去年の10月には大体できていたんだけど、いろいろあって放置してたのを今年中にまとめよう!!と12/29日くらいから思い始めて、まだまとめている最中です。
あまりにやることが多いので先にデモでも置いとくかという考えにいたった。近いうちにまとめて公開します。
それでこのライブラリでやりたかったことは大体終わる気がする(えっ

使っているアルゴリズムについて

詳しくは学習プログラムの説明にでも書こうと思っているけど、気になる人もいると思うので、単語だけでも並べておきます。
まず元になる画像特徴量にはVLADと領域分割を使ったHSVヒストグラムを使っています。VLADで使っている特徴点検出器と記述子はBOVWドライバ用に書いていたものを使っています。
VLAD、HSVそれぞれの特徴量から教師データにあった検索用の空間への変換関数を線形のLMCAをベースにしたアルゴリズムで学習して、検索では変換した後の空間で距離が近いデータを表示します。画面上にあるcolor weightは、VLADとHSVの重みを決めるパラメーターで、それぞれの距離を重み付けて足したものを最終的な画像間の距離にしています。
LMCAはk近傍識別器の精度を上げるための手法ですが、単純な画像検索システムではクエリベクトルのk近傍を検索結果として表示するだけなので、k近傍識別器の精度がよくなるような空間に変換したあとで距離が近いデータを表示すれば類似検索としてもよい感じになっているだろうという考えで作っています。

感想

実は前のバージョン(v2)も計量学習という分野を知らなかった頃の俺が考えたさいきょうのけいりょうがくしゅうを使っているので、考え方は前のバージョンと同じで、実装が異るだけです。v2は、多クラス線形分類器(one-versus-the-rest)の精度がよくなるような空間への変換関数を教師ありで学習すれば(階層ニューラルネットワークは1層目で非線形変換したベクトルを2層目で線形分類する)、全てのキャラにおいて各キャラとそれ以外のキャラをできるだけ線形分離できるようになるからきっと同じキャラのベクトルが似てきているので似た顔も集まってきて(このへんがすごくテキトウ)いける!というものでした。今回使っているLMCAは 変換後の空間でk近傍識別器の精度がよくなるようにするというそのまんまな目標を持っているので、妙な妄想を挟まずとも僕が本当にやりたかったことをきちんと学習してくれる感じです。ただこれめちゃくちゃ重い式で、1万次元(VLADがそれくらいある)1万データ(animeface-character-datasetがそれ以上ある)から学習するのは無理だろという感じだったので、色々計算を工夫したりテキトウに端折ったりSIMDOpenMPでゴリ押ししたりして、うちの家庭用パソコンでも爆速(2日間くらい)で学習できるような実装にしたので、LMCAをベースにしたものと書かざるおえなくなった。LMCAはあまりメジャーではないようですが、計量学習と次元削減が同時にできるのと(元の次元が高いので次元削減は必須だった)、目的関数が直感的で分かりやすく自分でもいじりやすそうだったので選びました。
類似検索としては、前は(これは仕方がないことだけど)教師データになかったクラス(キャラクタ)の精度がきわめて悪かったのが、教師データになかったクラスもアニメ絵であればなんかそれっぽくなっている場合が多い気がします。あと前のは結局髪の色で検索しているだけだろと言われていたので、色の重みを調節できるようにしたけど、色なしでも西又絵とかちゃんと検索できるし、色以外もある程度使えていると思います。ただアニメ絵じゃない細い線の集合で書かれたようなイラストは色以外ではうまくいっていないように思います。顔というより髪の塗り方とかキャラデザが学習されている感じがする(だから描く人のやり方が強く出ているイラストはうまくいかないのかなとか)。
検索速度は、前はクソみたいなSQL検索だったのが、僕が本気で書いた超ゴリ押し並列全検索になったので、桁違いに速くなっています(計算量は同じです)。

自分としては全てにおいて前作を超えた……と思ってますが、どうだろうか……
超えたからといって何もないし、まだまだダメな感じするし、というか、もはやなんのためにアニメ顔類似検索なんてものを作ろうとしていたのか忘れてしまったのだが――

Ubuntu12.10でBorderlands2をする

Borderlands2もLinuxのWineで動くので紹介します。
WineとSteamのインストールについてはUbuntu 12.10でL4D2をする (Wine) - デーを見てください。
以下の内容は上の記事通りにwinetricksからsteamを入れていることとして書かれています。

まずBorderlands2のインストールは普通にSteamのライブラリからインストールするだけです。
ただ、ランチャーが.NET製で動かないので、起動周りをちょっといじらないと起動できません。

まずBorderlands2の実行ファイルがあるディレクトリにsteam_appid.txtというファイルを作って49520という数字を書き込みます。

echo 49520 > $HOME/.local/share/wineprefixes/steam/drive_c/Program\ Files\ \(x86\)/Steam/steamapps/common/Borderlands\ 2/Binaries/Win32/steam_appid.txt

次に$HOME/bin/borderlands2.shあたりに起動スクリプトを作ります。

% cat > $HOME/bin/borderlands2.sh  
#!/bin/sh
cd  "$HOME/.local/share/wineprefixes/steam/drive_c/Program Files (x86)/Steam/steamapps/common/Borderlands 2/Binaries/Win32/"
env WINEPREFIX="$HOME/.local/share/wineprefixes/steam" wine ./Borderlands2.exe
^C
% chmod 755 $HOME/bin/borderlands2.sh

これで起動できるので、ウィンドウマネージャーのメニューのBorderlands2を上で作ったスクリプトを実行するように変更します。
注意として、あらかじめSteamが起動していないと起動しません。

http://cd4e23648266260cb742192f68df10e1.gazou.me/large.png
ヤッター!!
ゲームのホストとして公開して、よく知らない人が3人入ってきても問題なく動いていました。
初回起動時はウィンドウの描画位置がおかしかった気がしますが、2回目からはならなかったので、おかしかったら解像度を設定したあと一度終わらせて起動し直したらいいと思います。

ボダラン2はゲームとしては楽しかったですが、相変わらずストーリーが全く頭に入ってこなかったですね。

こまめに日記を書きたい

昔は、開発日記とか、日々のムカついた事とか、自分の精神状態の報告とか、まあいろいろとちょっとしたことを書いていたのに、最近はまとめしか書かなくなってきてて、でも、やっぱり書いたほうがいいと思うので、もう少し気軽にやっていることの途中経過とかを書こうと思う。
前にも同じ事を言ってて結局書かなくなったので、繰り返しかもしれないけど。

まとめると、やってたことをまとめようとしているけどつらいので適当に書いていきたいということです。

Ubuntu 12.10でL4D2をする (Wine)

SteamのLinux Betaが出たらしいです。僕は2週間くらい前にベータのアンケートみたいなやつに答えたのですが、特に何も来てなくて試せていません。試せていませんが、がんばってほしいですね。試せていませんが。
ただ僕は、Ubuntu 12.04の頃からWine経由でL4D2をやっていて、Wineってなんかめんどうなイメージがあったのですが(APIがないと言われるたびに実装していくみたいな…)、L4D2は素直に動いたので、超簡単な方法を書いておきます。

グラボなんかの環境にも依存してそうなので環境によっては動かないかもしれません。うちのグラボはGTX 260でドライバはnvidia-currentを使っています。デスクトップはgnome-classicです。

Wineのインストール
sudo apt-get install wine
Steamのインストール
winetricks steam

Steamのインストーラーが起動するのでインストールします。

起動後にSteamのアカウント情報を入力すると、メールで認証コードを送ったので入力しろと言われるので、メールで受け取った認証コードを入れるとログインできます。

L4D2のインストール

SteamのライブラリからL4D2を選んでインストールします。
http://943caf378f4d1129752df2954803f96c.gazou.me/large.png
持っていない人はストアで買いましょう。(買ったものの動かないことがあるかもしれません。動かなかったらWindowsでやりましょう)

これで普通に起動するので、とりあえずシングルプレイヤーモードで入ってビデオやコントローラーの設定をするといいと思います。CAPSLOCKをCTRLに変えててもWineだと変わってなかったりします。
http://81f4744f23b5f64cd49d49d4eeb63ac1.gazou.me/large.png

Steam Cloudで設定が同期されるようになっていると、他のパソコンの設定を変えてしまうので注意してください。多分最初に起動したときに同期するか聞かれます。

便利化

ニワカですが便利化します。

起動時のムービーを流さないようにする

Steamのライブラリ→L4D2→プロパティ→起動設定で、-novid を入れておくと起動時のムービー流れなくなります。

steam://のURLを開く

xdg-openをいじればsteam://を開けそうですが、ウェブ側から開けるとちょっと怖い感じするので僕はコマンドにしています。

$HOME/bin/steam-open に

#!/bin/sh
env WINEPREFIX="$HOME/.local/share/wineprefixes/steam" wine "C:\\windows\\command\\start.exe" "$@"

のようなスクリプトを置いて$HOME/binにPATHを通しておくと、たとえば、nico-opなら

$ steam-open steam://connect/l4d2.forjp.net:27032 

で接続できます。

よくいるサーバーがある場合はサーバーごとにコマンドを作ったり、ショートカットをデスクトップ等に置くと便利かもしれません。

(winetricksから入れると$HOME/.local/share/wineprefixes/steamに入るっぽいです。場所が違う場合は、ウィンドウマネージャーのメニューにWine/Programs/Steamが入っていると思うのでプロパティを見ましょう。)

不具合

重いローカルサーバーや人数が多いサーバーに入って負荷がかかった時に、

  • 入った瞬間にサウンドループが起こる(大体は5秒くらいで直るけどそのまま固まることもある)
  • 一部の音(特殊の声だけとか自分の武器の音だけとか)が聞こえなくなる
  • wなどの移動キー入力が入ったままになって解除できなくなる

などの不具合が出ることがあります。Steamを再起動しないと直らないので、操作できる場合はいったん落としましょう。全画面で固まっている場合は、ALT+TABで抜けて、xkillコマンドでL4D2を落とすか、マジで固まっててどうもなくなったらCTRL+ALT+DELなどでウィンドウマネージャーからログアウトして、入りなおしてからkillコマンドで止めます。

他のゲーム

HL2は起動したけど、移動キー入力が入ったままになって解除できなくなる不具合が頻発して無理だった。
TF2は起動時のムービーで固まる。CoD2は起動できなかった。Valve以外のゲームは無理っぽい感じする。

L4D2だけは稀に不具合に出るだけで結構ちゃんと動いています。

なぜLinuxなのか!!

最近パソコンが1台しかなくて、それで時間がかかる計算の処理をLinux側で動かしていることがあるので(Windows7デュアルブートになってる)、その合間にゲームをするためにLinuxで動かしています。

この場合、更にcgroupの仕組みを使うと、計算用プロセスとゲーム用プロセスで使うCPUを分けれるので、ゲームが重くならない程度のリソースを割り当ててできるだけ計算に回すみたいなことができて便利です。

はてなブログに移行した

ダイアリーから記事をインポートしてリダイレクトの設定もできるようになっていたので移行しました。

6月くらいからできていたらしい。 はてなブログがリリースされた時に出来なくてアホカと思ったまま興味を失っていたので気づかなかった。ベータ版だったから突然大移動されても困るみたいなのがあったのだろうけど。

今は、記事自体とコメントをコピーして元のURLやRSSはリダイレクトできて、記事についていたはてなスターはてブのURLも置換?されるようです。

ダイアリーの方も広告が出るようになったし、もうあっちにデータを置いていてうれしいことなんてないと思うので、さっさとはてなブログに移行したほうがいいと思いました。

参照

はてなダイアリーからはてなブログへのインポート機能を追加しました