當前位置:首頁 » 數據倉庫 » 帶標記的手寫數字資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

帶標記的手寫數字資料庫

發布時間: 2023-02-10 23:04:54

① 目前美國手寫郵政編碼的識別用的誰家的演算法

轉載1 引言

手寫體數字識別是文字識別中的一個研究課題,是多年來的研究熱點,也是模式識別領域中最成功的應用之一。由於識別類型較少,在實際生活中有深遠的應用需求,一直得到廣泛的重視。近年來隨著計算機技術和數字圖像處理技術的飛速發展,數字識別在電子商務、機器自動輸入等場合已經獲得成功的實際應用。盡管人們對手寫數字的研究己從事了很長時間的研究,並己取得了很多成果,但到目前為止,機器的識別本領還無法與人的認知能力相比,這仍是一個有難度的開放問題,所以對手寫數字識別的進一步研究,尋求如何更高效更准確更節能地實現手寫數字的自動錄入和識別的解決方案對提高經濟效益、推動社會發展都有深遠的意義。

近年來, 人工神經網技術發展十分迅速, 它具有模擬人類部分形象思維的能力, 為模式識別開辟了新的途徑, 成了模擬人工智慧的一種重要方法,特別是它的信息並行分布式處理能力和自學習功能等顯著優點, 更是激起了人們對它的極大的興趣。BP(Back Propagation)網路是神經網路中一種,是1986年由Rumelhart和McCelland為首的科學家小組提出,是一種按誤差逆傳播演算法訓練的多層前饋網路,可以很好地解決非線性問題,在函數逼近、模式識別和數據壓縮等方面都有很廣泛的應用。我們在認真地研究了神經網路的基本原理和機制的基礎上, 結合手寫體數字識別這一具體課題, 提出了用BP神經網路方法來實現手寫體數字識別的方案。

2 手寫體數字識別概述

2.1 手寫數字識別簡述

模式識別是六十年代初迅速發展起來的一門學科。由於它研究的是如何用機器來實現人及某些動物對事物的學習、識別和判斷能力,因而受到了很多科技領域研究人員的注意,成為人工智慧研究的一個重要方面。

字元識別是模式識別的一個傳統研究領域。從50年代開始,許多的研究者就在這一研究領域開展了廣泛的探索,並為模式識別的發展產生了積極的影響。

手寫體數字識別是多年來的研究熱點也是字元識別中的一個特別問題。手寫體數字識別在特定的環境下,如郵政編碼自動識別系統,稅表和銀行支票自動處理系統等一般情況。當涉及到數字識別時,人們往往要求識別器有很高的識別可靠性,特別是有關金額的數字識別時,如支票中填寫的金額部分,更是如此。因此針對這類問題的處理系統設計的關鍵環節之一就是設計出高可靠性和高識別率的手寫體數字識別方法。這個領域取得了飛速的發展,部分是由於更好的學習演算法,部分是由於更優良的訓練集。美國國家科學學會(NIST)建立了

一個包含60000個經過標注的數字的資料庫,它已經成為對新的學習演算法進行比較的性能測試標准。然而可以說還沒有哪個手寫體數字識別器達到完美的識別效果。

在過去的數十年中,研究者們提出了許許多多的識別方法,按使用的特徵不同,這些方法可以分為兩類:基於結構特徵的方法和基於統計特徵的方法。統計特徵通常包括點密度的測量、矩、特徵區域等。結構特徵通常包括園、端點、交叉點、筆劃、輪廓等,一般來說,兩類特徵各有優勢。例如,使用統計特徵的分類器易於訓練,而且對於使用統計特徵的分類器,在給定的訓練集上能夠得到相對較高的識別率;而結構特徵的主要優點之一是能描述字元的結構,在識別過程中能有效地結合幾何和結構的知識,因此能夠得到可靠性較高的識別結果。本文針對手寫數字識別選用BP神經網路這種基於傳統統計學基礎上的分類方法,用於分割和識別,並取得了較好的識別效果。

2.2 手寫數字識別的一般過程

