手寫數字識別的全棧嘗試

2021-07-25 14:58:13 字數 2320 閱讀 2579

心血來潮想進行一次full stack嘗試,以前一直做單機的開發,沒有做過web service。web service比單機應用會更加容易傳播,不會對使用者有太多的要求。之前就有考慮過前端和後台通訊的問題,但一直沒有真正去實現過,這次還是遇到了一些問題。

整個專案的邏輯是,使用者在前端網頁手寫乙個數字,前端將傳送給後台,後台對進行識別,將識別結果返回給前端。整個專案是基於django,django是乙個python的web應用框架,很好地將前後端結合起來,方便開發。前端部分,寫了乙個簡單的網頁,主體是個canvas,使用者可以在canvas上進行畫寫。後端用python寫的,用tensorflow訓練好的模型進行**。

前端之前不是很熟悉,花了幾天看了下html+css+js,能夠寫一些簡單的東西,還用了bootstrap庫來快速開發。說實話,我是真的沒有任何美感啊…做東西完全做的不好看。

基本的介面如下:

前端將canvas轉化為影象資料的**如下:

var scribbler = document.getelementbyid ("the_stage");

var imagedata = scribbler.todataurl('image/png');

var datatemp = imagedata.substr(22);

用python語言寫的,工作流程如下:

前端傳來的資料是經過base64編碼的,我們解碼後將其轉換為numpy矩陣,就能用opencv的一些函式進行處理,將3通道轉為灰度圖,並resize成28x28大小,最後拉成1x784的矩陣,進行識別。

預處理部分還加入了一些位置的控制,找到數字位置並把其移到影象**。有個有趣的地方是呼叫opencv的resize函式有個插值引數可選,如果用它預設的線性插值的話,最後得到的識別結果並不好,嘗試了幾個最後選用的最近鄰插值,效果不錯。

識別部分是用tensorflow訓練好的模型進行**,就是tensorflow官網的tutorial中的模型。

解析接收資料部分**:

imgstr = request.post.get('txt')  #'txt'是傳送的json資料中影象資料對應的key

imgstr = base64.b64decode(imgstr)

img = cv2.imdecode(numpy.array(bytearray(imgstr)), -1)

這部分是我整個專案中關注的重點,之前對前後端通訊不是很了解。

前端傳送請求是通過url方式進行的,如訪問url:www.xx.com/index,django將url和python的函式繫結,函式用來響應請求:

from mnist.view import index

urlpatterns = [

url(r'^index', index)

]

index函式如下,其返回index.html網頁資料,前端獲取到網頁,就能載入在瀏覽器上:

def

index

(request):

return render(request, 'index.html')

上面提到傳送請求是通過url方式的,並且乙個url對應乙個python的響應函式,這樣前端就能傳送資料給後台並接收後台處理後的資料。假設前端是把json資料post過來的,後端函式可以通過request.post.get('txt')來獲取json資料中「txt」這個key所對應的value。處理完畢後可以通過httpresponse來返回資料給前端。

ajax

ajax 是與伺服器交換資料的技術,它在不過載全部頁面的情況下,實現了對部分網頁的更新。後端把識別結果傳送給前端,前端就能把結果更新在識別結果的區域。

$.post() 方法通過 http post 請求從伺服器上請求資料。$.post(url,data,callback);

在這裡,url繫結著後端的識別函式,data是要傳送的手寫資料,callback是成功後把識別結果顯示在識別結果區域的js函式。

將專案部署在了國外的乙個雲平台heroku上,部署好會給你的專案分配乙個**,很方便。當然免費的東西還是有侷限的地方,首先,在國外,可能連線比較慢;再是,**長時間沒有別訪問,系統會將其變成睡眠狀態,再次連線時可能要等待一會。

不過能給開發者提供這樣乙個測試的平台,heroku還是相當好的,不用自己花錢去租伺服器或者vps了。

手寫數字識別的k 近鄰演算法實現

前言手寫字元識別是機器學習的入門問題,k 近鄰演算法 knn演算法 是機器學習的入門演算法。本文將介紹k 近鄰演算法的原理 手寫字元識別問題分析 手寫字元識別的knn實現 測試。knn演算法原理 knn演算法是一種分類演算法,即如何判定一組輸入資料屬於哪一類別的演算法。knn屬於監督學習演算法,必須...

FATE MNIST手寫數字識別 全連線網路

三 編輯執行配置檔案 四 編輯dsl配置檔案 五 開始訓練任務 參考資料 作業系統 macos sierra 10.12.6 docker版本 19.03.8 fate版本 單機版1.3 python版本 3.6.10 tensorflow 1.15.2 keras版本 2.2.4 awk f t ...

手寫數字識別

這幾天在想這做字元識別方面的程式,看了很多 但是發現 上的幾乎用處都不是特別的大,理論一大堆,但是用在程式裡面則很難實現,看到有些 上說用連碼法,但是連碼法對結構的變化太敏感了,但是也從一些 裡獲得了一些靈感,我採用的是網格匹配法,準備工作採集樣本,得到了樣本的網格資訊用於接下來的識別,當然也可 一...