【智能】使用SVM完成MNIST手写字体分类

由 联环己烷 发布

关于MNIST

MNIST数据集

MNIST数据集是一个60000组训练数据集+10000组测试数据集组成的二进制图片集,每张图片均为28*28像素尺寸,内容为手写体的数字0-9。当然,由于是二进制数据集,你直接下载的数据肯定是看不见它长啥样的。

读入

首先去网站上把数据集下载下来,解压,然后就可以读入了。

网站上有写数据集中数据的格式:

1.png

可以看到,对于标签集,最开始是一个魔数,随后是数据个数。对于图片集,最开始是一个魔数,数据个数,两个数字代表图片尺寸(28*28)。

于是可以利用struct包将前面几个数字读掉,然后读完数据:

def load_data(file_img,file_label):
    with open(file_label,'rb') as f:
        magic,n=struct.unpack('>II',f.read(8))
        labels=npy.fromfile(f,dtype=npy.uint8)
    with open(file_img,'rb') as f:
        magic,n,r,c=struct.unpack('>IIII',f.read(16))
        imgs=npy.fromfile(f,dtype=npy.uint8).reshape(n,r,c)
    return imgs,labels

train_img,train_label=load_data('./train-images.idx3-ubyte','./train-labels.idx1-ubyte')
test_img,test_label=load_data('./t10k-images.idx3-ubyte','./t10k-labels.idx1-ubyte')

读了数据后,可以康康图片的模样:

from skimage import io
for img in train_x[0:10]:
    io.imshow(img)
    io.show()

大概吧,长这样:

2.png

特征提取

使用skimage中的hog进行图像的特征提取,如果使用visualize=True参数的话可以可视化地查看一下特征,便于调试pixels_per_cellcells_per_block的取值。

from skimage.feature import hog
for img in train_x[0:10]:
    normalised_blocks, hog_image = hog(img,pixels_per_cell=(2,2), 
    cells_per_block=(2,2),visualize=True)
    io.imshow(hog_image)
    io.show()

可视化的特征大概长这样:
3.png

初步调试好参数后,就直接得到需要分类的特征集好了:

X=[]
for img in train_x:
    tmp=hog(img,pixels_per_cell=(4,4),cells_per_block=(2,2),feature_vector=True)
    X.append(tmp)
X=npy.array(X)
Y=train_y

SVM分类

接下来使用SVM完成分类工作,获得一个模型。

from sklearn import svm

model_svc=svm.LinearSVC(C=0.1)
model_svc.fit(X,Y)

测试

testX=[]
for img in test_img:
    tmp=hog(img,pixels_per_cell=(4,4),cells_per_block=(2,2),feature_vector=True)
    testX.append(tmp)
testX=npy.array(testX)
testY=test_label

print(model_svc.score(testX,testY))

输出:0.9828


暂无评论

发表评论


京公网安备 11010802033049号