怎樣用 MATLAB 識(shí)別圖片上的文字?
共 1427字,需瀏覽 3分鐘
·
2022-02-09 17:37
去年自己做的一個(gè)小東西,現(xiàn)在看起來覺得沒那么難,而且完成了這個(gè)小項(xiàng)目之后,又學(xué)深入學(xué)習(xí)了一陣子,等有空再繼續(xù)改改。
去年做的小項(xiàng)目大概是這樣的:因?yàn)閷W(xué)校的教務(wù)管理系統(tǒng)查分?jǐn)?shù)比較麻煩,需要自己時(shí)不時(shí)登錄去“輪詢”,比較麻煩。那時(shí)會(huì)一點(diǎn)爬蟲,剛好學(xué)了一些機(jī)器學(xué)習(xí)的算法。想著訓(xùn)練出一個(gè)神經(jīng)網(wǎng)絡(luò)識(shí)別教務(wù)系統(tǒng)的驗(yàn)證碼,然后讓代碼幫我隔5分鐘查一下成績(jī),有新的成績(jī)出了就發(fā)郵件給我。于是我開始了。
1、 驗(yàn)證碼預(yù)處理
我們學(xué)校的教務(wù)系統(tǒng)驗(yàn)證碼長這個(gè)樣,4個(gè)字符(英文小寫字母加數(shù)字),左右傾斜,背景加了一些噪聲:
第一步想到的是濾波,驗(yàn)證碼的噪聲不像椒鹽噪聲,更像高斯噪聲。我自己也寫了個(gè)均值濾波器,效果也很不錯(cuò),對(duì)付這種比較簡(jiǎn)單的噪聲污染沒有太大問題。
在實(shí)際中,我直接調(diào)用了matlab的自帶濾波器,維納濾波。進(jìn)行灰度處理后直接交給維納濾波:
濾除噪聲的效果不錯(cuò)。
為了接下來的操作速度快一點(diǎn),我直接進(jìn)行了二值化操作,調(diào)整好閾值,二值化后得到:
2、Character Segmentation(Partition)
在實(shí)際的photo OCR當(dāng)中,字符分割是很難的,在NG的machine learning中提到了一點(diǎn),可以用sliding window的方法去實(shí)現(xiàn),在這里,我觀察了驗(yàn)證碼的特點(diǎn),其實(shí)驗(yàn)證碼當(dāng)中的字符都相對(duì)固定,所以我用最簡(jiǎn)單的方法分割圖像,當(dāng)然有時(shí)會(huì)偏差比較大。這也是可以改善的一點(diǎn)。我個(gè)人認(rèn)為利用圖論算法中的minimum cuts可以找到連接最弱的部分,然后進(jìn)行切割,這也是可行的。
切割后的效果:
3、 神經(jīng)網(wǎng)絡(luò)
當(dāng)時(shí)只能說是入門了神經(jīng)網(wǎng)絡(luò),學(xué)的是NG的課。直接用了一個(gè)全連接的前饋神經(jīng)網(wǎng)絡(luò),一共4層,input layer一共是260個(gè)神經(jīng)元,兩層hidden layer都是200個(gè)神經(jīng)元,output layer是36.
雖然方法很笨,一開始訓(xùn)練樣本也不多,我抓了100張驗(yàn)證碼,并手動(dòng)標(biāo)簽了,訓(xùn)練了一個(gè)初步的模型。然后我就直接用這個(gè)模型去識(shí)別,把正確識(shí)別的驗(yàn)證碼和對(duì)應(yīng)的字符保存起來;把識(shí)別錯(cuò)誤的保存到另外一個(gè)文件夾。針對(duì)識(shí)別錯(cuò)誤的驗(yàn)證碼,我手動(dòng)標(biāo)簽,然后訓(xùn)練,重復(fù)這個(gè)過程。后面驗(yàn)證碼已經(jīng)接近1000張了。
雖然方法很笨,但是效果很不錯(cuò)。經(jīng)過我?guī)状胃倪M(jìn)之后,在線識(shí)別100張,正確識(shí)別率基本在90%以上(90%~93%左右)
其實(shí),利用CNN效果會(huì)更好。先抓取大量為標(biāo)簽的驗(yàn)證碼,先進(jìn)行預(yù)訓(xùn)練,再進(jìn)行監(jiān)督訓(xùn)練,效果也會(huì)好很多。
當(dāng)時(shí)就是這樣,利用全連接網(wǎng)絡(luò)+L2 weight penalty,利用full-batch method 加 conjugate gradient訓(xùn)練了這個(gè)網(wǎng)絡(luò)。
之后我學(xué)了Geoffrey E. Hinton的課程之后,進(jìn)一步了解了神經(jīng)網(wǎng)絡(luò),可以做的花樣就很多了。
總結(jié)
這就是訓(xùn)練集的一部分:
標(biāo)簽:
我租了騰訊云的服務(wù)器,學(xué)生優(yōu)惠,1元1個(gè)月。
在考試月的時(shí)候完成了全部代碼,先在matlab完成了前期工作,然后用Python寫了一遍,加上了爬蟲的那一部分。 最后每次有成績(jī)都第一時(shí)間通知我:
附上github傳送門
[matlab版] mepeichun/Matlab_checkcode_verification
[java版] mepeichun/Java_checkcode_verification
[Python版] mepeichun/check_score_system
寫得很亂,因?yàn)槟嵌螘r(shí)間參加了好幾個(gè)比賽。。有空再改
