如何用python-sklearn库结合opencv库识别图像

运用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

结果如图

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值