利用Python进行数字识别

Python012

利用Python进行数字识别,第1张

在Java项目里写了一个RGBUtils的class,将32x32像素的图片全部数字化输出:

这是我在PS新建的32x32像素的数字9:

首先将32x32像素的图片转变成一行1024(=32x32)空间坐标,其实就相当于一个1024维的空间。TainData 里面有两千条数据就相当于有两千个点。

我们新建一个方法叫classify,就是把我们要测试的点放到训练数据空间里,看离他最近的k个点是什么值,这里我们K设置为5

我之前写的3的数字也变成1024维空间的点,选择最近的五个点进行判断。

原来图片

https://github.com/MichaelYipInGitHub/PythonTest/blob/master/com/test/knn/IdentifImg.py

1.Python没用封装KNN 算法, 因为太简单,可以直接手写。

2.从图片上看, 我用粗笔写的数字能识别到,细笔写的就识别不到,这可能与我的训练数据多为粗笔字体。

3.数字识别可以引申到动物识别,人物识别,不过他们用的像素不只是0和1,数据会更加庞大, 算法更加复杂。

其实就是python怎么读取binnaryfile\x0d\x0amnist的结构如下,选取train-images\x0d\x0a\x0d\x0aTRAININGSETIMAGEFILE(train-images-idx3-ubyte):\x0d\x0a[offset][type][value][description]\x0d\x0a000032bitinteger0x00000803(2051)magicnumber\x0d\x0a000432bitinteger60000numberofimages\x0d\x0a000832bitinteger28numberofrows\x0d\x0a001232bitinteger28numberofcolumns\x0d\x0a0016unsignedbyte??pixel\x0d\x0a0017unsignedbyte??pixel\x0d\x0a........\x0d\x0axxxxunsignedbyte??pixel\x0d\x0a\x0d\x0a也就是之前我们要读取4个32bitinteger\x0d\x0a\x0d\x0a试过很多方法,觉得最方便的,至少对我来说还是使用\x0d\x0astruct.unpack_from()\x0d\x0a\x0d\x0afilename='train-images.idx3-ubyte'\x0d\x0abinfile=open(filename,'rb')\x0d\x0abuf=binfile.read()\x0d\x0a\x0d\x0a先使用二进制方式把文件都读进来\x0d\x0a\x0d\x0aindex=0\x0d\x0amagic,numImages,numRows,numColumns=struct.unpack_from('>IIII',buf,index)\x0d\x0aindex+=struct.calcsize('>IIII')\x0d\x0a\x0d\x0a然后使用struc.unpack_from\x0d\x0a'>IIII'是说使用大端法读取4个unsingedint32\x0d\x0a\x0d\x0a然后读取一个图片测试是否读取成功\x0d\x0a\x0d\x0aim=struct.unpack_from('>784B',buf,index)\x0d\x0aindex+=struct.calcsize('>784B')\x0d\x0a\x0d\x0aim=np.array(im)\x0d\x0aim=im.reshape(28,28)\x0d\x0a\x0d\x0afig=plt.figure()\x0d\x0aplotwindow=fig.add_subplot(111)\x0d\x0aplt.imshow(im,cmap='gray')\x0d\x0aplt.show()\x0d\x0a\x0d\x0a'>784B'的意思就是用大端法读取784个unsignedbyte\x0d\x0a\x0d\x0a完整代码如下\x0d\x0a\x0d\x0aimportnumpyasnp\x0d\x0aimportstruct\x0d\x0aimportmatplotlib.pyplotasplt\x0d\x0a\x0d\x0afilename='train-images.idx3-ubyte'\x0d\x0abinfile=open(filename,'rb')\x0d\x0abuf=binfile.read()\x0d\x0a\x0d\x0aindex=0\x0d\x0amagic,numImages,numRows,numColumns=struct.unpack_from('>IIII',buf,index)\x0d\x0aindex+=struct.calcsize('>IIII')\x0d\x0a\x0d\x0aim=struct.unpack_from('>784B',buf,index)\x0d\x0aindex+=struct.calcsize('>784B')\x0d\x0a\x0d\x0aim=np.array(im)\x0d\x0aim=im.reshape(28,28)\x0d\x0a\x0d\x0afig=plt.figure()\x0d\x0aplotwindow=fig.add_subplot(111)\x0d\x0aplt.imshow(im,cmap='gray')\x0d\x0aplt.show()\x0d\x0a\x0d\x0a只是为了测试是否成功所以只读了一张图片