目錄
前言
課題背景和意義
實現(xiàn)技術(shù)思路
一、基本原理
二、基于深度學(xué)習(xí)的圖像文字識別技術(shù)
三、總結(jié)
實現(xiàn)效果圖樣例
最后
前言
? ? ??大四是整個大學(xué)期間最忙碌的時光,一邊要忙著備考或?qū)嵙?xí)為畢業(yè)后面臨的就業(yè)升學(xué)做準(zhǔn)備,一邊要為畢業(yè)設(shè)計耗費大量精力。近幾年各個學(xué)校要求的畢設(shè)項目越來越難,有不少課題是研究生級別難度的,對本科同學(xué)來說是充滿挑戰(zhàn)。為幫助大家順利通過和節(jié)省時間與精力投入到更重要的就業(yè)和考試中去,學(xué)長分享優(yōu)質(zhì)的選題經(jīng)驗和畢設(shè)項目與技術(shù)思路。
??對畢設(shè)有任何疑問都可以問學(xué)長哦!
選題指導(dǎo):?https://blog.csdn.net/qq_37340229/article/details/128243277
大家好,這里是海浪學(xué)長畢設(shè)專題,本次分享的課題是
??畢業(yè)設(shè)計-基于深度學(xué)習(xí)的圖像文字識別系統(tǒng)
課題背景和意義
隨著信息化水平的不斷提升,以圖像為主的多媒體信 息迅速成為重要的信息傳遞媒介,圖像中的文字?jǐn)?shù)據(jù)包含 豐富的高層語義信息與分析價值。光學(xué)字符識別(Optical Character Recognition,OCR)指利用電子設(shè)備(例如掃描儀 或數(shù)碼相機)檢查紙上打印的字符,通過檢測暗、亮模式確 定其形狀,然后用字符識別方法將形狀翻譯成計算機文字 的過程。它是一種針對印刷體字符,采用光學(xué)方式將紙質(zhì) 文檔中的文字轉(zhuǎn)換為黑白點陣的圖像文件,并通過識別軟 件將圖像中的文字轉(zhuǎn)換成文本格式,供文字處理軟件進一 步編輯加工的技術(shù),通過該技術(shù)可將使用攝像機、掃描儀 等光學(xué)輸入儀器得到的報刊、書籍、文稿、表格等印刷品圖 像信息轉(zhuǎn)化為可供計算機識別和處理的文本信息。目 前,OCR 技術(shù)廣泛應(yīng)用于多個領(lǐng)域,比如文檔識別、車牌識 別、名片識別、票據(jù)識別、身份證識別和駕駛證識別等。如何除錯或利用輔助信息提高識別準(zhǔn)確率和效率,已成為 OCR 技術(shù)研究熱門課題。
實現(xiàn)技術(shù)思路
一、基本原理
OCR 文字識別技術(shù)
通常 OCR 文字識別過程可分為圖像輸入、圖像預(yù)處 理、對比識別、后期糾正和結(jié)果輸出等步驟。據(jù)此可將整 個 OCR 識別流程劃分為 5 個部分,圖為 OCR 文字識別 系統(tǒng)工作流程。
?文字識別常用方法有模板匹配法和幾何特征抽取法。
(1)模板匹配法。將輸入的文字與給定的各類別標(biāo)準(zhǔn) 文字(模板)進行相關(guān)匹配,計算輸入文字與各模板的相似 程度,取相似度最大的類別作為識別結(jié)果。該方法適用于 識別固定字型的印刷體文字,優(yōu)點是用整個文字進行相似 度計算,對文字缺損、邊緣噪聲等具有較強的適應(yīng)能力;缺 點是當(dāng)被識別類別數(shù)增加時,標(biāo)準(zhǔn)文字模板的數(shù)量也隨之 增加,增加機器存儲容量會降低識別正確率。
(2)幾何特征抽取法。抽取文字的一些幾何特征,如 文字端點、分叉點、凹凸部分及水平、垂直、傾斜等各方向 的線段、閉合環(huán)路等,根據(jù)這些特征的位置和相互關(guān)系進 行邏輯組合判斷,獲得識別結(jié)果。該識別方式由于利用結(jié) 構(gòu)信息,也適用于變形較大的手寫體文字。不足之處在于 當(dāng)出現(xiàn)文字粘連扭曲、有噪聲干擾時,識別效果不佳。
基于深度學(xué)習(xí)的 LeNet-5 網(wǎng)絡(luò)
深度學(xué)習(xí)(Deep Learning)是多層神經(jīng)網(wǎng)絡(luò)運用各種機 器學(xué)習(xí)算法解決圖像、文本等各種問題的算法集合。深度 學(xué)習(xí)的核心是特征學(xué)習(xí),它通過組合低層特征形成更加抽 象的高層表示屬性類別或特征,從分層網(wǎng)絡(luò)中獲取分層次 的特征信息,以發(fā)現(xiàn)數(shù)據(jù)分布式特征表示,從而解決以往 需要人工設(shè)計特征的難題。 利用深度學(xué)習(xí)進行文字識別,采用的神經(jīng)網(wǎng)絡(luò)是卷積 神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN),具體選擇 使用哪一個經(jīng)典網(wǎng)絡(luò)需綜合考慮,越深的網(wǎng)絡(luò)訓(xùn)練得到的 模型越好,但是相應(yīng)訓(xùn)練難度會增加,此后線上部署時預(yù) 測的識別速度也會很慢,所以本文使用經(jīng)簡化改進后的 LeNet-5(-5 表示具有 5 個層)網(wǎng)絡(luò),如圖所示。
它與原 始 LeNet 稍有不同,比如把激活函數(shù)改為目前常用的 ReLu 函數(shù);與現(xiàn)有 conv->pool->ReLu 不同的是其使用的方式是 conv1->pool->conv2->pool2,再接全連接層,但是不變的是 卷積層后仍然緊接池化層。
二、基于深度學(xué)習(xí)的圖像文字識別技術(shù)
方法步驟
本文在開源的 TensorFlow 框架開發(fā)環(huán)境下,搭建深度 學(xué)習(xí)神經(jīng)網(wǎng)絡(luò) LeNet-5 和計算圖,將樣本文件添加到訓(xùn)練 隊列中喂給網(wǎng)絡(luò)訓(xùn)練,完成充足的訓(xùn)練量后,對模型進行 識別準(zhǔn)確率評估,并最終將訓(xùn)練得到的識別模型應(yīng)用于實 際場景中的圖像文字識別實驗檢測,流程如圖所示。
1、網(wǎng)絡(luò)搭建
深度學(xué)習(xí)訓(xùn)練的第一步是搭建網(wǎng)絡(luò)和計算圖。文字 識別實質(zhì)上是一個多分類任務(wù),識別 1 000 個不同的文字, 相當(dāng)于 1 000 個類別的分類任務(wù)。在搭建的網(wǎng)絡(luò)中加入 batch normalization。 另 外 損 失 函 數(shù) 選 擇 sparse_soft? max_cross_entropy_with_logits,優(yōu)化器選擇 Adam,學(xué)習(xí)率設(shè) 為 0.1,實現(xiàn)代碼如下:
#network: conv2d->max_pool2d->conv2d->max_pool2d->
conv2d->max_pool2d->conv2d->conv2d->max_pool2d->ful?
ly_connected->fully_connected
#給 slim.conv2d 和 slim.fully_connected 準(zhǔn) 備 了 默 認(rèn) 參 數(shù) :
batch_norm
with slim.arg_scope([slim.conv2d,slim.fully_connected],
normalizer_fn=slim.batch_norm,
normalizer_params={'is_training':is_training}):
conv3_1 = slim.conv2d(images,64,[3,3],1,padding=
'SAME',scope='conv3_1')
max_pool_1 = slim.max_pool2d(conv3_1,[2,2],[2,2],
padding='SAME',scope='pool1')
conv3_2 = slim.conv2d(max_pool_1,128,[3,3],padding=
'SAME',scope='conv3_2')
max_pool_2 = slim.max_pool2d(conv3_2,[2,2],[2,2],
padding='SAME',scope='pool2')
conv3_3 = slim.conv2d(max_pool_2,256,[3,3],padding=
'SAME',scope='conv3_3')
max_pool_3 = slim.max_pool2d(conv3_3,[2,2],[2,2],
padding='SAME',scope='pool3')
conv3_4 = slim.conv2d(max_pool_3,512,[3,3],padding=
'SAME',scope='conv3_4')
conv3_5 = slim.conv2d(conv3_4,512,[3,3],padding=
'SAME',scope=‘conv3_5’)
max_pool_4 = slim.max_pool2d(conv3_5,[2,2],[2,2],
padding='SAME',scope='pool4')
flatten = slim.flatten(max_pool_4)
fc1 = slim.fully_connected(slim.dropout(flatten,keep_prob),
1024,
activation_fn=tf.nn.relu,scope='fc1')
logits = slim.fully_connected(slim.dropout(fc1,keep_prob),
FLAGS.charset_size,activation_fn=None,scope='fc2')
# 因為沒有做熱編碼,所以使用 sparse_softmax_cross_entro?
py_with_logits
loss = tf.reduce_mean (tf.nn.sparse_softmax_cross_entro?
py_with_logits(logits=logits,labels=labels))
accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(logits,
1),labels),tf.float32))
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
if update_ops:
updates = tf.group(*update_ops)
loss = control_flow_ops.with_dependencies([updates],loss)
global_step = tf.get_variable("step",[],initializer=tf.con?
stant_initializer(0.0),trainable=False)
optimizer = tf.train.AdamOptimizer(learning_rate=0.1)
train_op = slim.learning.create_train_op(loss,optimizer,glob?
al_step=global_step)
probabilities = tf.nn.softmax(logits)
2、模型訓(xùn)練
訓(xùn)練之前需先設(shè)計好數(shù)據(jù),為高效地進行網(wǎng)絡(luò)訓(xùn)練作 好鋪墊。主要步驟如下:
(1)創(chuàng)建數(shù)據(jù)流圖。該圖由一些流水線階段組成,階 段間用隊列連接在一起。第一階段將生成并讀取文件名, 并將其排到文件名隊列中;第二階段從文件中讀取數(shù)據(jù) (使用 Reader),產(chǎn)生樣本且把樣本放在一個樣本隊列中。
根據(jù)不同的設(shè)置,或者拷貝第二階段的樣本,使其相 互獨立,因此可以從多個文件中并行讀取。在第二階段排 隊操作,即入隊到隊列中去,在下一階段出隊。因為將開 始運行這些入隊操作的線程,所以訓(xùn)練循環(huán)會使樣本隊列 中的樣本不斷出隊,如圖所示。
樣本隊列的入隊操作在主線程中進行,Session 中可以 多個線程一起運行。在數(shù)據(jù)輸入的應(yīng)用場景中,入隊操作 從硬盤中讀取輸入進行,再放到內(nèi)存中,速度較慢。使用 QueueRunner 可以創(chuàng)建一系列新的線程進行入隊操作,讓 主線程繼續(xù)使用數(shù)據(jù)。如果在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的場景中,則 訓(xùn)練網(wǎng)絡(luò)和讀取數(shù)據(jù)異步,主線程在訓(xùn)練網(wǎng)絡(luò)時,另一個 線程再將數(shù)據(jù)從硬盤讀入內(nèi)存。
訓(xùn)練時數(shù)據(jù)讀取模式如上所述,則訓(xùn)練代碼設(shè)計為:
with tf.Session (config=tf.ConfigProto (gpu_options=gpu_op?
tions,allow_soft_placement=True))as sess:
# batch data 獲取
train_images, train_labels = train_feeder.input_pipeline
(batch_size=FLAGS.batch_size,aug=True)
test_images, test_labels = test_feeder.input_pipeline
(batch_size=FLAGS.batch_size)
graph = build_graph(top_k=1) # 訓(xùn)練時 top k = 1
saver = tf.train.Saver()
sess.run(tf.global_variables_initializer())
# 設(shè)置多線程協(xié)調(diào)器
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess,coord=co?
ord)
train_writer = tf.summary.FileWriter(FLAGS.log_dir + '/train',
sess.graph)
test_writer = tf.summary.FileWriter(FLAGS.log_dir + '/val')
start_step = 0
(2)指令執(zhí)行。設(shè)置最大迭代步數(shù)為 16 002,每 100 步進行一次驗證,每 500 步存儲一次模型。 訓(xùn)練過程的損失函數(shù) loss 和精度函數(shù) accuracy 變換 曲線如圖所示。
損失(loss)和精度(accuracy)是用于衡量模型預(yù)測偏 離其訓(xùn)練對象期望值的衡量指標(biāo),從圖可以看出 loss 和 accuracy 最大值分別穩(wěn)定在 0.05、0.9 左右,說明模 型訓(xùn)練順利完成,已具備替代訓(xùn)練對象進行文字識別工作 的能力。
(3)模型性能評估。在對模型進行訓(xùn)練調(diào)試之后,再 對模型性能進行評估,計算模型 top 1(識別結(jié)果的第一個 是正確的概率)和 top 5(識別結(jié)果的前 5 個中有正確結(jié)果 的概率)的準(zhǔn)確率,使模型應(yīng)用效果達到最佳。計算模型 top 1 和 top 5 準(zhǔn)確率的代碼為:
i = 0
acc_top_1,acc_top_k = 0.0,0.0
while not coord.should_stop():
i += 1
start_time = time.time()
test_images_batch,test_labels_batch = sess.run([test_imag?
es,test_labels])
feed_dict ={graph[‘images’]:test_images_batch,
graph[‘labels’]:test_labels_batch,
graph[‘keep_prob’]:1.0,
graph[‘is_training’]:False}
batch_labels,probs,indices,acc_1,acc_k = sess.run([graph
[‘labels’],
graph[‘predicted_val_top_k’],
graph[‘predicted_index_top_k’],
graph[‘a(chǎn)ccuracy’],
graph[‘a(chǎn)ccuracy_top_k’]],
feed_dict=feed_dict)
final_predict_val += probs.tolist()
final_predict_index += indices.tolist()
groundtruth += batch_labels.tolist()
acc_top_1 += acc_1
acc_top_k += acc_k
end_time = time.time()
logger.info(“the batch{0}takes{1}seconds,accuracy ={2}
(top_1){3}(top_k)”
.format(i,end_time - start_time,acc_1,acc_k))
?從圖中可以看出,識別模型 top 1 和 top 5 分別達到了 99.8%、99.9%,識別準(zhǔn)確率很高。
實驗結(jié)果
從某文檔中截取出一段文字以圖片格式保存,再使用 文字切割算法把文字段落切割為單字,如圖所示。
?文字段落切割為單字:
對文字段落進行識別,由于使用的是 GPU,識別速度 非???,除去系統(tǒng)初始化時間,全部圖像識別時耗不超過 1s。其中輸出的信息分別是:當(dāng)前識別的圖片路徑、模型預(yù) 測出的 top 3 漢字(置信度由高到低排列)、對應(yīng)的漢字 ID、 對應(yīng)概率。在識別完成之后,將所有識別文字按順序組合 成原始段落排列,如圖所示。
?文字段落識別結(jié)果 2:
?
從圖中可以看出單字的識別非常準(zhǔn)確,在最后顯示的 文字段落識別結(jié)果中可以看到僅個別文字識別出現(xiàn)偏差, 整體識別效果佳,說明該模型的識別能力可滿足一般實際 場景印刷體文字識別要求。
三、總結(jié)
經(jīng)過測試,基于深度學(xué)習(xí)的圖像文字識別模型在模型 評估上 top 1 的正確率達到了 99.8%。與傳統(tǒng) OCR 相比, 基于深度學(xué)習(xí)的 OCR 技術(shù)在識別準(zhǔn)確率方面有大幅上 升。在一些比較理想的環(huán)境下,文字識別效果較好,但是 處理復(fù)雜場景或一些干擾比較大的文字圖像時,識別效果 有待提高,后續(xù)將對模型作進一步優(yōu)化。 隨著 OCR 技術(shù)的迅猛發(fā)展,文本檢測和識別技術(shù)將拓 展更多語言支持。從圖像中提取文字對于圖像高層次語 義理解、索引和檢索意義重大。結(jié)合深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò) 和 NPL 語義分析提升 OCR 識別糾錯能力,幫助個體提升效率、創(chuàng)造價值,是未來重要發(fā)展趨勢。
實現(xiàn)效果圖樣例
圖像文字識別系統(tǒng):
我是海浪學(xué)長,創(chuàng)作不易,歡迎點贊、關(guān)注、收藏、留言。文章來源:http://www.zghlxwxcb.cn/news/detail-451992.html
畢設(shè)幫助,疑難解答,歡迎打擾!文章來源地址http://www.zghlxwxcb.cn/news/detail-451992.html
最后
到了這里,關(guān)于畢業(yè)設(shè)計-基于深度學(xué)習(xí)的圖像文字識別系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!