sklearn識別單張自定義手寫數字圖片


 

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算法的簡單調用,識別魯棒性不高,所以圖片中數字要很粗——方便識別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM