1

顔の画像に基づいて性別を分類する小さなプログラムを作成しました。私はYale の顔データベース(男性用の 175 枚の画像と女性用の同じ数) を使用し、それらをグレースケールに変換し、ヒストグラムを均等化したので、前処理後の画像は次のようになります。

ここに画像の説明を入力

次のコードを実行して結果をテストしました (SVM と線形カーネルを使用しています)。

def run_gender_classifier():
    Xm, Ym = mkdataset('gender/male', 1)     # mkdataset just preprocesses images, 
    Xf, Yf = mkdataset('gender/female', 0)   #  flattens them and stacks into a matrix
    X = np.vstack([Xm, Xf])
    Y = np.hstack([Ym, Yf])
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y,
                                                    test_size=0.1,
                                                    random_state=100)
    model = svm.SVC(kernel='linear')
    model.fit(X_train, Y_train)
    print("Results:\n%s\n" % (
        metrics.classification_report(
            Y_test, model.predict(X_test))))

そして100%の精度を手に入れました!

In [22]: run_gender_classifier()
Results:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        16
          1       1.00      1.00      1.00        19

avg / total       1.00      1.00      1.00        35

別の結果を期待することもできますが、画像分類が 100% 正しいというのは、非常に疑わしいと思います。

さらに、カーネルをRBFに変更すると、結果が完全に悪くなりました。

In [24]: run_gender_classifier()
Results:
             precision    recall  f1-score   support

          0       0.46      1.00      0.63        16
          1       0.00      0.00      0.00        19

avg / total       0.21      0.46      0.29        35

これは私にとってさらに奇妙に思えます。

だから私の質問は:

  1. 私のアプローチやコードに間違いはありますか?
  2. そうでない場合、線形カーネルの結果が非常に良く、RBF の結果が非常に悪いのはなぜでしょうか?

ロジスティック回帰でも100%正しい結果が得られ、深い信念ネットワークでは非常に悪い結果が得られたため、SVMに固有のものではなく、線形および非線形モデルに固有のものであることに注意してください。


完全を期すために、データセットを前処理して作成するためのコードを次に示します。

import cv2
from sklearn import linear_model, svm, metrics
from sklearn.cross_validation import train_test_split


def preprocess(im):
    im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    im = cv2.resize(im, (100, 100))
    return cv2.equalizeHist(im)


def mkdataset(path, label):
    images = (cv2.resize(cv2.imread(fname), (100, 100))
              for fname in list_images(path))
    images = (preprocess(im) for im in images)
    X = np.vstack([im.flatten() for im in images])
    Y = np.repeat(label, X.shape[0])
    return X, Y
4

2 に答える 2

5

説明されているすべてのモデルには、調整パラメーターが必要です。

  • 線形 SVM : C
  • RBF SVM : C、ガンマ
  • DBN : レイヤー数、ニューロン数、出力分類器、トレーニング率...

そして、あなたは単にこの要素を省略しました。したがって、調整可能なパラメーターの数が最小のモデルがより適切に動作することは非常に自然です。単純に、デフォルトのパラメーターが実際に機能する可能性が高いためです。

100% スコアは常に不審に見えるため、「手動で」再確認する必要があります。物理的にデータをトレーニングとテストに分割し (別のディレクトリに配置)、1 つの部分でトレーニングし、モデルをファイルに保存します。次に、別のコードでモデルをロードし、モデルの画像とラベルを表示してテストファイルでテストします。このようにして、実装エラーがないことを確認します(モデルがそれらの顔を認識しているという物理的な証拠があれば、処理エラーがあるかどうかは本当に気にしませんよね?)。これは純粋に「心理学的方法」であり、データの分割/共有とその後の評価に誤りがないことを明らかにしています。

アップデート

コメントで示唆されているように、私はあなたのデータセットもチェックしました。公式ウェブサイトに記載されているように:

拡張された Yale Face Database B には、9 つ​​のポーズと 64 の照明条件の下での 28 人の被験者の 16128 枚の画像が含まれています。

したがって、これは確かに問題です。これは性別認識用のデータセットではありません。分類子は、これらの 28 の被験者を単純に記憶するだけで、簡単に男性/女性に分けられます。他の被写体の画像では機能しません。このデータセットの唯一の「価値のある」部分は、手作業で抽出できる特徴的な個人の 28 の顔のセットですが、28 の画像は、少なくとも等級が小さすぎて役に立たないようです。

于 2013-10-26T05:30:35.800 に答える