4月からの日記

4月〜8月 - 初めはやる気ある

4月〜8月は、主に数学をしていた。
冗談のように言っていた「分数の割り算ができない」は、自分の記憶に自信がないという気が狂いそうな状態と合わさって、本当に深刻な問題だったので、算数から始めて最適化問題ができる程度にはやったと思う。専門分野の入門本が息をするように読めるようになったのでやってよかった。
あと、あまりにプログラミングしないと不安なので、Project Eulerもした。これはプログラムで解く数学系の問題集みたいなものだけど、最初のほうはループさえ書ければできる感じで、ループを書きすぎてfor文の達人になったと思う。関数型言語を使えばかっこよく書けるのだろうかとも思ったけど、自分が今後やることは確実にC言語実装なので、似たような構造で書くのが楽なPerlを使うようにした。今もたまにやっていて、できた問題のソースコードは、Index of /misc/project-euler/に置いている。問題はこっち。問題の日本語訳wikiもある。Project Euler - PukiWiki
8月ころに統計解析ソフトのRも少しした。少しというのは2日くらいだけど、試したことはわりと大掛かりで、2回目になるイラストと写真の分類問題をやろうとした。2回目の案は、人間の目は色や明暗の勾配を強調したりする機能があることに着目すると、写真を見るにはいくつか強さの違うエッジを統合してみる必要があるけれど、イラストは縁取りだけ見ればよい。つまり、明暗の勾配からエッジ点を求めるのにいくつかの異なる閾値でテストすると、写真は検出されるエッジ点の変化が激しいのに対して、イラストは一定に近いという仮定から、n個の異なる閾値に対するエッジ点の面積の変化率を特徴ベクトルにして、分離できるのではないか? というもの。OpenCVで特徴を学習用とテスト用のテキストファイルに吐き出して、それをRのrpartやadaboostやsvmなどで試したけど、エラー率が0.2以下にならなかったので諦めた。

9月〜10月 - 働いたら負けだと思っている

9月〜10月はWinny Cache FSを作って、放置してて、ダラダラとGPUについてたGRAW2というゲームをしてた。これのマルチプレーは世界の無職が銃で殺しあうという素晴らしいゲームでFPS症候群になる程度までやった。散歩しているだけでゲームしてる気分で楽しい。引き続き、Cod:WaWのマルチβもしてた。あと山口の家事手伝いと平日遊びに行ったりとか、とにかくダラダラと過ごしてた。

11月……

11月はさすがにヤバイと気づいて、統計学を勉強する準備をするのと、CUDAを少し試していた。少しというのは関数5個くらいだけど、試したことはわりと大掛かりで、3回目になるイラストと写真の分類問題をやろうとした。3回目の案は、イラストは縁取りがはっきりしているので、条件をある程度絞ったエッジ部分の近傍画素を直接使って分類するというもの。条件はガウス関数シグモイド関数をかけたガボールフィルタのようなもの
f:id:ultraist:20081206015445p:image
が一定以上の値を返す周辺のX軸での最大値を中心にした9x9の画素を81次元の特徴ベクトルにした(でかい)。ようは左から右への色の変化が同じ方向(暗い→明るい)でエッジの角度も近い(±45°くらい)を条件に入力空間を絞った四角い画像(グレースケール)で判定する。
二次f:id:ultraist:20081206021106p:image三次f:id:ultraist:20081206021107p:image
1画像から1000〜3000個程度の点が取れる。この分類は2クラスだけど、画素パターンの分布としては2クラスの中でもかなりバラてるので、一度この特徴を大量のイラストと写真から大量に抽出してごちゃ混ぜにしたあと自己組織化マップ(SOM)で128x128のユニットに学習して特徴マップを作って(最初は周辺の確率を畳み込もうと思っていたので似たものを近くに集めたくてSOM)、
f:id:ultraist:20081206014634p:image:w128(でかいのでクリックで拡大)
そのあとイラスト・写真から抽出したN個ずつの特長を最近傍により16384クラス(128x128)に分類して、各クラスに割り当てられた個数をNで割れば、クラスごとの密度が出るので、
f:id:ultraist:20081206014635p:image(密度の割合の図。白い→イラストが多い、黒い→写真が多い)
これを関数にした単純ベイズ分類器を構築すればイラストと写真が簡単に高速に分類できるのではないか? と思った。
特徴抽出のCUDAによる実装は、フィルタで畳み込む処理とその結果からゼロ交差点以外をすべて消す2つ処理を各ピクセルが自分を中心とした周辺の情報を使って自分の値を決定するセルオートマトンのようなルールで書いて並列化した。最新CPUの百倍近く速かった(一瞬で終わるのであまりまじめに測ってない)。SOMのCUDAによる実装は、BMUの検索をデータごとに並列化して求める処理とユニットのバッチ学習処理を成分レベルで並列化して計算する処理で書いて、最新CPU(の1コア)の20倍程度速かった。20倍というと微妙な気がするけど、2ヵ月半かかる学習処理がたった50時間で終わるのでCUDAマジ未来のコンピュータ。
で、結果は、エロオンリーならエラー率0.1以下までいけるけど、一般的な写真やイラストを混ぜるとエラー率が0.15以下にならなかったので無かったことにした。0.1以下になったら、JPEGのメタ情報(exif)を使って性能を引き上げてフリーソフトにしようと思っていた。ただ、これは1画像に対する性能なので、イラストと写真のどちらかのセットが複数入っているフォルダ(またはタグ、動画)を分類するならもっとよくできる。
ダメなのは、劣化jpg、TVキャプチャ、雑誌スキャン、湯気フィルタ、絵柄がエロゲ的でない、写真に文字がいっぱい入ってる、加工写真などの感じ(失敗した画像を見ただけの感想で、実際はどうなのか分からない)で、2回目の反省を生かせていないので反省した。
あとこれは、思うがまま好き勝手していたので、自分でも結構ひどいと思う。
12月から本気出す。


というのが、4月〜11月のまとめ。