寫在前面
其實我之前寫過乙個簡單的識別手寫數字的程式,但是因為邏輯比較簡單,而且要求比較嚴苛,是在50x50大小畫素的白底圖上手寫黑色數字,並且給的訓練材料也不夠多,導致準確率只能五五開。所以這一次準備寫乙個加強公升級版的,藉此來提公升我對python處理檔案與圖程式設計客棧片的能力。
這次準備加強難度:
因為我還沒開始正式寫,並且最近專業課程學習也比較緊迫,所以可能更新的比較慢。不過放心,**質量肯定是不會下降的,我會盡我所能寫的邏輯明確、通俗易懂點。
所以這次面向的人群是擁有一定python基礎,對數學算發有一點了解(識別影象的演算法嘛)的人。
但畢竟我不是專業的,也沒有看那麼多**,所以我這裡運用的演算法僅僅是我乙個粗淺的想法,只是為了練手而已。如果和實際應用脫程式設計客棧節,還望莫怪。
當然,如果諸位有什麼比較好的想法,可以在下方評論或者私信我,我們可以**一下,相互進步。
整體思路
大綱對的預處理
在最開始的時候,我們假設只擁有乙個訓練庫,裡面是從0到9的手寫數字圖案若干組。
所以我們首先應該將這些圖案讀入程式中,然後運用某種方式儲存好,用來後面識別。
這裡的圖案我們假設是大小不一的,裡面手寫的數字也是有大有小。所以我們可以將包住手寫數字圖案的最小矩形給裁剪出來,然後將裁剪出來的圖案統一給拉伸成相同大小的圖案。
以上操作得出乙個矩陣,這個矩陣的值是圖案的灰度值。對於訓練用的和被檢測的我們都是這樣處理。
影象識別的演算法處理
我這裡想用兩個方法來讓數字識別準確點:
洞數就是某個數字是否有閉合的曲線,比如說7沒有洞,6有乙個洞,8有兩個洞。所以我們根據洞數可以分成以下三類
0洞:1, 2, 3, 4, 5, 7
1洞:6, 9, 0
2洞:8
但是因為各種手寫差異,比如說6, 9, 8之類的沒有閉合,4上面閉合,所以會導致下面這種可能情況
0洞:1, 2, 3, 4, 5, 6, 7, 9
1洞:6, 8, 9, 0
2洞:8
雖然說這樣分類0洞佔大多數,但是聊勝於無。
對於將轉為向量的意思就是將原本的二維矩陣展開稱為一維向量。這個用numpy的函式可www.cppcns.com以可以很簡單的實現。
對於這個分類,下面我程式設計客棧就簡單的講一下原理。
假設我們在二維平面上有兩個點a=(1,1)和b=(5,5),我現在再放乙個點c=(2,2),那麼請問,c點離哪乙個更近?
學過初中數學的都會知道肯定是離a點更近。所以我們換一種說法,我們現在有兩個類a和b,a類中包括了點(1,1),b類中包括了點(5,5),所以對於點(2,2),它可能屬於哪一類?
因為這個點離a類的點更近一點,所以它可能屬於a類。這就是結論。那麼對於3維空間,a類是點(1,1,1)和b類是(5,5,5),那麼對於點(2,2,2)肯定也是屬於a類。
可以看出,我們這裡是將兩個點的距離來作為判斷屬於哪一類的標準。那麼對於我們將拉成的1xn維向量,他實際上投影到n維空間上就是乙個點,所以我們將訓練向量分成10類,分別代表十個數字,那麼被識別數字靠近哪乙個類,那說明它有可能屬於這乙個類。
那麼我們這裡可以假設對於被識別向量,列出距離他最近的前十個向量分別屬於哪一類別,然後根據名次加上乙個權重,並計算出乙個值。該值代表了可能是屬於哪乙個類,因此這就是我們得出的最終的乙個結果——被識別手寫數字的值。
難點儲存已訓練的向量。這一條我想就直接儲存在csv檔案中,每一次運算時先判斷是否有新的訓練加入,如果有,則把新的向量也存入csv檔案中。若沒有,則直接讀取所有向量儲存在乙個大矩陣中用於計算。
將手寫數字從背景中分離。因為我這裡令手寫數字為黑色(灰度值為0),其他背景色盡量為,所以就令灰度值大於某個界限(如50)的點全部為255(白色),其餘不變。這樣子只要非255,那就是手寫數字的點。
識別手寫數字的洞。這個有演算法,搞過程式設計競賽的應該會了解。具體我就不細講了,大概就是利用遞迴之類的去尋找。
求向量距離。這個更簡單了,求解每乙個訓練向量與識別向量的距離就行,只不過當訓練向量比較大的時候可能比較慢。
總結以上就是全部思路,如果諸位有更好的想法,歡迎評論/私信我,讓我們一起相互學習進步,謝謝。
本文標題: python實現識別手寫數字大綱
本文位址: /jiaoben/python/218960.html
Python徒手實現識別手寫數字 大綱
其實我之前寫過乙個簡單的識別手寫數字的程式,但是因為邏輯比較簡單,而且要求比較嚴苛,是在50x50大小畫素的白底圖上手寫黑色數字,並且給的訓練材料也不夠多,導致準確率只能五五開。所以這一次準備寫乙個加強公升級版的,藉此來提公升我對python處理檔案與的能力。這次準備加強難度 被識別可以是任意大小 ...
手寫數字識別
這幾天在想這做字元識別方面的程式,看了很多 但是發現 上的幾乎用處都不是特別的大,理論一大堆,但是用在程式裡面則很難實現,看到有些 上說用連碼法,但是連碼法對結構的變化太敏感了,但是也從一些 裡獲得了一些靈感,我採用的是網格匹配法,準備工作採集樣本,得到了樣本的網格資訊用於接下來的識別,當然也可 一...
手寫數字識別
import os os.environ tf cpp min log level 2 不想讓警告的資訊輸出可以新增 from tensorflow.examples.tutorials.mnist import input data import tensorflow as tf def mnis...