首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

opencv教程-分类与聚类算法

  opencv提供的有常用的机器学习算法和深度学习算法,本来是不打算放opencv中说的,毕竟机器学习和深度学习有很多专门的算法库,不过既然有就来大致了解下就行,基本流程还是:样本处理特征提起模型训练预测。

1:KNN最近邻算法

简单理解:从数据集中找到距离当前样本最近的k个样本,投票决定当前样本类别,这里k一般为奇数。不好的地方就是每次预测都要用整个数据集来进行距离计算,慢并且存储大,假设有10亿样本的话,就自己脑补吧。

knn = cv.ml.KNearest_create()

knn.train(train, cv.ml.ROW_SAMPLE, train_labels)

ret,result,neighbours,dist = knn.findNearest(test,k=5)

如上图结果所示,第一列是真实标签,第二列是距离最近的k=5个样本标签,第三列是预测标签(投票决定)。

分类准确率:91.76。

2:SVM支持向量机分类算法

这里有两种情况:

(1)线性可分:寻找具有最大分类间隔的分割线。

(2)非线性可分:核函数变换低维空间转换到高维空间,使其线性可分;加入惩罚因子和松弛变量处理错分样本。

训练模型需要注意下最好是对特征进行归一化,省的你用RBF核函数训练模型发现模型预测准确率很低,还以为是算法很差呢,其实是特征处理的问题。

模型训练保存:

svm = cv.ml.SVM_create()

svm.setKernel(cv.ml.SVM_LINEAR)

svm.setType(cv.ml.SVM_C_SVC)

svm.setC(2.67)

svm.setGamma(5.383)

svm.train(trainData, cv.ml.ROW_SAMPLE, responses)

svm.save('svm_data.dat')

模型预测:

result = svm.predict(testData)[1]

上述蓝色部分是对不同核函数所做的测试,绿色部分是对RBF核函数手动调参的最优结果,可以看出SVM比KNN算法有了很大提升,这里其实也有特征的关系,KNN的特征用的就是整幅图像的像素值,SVM用的是64维的hog特征。

3:k-Means均值聚类算法

基本理解:无监督算法,最终会得到K个聚类中心,对于新样本距离哪个聚类中心最近就属于哪个类别。

criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)

ret,label,center=cv.kmeans(Z,2,None,criteria,10,cv.KMEANS_RANDOM_CENTERS)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210120A0G48U00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券