手寫體數字識別的過程如圖2-1所示,一般分為預處理、特徵提取、數字串的分割、分類器、等模塊。原始圖像是通過光電掃描儀,CCD器件或電子傳真機等獲得的二維圖像信號。預處理包括對原始圖像的去噪、傾斜校正或各種濾波處理。手寫體數字具有隨意性,其字元大小、字間距、字內距變化很大,分割難度較大。手寫數字串的分割是其中最重要的環節,是制約識別率的瓶頸所在。去噪是預處理中極重要的環節。系統面對的是從實際環境中切分出的字元圖像,可能有粘連的邊框、隨機的墨點、切分不正確引入的其他字元筆劃等使前景點增加的雜訊,還可能有斷線等使背景增加的雜訊,目前適應各種環境的通用去噪演算法還不成熟。預處理中的規格化也不僅僅是同比例的放縮,它不僅要保持拓撲不變,更要最大限度地突出所取特徵。在眾多應用環境中,特徵提取、分類器、多分類器集成是整個識別系統的核心。大體上來說特徵可以分為結構特徵和統計特徵兩類。由於分類器的選擇取決於所提取的特徵,因此相應的識別方法便有結構方法和統計方法。

總之,從手寫體數字識別原理可見,手寫體數字識別技術主要包括以下幾點:

1)圖像預處理,包括彩色圖像轉成灰度圖像、二值化,歸一化,濾除干擾雜訊等;

2)基於數字圖像的特徵選擇和提取;

3)數字串的分割;

4)模式分類識別。

其中,第二和第四部分是手寫數字識別的重點,直接關繫到識別的准確率和效率,也是本論文研究的重點所在。

結果圖2-1 識別流程

2.3 手寫數字識別的一般方法及比較

手寫數字識別在學科上屬於模式識別和人工智慧的范疇。在過去的四十年中,人們提出了很多辦法獲取手寫字元的關鍵特徵,提出了許多識別方法和識別技術。這些手段分兩大類:

全局分析和結構分析。

多年的研究實踐表明,對於完全沒有限制的手寫數字,幾乎可以肯定:沒有一種簡單的方案能達到很高的識別率和識別精度,因此,最近這方面的努力向著更為成熟、復雜、綜合的方向發展。研究工作者努力把新的知識運用到預處理,特徵提取,分類當中。近年來,人工智慧中專家系統方法、人工神經網路方法已應用於手寫數字識別。在手寫數字識別的研究中,神經網路技術和多種方法的綜合是值得重視的方向。

針對模式特徵的不同選擇及其判別決策方法的不同,可將模式識別方法大致分為5大類這5種識別方法均可實現手寫數字識別,但它們特點不同,必須根據條件進行選擇。

(1)統計模式法

這是以同類模式具有相同屬性為基礎的識別方法。用來描述事物屬性的參量叫做待征,它可以通過模式的多個樣本的測量值統計分析後按一定準則來提取。例如:在手寫數字識別系統中,我們可以把每個數字的圖形分為若干個小方塊(圖),然後統計每一小方塊中的黑像素構成一個多維特徵矢量,作為該數字的特徵。必須注意的是:在選擇特徵時,用於各類模式的特徵應該把同類模式的各個樣本聚集在一起,而使不同類模式的樣本盡量分開,以保證識別系統能具有足夠高的識別率。

(2)句法結構方法

在形式語言和自動機的基礎上產生了句法結構這一方法。其基本原理是:對每一個模式都用一個句法來表示,而對一個待識別的未知樣本,通過抽取該樣本的基元來構造該樣本的句子,然後分析此句子滿足什麼樣的句法,從而推斷出他該屬於哪個模式類。這種方法的優點是它能反映模式的結構特徵,而且對模式的結構特徵變換不敏感,因此比較適合聯機識別。但是由於抽取字元的基元比較困難,因而不是特別適合用於離線識別,同時這一方法的理論基礎還不可靠,抗干擾能力比較弱。

(3)邏輯特徵法

就是其特徵的選擇對一類模式識別問題來說是獨一無二的,即在一類問題中只有1個模式具有某1種(或某1組合的)邏輯特徵,此方法律立了關於知識表示及組織,目標搜索及匹配的完整體系;對需通過眾多規則的推理達到識別目標的問題,有很好的效果,但當樣品有缺損,背景不清晰,規則不明確甚至有歧義時,效果不好。

(4)模糊模式方法

就是在模式識別過程中引入了模糊集的概念,由於隸屬度函數作為樣品與模板相似程度的量度,故能反映整體的、主要的特性,模糊模式有相當不勻稱的抗干擾與畸變,從而允許樣品有相當程度的干擾與畸變,但准確合理的隸屬度函數往往難以建立。目前有學者在研究,並將其引入神經網路方法形成模糊神經網路識別系統。

(5)神經網路方法

