1

私はOpenCVVisual C++で英語の手書き OCR を開発しています。特徴抽出にはゾーンベースのアプローチを使用します。ここでは64×64画像を使用します。したがって、1 つのサンプル画像に対して64 個の特徴があります。大文字と単純文字の両方に52 のクラスがあるため、私のSVMマルチクラス SVMになります。特徴ベクトルの形式は次のとおりです。

Class A image1 0:0.222000 1:0.0250222 ..... 63:0.000052
Class A image2 (some float values) .... 
Class A image200 (some float values)

同様に、 52 クラスの両方に200 枚の画像があります。現在の精度をテストすると、35% ~ 40%しかありません。データのスケーリングによって予測の精度が向上することを確認しました。しかし、明確にしなければならないことがいくつかあります。

  1. これらの特徴値をどのようにスケーリングできますか?

  2. OpenCV LibSVMで各テスト特徴ベクトルの一致確率を取得する関数はありますか( OpenCV 2.4.5のドキュメントを検索しましたが、これを見つけることができませんでした)。

誰でもこれらを説明できますか? 、そして可能であれば、いくつかの非常に少ないコード行でも。

4

2 に答える 2

3
  1. A Practical Guide to Support Vector Classification をご覧ください。基本的に、特徴ベクトルの各次元を [-1, 1] または [0, 1] (すべての次元で同じ) にスケーリングする必要があります。たとえば、最初の次元について、可能な最大値と最小値がv_maxとであることがわかってv_minいる場合 (ピクセル グレー値の場合、それらは 0 と 255 です)。次に、新しい特徴値を次のように計算できます。new_val = (old_val-v_min)/(v_max-v_min);

  2. これは、OpenCV SVM 予測関数のドキュメントです: predict.

    float CvSVM::predict(const CvMat* sample, bool returnDFVal=false ) const

    trueを渡すreturnDFValと、余白までの距離が戻り値として取得されます。確率ではありませんが、分類の良さを示す指標として使用できます。

お役に立てれば。

于 2013-06-11T20:46:37.777 に答える
2
  1. あなたのデータはすでにいくらかスケーリングされていますが、libsvmの担当者は[0、1]または[-1に線形にスケーリングすることをお勧めします、1]。ピクセルデータが [0,1] の場合は、おそらくより理にかなっています。

  2. 私もそれを見ません。C++ libsvm ( http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ) に対してリンクすることができ、2 つのオプションがあります。A) クラスの確率を訓練します。この場合、それらを取得します。または、B) 決定境界からの距離を求めます。

于 2013-06-11T20:46:15.577 に答える