思路:
数据集来源:keras的mnist数据集
使用chain库中的from_iterable方法将二维的图片信息转化为一维矩阵接着采用之前二分类的思路训练模型。
代码如下:
from sklearn.neighbors import KNeighborsClassifier from tensorflow.keras.datasets import mnist from itertools import chain (train_images,train_labels),(test_images,test_labels)=mnist.load_data() one_w_tran_images=[] for i in range(len(train_images)): one_w_tran_images.append(list(chain.from_iterable(train_images[i]))) one_w_test_images=[] for i in range(len(test_images)): one_w_test_images.append(list(chain.from_iterable(test_images[i]))) #调用Knn算法 knn = KNeighborsClassifier(n_neighbors=4) knn.fit(one_w_tran_images, train_labels) y_predict = knn.predict(one_w_test_images) count = 0 for i in range(len(y_predict)): if y_predict[i] == test_labels[i]: count += 1 print('accuracy is %0.2f%%' % (100 * count / len(y_predict)))
第二部分为使用摄像头采集和处理数据
思路:
将采集的图片进行二极化,膨胀处理,接着缩小为28*28比例,接着再进行二极化处理并且转化为一维矩阵,利用已经训练好的模型进行预测
代码实现如下:
import cv2 cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) flag = cap.isOpened() index = 1 flag=True while (flag): ret, frame = cap.read() cv2.imshow("Capture_Paizhao", frame) k = cv2.waitKey(1) & 0xFF if k == ord('s'): # 按下s键,进入下面的保存图片操作 frame_g=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #二极化 retval, dst = cv2.threshold(frame_g, 70, 255, cv2.THRESH_BINARY_INV) #膨胀 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) dst = cv2.dilate(dst,kernel,15) cv2.imshow("C", dst) #缩小 new_image = cv2.resize(dst, [28,28],interpolation = cv2.INTER_AREA) #二极化 retval_, dst_ = cv2.threshold(new_image, 85, 255, cv2.THRESH_BINARY) #保存 cv2.imwrite("E:/" + str(index) + ".jpg", dst_) #转化为一维数组 psredict_=[] psredict_.append(list(chain.from_iterable(dst_))) psredict = knn.predict(psredict_) print(psredict) print("save" + str(index) + ".jpg successfuly!") print("-------------------------") index += 1 elif k == ord('q'): # 按下q键,程序退出 break cap.release() # 释放摄像头 cv2.destroyAllWindows()# 释放并销毁窗口
实现结论:
对训练模型部分
k取2时正确率为96.27%
k取3时正确率为97.05%
k取4时正确率为96.82%
一番尝试后选择k取3
对象摄像头拍摄的图片进行预测,常常出现图片取样质量低的问题,正确率很差
该图为取样时保存的数据,质量很差。