就是使用人工神經網路方法實現模式識別。可處理某些環境信息十分復雜,背景知識不清楚,推理規則不明確的問題,允許樣品有較大的缺損、畸變。神經網路方法的缺點是其模型在不斷豐富完善中,目前能識別的模式類不夠多,神經網路方法允許樣品有較大的缺損和畸變,其運行速度快,自適應性能好,具有較高的解析度。

上述幾種識別方法各有特點。結構法比較直觀,能較好反映事物的結構特性:問題是基元的提取很不容易,各基元的關系也比較復雜,抗干擾性能也較差。統計法用計算機來抽取特徵,比較方便,抗干擾性能強;缺點是沒有充分利用模式的結構特性。神經網路方法由於處理的並行性,可以快速同時處理大容量的數據,工作時具有高速度和潛在超高速,並且,網路的最終輸出是由所有神經元共同作用的結果,一個神經元的錯誤對整體的影響很小,所以其容錯性也非常的好。基於以上的考慮,本文的手寫數字識別採用了神經網路的方法。

3 圖像預處理與特徵提取

手寫體圖像數據在沒有進行一定的圖像預處理和特徵提取之前,不能立即應用到程序中進行神經網路訓練和字元識別工作。從圖像處理角度來說,手寫體的字元識別對字元是不是有顏色是不關心的,而對此圖像的清晰度是很關心的。所以在圖像進行一系列的圖像處理工作是很有必要的。圖像的預處理是正確、有效提取圖像特徵的基礎,有效的圖像特徵作為網路的輸入值才能進行正確的神經網路訓練和最終得到正確、有效的網路權重。

3.1 數字圖像預處理

3.1.1 灰度化處理

彩色圖像包含了大量的顏色信息,不但在存儲上開銷很大,在處理上也會降低系統的執行速度,因此在對圖像進行識別等處理中經常將彩色圖像轉變為灰度圖像,以加快處理速度。由彩色轉換為灰度的過程稱為灰度化處理。灰度圖像就是只有強度信息而沒有顏色信息的圖像,存儲灰度圖像只需要一個數據矩陣,矩陣每個元素表示對應位置像素的灰度值。彩色圖像的像素色為RGB(R,G,B),灰度圖像的像素色為RGB(r,r,r) ,R,G,B可由彩色圖像的顏色分解獲得。而R,G,B的取值范圍是0-255,所以灰度的級別只有256級。灰度化的處理方法主要有如下三種:最大值法、平均值法和加權平均值法。本文用到的加權平均值法來處理,即更換每個像素的顏色索引(即按照灰度映射表換成灰度值)。 權重選擇參數為:

紅:0.299

綠:0.587

藍:0.114

例如某像素點顏色對應的灰度值計算公式為:

NewPixColor?(BYTE)(0299*Red?0.587*Green?0.114*Blue) 系統輸入的源圖像支持3通道或者4通道圖像,支持Format24bppRgb, format32bppRgb, Format32bppArgb和Format8bppIndex這4種像素格式。

3.1.2 二值化處理

二值圖像是指整幅圖像畫面內僅黑、白二值的圖像。在數字圖像處理中,二值圖像佔有非常重要的地位。在實際的識別系統中,進行圖像二值變換的關鍵是要確定合適的閾值,使得字元與背景能夠分割開來,二值變換的結果圖像必須要具備良好的保形性,不丟掉有用的形狀信息,不會產生額外的空缺等等。採用二值圖像進行處理,能大大地提高處理效率。 二值化的關鍵在於閾值的選取,閾值的選取方法主要有三類:全局閾值法、局部閾值法、動態閾值法。全局閥值二值化方法是根據圖像的直方圖或灰度的空間分布確定一個閥值,並根據該閥值實現灰度圖像到二值化圖像的轉化。全局閥值方法的優點在於演算法簡單,對於目標和背景明顯分離、直方圖分布呈雙峰的圖像效果良好,但對輸入圖像量化雜訊或不均勻光照等情況抵抗能力差,應用受到極大限制。局部閥值法則是由像素灰度值和像素周圍點局部

