计算机视觉+机器学习 (一)识别手写数字 (3)
三. 开始训练数据集 。代码如下
import cv2
import os
import numpy as np
from sklearn import neighbors
import struct
print("Now start,please wait...")
def getImages():#处理训练图片
imgs = np.zeros([60000,784],int)#建立一个60000*784的0矩阵
for i in range(60000):
img1=cv2.imread("E://opencv-4.1.0//tensorflow_MNIST//trainImages//"+str(i)+".jpg",0)
for rows in range(28):
for cols in range(28):
if img1[rows,cols] >= 127:
img1[rows,cols]=1
else:
img1[rows,cols]=0
imgs[i,rows*28+cols]=img1[rows,cols](1*784),
return imgs
def getLabels():#解析训练标签(解析出来的标签和图片顺序是一一对应的)
f1=open("E://opencv-4.1.0//tensorflow_MNIST//train-labels.idx1-ubyte",'rb')
buf1=f1.read()
f1.close()
index=0
magic,num=struct.unpack_from(">II",buf1,0)
index+=struct.calcsize('>II')
labs=[]
labs=struct.unpack_from('>'+str(num)+'B',buf1,index)
return labs
def getTestImages():
imgs=np.zeros([10000,784],int)#
for i in range(10000):#
img1=cv2.imread("E://opencv-4.1.0//tensorflow_MNIST//testImages//"+str(i)+".jpg",0)
for rows in range(28):
for cols in range(28):
if img1[rows,cols]>=127:
img1[rows,cols]=1
else:
img1[rows,cols]=0
imgs[i,rows*28+cols]=img1[rows,cols]
return imgs
def getTestLabels():#处理测试标签,和处理训练标签是一样的
f1=open("E://opencv-4.1.0//tensorflow_MNIST//t10k-labels.idx1-ubyte",'rb')
buf1=f1.read()
f1.close()
index=0
magic,num=struct.unpack_from(">II",buf1,0)
index+=struct.calcsize('>II')
labs=[]
labs=struct.unpack_from('>'+str(num)+'B',buf1,index)
return labs
if __name__=="__main__":#主函数
print("Getting train_imgs...")
train_imgs = getImages()
print("Getting train_labels...")
train_labels=getLabels()
print("Creating KNN classifier...")
knn = neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3)
print("Training...")
knn.fit(train_imgs,train_labels)#读入训练图片和标签进行训练
print("Getting test_images...")
test_imgs = getTestImages()
print("Getting test_labels...")
test_labels = getTestLabels()
print("Predicting...")
result = knn.predict(test_imgs)#对测试图片进行预测
wrongNum = np.sum(result!=test_labels)#得出错误个数
num = len(test_imgs)#训练图片的总数
print("Total number:",num)
print("Wrong number:",wrongNum)
print("RightRate:",1-wrongNum/float(num))#得出正确率
运行结果如下:(由于不知道什么原因,在pycharm上运行不了这个代码,一直显示sklearn包不存在,其实已经下载出来了,就是出问题 但是在cmd中还是可以用sklearn包的 以后再解决,先在cmd上运行了一下代码,出现结果。费时很久可能我的电脑问题 。我是凌晨2:00开始运行的 ,等到2:30还没好就休息了,早上5:00看到运行结束 可能我电脑配置问题。)
其中为了更好理解,标注一下相关注释:
def getImages():#处理训练图片
imgs = np.zeros([60000,784],int)#建立一个60000*784的0矩阵
for i in range(60000):
img1=cv2.imread("E://opencv-4.1.0//tensorflow_MNIST//trainImages//"+str(i)+".jpg",0)#读取每一张图片(路径自定义)
for rows in range(28):
for cols in range(28):#访问每张图片的每个像素,这种方法简单易懂但是效率比较低
if img1[rows,cols] >= 127: #二值化处理,把一整张图片的像素处理成只有0和1
img1[rows,cols]=1
else:
img1[rows,cols]=0 #这里选择的临界点是127,正好是0-255的中间值
imgs[i,rows*28+cols]=img1[rows,cols]#把每张图片(28*28)展开成一行(1*784),
#然后把每张图片的像素逐行放到(60000*784)的大矩阵中
return imgs#返回所有图片的像素重构的矩阵
if __name__=="__main__":#主函数
print("Getting train_imgs...") #print的目的就是知道进度
train_imgs = getImages() #train_imgs保存60000*784的大矩阵
print("Getting train_labels...")
train_labels=getLabels()#train_labels保存60000个训练标签
print("Creating KNN classifier...")
knn = neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3)#重点来了,这里就是加载KNN分类器,具体的用法可以上网搜索
print("Training...")
knn.fit(train_imgs,train_labels)#读入训练图片和标签进行训练
print("Getting test_images...")
test_imgs = getTestImages()#test_imgs保存10000*784的大矩阵
print("Getting test_labels...")
test_labels = getTestLabels()#test_labels保存10000个训练标签
print("Predicting...")
result = knn.predict(test_imgs)#对测试图片进行预测
wrongNum = np.sum(result!=test_labels)#得出错误个数
num = len(test_imgs)#训练图片的总数
print("Total number:",num)
print("Wrong number:",wrongNum)
print("RightRate:",1-wrongNum/float(num))#得出正确率
结果中显示测试10000张图片,错误433个 ,准确率为95.67% 第一次实验就这样结束了。日后我会对此部分努力学习,争取熟悉相关知识把识别的准确率提高一些。
最后!我要非常感谢我的一位csdn上的朋友,从他那里学到了很多,也是他陪着我修改代码,其实大部分都是从他那借鉴的。有机会可以询问他,在此就不公布他的信息了!非常感谢!
(接下来的博客将继续更新,学习并实践更多的机器学习,计算机视觉相关知识与项目,请多多关注!谢谢!)