书名:计算机视觉40例从入门到深度学习:OpenCV-Python
作者:李立宗
出版社:电子工业出版社
出版时间:2022-07-01
ISBN:9787121436857
第15章 机器学习导读
15.4 OpenCV机器学习模块的使用
- OpenCV中机器学习模块的使用主要包含如下三个步骤:
● Step 1:模型初始化。
● Step 2:训练模型。
● Step 3:使用模型处理问题。
15.4.1 使用KNN模块分类
1、三个步骤
-
如图15-38所示,按照在OpenCV中使用机器学习模块的三个步骤使用KNN模块即可。
图15-38 使用KNN模块的流程示意图
2、每步使用的函数。
- Step 1:模型初始化。
knn=cv2.m1.KNearest create() #生成空模型 - Step 2:训练模型。
该步骤使用训练数据(原始特征值)、训练数据的响应值(训练数据的标签、分类信息)、数据的形状(行、列)完成训练,生成可以使用的模型。
knn.train(trainData, cv2.m1.ROW_SAMPLE, trainLabels)
其中:
● trainData是训练数据的特征值。
● cv2.ml.ROW_SAMPLE是数据类型,当前值表示数据是行形式的,也可以是列形式的(cv2.ml.COL_SAMPLE)。
● trainLabels是训练数据特征值对应的标签。 - Step 3:使用模型。
该步骤使用训练好的模型完成任务。将要处理对象的特征值和K值作为参数,传递给训练好的模型,使用函数findNearest得出计算结果。
ret,result,neighbours,dist = knn.findNearest(test,k)
其中:
● ret是浮点型的返回结果值。
● result是numpy.ndarray型的K近邻算法的运算结果(若将某图像识别为数值3,则通过result返回标签为3的numpy.ndarray形式的值“[[3.]]”)。
● neighbours是K个邻居的标签。
● dists是到K个邻居的距离。
● test是需要处理对象的特征值(如待识别图像的特征值)。
● k是K近邻算法中的K值大小。如果想使用最近邻算法,使k=1即可。
3、实例
-
【例15.1】使用KNN模块完成数据分类预测。
如图15-39所示,假设有两组数对,一组数对在(0,10)范围内,标签为“0”;另外一组数对在(90,100)范围内,标签为“1”。使用KNN模块预测数对(31,28)在K=3时的标签。
图15-39 示意图
- 由图15-39很容易判断出未知标签为“0”。下面根据题目要求,编写程序通过KNN模块进行判断。
# -*- coding: utf-8 -*-
"""
Created on Tue Jan 9 09:04:53 2024
@author: dalong10
"""
import cv2
import numpy as np
# =====生成模拟数据及标签====
trainData = np.array([[5,6],[9,8],[3,8],[99,94],[89,91],[92,96]]).astype(np.float32)
tdLable = np.array([[0],[0],[0],[1],[1],[1]]).astype(np.float32)
test=np.array([[31,28]]).astype(np.float32)
# =======使用KNN 算法===============
knn = cv2.ml.KNearest_create()
knn.train(trainData, cv2.ml.ROW_SAMPLE, tdLable)
ret,results, neighbours, dist = knn.findNearest(test,3)
# ========泉示结果============
print("当前数可以判定为类型:", results[0][0].astype(int))
print ("距离当前点最近的3 个邻居是:",neighbours)
print("3个最近邻居的距离:",dist)
运行结果
从上述程序结果可以看出,KNN模块预测的结果与通过图15-39判断的结果一致。
4、把抽象的问题处理为数值
- 本例使用的是纯数值。
实践中,要做的就是把抽象的问题处理为数值。
例如,将不同直径、质量的钻石划分为甲级、乙级,需要把钻石的直径、质量作为训练数据,把等级作为训练数据的标签,从而使用KNN模块或SVM模块对未知数据进行类别划分。












网友评论