灰度特性來確定像素的閥值的。Bernsen演算法是典型的局部閥值方法,非均勻光照條件等情況雖然影響整體圖像的灰度分布卻不影響局部的圖像性質,局部閥值法也存在缺點和問題,如實現速度慢、不能保證字元筆劃連通性、以及容易出現偽影現象等。動態閥值法的閥值選擇不僅取決於該像素灰度值以及它周圍像素的灰度值,而且還和該像素的坐標位置有關,由於充分考慮了每個像素鄰域的特徵,能更好的突出背景和目標的邊界,使相距很近的兩條線不會產生粘連現象。在圖像分割二值化中,自動閩值選取問題是圖像分割的關鍵所在。事實證明,閩值的選擇的恰當與否對分割的效果起著決定性的作用。

本文採用全局閾值的方法,實現將圖像二值化的功能。如果某個像素的值大於等於閾值,該像素置為白色;否則置為黑色。系統程序目前僅支持8bpp灰度圖像的轉換,閾值介於0~255之間,程序中取220。

3.1.3 去離散雜訊

原始圖像可能夾帶了雜訊,去雜訊是圖像處理中常用的手法。通常去噪用濾波的方法,比如中值濾波、均值濾波,本文中去除離散雜訊點採用中值濾波的方法。中值濾波法是一種非線性平滑技術,它將每一象素點的灰度值設置為該點某鄰域窗口內的所有象素點灰度值的中值,讓周圍的像素值接近的真實值,從而消除孤立的雜訊點。

3.1.4 字元分割

在識別時系統只能根據每個字元的特徵來進行判斷,為了最終能准確識別手寫體數字,必須將單個字元從處理後的圖像中逐個提取分離出來。具體做法是將圖像中待識別的字元逐個分離出來並返回存放各個字元的位置信息的鏈表。當把圖像分割完成後,從一定意義上來說便是形成了不同的小圖,每一張小圖就是一個數字,才能對這些小圖進行尺寸大小一致的調整。

3.1.5 細化

3.2 圖像特徵提取

特徵提取是字元識別中的一個重要組成部分,是模式識別的核心之一。經過預處理後,根據識別方法的要求抽取圖像特徵,作為識別的依據。一般而言,選擇的特徵一方面要求能夠足夠代表這個圖像模式,另一方面要求它們的數量盡可能少,這樣能有效地進行分類和較小的計算量。特徵提取的好壞會直接影響其識別的分類效果,進而影響識別率,因此特徵選擇是模式識別的關鍵。但是,目前還沒有一個有效的、一般的抽取、選擇特徵的方法。抽取、選擇特徵的方法都是面對問題的,因此針對不同的識別問題往往有不止一種的抽取、選擇特徵的方法。

② 手寫數字集介紹

手寫數字集介紹

import tensorflow as tf

import matplotlib.pyplot as plt

import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

#MNIST數據集

minist = tf.keras.datasets.mnist

(train_x, train_y), (test_x, test_y) = minist.load_data()

#訓練集和測試集的長度

print("Training set:", len(train_x))

print("Testing set:", len(test_x))

#圖像數據和標記數據的形狀

print("train_x", train_x.shape, train_x.dtype)

print("train_y", train_y.shape, train_y.dtype)

#數據集中的第1個樣本

train_x[0]

#顯示圖片5

plt.axis("off")

plt.imshow(train_x[0], cmap="gray")

plt.title("顯示圖片5")

plt.show()

#輸出圖片5標簽

train_y[0]

#隨機顯示4幅手寫數字圖片

for i in range(4):

    num = np.random.randint(1, 60000)

    plt.subplot(1, 4, i+1)

    plt.axis("off")

    plt.imshow(train_x[num], cmap="gray")

    plt.title(train_y[num])

plt.show()

③ 圖像識別 | 基於Keras的手寫數字識別(含代碼)

前沿

人工智慧的浪潮已經席捲全球,深度學習(Deep Learning)和人工智慧(Artificial Intelligence, AI)等詞彙也不斷地充斥在我們身邊。人工智慧的發展是一個三起兩落的變化,90年代期間,知識推理>神經網路>機器學習;2005年左右,機器學習>知識(語義網)>神經網路;而從2017年之後,基於深度學習的神經網路>知識(知識圖譜)>機器學習。

卷積神經網路(convolutional neural network, CNN)作為深度學習中的代表,最早的靈感是來源於1961年Hubel和Wiesel兩位神經生物學家,在對貓視覺皮層細胞的實驗中,發現大腦可視皮層是分層的(CNN中的分層網路結構與其如出一轍)。深度學習作為機器學習(ML)的一個子領域,由於計算機能力的提高和大量數據的可用性,得到了戲劇性的復甦。但是,深度學習是否能等同或代表人工智慧,這一點筆者認為有待商榷,深度學習可以認為是目前人工智慧發展階段的重要技術。由於本文主要撰寫關於深度學習的入門實戰,關於細節概念不做深入研究,下面筆者從實際案例,介紹深度學習處理圖像的大致流程。

