(前回〜10/25)

破滅してる。欲を出していろいろよくしようと思ったけど、まじめに考えるといろいろありすぎてちょっとヤバイ。
まあこれは勉強のチャンスであるので、もう少しやってみようと思う。

考えが変わったところ

本人率にこだわっていたけど、これは教師ありでやるべきだし、教師データは今地道に作っている(昨日がんばって60人分のラベル付き顔[髪型]画像各人100〜130枚作った。もとデータはあと150人分あるので健全な精神と引き換えに教師データを作る)ので、それができてからやろうと思った。
類似検索は、本人とかどうでもよくて、人間の感覚で似てると思うのを表示するようにしようと思う。この感覚は心理的には少し難しくて、たとえば知っている同じキャラ(本人)ならあまり似ていないシーンの画像でも似ていると強く思ってしまうことがあるので、「顔が似ている」といったことは書かなくて、「髪形のみ似ている」とか「魂の色が似ている」とかあまりキャラクタを強く想像しないようなタイトルをつけて、そういう心理的なアレをどうにかしたいと思ってる。
ただ、本人=ある程度似ている、はずなので、やっぱ本人率ががが

いろいろなアルゴリズムとパラメータの問題

以下は、具体例に対してよりよくするために小手先でいろいろやっているのであって、一般的な画像分類の話ではないので注意。

本当に応用という感じで、様々なアルゴリズムが関係していて、各段階ごとに手動で決めるパラメータが多くて、それらが複雑に関係しあってていろいろアレで結果を意のままにコントロールしようとすると破滅する。
大まかには次のような手順で検索用のデータベースを作ってる。([]カッコ内は今の方法)

  1. 画像に対して(必要なら)前処理を行う [髪の色からの距離で画像を作る]
  2. 画像から局所特徴を得る点(key points)を決める [Fast Hessian Detector, またスケールが小さすぎるの点はノイズにしかならないので消す]
  3. keypointとスケール(あれば)から記述子(局所特徴の特徴ベクトル)を得る [SURF]
  4. 大量の記述子をクラスタリングしてK個のvisual-wordsを決めるベクトル量子化のためのコードブックを作る [K-Means, K=512 or 1024]
  5. 各画像からvisual-wordsのヒストグラムを得て画像の特徴ベクトルとする
  6. 必要なら特徴ベクトルをなんらか変換する [IDF + コサイン正規化, ただし度数ごとにカウントする]

これで画像の類似度を特徴ベクトルの内積で計算できるようになる。
問題としては、
1はいろいろ変えて試しているけど、今のところ髪の色のから距離をとってそれを平均0標準偏差40くらいのガウス関数を通して0〜255に変換すると大体髪型だけ抜き取れて、それが一番いい感じの結果が出てる。本当はまじめにセグメンテーションするべきと思っているけど、ちょっと難しい。BSIFTという対象の境界情報を渡して背景に依存しない局所特徴を得る方法があるらしいので、そういうことをやりたいと思ってるけど、それはもっとあとになってマジでダメだったときでいいかなと思ってる。
2,3あたりはどうにかしたいと思ってるけど、全部自分で書くことを考えるとちょっと手が出しにくい。ただ、SURFがやっているinterest pointの検出が僕の感覚とはちょっとずれてるので、今後どうしても変えないときがすまなかったら変えようと思う。顔のイラスト画像は線画でも識別可能とかスケールが固定されているとか特殊な条件がいくつかあるので、もうちょっとどうにかできると思うんだけど…。
4は、MNISTで試したときにも収束しないといっていたけど、調べてみるとほとんど均一に分布しているようで、そのせいで重心が小刻みにしか動かないし、初期値依存がひどくて、コードブックを作り直すたびにかなり結果が変わる。今400万件の記述子を1024クラスに分類しているので、データに対してクラス数が少ないせいでたくさんの分布を内包したクラスを作ろうとしてそうなっていると思うんだけど、クラスを多くするとかなり似た局所特徴しかマッチしなくなるのでクラス分類がやりにくくなる。これはマジで困ってるけど、みんなこれでやってるようだし、あとの処理でどうにかなる気もするので、とりあえず放置。
5はこれでいい。
ここまで全部放置なので、6をやろうと思ってる。

  • ライブラリにpLSIを追加(今日)
  • 教師データができたらMLPの出力を使ってみる

とか思ってる。

(おわり)

追記

4が困るのは、その前の段階の処理を変更したときに、変更によって変わったのか、初期値依存で変わったのか分かりにくいためで、はじめこのことに気づかずにかなり翻弄されてた。