そろそろ本気出す!!

一時のテンションは一瞬で消えたのと、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も置換?されるようです。

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

参照

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

表紙を写すと本のレビューが読めたりするHTML5アプリを作ってみた

最近のブラウザはgetUserMediaという機能でJavaScriptからカメラを操作してリアルタイムに動画を読んだりできるようなので、画像認識のデモ的なものを作ってみた。

表紙検索

PCのGoogle ChromeOperaAndroidOpera Mobileの場合

動画が読めるといっても実際のところ一部のブラウザでしか使えなかったので段階的に対応してみた。
まず、PCのGoogle ChromeOperaAndroidOpera Mobileの最新バージョンが全ての機能が使えるブラウザです。

これらのブラウザで hyoushi.me というドメインを開くと、サイトのトップに「カメラ起動」というでかいボタンが表示されています。

IS05 + Opera Mobile


(僕はウェブカメラを持っていないのでこれはIS05 + Opera Mobileのキャプチャです)

カメラ起動ボタンをクリックすると、こんな感じでページ内にカメラからの映像が表示されます。

このまま適当に床に落ちている本を写して映像部分をクリックすると、決定かと聞いてくるので、

OKを押すと映像がブラウザ上でリサイズされた後サーバーに送信されて、

検索結果が表示されます。

サーバーは さくら VPS 2GB 1台で動かしていて、今僕が一人で使っている分には1秒ちょっとで結果が帰ってきていますが、他の人が使っていると激重になるかもしれません。

検索結果はとりあえず2件返しているので、正解があれば正解の画像をクリックすると、本の詳細やレビューなどが表示されます。

ここでAmazonへというボタンをクリックして購入すると僕にアフィ収入が入るというビジネスモデルを採用しています。


僕のIS05だと動画の解像度が240x320しかなくて、かなり画質が悪いし、動画なのでピントを合わせたりが難しいのですが、結構適当に写しても検索されます。

2冊同時でもいける。タイトルをアップで写すと似たようなフォントで同じ文字列を含むタイトルが検索されたりもします。
ぶれてたり、反射していたり、遠すぎて本が小さかったり、斜めになってパースが効いていたりしなければ大体目的の本が出てくるのではないかと思います。
全体を写そうとするよりは、タイトルやイラストなど特徴的な部分をアップでくっきり写したほうが精度がよいです。

家にあった本を大体試したけど、Amazon.co.jp: 時間衝突 (創元推理文庫): バリントン・J・ベイリー, 大森 望: 本という本がどうやっても出なかった以外は、出てたので、大体出るのではないかと思います。(カメラにもよるかもしれない)

あと検索結果として表示される本の詳細や表紙画像、レビューなど全ての情報はAmazonのItemLookupで検索毎に最新の情報を取得しているので、検索した時点でAmazonに無い本は出てきません。
またAmazonのAPIは1時間に2000回しか叩けないので、このサイトも(一人あたりではなく全体で)1時間に2000回しか検索できません。

Windows7 + Opera

ウェブカメラは持っていないのですが、ニコニコミュニティという仮想カメラソフトを使うと、デスクトップや指定した写真をカメラの入力にできるらしいので一応動くか試してみた。

普通に動いた。動画サイズ(解像度)はJavaScriptから指定できないので、カメラによって縦横比が変わったりします。一応はみ出ないように最大幅を超えている場合はフレームをリサイズして表示しています。

Windows 7 + Google Chrome

Google ChromeWindows XPでは動いたけど、Windows7では動きませんでした(いまWindows7なのでキャプチャは無い)。
これはたぶん、
Issue 136238 - chromium - getUserMedia stopped working on Windows - An open-source project to help move the web forward. - Google Project Hosting
のバグで、機種によってはカメラの初期化に失敗するようなので、パソコンの場合は実質対応しているのはOperaだけかもしれません……

getUserMediaに対応していない場合

JavaScriptからカメラが操作できない場合は、普通にファイル送信しかありません。画像ファイルを選択するとその画像で検索できます。便利。


(これはFirefox Mobileのキャプチャです)

ただカメラが内蔵されている機器を使っている場合は、ファイル選択からカメラが選択できる場合があって

この場合は、普通にカメラアプリが起動して撮影すると検索されます。こっちのほうがフォーカスが効くし、解像度が高いのでいい気がしますね……
ただ、この場合だとたまに撮影後にブラウザがリロードされて検索できないことがあって、ブラウザのバグなのか僕が悪いのか分かっていないです。あとなにか重い感じするし、シャッター音がします。

僕のAndroid 2.3 標準ブラウザでは、カメラ選択は出なくて無理でした。

追記

ファイルが選択された場合(ファイル選択からカメラを起動した場合)にFile APIで読み込んでリサイズしてアップロードしていたのですが、iPhone5のSafariで画像がバグるらしいのでとりあえず無効にしました(そのままファイルアップロードする)。これだとiPhone5のSafariでも使えているようです。

まとめ

JavaScriptで動画は扱えるけどブラウザを選んだり、動画なのでフォーカスが効かなかったり、解像度が低かったり、散々な感じでしたが、全体的には未来っぽい感じにできたと思います。携帯端末とか得に意識しなくてもブラウザが対応していれば勝手に動いてくれるのもいいです。Javaとか環境を作るだけでだるいですし。

本の検索に関しては、僕の感覚ではこの規模のデータを『さくら VPS 2GB 1台』でこの精度この速度で検索できるなら、現時点で実用レベルに達していると思うので、"きれいなデータ"さえあればいろいろ応用ができるのではと思います。
僕はデータを提供することはできないですが(そもそも画像データ自体は保存していない)、このサイトで使っている画像検索エンジンのライブラリを公開しているので、興味のある方は使ってみてください。

nagadomi/otama · GitHub
このotamaというライブラリの bovw512k_iv_kc というドライバを使っています。

このライブラリは2年くらい前に前職の関係で開発したもので、その後も地道にいじりながらなんか使い道ないかなと思っていたのですが、特に使い道が見つからないまま先月退職したのと、個人で作っていてクレジットは僕が持っていたので、githubにでも置いとくことになったものです。
2年も前から作っているならすごく完成度が高そうだけど、ここ1ヵ月くらい無職の力を使ってハチャメチャに書き直したので、まだかなりアルファっぽい感じです。ベースが2年前なのでいろいろ古いし。
詳しくはREADME.mdなどを見てください。

今年中くらいはフラフラしてようと思うので、その間気が向いたらいじったりすると思いますのでよろしくお願いします。