日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何写一个简单的手写识别算法?

發布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何写一个简单的手写识别算法? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


可以精準快速的識別出自定義的簡單圖形。
類似于下面這種?
Magic Touch - A Free Game by Nitrome
Magic Touch: Wizard for Hire on the App Store on iTunes

吐槽第一名答案, @Vinjn張靜 回答的 $1 gesture recognizer 是比較好的解法。

灑家也有一個類似的算法,借鑒了原始手寫ocr的思路來實現的。其實是寫在 $1 gesture recognizer 之前的,但沒有 $1 gesture recognizer 歸納得好,作者jacob還是我偶像。

Realtime Gesture recognition

把所有的筆畫定義了個8個方向,然后將B的筆畫可以分解成一個字符串。然后當人在觸摸屏上畫出一個符號時,也將它分解成8個方向的字符串,最后比較兩個字符串的距離就能判斷出和不同符號的近似度。
<img src="http://pic1.zhimg.com/5c8f99d6dfe803d783e215e131cb9f10_b.jpg" data-rawwidth="527" data-rawheight="167" class="origin_image zh-lightbox-thumb" width="527" data-original="http://pic1.zhimg.com/5c8f99d6dfe803d783e215e131cb9f10_r.jpg">
實現起來也很簡單,第一步去噪,因為不同觸摸屏的采樣頻率不同。
<img src="http://pic3.zhimg.com/cd33fdcf5a5f58b1c15ad0ffbf44300a_b.jpg" data-rawwidth="376" data-rawheight="188" class="content_image" width="376">

第二步把去噪后的數據轉換成方向序列,把之前得到的點換成方向序列,并把方向序列歸納到之前定義的8個方向中去。
<img src="http://pic3.zhimg.com/cd33fdcf5a5f58b1c15ad0ffbf44300a_b.jpg" data-rawwidth="376" data-rawheight="188" class="content_image" width="376">
第三步把連續一致的方向合并。
<img src="http://pic4.zhimg.com/dd4e09658bfd902a0b72c943687b260b_b.jpg" data-rawwidth="263" data-rawheight="156" class="content_image" width="263">
第四步把小片段的移動略去,最后就能得出其實是畫了一個凹的形狀。
<img src="http://pic4.zhimg.com/e8f5c7238045c508d42c0341bf860483_b.jpg" data-rawwidth="470" data-rawheight="170" class="origin_image zh-lightbox-thumb" width="470" data-original="http://pic4.zhimg.com/e8f5c7238045c508d42c0341bf860483_r.jpg">
這個算法的厲害之處是可以實時識別,畫到一半也能判斷出來。
Realtime Gesture recognition 源代碼和demo都在上面了。



===============
吐槽時間。。。。
剛寫完論文累死了,來吐槽。。。。
原來大家都覺得第一名不靠譜,怎么木有人把我頂上去!我眼紅著那300多票呢!

我來告訴你為什么第一名不靠譜,

首先ocr拿來做gesture recognition是不對滴!
ocr是一個比gesture recognition更難的問題,因為ocr得到的是一張圖片,所有點并沒有時間戳,而手勢識別時,每一下移動是有時間戳的,所以是知道“怎么畫出來”這個額外信息的。

其次ocr不是這么解釋的。
ocr問題的重點是怎么選擇特征,比如知名的uci 數據集就有以下這些特征量:

1. lettr capital letter (26 values from A to Z)2. x-box horizontal position of box (integer)3. y-box vertical position of box (integer)4. width width of box (integer)5. high height of box (integer)6. onpix total # on pixels (integer)7. x-bar mean x of on pixels in box (integer)8. y-bar mean y of on pixels in box (integer)9. x2bar mean x variance (integer)10. y2bar mean y variance (integer)11. xybar mean x y correlation (integer)12. x2ybr mean of x * x * y (integer)13. xy2br mean of x * y * y (integer)14. x-ege mean edge count left to right (integer)15. xegvy correlation of x-ege with y (integer)16. y-ege mean edge count bottom to top (integer)17. yegvx correlation of y-ege with x (integer)

我不懂deep learning,別和我講什么ocropus....

最后貝葉斯講得也不好。

感覺挑小朋友刺也挺不要臉的,其實我就是眼紅那300多票。。。

不請自來,終于有個能答的了。
用貝葉斯分類器做,四五十行Matlab代碼足以搞定。
先占座,容我緩緩道來,保準看完大家都會做模式識別。
------------------------------
以手寫阿拉伯數字識別為例,我們需要設計一個系統,其輸入為一個M*N像素的圖片,輸出為的0~9的數字。對于M*N像素的圖片輸入,可將其視為一個M*N的矩陣,矩陣的每個元素代表其對應像素位置上的的灰度值。

