標籤:vs2013 opencv python 影像處理
快樂蝦
http://blog.csdn.net/lights_joy/
歡迎轉載,但請保留作者資訊
在opencv中支援SVM分類器,本文嘗試在python中調用它。
和前面的貝葉斯分類器一樣,SVM也遵循先訓練再使用的方式,我們直接在貝葉斯分類器的測試代碼上做簡單修改,完成兩類資料點的分類。
首先也是先建立訓練用的資料,需要注意的是這裡的train_label必須是整數類型,而不是float:
# 訓練的點數train_pts = 30# 建立測試的資料點,2類# 以(-1.5, -1.5)為中心rand1 = np.ones((train_pts,2)) * (-2) + np.random.rand(train_pts, 2)print(‘rand1:‘)print(rand1)# 以(1.5, 1.5)為中心rand2 = np.ones((train_pts,2)) + np.random.rand(train_pts, 2)print(‘rand2:‘)print(rand2)# 合并隨機點,得到訓練資料train_data = np.vstack((rand1, rand2))train_data = np.array(train_data, dtype=‘float32‘)train_label = np.vstack( (np.zeros((train_pts,1), dtype=‘int32‘), np.ones((train_pts,1), dtype=‘int32‘)))# 顯示訓練資料plt.figure(1)plt.plot(rand1[:,0], rand1[:,1], ‘o‘)plt.plot(rand2[:,0], rand2[:,1], ‘o‘)plt.plot(rand2[:,0], rand2[:,1], ‘o‘)
類似這樣的資料:
在得到訓練資料後,接著建立一個SVM分類器並配置訓練參數:
# 建立分類器svm = cv2.ml.SVM_create()svm.setType(cv2.ml.SVM_C_SVC) # SVM類型svm.setKernel(cv2.ml.SVM_LINEAR) # 使用線性核svm.setC(1.0)
接著我們對此分類器進行訓練:
# 訓練ret = svm.train(train_data, cv2.ml.ROW_SAMPLE, train_label)
在訓練完成後就可以使用測試資料進行預測了:
# 測試資料,20個點[-2,2]pt = np.array(np.random.rand(20,2) * 4 - 2, dtype=‘float32‘)(ret, res) = svm.predict(pt)print("res = ")print(res)
predict通過res返回得到一個20x1的數組,每一行對應一個輸入焦點,計算得到的值就是分類的序號,在這裡是0和1,我們取0.5為閾值進行分類並顯示結果:
# 按label進行分類顯示plt.figure(2)res = np.hstack((res, res))# 第一類type_data = pt[res < 0.5]type_data = np.reshape(type_data, (type_data.shape[0] / 2, 2))plt.plot(type_data[:,0], type_data[:,1], ‘o‘)# 第二類type_data = pt[res >= 0.5]type_data = np.reshape(type_data, (type_data.shape[0] / 2, 2))plt.plot(type_data[:,0], type_data[:,1], ‘o‘)plt.show()
看看最後的結果:
最後,通過svm. getSupportVectors擷取支援向量。
# 支援向量vec = svm.getSupportVectors()print(vec)
??
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Python影像處理(15):SVM分類器