《基于深度審計網絡的手寫漢字識別系統設計與測試研究》16000字(論文)_第1頁
《基于深度審計網絡的手寫漢字識別系統設計與測試研究》16000字(論文)_第2頁
《基于深度審計網絡的手寫漢字識別系統設計與測試研究》16000字(論文)_第3頁
《基于深度審計網絡的手寫漢字識別系統設計與測試研究》16000字(論文)_第4頁
《基于深度審計網絡的手寫漢字識別系統設計與測試研究》16000字(論文)_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于深度審計網絡的手寫漢字識別系統設計與測試研究目錄TOC\o"1-2"\h\u258831緒論 155471.1選題背景與意義 1304051.2國內外研究現狀 316672手寫漢字識別系統設計 7235112.1設計目標 7136022.2開發語言選擇 8103912.3系統結構 10283302.4軟硬件環境 1281403手寫漢字識別系統構建 1351873.1數據集處理 13106153.2卷積神經網絡搭建 14131833.3訓練函數 1651663.4圖形界面 1888924手寫漢字識別系統測試 1977894.1測試環境 19188764.2測試結果 20285074.3分析比對 21163285總結和展望 248919參考文獻 261緒論1.1選題背景與意義有關手寫體漢字識別技術在世界范圍內的誕生,經過了大概有三個時期,理論探索期、快速發展期、深入發展期。印刷體漢字的識別技術可謂手寫體漢字識別技術的前身[1]。在第一個階段,在上個世紀,當計算機踏入歷史舞臺,對于計算機的研究就從未停下腳步。印刷體英文的識別在日常生活中都是不可或缺的,而隨之衍生的就是手寫體英文的識別。隨著中國在世界舞臺大展宏圖,漢字的影響力也越發強大,一些西方計算機公司,中國國內學者,中國知名高校都開始著手對漢字印刷體的計算機識別工作。而最先發表有關于漢字印刷體識別的文章的是CaseyR與NagyG,他們于1966年率先正式發表有關于印刷體漢字識別的相關理論知識及困難,并且順利識別出了近一千個印刷體漢字,為漢字識別奠定了理論基礎,掀起了全球業內人士對漢字識別的熱潮。而在第二個階段,中國發布了GB2312-80國家標準字符庫,極大的推動了漢字識別技術的發展。隨著印刷體漢字識別技術進一步的完善,全世界都有著對印刷體漢字有較高識別率的軟件,與此同時,有關于手寫漢字識別的研究悄然興起,日本首先對手寫體漢字識別進行研究。而在上個世紀八十年代,國內高校以及研究所開始了對手寫漢字的研究。在最后一個時期,以深度學習為核心的脫機手寫漢字識別技術有了長足的進步。我們的母語是漢語,漢字也是中國民族的瑰寶,漢字的廣泛使用使得計算機對于不同風格的手寫漢字識別非常有必要,我們國家對于漢字的分類、構造、內涵、造字原理等都有著豐富的人文研究基礎,結合人文知識和科技水平,關于手寫漢字識別的深入鉆研在國內一定可以很好地進行,領先世界一步。除此之外,對于手寫漢字的識別和處理,能極大地提高我國計算機科學技術的普及率,當下是個信息化時代,利用計算機提高工作效率已經是國家發展,提高民生水平必不可少的課題。如何根據已有的大量印刷或者手寫材料,方便快捷地輸入到計算機已經成為必不可少的課題,這就使得手寫漢字識別在商業合同文本糾紛,辦公系統自動化,郵政系統掃描,銀行票據處理等方面具有極大的開發潛力。1.2國內外研究現狀1.2.1漢字識別系統概述二十一世紀初,已經研發出識別率較高的聯機手寫漢字識別系統,它能夠保存書寫的筆順信息,獲取時間空間順序從而實現,但是脫機手寫漢字識別的發展遭遇瓶頸,當時世界上并沒有足夠完善的脫機手寫漢字識別方法。隨著深度學習的興起,計算機計算能力的增長,依托于圖像識別技術的進步,在2012年,瑞士人工智能實驗室描述了具備“端-端”特點的多列卷積神經網絡模型(MCDNN)。在多列卷積神經網絡中,利用GPU訓練深度神經網絡的模型,同時平均集成卷積神經網絡的輸出;將所得到的手寫漢字樣本轉換成圖像類別,并通過已搭建的模型訓練。在訓練的過程中,不采用進一步地特征選擇、提取,所得到的最終結果便是卷積神經網絡希望得到的識別結果[2]。在脫機和聯機手寫漢字識別方面,多列卷積神經網絡模型能夠很好地勝任模式識別工作,當時的識別技術都位居當時世界識別水平的前列,為手寫漢字識別問題提供了更加完善的解決方案。盡管以多列卷積神經網絡模型為代表的卷積神經網絡模型簡便且具備比較優秀的識別能力,但缺點也是較為明顯的,端到端的識別方法不能全面的利用手寫文字的已有研究成果,例如聯機手寫漢字中的筆順信息、漢字方位轉換特點等,這些手寫漢字的特征是利用本卷積神經網絡無法進一步學習來實現的。近年來,伴隨著卷積神經網絡(Convolutionalneuralnetworks,CNN)的模型理論不斷完善,對于它的研究方向也朝著多方面發展。對運行速度和存儲容量的優化是非常重要的一個方面,因此涌現了許許多多優化升級CNN模型的方法。中國科學家設計出一種9層CNN,該網絡采用了全局監督低維擴展(GSLRE)方法,使神經網絡能夠擁有更高的計算速度更小的模型大小,利用自適應權重(ADW)技術,使得網絡仍能達到超過90%的識別率。盡管精度有所下降,但是僅僅只是下降了0.21%,卻大大減少了計算量。在CNN的識別過程中,圖像噪聲也會對識別率產生一些影響——雖然CNN力求最簡便的輸入,更完美的識別系統應當可以在這方面進行進一步地優化。在最新的JournalofPhysics:ConferenceSeries雜志上發表的一篇基于CNN和中值濾波的手寫體漢字識別進行了有關噪聲處理對CNN手寫漢字識別系統的優化,中值濾波在散斑噪聲、椒鹽噪聲的處理中有很好地表現。因此首先通過中值濾波法,實現對圖像的去噪聲處理過程,再將處理后的圖片信息應用到CNN,以此獲得更高的識別率[3]。如今,國內互聯網公司也推出了各種手寫漢字識別服務,但對于風格迥異的手寫漢字,仍不能做到始終使得漢字識別率維持在極高的水平,要做到精確識別不同風格的手寫漢字,仍需要投入更大的精力。1.2.2深度神經網絡概述深度神經網絡已經在我們日常生活中最為常見的信息處理領域,如語音、文字、圖像等方面,獲得了極大的成功[4]。日新月異的計算機理論帶來的是這個世界翻天覆地的變化,計算機計算能力的飛速發展,使得深度神經網絡已經具備足夠的可行性和可用性,現代的優秀工程師們,已經通過各種技術手段,搭建不同的深度神經網絡,將它應用到許許多多的不同領域,并且在各個領域都擁有者舉世矚目的成就。深度學習可謂獨領風騷于音視頻領域上,現今的所有商用語音識別背后,都有著深度學習的影子。除此之外,深度學習使得圖像識別變得極為簡便,大大提高了現今的圖像識別能力,識別率相較之前的技術有了長足進步,甚至使得目前對于圖像識別的準確率不屬于人工識別。就圖像識別這個領域而言,他的應用已經涵蓋了我們生活的方方面面,應用最廣的就是為我們所熟知的人臉識別,指紋識別等,這些都是深度學習在生物特征識別技術上的成果。而在自然語言理解方面,深度學習也大顯身手。當下較為火熱的無人車技術,智能問答,天氣預報等,都在深度學習的幫助下有著質的飛躍[5]。深度神經網絡的起源一般以1994年的LeNet5為起點,LeNet5是最早的卷積神經網絡,孕育著未來發展的無限可能。LeNet5最大的特點就是定義了卷積神經網絡的基本特征,即它的層次模型。首次利用卷積操作實現圖像特征的提取,子采樣利用了圖空間平均技術,而在激活層之中使用了Sigmoid函數和tanh函數來進行非線性整流操作。LeNet5可以說是深度神經網絡的開山鼻祖。盡管如此,受限于當時的計算水平,深度神經網絡的發展遭遇了一個瓶頸期。但是,相關的研究人員沒有放棄,緩慢地推動著深度神經網絡的持續發展。一直到2010年,國外科學家DanClaudiuCiresan和JurgenSchmidhuber接過深度神經網絡發展的接力棒,使得深度神經網絡再度進入大眾視野,并開啟了深度神經網絡蓬勃發展的黃金時代,他們成功搭建了基于NVIDIAGTX280GPU圖形處理器的GPU神經網絡九層模型,能夠實現前向傳播和后向反饋計算。之后的一年里,硅谷的美國巨頭互聯網公司們也開始使用CNN使得語音識別的錯誤率顯著下降;2012年,AlexKrizhevsky發表了一篇題為“利用深度卷積網絡進行圖像網絡分類”的論文,其中確認了一種稱為卷積神經網絡的多層卷積計算模型能夠識別和分類大約120萬張圖像,達到了前所未有的精度水平[6]。AlexKrizhevsky利用他的AlexNet在大規模圖像識別挑戰大賽ImageNet上大放異彩,以巨大的優勢將圖像識別的錯誤率降低將近十個百分點,錯誤率低至百分之十五,斬獲冠軍;同年,谷歌公司完成了從大量的圖片中利用卷積神經網絡使得計算機學習如何實現貓臉識別;而這之后,深度神經網絡的發展以火箭般的上升速度,閃耀于各個領域。阿法狗(AlphaGo)于2015年10月橫空出世,是深度學習研發公司DeepMind對人工智能的最新研究成果,是第一臺以計算機身份打敗了一個個人類職業圍棋選手,最終以巨大的優勢擊敗了世界圍棋冠軍李世石,在圍棋領域被認為是世界上最強,創造了歷史[7]。下面介紹三種常見的深度神經網絡模型。前饋神經網絡:前饋神經網絡(feedforwardneuralnetwork,FNN)神經網絡主要是由輸入層(InputLayer)、隱藏層(HiddenLayer)、輸出層(OutputLayer)來構成它的結構。圖1表示的就是一種最簡單的前饋神經網絡,底層神經元為輸入層,最高層的神經元表示輸出層,所有在中間的都為隱藏層。FNN實現單向傳播,期間并不產生反饋型號,在輸出層得到一個有向非成圈圖,即為輸出結果。因為這種神經網絡由多個隱藏層串型連接,也被人們稱作多層感知機模型。全連接神經網絡(FullyConnectedNeuralNetwork,FCNN)也是形容FNN的一種方式,顧名思義,其原因在于前饋神經網絡的各個層次是全連接形成的。另外,各個神經層的神經元之間是相互獨立的,只有相鄰層次的的神經細胞才會按照全連接方式構建,神經元由線性加權求和的“線性層”和以激勵函數為基礎的“非線性層”兩部分組成。神經元逐層獲取上一層的信號量輸出到下一層的神經元。前饋神經網絡是非常基礎的一種非線性模型,但它所具備的獨特的思維理念使得人工智能的目光投向深度學習,引起業內人士的廣泛討論[8]。卷積神經網絡:卷積神經網絡在圖像數據處理方面大顯身手,但可用于其它形式數據的處理,如語音識別,自然語言處理等方面。舉一個典型的卷積神經網絡應用地例子,比如通過學習已有的知識,構造好一個模型,當輸入一個圖像后,它會根據訓練好的模型對圖像進行一系列的操作,對圖像進行分類,得到一個較為精確的分類結果。比如,對于“籃球”的圖像,它就輸出“籃球”;對于“橄欖球”的圖像,它不會認為這是一個籃球,而是通過學習,知道它是“橄欖球”。如圖2所示,CNN一般由多個結構相似的單元組成,每個單元卷積(convolution),激活(activation)和池化(pooling)三個基本操作。這種結構使得CNN對于二維結構數據的處理,相較于其它多種DNN模型具有無可比擬的優勢。除此之外,CNN在訓練的過程中,將參數在多個層次重復使用,提高了運算的效率,大大提高了訓練速度。生成式對抗網絡:生成式對抗網絡(GenerativeAdversarialNetworks,GAN)是深度學習研究的一個非常重要的分支,它由生成器(generator)和判別器(discriminator)組成的一對相互競爭的網絡。GAN在噪聲處理,圖像修復,精準預測等領域中有著較好的表現;它所具備的突出優點是,解決了訓練集數據缺少的情況下,進行相應的學習訓練,主要也是通過模擬現實數據來實現訓練精度的不斷提升。簡單地說,兩個網絡協同工作,生成器通過學習真實世界中的圖像、聲音、文本等信息,不斷制造虛假的類別,而判別器接受這些不斷生成的虛假類別,并區分真實與虛假的類別。好比一個古董鑒評師,根據自身鑒別贗品和正品的經驗,不斷提高自身的鑒定水平,從而更好地進行鑒定工作。如圖3所示,隨機噪聲輸入到生成器中形成“偽樣本”,再把“偽樣本”和“真樣本”輸入至判別器,在[0,1]區間給定一個數值,越接近“1”表示可信程度越高,越接近“0”表示可信程度越低。不斷重復這一過程中,進行“生成”和“對抗”兩種操作,生成器學習如何制造更加完美的“贗品”,判斷器學習如何更好地區分“真偽”,最終形成了這一深度神經網絡模型[9]。人工智能(AI)是在全球范圍內興起的一個熱詞,它涉及到科技、軍事、金融等各個關鍵領域,已經成為了全球經濟競爭新的主題,已經可以在一定程度上反映國家的部分科技硬實力。有別之前的幾次工業革命,在最新的以人工智能為核心技術的生產革命中,中國已經站在了與西方國家同一起跑線上,已經積累了足夠的底蘊支持發起新一輪的技術提升。深度學習作為人工智能的一個分支,中國已經投入了足夠的人力物力開展相關的研究,中國的前沿科學家工程師們憑著他們的智慧,在世界舞臺上占據了一席之地。在深度學習領域上,中國研究者們發表的論文數以及相關的專利數在這幾年保持著高速的增長水平,甚至超越美國。例如,清華大學的博士生導師黃高教授就提出了一種名為密集連接卷積網絡模型(DenseNet)。DenseNet有別于傳統神經網絡,它創造性地構造了一種全新的密集連接模式來代替常見的一維逐層連接方式,將之拓展為立體的跨層密集連接方式[10]。DenseNet模型具有計算速度快、程序泛化能力強大、對于數據的處理和利用能力強大等諸多優點,在計算機視覺領域已經具備一定的影響力。在論文的報告中,也探討了深度神經網絡如何在過參數(Over-parameterization)情況下,通過一定方法優化模型,與此同時,也闡述了非對稱損失函數具有普遍存在性,思考如何基于該性質來實現泛化性能更好的優化算法。

