sklearn內置了手寫數字的數據集digits。此數據集的官方介紹在這里。摘錄如下:
Each datapoint is a 8x8 image of a digit.
Classes 10 Samples per class ~180 Samples total 1797 Dimensionality 64 Features integers 0-16
整體步驟分為:訓練——預測兩大步。用到的預測圖片如下:
from sklearn.linear_model import LogisticRegression from sklearn import datasets from sklearn.cross_validation import train_test_split from sklearn.metrics import confusion_matrix,accuracy_score import numpy as np import scipy import cv2 from fractions import Fraction
def image2Digit(image): # 調整為8*8大小 im_resized = scipy.misc.imresize(image, (8,8)) # RGB(三維)轉為灰度圖(一維) im_gray = cv2.cvtColor(im_resized, cv2.COLOR_BGR2GRAY) # 調整為0-16之間(digits訓練數據的特征規格)像素值——16/255 im_hex = Fraction(16,255) * im_gray # 將圖片數據反相(digits訓練數據的特征規格——黑底白字) im_reverse = 16 - im_hex return im_reverse.astype(np.int) # 加載數字數據 digits = datasets.load_digits() # 划分訓練集與驗證集 Xtrain, Xtest, ytrain, ytest = train_test_split(digits.data, digits.target, random_state=2) # 創建模型 clf = LogisticRegression(penalty='l2') # 擬合數據訓練 clf.fit(Xtrain, ytrain) # 預測驗證集 ypred = clf.predict(Xtest) # 計算准確度 accuracy = accuracy_score(ytest, ypred) print("識別准確度:",accuracy) # 讀取單張自定義手寫數字的圖片 image = scipy.misc.imread("digit_image/2.png") # 將圖片轉為digits訓練數據的規格——即數據的表征方式要統一 im_reverse = image2Digit(image) # 顯示圖片轉換后的像素值 print(im_reverse) # 8*8轉為1*64(預測方法的參數要求) reshaped = im_reverse.reshape(1,64) # 預測 result = clf.predict(reshaped) print(result)
注意:
- 自定義圖片最好是png格式,因為jpg采用的是有損壓縮算法,圖像數據會變化;
- 訓練數據與預測數據格式需要一致,即特征一致;
- 上述代碼基本上是對sklearn算法的簡單調用,識別魯棒性不高,所以圖片中數字要很粗——方便識別