我們需要大量的手寫樣本來訓練分類器,樣本越多越好,自己采集樣本當然很累啦,網上有現成的數據庫 MNIST Database sam roweis : data
把數據庫中的一部分畫出來,大概是這樣子的:
<img src="http://pic1.zhimg.com/6bdccf8a6dc0f8998adf24c430579fc4_b.jpg" data-rawwidth="913" data-rawheight="334" class="origin_image zh-lightbox-thumb" width="913" data-original="http://pic1.zhimg.com/6bdccf8a6dc0f8998adf24c430579fc4_r.jpg">--
先講正態分布。

單個變量x的正態分布,眾所周知,大概是這樣的
<img src="http://pic4.zhimg.com/79f621189519523b42b93951f6bbd393_b.jpg" data-rawwidth="422" data-rawheight="300" class="origin_image zh-lightbox-thumb" width="422" data-original="http://pic4.zhimg.com/79f621189519523b42b93951f6bbd393_r.jpg">
函數式也很簡單&lt;img src="http://pic4.zhimg.com/104bbf353af8487e0055d807d8c42e07_b.jpg" data-rawwidth="232" data-rawheight="58" class="content_image" width="232"&gt;兩個變量&amp;lt;x,y&amp;gt;的聯合分布,大概是這樣子的兩個變量<x,y>的聯合分布,大概是這樣子的
&lt;img src="http://pic4.zhimg.com/59e76b87eba74967fc0589219a479b1f_b.jpg" data-rawwidth="300" data-rawheight="227" class="content_image" width="300"&gt;
那么對于k個變量的輸入,,
應該是什么樣子呢~
我也不知道,但是有公式描述它:
&lt;img src="http://pic2.zhimg.com/071cccf42ac95f91441636904b7a6835_b.jpg" data-rawwidth="569" data-rawheight="58" class="origin_image zh-lightbox-thumb" width="569" data-original="http://pic2.zhimg.com/071cccf42ac95f91441636904b7a6835_r.jpg"&gt;跟單變量函數式是不是很像啊~~跟單變量函數式是不是很像啊~~
其中,u 是 x 的期望值:
&lt;img src="http://pic1.zhimg.com/6f4119728be998032ce9557a35486770_b.jpg" data-rawwidth="291" data-rawheight="32" class="content_image" width="291"&gt; 是 x 的協方差矩陣,大小為 k*k:
&lt;img src="http://pic4.zhimg.com/b0856458cd49232aea2467b2b4f85823_b.jpg" data-rawwidth="758" data-rawheight="197" class="origin_image zh-lightbox-thumb" width="758" data-original="http://pic4.zhimg.com/b0856458cd49232aea2467b2b4f85823_r.jpg"&gt;
嗯,這就是對k維隨機變量的正態分布的描述,簡單吧。
------------------------------
再講貝葉斯分類。

看一維的例子。
假設有兩種魚A,B,各自的長度都呈正態分布,但期望方差不同,如下圖,藍色為B的長度的正態分布,紅色為A的長度的正態分布。
&lt;img src="http://pic4.zhimg.com/818851373fbacf832cd8539d812cf7f7_b.jpg" data-rawwidth="561" data-rawheight="420" class="origin_image zh-lightbox-thumb" width="561" data-original="http://pic4.zhimg.com/818851373fbacf832cd8539d812cf7f7_r.jpg"&gt;
問題來了,是我逮到一條魚,告訴你量出來長度為25,別的你都不知道,讓你猜猜到底這魚是A還是B,你會怎么答啊?

答A么,錯啦!!

這是A,B的長度的正態分布,又不是A,B的概率分布!!!
假如逮上來1000100條魚,其中100條是A,剩下的1000000條是B;你答A就二了么!

那該怎么答哇~
把各自的正態分布乘以其概率,再畫畫看~
&lt;img src="http://pic2.zhimg.com/c1c5adf8bff164333a5ce14a63a2d089_b.jpg" data-rawwidth="561" data-rawheight="420" class="origin_image zh-lightbox-thumb" width="561" data-original="http://pic2.zhimg.com/c1c5adf8bff164333a5ce14a63a2d089_r.jpg"&gt;我去,x=25的地方B比A不知道高到哪里去了!!!所以你們不要見的風是的雨啊,懂了沒有!!!我去,x=25的地方B比A不知道高到哪里去了!!!所以你們不要見的風是的雨啊,懂了沒有!!!

原理是什么呢?貝葉斯老爺子告訴我們這個定理:



就是說啊:要是你知道某種魚的長度x的正態分布,也知道這種魚在魚群中的概率,是所有魚的長度分布。逮上來一條魚的長度為25,套這個公式就知道這條魚是的概率是多少了不是~

剛那個問題不就好答了么,肯定要比較和 的大小啊,哪個大選哪個啊~~

這是一維的問題,x的緯度高了的話,套用上面的正態分布的高緯度公式啊,一樣算得出來

so easy~~
------------------------------
正式步入主題。