2手寫漢字識別系統設計2.1設計目標本次實驗的最終目標是實現較為完善的基于深度神經網絡的脫機手寫漢字識別系統。其整體編程語言采用Python實現,核心技術為卷積神經網絡。首先,一個完整的脫機手寫漢字識別系統必須具備正確性。本畢業設計的原理是卷積神經網絡模型,依靠神經網絡的訓練得到識別率盡可能高的模型是本畢業設計的最高原則。在畢業設計的過程中,應不斷比對已有的參數,調整卷積神經網絡的參數,最終實現百分之七十以上的正確識別率。同時,程序設計的過程中,應及時發現存在的問題,首先避免語法錯誤,絕大多數語法錯誤都能通過Anaconda的Spyder編譯器發現,而更為復雜的邏輯錯誤則需要經過一步一步的調試來發現問題等。第二,代碼的魯棒性也是程序設計中不可缺少的一環。考慮到硬件原因,本次畢業設計完成的手寫漢字識別系統的測試集在進行測試前都必須經過一定程度上的圖片轉換操作,并且對于輸入的圖片數據有一定的約束,才能得到較好地識別效果。同時,畢業設計支持大約兩千中字符與漢字類別,對于超過兩千種常用漢字的部分,應給予系統不支持的提示,從而提高系統的魯棒性。其次,必須保證系統的靈活性,使得后續對神經網絡或是其他模塊的修改和完善更加便捷。本畢業設計將代碼整體分為三大模塊。第一個模塊是數據集處理模塊。數據集的來源是CASIA脫機中文手寫數據庫。該數據庫搜集了風格不同的手寫漢字信息,數據量龐大,非常適合深度神經網絡的訓練和測試。該數據集原格式為gnt,需要進行一定程度上的解壓縮處理操作,使得其轉換為png圖片格式。第二個模塊就是深度神經網絡模塊。本模塊為本畢業設計的核心模塊,核心內容和設計關鍵都在該模塊中得到實現。其中supercnn類實現的是CNN的整體搭建過程,可以通過調整輸入的各種不同的參數,如輸入通道、卷積核大小、輸出通道等信息,實現卷積神經網絡的不斷優化,利用繼承的方法實現卷積、池化等操作。trainging_CNN()函數完成的是訓練操作,通過調用上述類的深度神經網絡模型來完成訓練操作,同時要注意保存訓練好的模型和數據信息。show_accuracy()函數完成的是對于正確率的統計,通過選取部分測試集數據進行識別,與正確結果比較,計算出識別率并打印在屏幕上。random_inference()函數實現對隨機一個測試集樣本的預測,將正確結果和預測結果打印在標簽上。result()函數可以對單個指定的文件夾漢字進行識別,同樣打印出正確標簽和預測標簽。image_label_txt()函數將訓練集和測試集的大量圖片數據路徑存放在一起,便于獲取正確的標簽。最后一個模塊是圖形設計界面模塊,該程序形成具體的圖形界面,可以根據圖形界面的提示操作,去實現對單個漢字的識別操作。總體來說,滿足了程序設計的靈活性,對于代碼的后續完善和修改,可以去相應模塊進行一系列的操作,簡便靈活。重用性也在本次手寫漢字識別系統中體現。各個對象、函數、方法之間存在著一定的聯系,supercnn類實現的深度神經網絡模型將在后續的訓練函數,測試函數,預測函數中都有用到。而第二個模塊也被應用到圖形界面設計模塊中,可以直接重用第二模塊的方法來實現對單個漢字的識別。總而言之,本設計系統滿足軟件的重用性,使得整個系統之間存在著藕斷絲連的聯系,互相之間的高效使用,大大簡化了代碼,不僅提高了代碼的可讀性,也便于代碼的后續完善。最后一點是程序的高效性。由于深度神經網絡的計算量龐大,因此在電腦代碼的運行上需要盡可能的提高效率。本人從硬件和軟件兩個方面入手,來進行系統效率的優化。硬件部分,設計的一開始是利用CPU進行整個手寫漢字訓練集的訓練過程,訓練所耗時間非常久,隨著分類數量的增加,完全無法滿足計算需求,因此我想方法將本人筆記本電腦上的獨立顯卡NVIDIAGetForceGTX1050Ti應用到本畢業設計中,以提高效率。軟件部分,要想調用GPU顯卡,必須安裝相關驅動,通過下載安裝

