Python徒手實現識別手寫數字 大綱

2021-08-09 06:58:33 字數 2069 閱讀 8324

其實我之前寫過乙個簡單的識別手寫數字的程式,但是因為邏輯比較簡單,而且要求比較嚴苛,是在50x50大小畫素的白底圖上手寫黑色數字,並且給的訓練材料也不夠多,導致準確率只能五五開。所以這一次準備寫乙個加強公升級版的,藉此來提公升我對python處理檔案與的能力。

這次準備加強難度:

被識別可以是任意大小;

不一定是白底圖,只要數字顏色是黑色,周圍環境是淺色就行;

加強識別手寫數字的邏輯,提公升準確率。

因為我還沒開始正式寫,並且最近專業課程學習也比較緊迫,所以可能更新的比較慢。不過放心,**質量肯定是不會下降的,我會盡我所能寫的邏輯明確、通俗易懂點。

所以這次面向的人群是擁有一定python基礎,對數學算發有一點了解(識別影象的演算法嘛)的人。

但畢竟我不是專業的,也沒有看那麼多**,所以我這裡運用的演算法僅僅是我乙個粗淺的想法,只是為了練手而已。如果和實際應用脫節,還望莫怪。

在最開始的時候,我們假設只擁有乙個訓練庫,裡面是從0到9的手寫數字圖案若干組。

所以我們首先應該將這些圖案讀入程式中,然後運用某種方式儲存好,用來後面識別。

這裡的圖案我們假設是大小不一的,裡面手寫的數字也是有大有小。所以我們可以將包住手寫數字圖案的最小矩形給裁剪出來,然後將裁剪出來的圖案統一給拉伸成相同大小的圖案。

以上操作得出乙個矩陣,這個矩陣的值是圖案的灰度值。對於訓練用的和被檢測的我們都是這樣處理。

我這裡想用兩個方法來讓數字識別準確點:

識別所寫數字的「洞數」;

將轉為1xn的向量,然後根據根據訓練分出的類對被識別進行分類。

洞數就是某個數字是否有閉合的曲線,比如說7沒有洞,6有乙個洞,8有兩個洞。所以我們根據洞數可以分成以下三類

但是因為各種手寫差異,比如說6, 9, 8之類的沒有閉合,4上面閉合,所以會導致下面這種可能情況

雖然說這樣分類0洞佔大多數,但是聊勝於無。

對於將轉為向量的意思就是將原本的二維矩陣展開稱為一維向量。這個用numpy的函式可以可以很簡單的實現。

對於這個分類,下面我就簡單的講一下原理。

假設我們在二維平面上有兩個點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實現識別手寫數字大綱

寫在前面 其實我之前寫過乙個簡單的識別手寫數字的程式,但是因為邏輯比較簡單,而且要求比較嚴苛,是在50x50大小畫素的白底圖上手寫黑色數字,並且給的訓練材料也不夠多,導致準確率只能五五開。所以這一次準備寫乙個加強公升級版的,藉此來提公升我對python處理檔案與圖程式設計客棧片的能力。這次準備加強難...

python 實現 KNN 分類器 手寫識別

優點 進度高,對異常值不敏感,無資料輸入假定 缺點 計算複雜度高,空間複雜度高 適用資料範圍 數值型和標稱型 1 計算已知類別資料集中的點與當前點的距離 2 按照距離遞增次序排序,選取與當前點距離最小的 k 個點 3 確定前 k 個點所在類別的出現頻率 4 返回前 k 個點出現頻率最高的類別作為當前...

tensorflow實現手寫數字識別(MLP)

from future importprint function 即使是在python2版本也要像在python3中使用print函式 fromtensorflow.examples.tutorials.mnistimportinput data mnist input data.read data...