其實我之前寫過乙個簡單的識別手寫數字的程式,但是因為邏輯比較簡單,而且要求比較嚴苛,是在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...