CUDA以及cuDNN,使得我的電腦上的GPU能夠應用到深度神經網絡的訓練中去。經過測試,確實利用GPU能夠大大提高程序運行效率,能夠支持更多的漢字類別,進一步完善手寫漢字識別系統。2.2開發語言選擇Python是一種高級語言,早在上個世紀八十年代就被荷蘭科學家提出,該語言具備函數式編程性、面向對象、強互動性以及可解釋性的特點[11]。Python語言可以說是當下最契合計算機功能的一種語言,它將編程語言所必備的函數式編程,面向對象特性等,和當今計算機科學技術最熱門的領域,比如大數據,機器學習,網絡編程等領域相結合,這些最新科研技術都能利用Python語言便捷的實現,使得Python所涵蓋的內容更加的豐富,在各種各樣的領域中發揮著不可替代的作用,充分體現了計算機系統應有的高速計算能力,數據存儲能力,網絡通信能力等[12]。Python不但能夠對大量數據進行整合歸并,更能實現對于數據的分析轉換。除此之外,Python近乎包含現有編程語言的各種優良特性,也被良好的用于軟件開發工作。近年來,伴隨著新興技術如人工智能,云計算,大數據等技術得到了迅速的發展,互聯網從業者逐步發現了Python語言的優良特性,并將之廣泛應用于上述的多種領域。相較于傳統的程序設計語言,他所具備的優點更是被全面放大,不僅使得必備的程序設計功能更加完備,更是利用自身特性,在前沿領域大展身手。首先,在人工智能領域中,Python憑借其獨有的強大計算機數據處理能力,組成了人工智能算法中最重要的計算部分,為人工智能的學習和發展提供了便捷的平臺,取得了非凡的成績,也擁有著極高的地位。從最初的簡單腳本設計到大型項目軟件的開發,再到現在的大數據計算等,Python語言可謂是時代的弄潮兒。Python以及它所擁有的繁多的開源庫使得它的功能具備著無限的可能,幾乎包含了所有常見的計算機功能,從最基本的計算機應用開發,到數據圖表制作及數學運算分析,再到網絡編程,數據爬蟲,人工智能等多個方面。Python最為突出的優點就是它仍有著無窮的潛力,每分每秒都在由全國各地的計算機從業者不停地完善和創新,不僅使得它的優越性更加突出,而且也擴大了它的知名度,形成一個良性循環。而在大數據方面,伴隨著信息化的加速發展和計算機的全面普及,數據正在以幾何數級爆炸增長,這些大量的數據蘊含著寶貴的財富,如何得到數量豐富且有價值的數據,并進行一系列的運籌帷幄,都需要付出巨大的努力。而Python語言在大數據信息的搜集和大數據分類處理中有著無可比擬的優勢,網絡爬蟲使得信息搜集變得簡便,圖像識別技術,機器學習技術等使得海量的信息分析成為可能,Python在大數據的應用中扮演著重要的角色。如今Python已經是全國編程愛好者熱衷的程序設計語言之一。Python的前身是一種腳本編程語言,在后續的發展中才逐漸完善功能。它不但能夠勝任不同的腳本需求,而且也能實現面向對象的大型項目編程[13]。Python語言具有豐富的優點,下面將從幾個方面進行介紹。首先,它開源且簡介,適合計算機初學者的使用,它沒有過多的關鍵字,防止初學者在變量的命名以及關鍵字的使用上遇到困難,整個語言的結構清晰明了,語法方面符合自然語言的思維邏輯,對傳統的編程語言取其精華,去其糟粕,Python語言無疑是零基礎接觸編程語言的人的福音,免去了繁雜的語法學習過程,Python代碼的可讀性極高,不同于Perl語法的條條框框,極簡的說明文檔使得使用者們能夠充分發揮自己的創造力去推動計算機技術的發展,解決實際問題。Python的庫系統可以說是最有特色的一個組成部分。它的標準庫已經涵蓋了傳統編程語言的絕大多數功能,如數學方面的計算,正則表達式的生成,網絡編程的編寫,數據庫的處理,音視頻文件處理,文件操作,圖形界面等。其次,他的一系列具有特色的庫,都是開源并且被科研人員不斷更新的,這些特色工具使得科研人員們能夠利用世界各地開發者的智慧,滿足自己的技術指標和需求。除了這些,可移植的具備使得Python的應用范圍更加廣闊,這主要歸功于它是開放源碼的語言,在各種系統中,都具有良好的兼容性。在計算機對于Python語言的翻譯過程中,Python強大的解釋器就發揮它的作用,將Python源代碼在不同的操作系統環境下翻譯成機器語言執行,所以在程序的移植過程中會避免編譯問題,庫函數報錯等問題。與此同時,可移植性結合可擴展性,Python的優勢更上一層樓,對于已熟練掌握已有編程語言的研究人員來說,自然是熟悉的語言使用起來更加得心應手,Python的可擴展性使得程序的部分利用其它語言編寫是具有可行性的,除了研究人員工作效率的提升,更是解決了Python在部分情況下,代碼運行速度相對較慢的問題——對于高速度要求的代碼塊,完全可以用C語言等來實現而不影響整體Python的編程。面向對象也是當今社會編程語言的熱門需求。面向對象的特點并不是Python與生俱來的,而是在后續的發展中,因為需要而產生的。因此,Python既可以是以對象構建的數據功能二元組為基礎的面向對象的“JAVA”,也可以是由各種函數形成的面向過程的“C語言”,這完全取決于開發者的需求。脫機手寫漢字識別系統訓練數據集手寫漢字識別模型手寫漢字預測識別脫機手寫漢字識別系統訓練數據集手寫漢字識別模型手寫漢字預測識別數據集處理卷積神經網絡圖形界面原始數據集可用數據集數據字典識別結果圖4系統結構圖本畢業設計名為基于深度神經網絡的脫機手寫漢字識別系統。整體設計如圖所示,系統主要結構為三大模塊——數據集處理、卷積神經網絡、圖形界面。數據集處理模塊位居第一模塊,他將對所需識別的數據進行一定程度上的轉換操作,便于采樣輸入到神經網絡中去,也為了有更好的識別率。源自CASIA的數據集包含3926個類別的常用漢字和字符,訓練集數據中每個類別有大約240個不同風格的手寫體漢字和字符,測試集數據中每個類別有大約60個不同風格的手寫體漢字和字符。在數據處理的過程中,訓練集數據存放入train文件夾,在train文件夾下面,將每個類別的數據放入相同的文件夾,文件夾名按照五位數字和自身的類別序號組成。這樣的分類方式,不僅便于后續根據文件路徑存入txt文本中,也便于在數據字典中,依照標簽查詢對應的漢字。數據字典文件包括的就是每個漢字和字符序號以及對應的漢字和字符,所形成的是Python數據結構中的字典格式,其中字典的“鍵”代表的是漢字或字符,字典的“值”代表的是漢字或字符的標簽。第二個模塊就是深度神經網絡模塊。作為手寫漢字識別系統的核心模塊,卷積神經網絡模型的搭建,訓練函數的生成,測試單個制定樣本,多個隨機樣本,單個隨機樣本,文件標簽整合,這些內容都位于該核心模塊中。首先實現了CNN的整體搭建過程,所生成的模型包括兩次卷積操作,三組全連接操作,實現了比較簡易的卷積神經網絡模型。而在這些操作當中,可以不斷修改調整每個操作方法的輸入參數,如輸入通道、卷積核大小、輸出通道等信息,不斷優化卷積神經網絡,而這僅僅是一輪操作,總的迭代次數要根據最初參數的設置來決定,一般而言,訓練的次數越多,最終形成的模型識別率越高。在這之后是對于訓練集的訓練操作,在訓練函數中,通過調用上述搭建的深度神經網絡模型并循環迭代來完成對整個訓練集的訓練,在訓練的過程中,將完成所有的訓練集的訓練次數賦予一個變量times,也就是次數,每進行十次完全訓練,就對神經網絡模型進行一個保存,保存的結果可以用于后續的繼續訓練,也可直接用于測試已生成模型的精度。后續對整體精度的預測,也是通過選取測試集中的樣本,輸入已有的識別模型,對輸出結果的正確率進行分析。隨機測試單個樣本也是完成類似的效果,相較于大量的識別率統計,能夠更加直觀的反應不同標簽的預測效果,在這部分函數中,將會顯示預測的漢字的正確標簽以及經由預測后的標簽,隨機的范圍是在全部測試集當中。而根據文件路徑預測單個樣本也和隨機預測單個樣本類似,主要的區別在于不需要將待預測的樣本放在指定的文件夾中,為后續圖層界面的調用做鋪墊。最后是有一個分類統計文件的功能,目的是使得train文件夾和test文件夾中的標簽能夠方便的引用,從而便于在預測的過程中實現正確標簽和預測標簽的比較。最后的一個模塊是形成圖形界面,本畢業設計完成的是一個脫機漢字識別系統,應當具備清晰明了的圖形界面以便于用戶的使用,因此采用了Python的PySimpleGUI庫實現了簡單但是便捷的程序圖形界面。該圖形界面包括了核心的漢字識別功能,通過上傳待預測的樣本的文件路徑,調用前一個模塊預測單個制定樣本函數,從而得到預測的標簽信息。同時,僅僅只有標簽信息并不能使得用戶知道所要識別的漢字是什么,因此還必須添加一個附加功能,即通過標簽查詢到具體的漢字信息。因此在漢字識別欄下面,還添加了查詢標簽部分,能夠對輸入的標簽信息,查詢數據字典對應的漢字信息,彈窗顯示查詢的標簽所對應的具體漢字。整個圖形界面具備相應的文字引導,用戶使用便捷。以上就是本畢業設計完成的脫機手寫漢字識別系統的整體設計,設計過程中盡管存在一些疏漏,但是完成了核心原理的卷積神經網絡搭建以及最終目標——手寫漢字識別系統。總而言之,符合畢業設計題目的全部要求,并且存在著很強的可塑性,可以在后續的學習生涯中進一步完善該脫機手寫漢字識別系統。2.4軟硬件環境2.4.1軟件運行環境Windows102004;Anaconda4.5.11;CUDAToolkit10.1;cuDNNv7.6.5;Python3.7.10;Python庫版本:numpy1.20.1;torch1.8.1;PySimpleGUI4.40.1;2.4.2硬件運行環境處理器:Intel(R)Core(TM)i5-7300HQ@2.50GHZ獨立顯卡:NVIDIAGeForceGTX1050Ti內存:8G

