2013-06-11 18 views
1

我正在開發英文手寫OCR與OpenCVVisual C++。我使用基於區域的方法進行特徵提取。這裏我用64×64圖片。 所以我有64個功能爲一個示例圖像。我的SVM多級SVM,因爲我有52類爲大寫和簡單的字母。 這裏是特徵向量的格式。如何在Open CV LibSVM中縮放數據

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

同樣我有200圖像兩個52類。當測試我目前的準確率是只有35% - 40%。我已經閱讀爲縮放數據增加了預測的準確性。 但我有幾件事情要說清楚。

  1. 如何縮放這些特徵值?

  2. 有什麼功能得到OpenCV的LIBSVM每個測試特徵向量的匹配概率(我搜索了OpenCV的2.4.5的文檔,但我找不到這個)。

任何人都可以解釋這些嗎?如果可能的話,還有一些很少的代碼行

回答

2
  1. 你的數據在一定程度上已縮放但LIBSVM人建議(http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf)線性擴展爲[0,1]或[1,1]。如果你有像素數據[0,1]可能更有意義。

  2. 我也沒有看到它。您可以鏈接到C++ libsvm(http://www.csie.ntu.edu.tw/~cjlin/libsvm/),然後您有兩個選項。 A)訓練班級概率,在這種情況下,你會得到那些答案或B)要求距離決策邊界的距離。

+0

關於數據「已經有所規模」的好處。所以剛剛減少了255;事實上,在這種情況下,數據本質上是二進制的,並且最大值不是那麼大,你可能會意識到沒有縮放。 – Bull

+0

如果除以255,請確保您轉換爲浮點表示形式。 –

+0

@Josh S - 非常感謝你的努力和考慮我的問題。我的數據已經縮放(0到1之間)。但我需要以某種方式找到匹配的概率。我覺得純粹的LibSVM適合我的目的,而不是OpenCV集成的。 –

3
  1. 看看A Practical Guide to Support Vector Classification。基本上,您應該將特徵向量的每個維度縮放到[-1,1]或[0,1](所有維度都相同)。例如,對於第一維度,如果知道可能的最大值和最小值是v_maxv_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

    如果您在returnDFVal傳爲真,那麼你會得到的距離,以保證金爲返回的值。這不是一個概率,但你可以用它作爲你的分類有多好的一個指標。

希望這會有所幫助。

+0

非常感謝您考慮我的問題和您的努力。我想使用純粹的LibSVM而不是OpenCV集成的。兩者都是一樣的,但我覺得使用Pure LibSVM將解決我的問題。非常感謝你 –

+0

http://stackoverflow.com/questions/43408031/scaling-for-single-instance-in-matlab-for-libsvm?noredirect=1&lq=1 –