计算机视觉+机器学习 (一)识别手写数字 (3)

计算机视觉+机器学习 (一)识别手写数字 (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上的朋友,从他那里学到了很多,也是他陪着我修改代码,其实大部分都是从他那借鉴的。有机会可以询问他,在此就不公布他的信息了!非常感谢!

(接下来的博客将继续更新,学习并实践更多的机器学习,计算机视觉相关知识与项目,请多多关注!谢谢!) 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值