3手寫漢字識別系統構建3.1數據集處理舊的gnt文件存放于odata文件目錄下,新生成的png圖片都放在各自的標簽文件夾中,標簽文件夾存放于data文件中,os.path.join()為路徑拼接函數。read_from_gnt_dir()該方法實現從gnt文件中提取png圖片信息,第一個循環是對信息完成對信息的提取操作,第二個循環完成對原數據的讀取操作。其中np.fromfile()方法實現的是對文件的提取,數據類型uint8,數目10進行提取。接下來實現對數據字典的生成操作,首先調用上述的讀取gnt文件信息,按照gb18030編碼標準解碼,通過zip函數將漢字和字符信息與標號對應生成元組,再格式轉換為字典char_dict=dict(zip(sorted(label_list),range(len(label_list))))將最終結果存入數據字典。使用pickle庫中的pickle.dump(char_dict,f)來保存生成的數據字典文件。圖5手寫漢字數據集在此介紹Python的PIL模塊,該模塊是一個圖像讀取和圖像處理模塊,能夠通過輸入的圖片路徑信息,使用PIL.Image讀取圖像,接著就可以使用Image的各種方法來實現圖像轉換。Image.fromarray(image)功能是數組到圖片的轉換,實現最終的數據處理并保存部分,完成了從gnt文件到png圖片的轉換。在轉換的過程中,使用了Image.open.convert方法,在這里主要使用的convert方法作用是進行圖片樣式的轉換,將原有的圖片轉換為RGB格式并保存。圖5手寫漢字數據集3.2卷積神經網絡搭建對圖片數據的處理操作,定義一個數據類型便于輸入到卷積神經網絡。這里我設置的CNNdataset是在pytorc庫中的Dataset模塊的子類,完成的是一個自定義加載數據類別,在pytorch的torch.utils.data模塊中的Dataset就是完成對數據類型的定義操作,而我的CNNdataset(Dataset)數據類表示CNNdataset將會繼承父類Dataset,這其中的super(CNNdataset,self)的功能就是繼承父類的屬性和方法,在這些基礎上可以添加自己所需的一些功能或變換,基本上只需要重寫Dataset里的__init__,__getitem__,__len__這幾個部分的內容就可以了。__init__將會獲取圖片信息,同時對已經存入txt文件中的圖片的路徑進行標簽獲取,最后在進行一步圖片轉換操作,轉換的方式由輸入的轉換方法來決定。__getitem__在訓練的時候返回輸入卷積神經網絡的圖片和標簽信息等,使之形成圖片標簽和識別結果的匹配。__len__返回的是該數據集的長度信息。在對torch.utils.data.Dataset類進行重寫的過程中,必須注意的是,在繼承的過程中如果要使用其他的數據類,這些數據類必須也是torch.utils.data.Dataset類的子類,且必須要重寫_getitem_和_len_方法。總而言之,該部分就是創建一個數據類,擁有著兩個最重要的屬性,即為樣本的圖片和標簽信息,該數據類可以得到這些信息和數據集的總長度。圖6卷積神經網絡代碼下面的圖6卷積神經網絡代碼上圖為最重要的CNN搭建模塊代碼,首先是類似上述數據類的設置,卷積神經網絡所生成的類是繼承nn.Module的子類,在初始化__init__(self)的過程中,首先繼承父類nn.Module的屬性和方法,之后即可直接調用父類的卷積神經網絡搭建方法,接下來將對模型搭建的過程中用到的方法,方法的基本原理及所需參數進行詳細說明。nn.Conv2d()方法搭建的是卷積層,該方法有許多參數,本模型輸入三個參數,按順序依次為輸入通道個數,輸出通道個數,卷積核大小,其他參數均設置為默認值。下為Conv2d()用到的相關變量意義。其中,N表示采樣大小;C表示通道數,分為Cin和Cout兩種;H表示像素高度;W表示像素寬度;k由卷積核大小變換生成;groups表示分組卷積的組數,默認為1;padding表示對于輸入的填充,默認填充為0;dilation表示內核各元素的間距,默認為1;stride表示卷積的步長,默認為1。圖7Conv2d()運算公式bias表示添加可學習的偏移值至輸出,weight是對權重的計算,?是互相關函數操作運算符。圖7Conv2d()運算公式其中k的計算公式為k=其中input的變換公式如圖圖8input()運算公式圖8input()運算公式圖9MaxPool2d()運算公式nn.MaxPool2d()方法實現的是池化層,主要用到兩個參數,第一個參數是池化窗口大小kernel_size,第二個參數stride是池化窗口移動的步長,其余變量都與卷積層相同圖9MaxPool2d()運算公式nn.Linear()方法是全連接模塊,第一個參數是輸入樣本的大小,第二個參數是輸出樣本的大小。其中x為輸入的行向量,A是計算后得到的輸入權重矩陣,T表示矩陣的轉置變換,b是偏移值。線性變換的公式為y=xA在池化的過程中,實現了兩層卷積,兩層池化,在最后添加三層全連接層。forward()是繼承nn.module必須重寫的方法。這一方法完成的是卷積神經網絡中的激活層操作。F.relu()是線性整流函數,實現的是對輸出判斷是否達到閾值,即經由訓練后的特征強度是否達到所需的標準。該方法使用之前在初始化過程中已經設置好的各個層參數,進行兩輪的卷積、激活、池化操作。x.view實現的功能是把多行的張量轉變為一維的數據。最后進行兩次對全連接層的激活操作,經由最后一次全連接層得到輸出結果。relu()函數公式為ReLU圖10線性整流函數圖像relu圖10線性整流函數圖像3.3訓練函數下面介紹訓練函數trainging_CNN()中。第一步進行圖像處理操作,主要使用的是torchvision.transforms模塊。注意此處的圖片都為PILImage格式,根據參數設置的圖像尺寸,使用Resize()將輸入的圖像調整為指定大小,第一個參數是高度,第二個參數是寬度。使用Grayscale()將圖像轉換為灰度圖。利用ToTensor()將圖片形式轉換為torch.FloatTensor的數據形式。最后用Compose()串聯所有的變換操作。具體代碼為transforms.Compose([transforms.Resize((args.image_size,args.image_size)),transforms.Grayscale(),transforms.ToTensor()])下一步是按照之前定義的數據類別CNNdataset進行數據類別的輸入,再使用torch.utils.data.DataLoader類加載輸入的數據,返回的是可迭代的處理數據。DataLoader()有三個參數變量,第一個就是輸入的數據類,第二個是參數設置中的每批加載的樣本數量,最后一個shuffle參數表示是否在每次迭代中進行數據順序的隨機化處理操作。torch.device()表示訓練使用GPU或CPU,一般而言GPU訓練速度遠大于CPU。圖11交叉熵損失函數接下來就是按照之前搭建的神經網絡進行訓練。nn.CrossEntropyLoss()是交叉熵損失函數,一般用于計算預測模型和實際模型的差距。交叉熵損失函數圖11交叉熵損失函數optim.Adam()是使用Adam這個隨機優化方法,第一個變量是待優化的參數,第二個變量是學習率,學習率越大在初始的學習過程中就會學習得越快。torch.load()加載已保存的模型文件信息,若有則讀取并繼續迭代直到運行至最大迭代次數,若無則從零開始訓練。optimizer.zero_grad()將梯度重置為0,loss.backward()是反向傳播計算當前梯度,optimizer.step()通過梯度下降實現參數的更新,主要用于優化參數。每進行200步顯示一次損失值,每完成一次迭代就使用torch.save保存模型文件。3.4圖形界面最后實現一個簡單的圖形用戶界面,sg.theme()設置界面的主題顏色,layout是一個布局列表,子列表按順序實現每一行的布局,每個子列表占用一行空間。在本圖形界面布局中,定義了一個文本提示框,兩個文本輸入框,一個上傳文件組件,三個按鈕。接著是創建窗口方法sg.Window(),第一個參數為窗口標題,第二個參數為布局信息。這里需要打開數據字典,存入dictionary變量,以便于后續標簽和漢字或字符的對照。循環維持窗口,當點擊事件為“開始識別”,則根據文件上傳至第一個文本輸入框的文件路徑,進行識別功能,調用之前的result()函數,識別完畢后,sg.Popup()方法實現一個彈窗顯示識別的結果,包括正確標簽和預測標簽。當點擊事件為“查詢”,則根據輸入至第二個文本輸入框的標簽信息,根據字典查詢到對應的漢字或字符,同樣彈窗顯示。下圖為圖形界面及測試界面,彈窗1為識別的彈窗,彈窗2為標簽查詢的彈窗。圖13彈窗1圖14彈窗2圖12圖形用戶界面