我們剛說了,對于M*N的矩陣輸入,直接把它轉化成一個有M*N個元素的數組,這個數組就是前面的x啦,即,對于x中的每一個元素,我們都視之為呈正態分布。

我們有很多不同手寫數字的樣本噠~算出這些樣本對應的參數,比如對于數字 3:
1. 算出其在樣本庫中的出現的概率
2. 算出數字3對應的所有樣本矩陣轉換成的向量x的正態分布:
3. 根據貝葉斯公式算出 ,這里忽略掉 因為它對于所有數字都一樣,而且我們只是要比較 的大小而已啊~

這不就把貝葉斯分類器設計好了么,剩下的就簡單啦~
比如我們現在有一張圖片,轉化成矩陣再轉化成向量x, 然后你就開始算啊,
算一直到的大小,最后比較誰大就認為這個圖片上畫的是誰~
------------------------------
Matlab代碼和數據庫附上,大家有興趣可以下了試試看:
Bayes.m_免費高速下載
識別正確率高達95.3%啊有木有!!!
手寫數字都能識別了,三角形什么的識別起來不是太簡單啦~就是要大量的樣本而已嘛。
------------------------------
感謝大家的熱情,如果有興趣自學模式識別的話 @歐陽塵曦@黃升球 ,推薦大家這本書:
Pattern Classification (豆瓣)
網上中英文pdf都有,大家自己找啦。有人問到需要的數學基礎,其實本科的基礎數學就足夠用了,遇到不懂的去網上搜,再不行就找人問。
------------------------------
關于不同分類器選擇的問題,樓下匿名用戶已經講的很好啦,我再補充幾點 @用心閣 :

貝葉斯分類器的好處是,簡單易懂,無迭代,運行速度快,準確率尚可,但是在某些情況下會表現不好,而且需要大量樣本來估算其正態分布參數。

KNN分類器的原理也很簡單,比貝葉斯更容易懂,實現簡單,需要樣本數少,但是其迭代次數多,運行速度比貝葉斯要慢個幾十甚至上百倍,而且根據k的取值,運行結果準確率不是很穩定。

支持向量機,前幾年非常火的,需要較好的數學基礎才能理解實現,準確率較前兩者都好,速度跟貝葉斯在一個級別,也不需要迭代,缺點在于,對于兩個以上的類別,你需要設計不止一個支持向量機來分類,而且,你需要針對特定的情況設置特定的kernal,以達到滿意的效果。

最近比較火的是神經網絡啦,準確率超高,表現驚人;但是訓練需要迭代,運行時間很長,大規模的神經網絡一般的PC運行起來很吃力的。
------------------------------
關于樣本多少的問題 @波紋,你可以這么理解,假如告訴你,某種魚的長度呈正態分布,但是其長度的方差和均值都未知,那你需要逮幾條魚出來量,才敢有把握估算這種魚長度的正態分布呢?當然是越多越好啦,具體的證明,你可以搜下:最大似然估計。我們采集樣本,就是為了估算這種魚的長度的正態分布的參數。
------------------------------
@chivalry
1. 貝葉斯是假定各個特征間是獨立的,代碼中看到用到了協方差,是不是只要保留協方差矩陣的對角線的值?
答:可以看我前面講的多為正態分布。需要計算樣本的協方差矩陣,才能估算樣本的正態分布。樣本的各個特征之間是否獨立,不影響我們對樣本的正態分布的估算。
2. 沒看到乘以先驗概率的地方?
答:在樣本中,各個數字出現的概率是一樣的(現實中大多也是如此),要比較后驗概率的大小,乘不乘都一樣,你看我就把p(x)給省去了。事實上,我比較后驗概率時的計算更加簡化了:
對后驗概率取對數,稱之為discriminant function:
&lt;img src="http://pic3.zhimg.com/886a018eabb82c3f930da6bae6bf8ace_b.jpg" data-rawwidth="297" data-rawheight="44" class="content_image" width="297"&gt;
&lt;img src="http://pic1.zhimg.com/c4e80d23fa41f64cb70c953f29d18fc8_b.jpg" data-rawwidth="591" data-rawheight="55" class="origin_image zh-lightbox-thumb" width="591" data-original="http://pic1.zhimg.com/c4e80d23fa41f64cb70c953f29d18fc8_r.jpg"&gt;
省去對各個數字一樣的項和影響小的項,最后只剩下
&lt;img src="http://pic2.zhimg.com/1ddbfd5cba2ad14c47d5254abff06901_b.jpg" data-rawwidth="298" data-rawheight="54" class="content_image" width="298"&gt;甚至連二分之一也不乘了。甚至連二分之一也不乘了。
------------------------------
@黃升球 對于高像素的圖片,即高緯度的輸入,一般需要做降維處理提取特征向量,PCA和LDA是比較基礎的,也能提高分類器的準確率,這部分確實需要一點數學才好理解。

總結

以上是生活随笔為你收集整理的如何写一个简单的手写识别算法?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。