加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

基于深度學(xué)習(xí)的手寫數(shù)字識別項目GUI(Deep Learning Project)

08/28 14:42
1537
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關(guān)方案
  • 方案介紹
    • 本文摘要
    • 運行項目的需求
    • MNIST 數(shù)據(jù)集
    • 建立基于深度學(xué)習(xí)的手寫數(shù)字識別項目
    • 截屏結(jié)果
    • 總結(jié)
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

一步一步教你建立手寫數(shù)字識別項目,需要源文件的請可直接跳轉(zhuǎn)下邊的鏈接:All project

Deep Learning Project – Handwritten Digit Recognition using Python

本文摘要

在本文中,我們將使用MNIST數(shù)據(jù)集實現(xiàn)一個手寫數(shù)字識別應(yīng)用程序。我們將使用一種特殊類型的深度神經(jīng)網(wǎng)絡(luò),即卷積神經(jīng)網(wǎng)絡(luò)。最后,我們將構(gòu)建一個GUI,您可以在其中繪制數(shù)字并立即識別它。

實現(xiàn)效果:

Alt

運行項目的需求

這個有趣的Python項目要求你具備Python編程的基本知識,使用Keras庫和Tkinter庫進(jìn)行深度學(xué)習(xí),以構(gòu)建GUI。

使用下面的命令為這個項目安裝必要的庫:

pip install numpy, tensorflow, keras, pillow,

MNIST 數(shù)據(jù)集

這可能是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)愛好者中最受歡迎的數(shù)據(jù)集之一。MNIST數(shù)據(jù)集包含60,000張從0到9的手寫數(shù)字的訓(xùn)練圖像和10,000張用于測試的圖像。MNIST數(shù)據(jù)集有10個不同的類。手寫數(shù)字圖像表示為28×28矩陣,其中每個單元格包含灰度像素值。

建立基于深度學(xué)習(xí)的手寫數(shù)字識別項目

以下是實現(xiàn)手寫數(shù)字識別項目的步驟:

1、導(dǎo)入庫并加載數(shù)據(jù)集

首先,我們將導(dǎo)入訓(xùn)練模型所需的所有模塊。Keras庫已經(jīng)包含了一些數(shù)據(jù)集,MNIST就是其中之一。所以我們可以很容易地導(dǎo)入數(shù)據(jù)集并開始使用它。mnist.load_data()方法返回訓(xùn)練數(shù)據(jù)及其標(biāo)簽以及測試數(shù)據(jù)及其標(biāo)簽。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K

# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

print(x_train.shape, y_train.shape)

2、處理數(shù)據(jù)集

圖像數(shù)據(jù)不能直接輸入到模型中,所以我們需要對數(shù)據(jù)進(jìn)行一些操作和處理,使其為神經(jīng)網(wǎng)絡(luò)做好準(zhǔn)備。訓(xùn)練數(shù)據(jù)的維數(shù)為(60000,28,28)。CNN模型將需要多一個維度,因此我們將矩陣重塑為形狀(60000,28,28,1)。

x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
input_shape = (28, 28, 1)

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

3、建立模型

現(xiàn)在我們將在Python數(shù)據(jù)科學(xué)項目中創(chuàng)建CNN模型。CNN模型通常由卷積層和池化層組成。它對于表示為網(wǎng)格結(jié)構(gòu)的數(shù)據(jù)效果更好,這就是為什么CNN在圖像分類問題上效果很好的原因。dropout層用于使一些神經(jīng)元失活,在訓(xùn)練時,它減少了模型的擬合。然后,我們將使用Adadelta優(yōu)化器編譯模型。

batch_size = 128
num_classes = 10
epochs = 10

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accuracy'])

4、訓(xùn)練模型

Keras的model.fit()函數(shù)將開始模型的訓(xùn)練。它需要訓(xùn)練數(shù)據(jù)、驗證數(shù)據(jù)、epoch和批大小。

訓(xùn)練模型需要一些時間。訓(xùn)練完成后,我們將權(quán)值和模型定義保存在“mnist.h5”文件。

hist = model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(x_test, y_test))
print("The model has successfully trained")

model.save('mnist.h5')
print("Saving the model as mnist.h5")

5、評估模型

我們的數(shù)據(jù)集中有10,000張圖像,這些圖像將用于評估我們的模型工作的好壞。測試數(shù)據(jù)沒有參與數(shù)據(jù)的訓(xùn)練,因此是我們模型的新數(shù)據(jù)。MNIST數(shù)據(jù)集很好地平衡了,所以我們可以得到大約99%的準(zhǔn)確率。

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