圖13彈窗1圖14彈窗2圖12圖形用戶界面4手寫漢字識別系統測試4.1測試環境argparse該模塊作為非常重要的參數設置模塊,對于代碼的可移植性,可讀性都有很大的幫助。該模塊能夠在命令行的運行中提供功能選項,就類似Windows系統下的命令行,我們可以使用netstat–ano來實現對于端口信息的查看。而該模塊就是實現在命令行中進行不同的CNN模型在應用方面上對于需求的選擇,在后續舉例中會進一步說明。對于可選擇參數,基本上每一個參數都會設置一個最常用的默認值。除此之外,它也能夠提供幫助手冊,對程序用到的參數可以在help參數中添加對于參數的解釋部分,增強程序的可讀性。使用parse.add_argument添加參數,使用“args”+“參數名”調用設置的參數。.function參數形成的是功能選擇,在命令行中可以根據設置—function參數而選擇實現訓練神經網絡、顯示已有的模型的識別率、隨機進行單個標本的預測操作這三種功能。saving參數實現對已經訓練的模型進行保存,保存路徑為當前文件的log.pth文件中,該文件可用于后續的繼續訓練或者準確率統計功能中。iftrained參數用于判斷是否已經存在已完成訓練的模型,False表示不存在log.pth文件,需要建立新的日志文件,True表示已存在log.pth文件,在后續的操作中可以進行更新或者直接調用。epoch參數是設置迭代次數的上限,若要完成100次迭代,將值設為100即可。batch_num參數表示每批加載的樣本數量,默認值為16。需要注意的是,分類越多,對于采樣的最小數量要求就越大。例如16可以滿足200類別的分類識別,而不能滿足500類別。若要完成對500類的分類識別,最好是將采樣的最小數量設置為64,總而言之,該參數根據分類數目的多少而成正比例關系。allclasses參數是對分類類別數目的設置,默認值即為所要分類的數目,choices是對數據集的一個選擇,數據集是有0-3925類別,因此從這里面按順序選擇分類的數目進行識別率統計。下面為address參數添加過程:parse.add_argument('--address',type=str,default='C:\\Users\\DELL\\Desktop\\generationproject\\OCR\\data',help='文件的存放路徑,目錄位于data和test目錄的上級')4.2測試結果圖15正確率測試圖以下為測試用到的兩個測試函數,識別率函數show_accuracy(),隨機預測函數random_inference()。前面的步驟與訓練函數類似,完成的就是對模型的讀取和數據的輸入操作。torch.no_grad()是一個禁止計算梯度的上下文管理器,在測試函數中不需要計算梯度,因此使用該方法可以大大減少內存消耗,提高運行效率。model.eval()是將模型設置為測試模式,之后就是輸入加載的數據到模型中去進行預測識別,輸出識別的結果,每100個樣本輸出一次正確率,最終計算平均正確率。圖4.1.1為200類別,迭代50次之后的結果。隨機預測函數random_inference()操作基本類似,打開存放的測試txt文件,隨機選取一行圖片路徑信息,保存正確標簽。依據路徑信息將圖片輸入至模型進行識別預測,顯示預測的結果和正確的標簽。測試結果如圖4.1.1所示。result()函數基本與隨機測試函數結構類似,區別在于后續的圖形界面主要調用該函數來實現單個手寫漢字的預測,因此會有一個返回值,返回的是預測的標簽。同時,文件讀取的分割策略也會有所區別。圖15正確率測試圖隨機預測函數random_inference()操作基本類似,打開存放的測試txt文件,隨機選取一行圖片路徑信息,保存正確標簽。依據路徑信息將圖片輸入至模型進行識別預測,顯示預測的結果和正確的標簽。測試結果如圖4.1.2所示。result()函數基本與隨機測試函數結構類似,區別在于后續的圖形界面主要調用該函數來實現單個手寫漢字的預測,因此會有一個返回值,返回的是預測的標簽。同時,文件讀取的分割策略也會有所區別。圖16圖16隨機識別測試圖4.3分析比對該部分研究的是本次畢業設計基于CNN的脫機手寫漢字識別的識別率與哪些因素有關。該部分主要從兩個方面入手,第一個方面是隨著分類數量的增多,相同模型下,是否會產生識別率的下降、第二個方面是研究迭代次數與識別率的關系。第一部分,如表1所示,對比200,300,500,1000,2000類別的識別率。表表1識別類別數與識別數對照表類別數20030050010002000識別率78.52%77.72%76.07%70.78%68.16%可以得出兩個結論:在模型的結構類似的情況下,對于分類的數量要求越高,訓練所得到的手寫漢字識別系統的識別率上限越低;本系統性能中上,隨著類別數的增加,上限的降低存在但并不顯著,仍能保持較高的識別率。第二部分,如下圖,圖17表示的是在300類別識別模式下,迭代次數與識別率的關系,圖18表示的是在1000類別識別模式下,迭代次數與識別率的關系。圖17圖17300類別迭代次數與識別率關系圖圖181000類別迭代次數與識別率關系圖圖181000類別迭代次數與識別率關系圖由上述兩圖可以得出四個結論:隨著迭代次數的增加,訓練的識別率將會上升;識別率和迭代次數的關系呈對數關系上升;識別率存在上限,受制于卷積神經網絡的性能;分類的數目越多,起始的學習率越低。

