やってみよう!

プログラミングとかでぃーぷらーにんぐとかVRとか気になったものをやってみる予定

同一人物でクラスタリングする方法を考えてみる

前回、yolov3でキャラクターを自動で抽出するところまでできたので、今回はそのキャラがごとにクラス分けしてみたいと思います。

 

もちろん、目で見て分けていけば可能なのですが、そんな苦行に耐えきれる自信がないので、なるべく自動でやりたいと思います。

 

要件定義

今回やりたいことは、主要キャラの識別なので、

  • ココア
  • チノ
  • リゼ
  • 千夜
  • シャロ
  • マヤ
  • メグ
  • 青山ブルーマウンテン
  • タカヒロ
  • モカ

(公式サイトより)

の10クラスとその他の計11クラスに分ければ良いのですが、

ごちうさ以外にも汎用的に使いたい」というワガママからクラスタ数は不明とします。

  • クラスタ数は不明
  • 後ろ姿等からも判別可能ならできるだけ判別したい
  • 汎用的にしたいので、モブA、モブBも別クラスになるようにしたい
  • 靴や手だけなど、判別不可能なものは纏めて同じクラスか、無視したい

ざっくりこんな感じです。

 

手法を考えてみる

 

最初に言った通り、手動で分けるのは嫌なので、ディープラーニングを使う場合は教師なし学習か、半教師あり学習のどちらかになります。

 

また、クラスタ数が不明なので、MeanShift、DBSCAN、x-meansなどクラスタ数を指定しないアルゴリズムを使用する必要があります。

 

他には、今回は同じ画像を探すのではなく、写っているキャラが誰なのかをクラスタリングする必要があるので、画像全体では無く、髪型や髪色、目、鼻、口、背格好など、部分的な特徴を判断材料にすべきではないかと思います。

 

これらの条件を踏まえて手法を選択するのですが、あまりクラスタリング手法を知らないので、ググって良さげなものから試していきたいと思います。

 

AutoEncoderを使った手法

catindog.hatenablog.com

Deep Embedded Clustering

qiita.com

Facenetを使った手法

future-architect.github.io

qiita.com

局所特徴量を使った手法

qiita.com

機械学習の手法色々

qiita.com

難しくてそれぞれどんなやり方なのか理解しきれませんでしたが、

何かしらの方法で特徴量を抽出する -> 得られた特徴量を使って何かしらの手法で距離の近いものをグループ化する

かなりフワッとしてますが大枠こんな感じなのかなと。

特徴量抽出方法

  • オートエンコーダー(AE,VAE,CVAE)
  • CNN(facenet使うか自前でモデル作るか)
  • 局所特徴量(SHIFT,SURF)

特徴量の分布からクラスタリング

 CNN は特徴量抽出するだけなら教師データいらないのかなぁ?それか適当に重みデータ落としてきて少量の教師データでfine-tuningすればいいのかなぁ?

AEで2次元の特徴量だして可視化しながらユークリッド距離でいい感じに分けるのが簡単かなあ?

機械学習とかやった事ない文系phperだからイマイチ理解が合ってるのかとか、こういう時はこれ使えばいいとかが分からないんだよなぁ

SIFT、SURF等のディープラーニングじゃない手法の特徴量抽出はお手軽そうだけど精度でなさそうだよなぁ(偏見)

とりあえずこんな感じで進めていこうと思います