6、建立GUI界面預(yù)測數(shù)字

現(xiàn)在對于GUI,我們已經(jīng)創(chuàng)建了一個新文件,我們在其中構(gòu)建了一個交互式窗口,用于在畫布上繪制數(shù)字,并且通過一個按鈕,我們可以識別數(shù)字。Tkinter庫包含在Python標(biāo)準(zhǔn)庫中。我們已經(jīng)創(chuàng)建了一個函數(shù)predict_digit(),它將圖像作為輸入,然后使用訓(xùn)練好的模型來預(yù)測數(shù)字。

然后我們創(chuàng)建App類,它負(fù)責(zé)為我們的應(yīng)用程序構(gòu)建GUI。我們創(chuàng)建一個畫布,我們可以通過捕獲鼠標(biāo)事件和按鈕來繪制,我們觸發(fā)predict_digit()函數(shù)并顯示結(jié)果。

下面是我們的gui_digit_recognizer.py文件的完整代碼:

from keras.models import load_model
from tkinter import *
import tkinter as tk
import win32gui
from PIL import ImageGrab, Image
import numpy as np

model = load_model('mnist.h5')

def predict_digit(img):
    #resize image to 28x28 pixels
    img = img.resize((28,28))
    #convert rgb to grayscale
    img = img.convert('L')
    img = np.array(img)
    #reshaping to support our model input and normalizing
    img = img.reshape(1,28,28,1)
    img = img/255.0
    #predicting the class
    res = model.predict([img])[0]
    return np.argmax(res), max(res)

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.x = self.y = 0

        # Creating elements
        self.canvas = tk.Canvas(self, width=300, height=300, bg = "white", cursor="cross")
        self.label = tk.Label(self, text="Thinking..", font=("Helvetica", 48))
        self.classify_btn = tk.Button(self, text = "Recognise", command =         self.classify_handwriting) 
        self.button_clear = tk.Button(self, text = "Clear", command = self.clear_all)

        # Grid structure
        self.canvas.grid(row=0, column=0, pady=2, sticky=W, )
        self.label.grid(row=0, column=1,pady=2, padx=2)
        self.classify_btn.grid(row=1, column=1, pady=2, padx=2)
        self.button_clear.grid(row=1, column=0, pady=2)

        #self.canvas.bind("<Motion>", self.start_pos)
        self.canvas.bind("<B1-Motion>", self.draw_lines)

    def clear_all(self):
        self.canvas.delete("all")

    def classify_handwriting(self):
        HWND = self.canvas.winfo_id() # get the handle of the canvas
        rect = win32gui.GetWindowRect(HWND) # get the coordinate of the canvas
        im = ImageGrab.grab(rect)

        digit, acc = predict_digit(im)
        self.label.configure(text= str(digit)+', '+ str(int(acc*100))+'%')

    def draw_lines(self, event):
        self.x = event.x
        self.y = event.y
        r=8
        self.canvas.create_oval(self.x-r, self.y-r, self.x + r, self.y + r, fill='black')

app = App()
mainloop()

截屏結(jié)果

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

總結(jié)

在本文中,我們成功地在手寫數(shù)字識別應(yīng)用程序上構(gòu)建了一個Python深度學(xué)習(xí)項目。我們構(gòu)建并訓(xùn)練了卷積神經(jīng)網(wǎng)絡(luò),它對于圖像分類非常有效。稍后,我們構(gòu)建GUI,在畫布上繪制數(shù)字,然后對數(shù)字進(jìn)行分類并顯示結(jié)果。

博客主頁:https://blog.csdn.net/weixin_51141489,需要源碼或相關(guān)資料實物的友友請關(guān)注、點贊,私信吧!

  • 聯(lián)系方式.txt

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
LTC6991HS6#TRPBF 1 Linear Technology LTC6991 - TimerBlox: Resettable, Low Frequency Oscillator; Package: SOT; Pins: 6; Temperature Range: -40&deg;C to 125&deg;C
$15.23 查看
AD9361BBCZ 1 Analog Devices Inc RF Agile Transceiver

ECAD模型

下載ECAD模型
$269.47 查看
NC7S14M5X 1 onsemi TinyLogic HS Inverter with Schmitt Trigger Input, 3000-REEL

ECAD模型

下載ECAD模型
$0.28 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