目錄:

以手寫識別數字為例,作為深度學習的入門項目,本文以Keras深度學習庫為基礎。其中使用的tensorflow等模塊需要提前配置好,同時注意模型,圖片保存、載入的文件路徑問題。在自己的計算機上運行時,需要創建或修改。下面的流程包括:使用Keras載入MNIST數據集,構建Lenet訓練網路模型,使用Keras進行模型的保存、載入,使用Keras實現對手寫數字數據集的訓練和預測,最後畫出誤差迭代圖。

手寫數字數據集介紹:

手寫數字識別幾乎是深度學習的入門數據集了。在keras中內置了MNIST數據集,其中測試集包含60000條數據,驗證集包含10000條數據,為單通道的灰度圖片,每張圖片的像素大小為28 28.一共包含10個類別,為數字0到9。

導入相關模塊:

載入MNIST數據集

Keras可實現多種神經網路模型,並可以載入多種數據集來評價模型的效果,下面我們使用代碼自動載入MNIST數據集。

顯示MNIST訓練數據集中的前面6張圖片:

數據的預處理

首先,將數據轉換為4維向量[samples][width][height][pixels],以便於後面模型的輸入

為了使模型訓練效果更好,通常需要對圖像進行歸一化處理

最後,原始MNIST數據集的數據標簽是0-9,通常要將其表示成one-hot向量。如訓練數據標簽為1,則將其轉化為向量[0,1,0,0,0,0,0,0,0,0]

模型的建立與計算

訓練模型的參數設置:

本文使用Lenet網路架構,下面定義Lenet網路結構,若要更改網路結構,如用VGGNet,GoogleNet,Inception,ResNets或自己構建不同的網路結構,可以直接在這一塊函數內進行修改。

再附上兩個經典的模型:

VGG16:

GoogleNet:

設置優化方法,loss函數,並編譯模型:

本文使用生成器以節約內存:

結果分析

作出訓練階段的損失、精確度迭代圖,本文將epoch設置為10,已達到0.98的准確率(代碼、圖像如下所示)。

公眾號:帕帕 科技 喵

歡迎關注與討論~

④ 目前常用的手寫字體(數字,字母,漢字)數據集有哪些

1 cifar10資料庫

60000張32*32 彩色圖片 共10類

50000張訓練

10000張測試

下載cifar10資料庫

這是binary格式的,所以我們要把它轉換成leveldb格式。

2 在../caffe-windows/examples/cifar10文件夾中有一個 convert_cifar_data.cpp

將他include到MainCaller.cpp中。如下:

編譯....我是一次就通過了 ,在bin文件夾里出現convert_cifar_data.exe。然後 就可以進行格式轉換。binary→leveldb

可以在bin文件夾下新建一個input文件夾。將cifar10.binary文件放在input文件夾中,這樣轉換時就不用寫路徑了。

cmd進入bin文件夾

執行後,在output文件夾下有cifar_train_leveldb和cifar_test_leveldb兩個文件夾。裡面是轉化好的leveldb格式數據。

當然,也可以寫一個bat文件處理,方便以後再次使用。

3 下面我們要求數據圖像的均值

編譯../../tools/comput_image_mean.cpp

編譯成功後。接下來求mean

cmd進入bin。

執行後,在bin文件夾下出現一個mean.binaryproto文件,這就是所需的均值文件。

4 訓練cifar網路

在.../examples/cifar10文件夾里已經有網路的配置文件,我們只需要將cifar_train_leveldb和cifar_test_leveldb兩個文件夾還有mean.binaryproto文件拷到cifar0文件夾下。

修改cifar10_quick_train.prototxt中的source: "cifar-train-leveldb" mean_file: "mean.binaryproto" 和cifar10_quick_test.prototxt中的source: "cifar-test-leveldb"
mean_file: "mean.binaryproto"就可以了,

後面再訓練就類似於MNIST的訓練。寫一個train_quick.bat,內容如下:

[plain] view plain
..\\..\\bin\\MainCaller.exe ..\\..\\bin\\train_net.exe
SET GLOG_logtostderr=1
"../../bin/train_net.exe" cifar10_quick_solver.prototxt
pause