基于FPGA的數(shù)字識別的實(shí)現(xiàn)
掃描二維碼
隨時隨地手機(jī)看文章
基于FPGA的數(shù)字識別的實(shí)現(xiàn)
01
背景知識
現(xiàn)如今隨著機(jī)器識別技術(shù)的日益成熟,在我們的日常生活中機(jī)器識別也隨處可見。大家常見的有二維碼識別,指紋識別,車牌識別等,這些技術(shù)已經(jīng)相當(dāng)成熟。還有現(xiàn)如今比較火的無人駕駛系統(tǒng)。無人駕駛系統(tǒng)中存在很多機(jī)器識別技術(shù),包括對人或移動物體的識別,路標(biāo)識別,以及距離估算等。而各種識別系統(tǒng)中,對數(shù)字的識別是必不可少的。數(shù)字在我們?nèi)祟愂澜鐭o處不在。
目前實(shí)現(xiàn)數(shù)字識別的方法大致分為以下4種:
1)使用軟件編程在傳統(tǒng)個人PC 上進(jìn)行實(shí)現(xiàn);
2)使用通用的 MCU 微型處理器(例如 51 單片機(jī)、 ARM 等)上進(jìn)行實(shí)現(xiàn);
3)使用通用 DSP 作為系統(tǒng)處理器進(jìn)行實(shí)現(xiàn);
4)使用專用 DSP 作為運(yùn)算核心;
除以上四種方法以外, FPGA 以其獨(dú)有的硬件可并行運(yùn)行的優(yōu)勢,打破了傳統(tǒng)處理器順序執(zhí)行的模式,可在一個時鐘周期內(nèi)并行完成多個運(yùn)算,相比于 DSP 在處理速度與處理能力上有了大幅的提高, 在具有成本低、集成化程度高、便于后期維護(hù)、 升級等優(yōu)勢的同時使系統(tǒng)的運(yùn)行速度能夠滿足圖像實(shí)時處理的需求,所以本設(shè)計(jì)決定采用 FPGA 作為硬件平臺,設(shè)計(jì)與實(shí)現(xiàn)一種基于FPGA 的數(shù)字識別系統(tǒng)。
02
基于FPGA的數(shù)字識別的方法
通常,針對印刷體數(shù)字識別使用的算法有:基于模版匹配的識別方法、基于BP 神經(jīng)網(wǎng)絡(luò)的識別方法、基于數(shù)字特征的識別方法等。下文將對這幾種算法進(jìn)行討論以及比較。
1>模版匹配法
模版匹配法是一種被較早應(yīng)用的數(shù)字識別算法,該算法的關(guān)鍵是對所要識別
的所有數(shù)字進(jìn)行模版構(gòu)建,之后將圖像中的數(shù)字與所有的數(shù)字模版一一進(jìn)行比較,
計(jì)算出圖像中數(shù)字與每個模版的相似度,根據(jù)所計(jì)算出的相似度結(jié)果進(jìn)行識別。
其中相似度最高的模版即為我們所要識別的結(jié)果。模版匹配法的對數(shù)字的大小、
結(jié)構(gòu)形狀的規(guī)范化程度要求很高,數(shù)字的規(guī)范化程度對識別的準(zhǔn)確率有著直接的
影響。該算法原理較為簡單,但計(jì)算復(fù)雜度過大,同時不利于 FPGA 的實(shí)現(xiàn)。
2>神經(jīng)網(wǎng)絡(luò)識別算法
神經(jīng)網(wǎng)絡(luò)識別的方法是模仿動物神經(jīng)網(wǎng)絡(luò)的特征,對信息進(jìn)行分布式并行處
理的一種算法。神經(jīng)網(wǎng)絡(luò)識別算法具有一定的抗干擾能力,但為了保證識別的準(zhǔn)
確率,該算法需要負(fù)責(zé)并且大量的計(jì)算,來對神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,而過于復(fù)雜的
計(jì)算不利于 FPGA 對該算法的實(shí)現(xiàn)。
3>數(shù)字特征識別算法
基于數(shù)字特征的識別算法其核心是通過對數(shù)字的形狀以及結(jié)構(gòu)等幾何特征
進(jìn)行分析與統(tǒng)計(jì),通過對數(shù)字特征的識別從而達(dá)到對圖像中數(shù)字的識別。
03
基于數(shù)字特征算法實(shí)現(xiàn)數(shù)字識別
我們采用基于數(shù)字特征的算法進(jìn)行數(shù)字的識別,通過圖像采集模塊采集到圖像,進(jìn)行灰度化,二值化,然后進(jìn)行數(shù)字特征的提取和統(tǒng)計(jì)來完成對數(shù)字的識別,最終顯示到數(shù)碼管上,完成圖像信息到數(shù)字信息的轉(zhuǎn)化。
圖1 0-6 數(shù)字特征標(biāo)線
圖2 7-8 數(shù)字特征標(biāo)線
圖3 5數(shù)字特征
數(shù)字特征信息的提取基于打印體,如上圖1,圖2,圖3所示,以圖3數(shù)字5舉例,紅框是數(shù)字5的水平和豎直的上下左右邊界。X1在豎直方向的2/5處的水平線,x2在豎直方向的2/3處的水平線,y在水平方的1/2處的水直線。我們以此特征來統(tǒng)計(jì)x1,x2,y與數(shù)字5的交叉點(diǎn)。
以交叉統(tǒng)計(jì)法來區(qū)分0-9數(shù)字的特征如下表1:
表1 0-9數(shù)字特征統(tǒng)計(jì)表
數(shù)字 |
與y交叉點(diǎn)個數(shù) |
與x1交叉點(diǎn)個數(shù) |
與x2交叉點(diǎn)個數(shù) |
分類 |
0 |
2 |
2 |
2 |
A |
1 |
1 |
1 |
1 |
B |
2 |
3 |
1 |
1 |
C |
3 |
3 |
1 |
1 |
C |
4 |
2 |
2 |
1 |
D |
5 |
3 |
1 |
1 |
C |
6 |
3 |
1 |
2 |
E |
7 |
2 |
1 |
1 |
F |
8 |
3 |
2 |
2 |
G |
9 |
3 |
2 |
1 |
H |
由于2,3,5的數(shù)字特征統(tǒng)計(jì)表一樣,無法區(qū)分所以我們繼續(xù)增加數(shù)字特征以區(qū)分2,3,5。如表2:
表2 2,3,5 數(shù)字特征統(tǒng)計(jì)
數(shù)字 |
與x1的交叉點(diǎn)位置(左,右) |
與x2的交叉點(diǎn)位置(左,右) |
分類 |
2 |
右 |
左 |
I(C) |
3 |
右 |
右 |
J(C) |
5 |
左 |
右 |
K(C) |
這樣通過數(shù)字統(tǒng)計(jì)完全區(qū)分開數(shù)字0-9。然后利用FPGA系統(tǒng)搭建實(shí)時數(shù)字識別系統(tǒng)。
04
基于FPGA的數(shù)字識別的實(shí)現(xiàn)
圖4 基于ov5640的FPGA實(shí)時數(shù)字識別系統(tǒng)
如圖4所示,我們圖像采集使用 ov5640 500W像素?cái)z像頭,采集到的彩色RGB圖像首先存入SDRAM中,然后由TFT顯示控制端讀出圖像數(shù)據(jù),讀出RGB圖像數(shù)據(jù)后,我們首先進(jìn)行RGB轉(zhuǎn)Ycbcr算法操作,然后對灰度圖像進(jìn)行閾值分割,形成二值圖像。對二值數(shù)字圖像進(jìn)行數(shù)字識別,最終顯示在數(shù)碼管上。
FPGA部分源碼
//------------------------------------------------------------------------
// VGA display
//--------------------------------------------------------------------------
always @(posedge TFT_VCLK or negedge rst_n) begin
if(!rst_n)
TFT_RGB <= 16'b0;
else if(hcount == 400 || vcount == 192 || vcount == 320)
TFT_RGB <= 16'hff00;
else
TFT_RGB <={o_y_8b[7:3],o_y_8b[7:2],o_y_8b[7:3]};
end
//-------------------------------------------------------------
//digital tube display
//-------------------------------------------------------------
always @(posedge TFT_VCLK or negedge rst_n) begin
if(!rst_n)
disp_data <= 32'h0;
else if((!TFT_VS_r0) && TFT_VS_r1)
case({x1_l,x1_r,x2_l,x2_r,y,x1,x2})
16'b1111_0010_0010_0010: disp_data <= {28'b0,4'h0}; //0
16'b1010_0001_0001_0001: disp_data <= {28'b0,4'h1}; //1
16'b0110_0011_0001_0001: disp_data <= {28'b0,4'h2}; //2
16'b0101_0011_0001_0001: disp_data <= {28'b0,4'h3}; //3
16'b1110_0010_0010_0001: disp_data <= {28'b0,4'h4}; //4
16'b1001_0011_0001_0001: disp_data <= {28'b0,4'h5}; //5
16'b1011_0011_0001_0010: disp_data <= {28'b0,4'h6}; //6
16'b0110_0010_0001_0001: disp_data <= {28'b0,4'h7}; //7
16'b1111_0011_0010_0010: disp_data <= {28'b0,4'h8}; //8
16'b1101_0011_0010_0001: disp_data <= {28'b0,4'h9}; //9
default: disp_data <= 32'b0;
endcase
else
disp_data <= disp_data;
End
結(jié)果展示
圖5 實(shí)驗(yàn)原圖
圖6 數(shù)字5識別
圖7 數(shù)字6 識別
圖8 數(shù)字7 識別
結(jié)果分析
本實(shí)驗(yàn)完成了對0-9數(shù)字的單個數(shù)字識別,對于多個數(shù)字的識別,我們要進(jìn)行模塊分割,然后在每個模塊里邊再識別數(shù)字。我們可以加上語音系統(tǒng)來播報(bào)我們識別出來的數(shù)字,已到達(dá)更加人性化的更加實(shí)用的開發(fā)。