5總結和展望本次畢業設計的過程中存在許多的困難,主要有下面幾個方面:首先是知識儲備方面,在本次畢業設計,本人對于深度學習的知識較為淺薄,僅僅是對機器學習有個初步的了解,而對于Pytorch庫也是從未接觸過。因此,為了完成畢業設計需要學習大量的新知識,導致時間上有些倉促,畢業設計的過程中也容易犯初學者的錯誤。好在有機器學習的基礎,對于數學方面的概念能夠有大體的了解,而Pytorch庫的說明文本也非常詳細,僅僅學習各個函數功能以及參數的意義就能實現深度神經網絡的搭建。其次是數據集的搜集。最開始我異想天開的想要憑借自己人工實現數據集的搜集,后來意識到個人想要完成滿足訓練集要求的數據數量是不現實的。通過查詢相關資料,我獲取了中科大的手寫漢字數據集。而這些數據集并不是直接以圖片的格式,因此還需要進一步的格式轉換。如何將gnt格式提取出png圖片也是遇到的難題。通過學習網絡上相關的方法,進一步研究文件格式的內容,最終成功利用Python的一些方法實現圖片數據集的提取。最后是硬件條件的不足。一開始進行手寫漢字識別模型的訓練,我采用的是CPU而忽視了GPU,導致效率極其低下。直至最后做分析比對的時候,由于每一種類別數量的訓練都要花費大量的時間,為了提高效率,意識到GPU也可用于pytorch的深度學習模型。根據我的NVIDIAGetForceGTX1050Ti顯卡,我選擇了合適的CUDAToolkit10.0版本以及cuDNN版本,成功實現了pytorch啟用GPU對模型進行訓練,大大提高了運行效率。受限于硬件條件、自身水平和軟件開發經驗,在全部漢字的分類、識別率和圖形界面的美化等方面還有很大的上升空間,可以進行進一步地學習和研究,將該脫機手寫漢字識別系統做得更好。在系統的調試階段,由于時間和設備的原因,盡管啟用了GPU,但是隨著分類數目的增多,每次訓練將花費大量的時間,因此不能對方方面面對模型的性能進行全面對照,只能在有限的幾個方面對卷積神經網絡進行優化,在未來時間充足的情況,可以對如何提升卷積神經網絡模型的識別率進行進一步研究。本畢業設計方案不僅初步達成

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論