运用sklearn库中的svc模型进行对图片识别结果预测,通过SVC(probability = True)来做实时结果预测,以下是将要运用的库,在这个项目中,需要将12张数字2和12张数字3进行区分识别
import cv2
import numpy as np
import joblib
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, accuracy_score
一、训练模型
训练模型前,需要准备好数据集用于训练模型,然后根据函数train_test_split进行数据切分,将数据集划分为训练集和测试集,然后对数据标准化后放入训练得到模型
1、数据集获取
数据集需要图像数据和标签数据,因此会得到两个列表一个是图像数据列表,一个是标签数据列表
def get_img():
img_train = [] #图像数据
img_label = [] #标签数据
label = 1
for i in range(0, 12):
label = 2
path = '2/'+ str(i) + '.jpg'
img = cv2.imread(path, 0)
img = cv2.resize(img, (80, 80))
img = img.flatten()/255.0 #图像展平归一化
cv2.imshow('img', img)
print('label', label, i)
img_train.append(img)
img_label.append(label)
cv2.waitKey(10)
for i in range(0, 12):
label = 3
path = '3/' + str(i) + '.jpg'
img = cv2.imread(path, 0)
img = cv2.resize(img, (80, 80))
img = img.flatten()/255.0 #图像展平归一化
cv2.imshow('img', img)
print('label', label, i)
img_train.append(img)
img_label.append(label)
cv2.waitKey(10)
return img_train, img_label
2、数据切分
对得到的数据集进行切分操作,将数据集切分为训练集和测试集,因为训练数据不够,因此全部数据用来进行训练
X,y = get_img()
X = np.array(X)
X = X.reshape((len(X), -1))
#拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=42)
X_train = X #将数据集全部用来训练
y_train = y
3、数据标准化
将得到的训练集和测试集进行数据标准化,方便训练,只对图片数据标准化
# 数据标准化
scaler = StandardScaler() #创建缩放对象
X_train = scaler.fit_transform(X_train) #训练集标准化
X_test = scaler.transform(X_test) #测试集标准化
4、训练模型
将准备好的数据进行训练,其中probability=True可以实时计算准确值
# 创建SVM分类器
clf = SVC(probability=True)
# 训练模型
clf.fit(X_train,y_train)
5、评估模型
进行结果评估,查看模型识别准确率
#结果预测
y_pred = clf.predict(X_test)
# 保存模型
joblib.dump(clf,"svm_model.xml")
# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
结果如图
二、测试模型
测试模型前,需要将训练好的模型导入,然后再对图片进行归一化操作,最后做识别,这里采用随机读取图片进行查看识别准确率的方式
import cv2
import joblib
import numpy as np
import random
from joblib import dump,load
model = joblib.load("svm_model.xml") ###############################
while(1):
index = random.randint(2,3)
number = random.randint(0,11)
img = cv2.imread('./'+str(index)+'/'+str(number)+'.jpg', 0) ###################################
cv2.imshow("img",img)
img = cv2.resize(img, (80,80))
img = img.flatten() / 255.0
img = img.astype(np.float32)
img = img.reshape(-1, )
img = img.reshape(1, -1)
# 使用模型进行预测
pre = model.predict(img)
# 进行预测
# y_pred = clf.predict(X_test)
proba = model.predict_proba(img)[0]
accuracy = proba[np.argmax(proba)] * 100
print("识别结果:", pre,"准确率:",accuracy)
if cv2.waitKey(0) & 0xff == 27:
break
1、数据获取
和训练模型时一致
img = cv2.imread('./'+str(index)+'/'+str(number)+'.jpg', 0) ###################################
cv2.imshow("img",img)
img = cv2.resize(img, (80,80))
img = img.flatten() / 255.0
img = img.astype(np.float32)
img = img.reshape(-1, )
img = img.reshape(1, -1)
2、进行预测
# 使用模型进行预测
pre = model.predict(img)
3、识别准确率计算
注意想要实时计算识别准确率,必须再模型训练时添加probability=True,否则无法使用
# 实时准确率
proba = model.predict_proba(img)[0]
accuracy = proba[np.argmax(proba)] * 100
print("识别结果:", pre,"准确率:",accuracy)
if cv2.waitKey(0) & 0xff == 27:
break
结果如图