日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 目标检测 >内容正文

目标检测

PyTorch实现 | 车牌OCR识别,《PyTorch深度学习之目标检测》

發布時間:2023/12/29 目标检测 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch实现 | 车牌OCR识别,《PyTorch深度学习之目标检测》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注:本文選自中國水利水電出版社出版《PyTorch深度學習之目標檢測》一書,有改動

福利!免費寄送圖書!!

公眾號【機器學習與AI生成創作】后臺回復168。即可參與免費寄送圖書活動,活動截止日期為 2023-02-26 晚上10點?。

公眾號后臺回復:168(建議選中復制)

也可自行購買:

01 OCR原理分析

??? ??本文中采用的車輛號牌識別部分的是采用CNN+LSTM+CTC組合而成,整個網絡部分可以分為三個部分,首先是主干網絡CNN用于提取字符的特征信息,其次采用深層雙向LSTM網絡在卷積特征的基礎上提取文字或字符的序列特征,最終引入CTC結構解決訓練時字符無法對齊的問題。詳細組合結構如圖1所示。

圖1???OCR算法結構圖

? ? ? (1)主干網絡CNN提取特征。由于該網絡只是通過卷積的形式來提取號牌的整個特征信息來做號牌上字符的識別,因此,該算法的輸入是整個號牌圖像。

? ? ? (2)LSTM提取序列信息。LSTM作為長短時記憶網絡是一種特殊的RNN結構,使用該結構能夠避免長期依賴的問題。與循環卷積神經網絡(RNN)不同的RNN能保存不同時刻的狀態,而LSTM的獨特網絡結構能夠保存四個不同狀態的特征,LSTM網絡結構單元主要由遺忘門、輸入門和輸出門三種組合而成,單元結構圖如下圖2所示。

圖2? ? LSTM網絡單元

? ? ?遺忘門主要是決定從網絡中丟棄和保留其中的部分特征,實現過程是通過讀取網絡輸入參數Xt和上一層的輸出狀態ht-1,并將其通過Sigmoid函數歸一化到0-1范圍區間中,0表示丟棄的特征,1表示需要保留的特征。遺忘門實現公式如式1所示:

? ? ???輸入門與遺忘門的結構不同,該部分分為兩部分結構,一部分與遺忘門類似,另外一部分則是在遺忘門的基礎上通過tanh函數將特征映射至-1和1之間,其中-1表示不同更新的部分,1表示需要更新的特征部分,如式2和3所示:

? ? ??輸出門中的sigmoid函數決定哪部分的函數是需要進行輸出的,輸出部分的特征通過tanh函數,并將其與sigmoid函數的輸出進行乘積,最終決定輸出部分的特征。實現部分公式如式4和5所示:

? ???(3)CTC結構。CTC結構是解決語音識別中自動對齊的一種方案,CTC網絡結構在字符識別上的應用解決了人為切割字符帶來的問題,從而提高整個算法的準確率。

02 車牌號數據集制作

本章中該部分采用的數據集,是在第一部分數據集的基礎上截取圖片中的號牌得到,在配有Python環境的機器上編寫Python腳本讀取數據集,從已經標注的xml文件解析出號牌所在圖片的位置。為了保證切割圖片的完整性,同樣采取擴大像素值的辦法,xml文件中保存的號牌位置,其中左上角位置坐標點分別減少5個像素,右下角位置坐標點分別增加5個像素。與目標檢測不同,識別號牌上的文本除了數據圖片之外,還需要將圖片名稱根據號牌上的文本進行修改。如圖3為處理后的可訓練號牌數據集。

圖3? 號牌數據集

? ????初步處理后的數據只是得到具體號牌的圖片,尚未對圖片進行標注處理,因此并不能直接作為數據集來訓練OCR算法,該部分主要實現號牌上文本的識別,本章3.2小節中已經通過YOLOv3算法實現全部遮擋號牌、未懸掛號牌和其他類號牌的定位和分類,在目標檢測算法基礎上選擇識別結果中其他類的圖片進行進一步處理,除了與圖片標注的質量有關之外,圖片的數量也直接影響最終的模型是否更好的泛化能力,數據集中的車輛號牌圖片除了包括正常號牌之外,還存在半遮擋的號牌。在進行訓練之前還要對圖片進行處理,實施過程如圖4所示。

圖4? ? 訓練集數據處理流程圖

????? (1)修改圖片名稱為號牌的文本。與目標檢測的標注方式不同,號牌的標注要根據實際圖片中的文本修改為圖片的名稱,并且圖片的后綴保持不變,對數據集標注完成之后還要根據實際項目需要的格式修改數據集,按照使用Python腳本程序將圖片按照6:1的比例分為訓練集和測試集,在項目中新建data目錄,并在data文件夾中分別新建train/text和test/text兩個路徑,其中train/text用來存放處理后的訓練集圖片,train中存放處理的train.pkl二進制文件,test/text中存放測試集圖片,同樣,test中存放測試集的test.pkl二進制文件。

? ? ? ?(2)生成pkl文件。pkl文件是存儲二進制內容的文件格式,訓練過程中網絡從pkl文件中讀取文本信息和對應的圖片進行訓練。分別將訓練集和驗證集中的圖片名稱按照次序依次存入新建的pkl文件中,命名為train.pkl和test.pkl,并把對應的圖片名稱存儲為序號。

03 修改預權重文件

? ????本章中采用在預訓練權重的基礎上進行訓練,使用預訓練權重的好處在于,不僅能夠保證模型快速收斂,減少訓練模型的時間,也能避免從零開始訓練導致訓練過程中出現梯度爆炸和梯度消失的情況發生。預訓練權重是通過Python的第三方模塊Collections中的子類OrderedDict模塊對數據進行存儲,OrderedDict是一種有序字典,能夠按照輸入的順序對元素進行存儲并保證順序不發生變化,也因此OrderedDict的使用能夠保證權重文件中的參數按照訓練網絡結構的層次和順序進行存儲,權重文件的存儲除了在保證權重文件中數據存儲的格式順序之外,還與訓練過程中的設備、存儲方式和網絡結構相關,因此使用預訓練權重需要首先對預訓練權重的結構以及其存儲訓練的方式進行了解。本章中對預訓練權重的修改包括分析權重文件,修改權重文件的維度兩部分,共同實現修改預訓練權重文件的目的。具體的實現方式如圖5所示。

圖5? ?? 修改權重文件實現方式

? ???(1)分析權重結構。預訓練權重的存儲方式根據其訓練方式可以分為CPU訓練、單GPU訓練和多GPU訓練,其中CPU和單GPU的情況下保存的模型結構相同;根據存儲的方式可以分為保存模型的網絡結構和訓練參數到權重文件,只保存訓練參數到權重文件兩種;根據存儲的方式可以分為保存訓練過程中訓練的批次、訓練參數、網絡結構的中間結構的權重文件和只保存最終訓練參數的權重文件兩種方式;根據網絡的結構可以通過Python腳本打印出權重文件的網絡結構,根據需求可以修改權重中需要修改的網絡參數。

? ? ?(2)修改預訓練權重的維度。修改網絡中的參數會導致網絡發生變化,因此,要修改預訓練權重文件來適配當前網絡,解決的方法有兩種:剔除其中不合適的網絡的節點訓練參數;修改不適合訓練的網絡節點,將其節點進行填充。本章采用第二種方式來匹配網絡,使用Python讀取權重中的節點名稱和維度信息,修改權重文件中的第一層的參數維度和最后對應種類數的網絡節點參數為修改后的種類數。保存修改后的權重文件為新的權重文件。

04? 模型參數設置及訓練過程

? ? ? ?OCR識別的訓練過程之前,要根據自己訓練的數據集和硬件配置來設置具體的參數,具體的參數配置如下。

? ? ?(1)加載數據集的位置? 在工程目錄cnn+lstm下,打開trian_crnn.py文件,修改類OCRIter中初始化加載函數中圖片和pkl文件的相對路徑,訓練集圖片路徑為./data/train/text,訓練集標簽pkl文件./data/train,測試集圖片路徑./data/test/text,測試集標簽pkl文件./data/test,同時設置參數train_flag為True,在工程代碼中修改讀取的pkl文件名稱。數據集的代碼如下:

if train_flag:self.data_path = os.path.join(os.getcwd(), "data", "train", "text")self.label_path = os.path.join(os.getcwd(), "data", "train") else:self.data_path = os.path.join(os.getcwd(), "data", "test", "text")self.label_path?=?os.path.join(os.getcwd(),?"data",?"test")

? ? ? ?生成pkl文件的代碼如下:

def _label_path_from_index(self):label_file = os.path.join(self.label_path, "train_pkl")assert os.path.exists(label_file, "path dose not exits:{}".format(label_file))gt_file = open(label_file, "rb")label_file = cPickle.load(gt_file)gt_file.close()return?label_file

? ? ??注意:在Python代碼中以下滑線開始的Python函數表示的是私有函數,其中以單前導下劃線_開頭的方法或變量,僅允許類內部和子類進行訪問,類的實例無法訪問此屬性和方法。和單前導下劃線類似的是雙前導下劃線__,以此為開頭的變量和方法,僅允許類內部進行訪問,類實例和派生類均不能進行訪問此屬性和方法。

? ???(1)修改識別的標簽的個數。識別的字符中包含數字、字母和漢字,OCR識別原理上相當于多分類算法,因此,類別上設置包含數字0-1,包含漢字甲-亥和地域簡稱京、津、晉、冀、蒙、遼、吉、黑、滬、蘇、浙、皖、閩、魯、豫、鄂、湘、粵、桂、瓊、川、貴、云、藏、陜、甘、青、寧、渝、贛、新、臺、港、澳。具體的修改參數如圖6所示。

圖6? ?數據集代碼配置

? ??(2)修改num_epoch=6000,BATCH_SIZE=64,配置使用GPU-0訓練,contexts = [mx.context.gpu(0)],默認生成并保存權重的路徑為工程項目中的model文件夾。

05? ?閾值分析

? ? ? ?實際應用中,污損遮擋號牌的識別不僅和算法的識別率有關,更與所采集的車輛圖像質量和實際車牌質量息息相關,車牌質量的好壞直接影響最終的識別性能,例如車牌會受到主觀因素上的車輛套牌、車牌遮擋、多車牌等影響,也會受到客觀因素上的生銹、字體脫落掉漆、號牌傾斜等影響。除此之外,也會在拍攝過程中受到天氣等各種因素影響,這些因素的不同也在不同程度上影響了最終的識別效果。

? ? ?OCR識別算法是通過識別號牌上的文本來實現正常號牌和半遮擋號牌的分類,因此,OCR算法對每個識別到的字符都會產生一個置信度,且各字符之間相互獨立,為了能描述整個識別號牌的置信度,采用識別出各字符的置信度相乘的方式作為號牌的置信度,confi表示第i個字符的置信度,conf表示號牌的整體置信度,實現的公式如式6所示:

? ? ? 從公式中可以看出,識別到的字符中任何一個字符存在過低置信度的字符會直接導致整個號牌的置信度降低,因此,可以選擇直接根據整個號牌的置信度設置閾值進行過濾,從而可以達到區分正常號牌和半遮擋號牌的目的,詳細的實現過程如圖7所示。

圖7?? 閾值分析流程圖

? ? ? (1)準備數據。各準備清晰號牌和模糊或半遮擋的號牌一百張,其中號牌的種類還應該包括各種不同顏色、不同種類的號牌數據。其中正常號牌命名為正常號牌+序號的方式,序號從1-100,半遮擋號牌命名方式為半遮擋號牌+序號,序號同樣為1-100,處理后的數據放置文件夾dataset下。

? ? ? (2)編寫代碼。處理后的數據通過程序計算不同閾值情況下的準確率,并保存每次修改閾值后計算得出的準確率,最后生成折線圖。實現過程中判斷號牌的置信度是否大于設置的閾值,高于閾值的號牌并被判斷其命名為正常號牌的作為正常號牌,低于閾值并被判斷命名方式中含有半遮擋號牌的同樣作為正確識別,在這兩個條件下計算號牌的準確率。

? ? ? (3)選擇閾值。經過公式3-6可以得出整個號牌的置信度,因此使用號牌的置信度增加過濾的閾值可以達到分類的效果。編寫腳本統計在不同閾值情況下驗證數據集的準確率,低于設定閾值的號牌作為半遮擋號牌,否則為正常號牌,設定初始值為0.5并以0.02的速度遞增,從而測試出在最高準確率的情況下最合適的閾值,從圖中可見,閾值大致隨準確率呈正比狀態,閾值為0.95左右時趨向平穩,達到96%的準確率,因此,選取合適的閾值為0.95,實驗部分的漲幅圖如圖8所示。

圖8? ??閾值圖

06? 實驗結果

? ? ?配置好模型參數后,啟動模型開始進行訓練,訓練OCR模型主要分為生成中間權重文件以及驗證實驗結果二個部分。詳細過程如下。

? ? ? (1)生成權重文件。本章中設置每一次epoch生成一次權重文件,權重文件保存到工程項目的model路徑下,權重文件的命名中包含epoch值,用來記錄迭代的次數,在不發生梯度爆炸的情況下,隨著不斷地訓練,損失值loss值不斷減少,學習效果也更好,由于數據量大并且收斂速度較為緩慢,因此在設置保存間隔時可設置為較大的值,本文中設置的間隔為迭代1000次進行一次權重文件的保存。

? ? ? (2)選擇模型。訓練過程中loss值越低代表在訓練集上擬合效果越好,但并不代表對驗證集效果也好,因此,除了要求訓練過程中loss值不斷減少之外,還要求保存中間產生的權重文件,保證驗證集測試其模型既能夠學習到足夠的特征,也能保持更好的泛化能力。經過驗證在epoch為4500時,準確率更高,loss也更低。測試部分圖片的輸出結果如圖9所示。

圖9? ?OCR輸出結果

? ? ? 從數據選擇用來計算準確率的驗證集200張,其中包含正常號牌一百張,半遮擋號牌一百張,其中包括各種情況下的號牌,例如藍牌、黃牌、新能源等等。驗證OCR算法的指標與目標檢測的指標相同。

? ? ? 本次實驗中使用的閾值為0.95來計算其驗證集中的準確率、召回率等等指標,計算指標的數據分為兩部分,一部分采用正常號牌,另外一部分為半遮擋號牌,分別計算其準確率(accuracy)、召回率(recall)、精確率(precision)和F1score三部分,從下表中可以得出,在準確率上識別正常號牌的準確率高達94.90%,遠高于半遮擋號牌的準確率,但半遮擋號牌的精確率在召回率為91.61%的基礎上可以達到100%的識別,從最后計算的F1score上來看,半遮擋號牌的識別效果要好于正常號牌。計算后的結果如表1所示。

? ? ? ?測試平臺的不同也會影響其運行效率,為了減少其他因素造成的影響,使對比效果更加具有可信度,本次采用的操作系統均為Ubuntu 16.04。其中GPU測試平臺為NVIDIA GeForce GTX 1080 Ti顯卡,使用的Cuda版本為10.0,并在測試的GPU平臺上安裝Cudnn加速庫,CPU平臺為AMD 3550H處理器。為了實現不同平臺上的速度測試,分別在不同的平臺上搭建環境,運行代碼的測試除了根據硬件設施需要對環境進行安裝之外還需要對代碼進行重新編譯。測試后的運行速率如表2所示。

猜您喜歡:

深入淺出stable diffusion:AI作畫技術背后的潛在擴散模型論文解讀

?戳我,查看GAN的系列專輯~!

一頓午飯外賣,成為CV視覺的前沿弄潮兒!

最新最全100篇匯總!生成擴散模型Diffusion Models

ECCV2022 | 生成對抗網絡GAN部分論文匯總

CVPR 2022 | 25+方向、最新50篇GAN論文

?ICCV 2021 | 35個主題GAN論文匯總

超110篇!CVPR 2021最全GAN論文梳理

超100篇!CVPR 2020最全GAN論文梳理

拆解組新的GAN:解耦表征MixNMatch

StarGAN第2版:多域多樣性圖像生成

附下載 |?《可解釋的機器學習》中文版

附下載 |《TensorFlow 2.0 深度學習算法實戰》

附下載 |《計算機視覺中的數學方法》分享

《基于深度學習的表面缺陷檢測方法綜述》

《零樣本圖像分類綜述: 十年進展》

《基于深度神經網絡的少樣本學習綜述》

《禮記·學記》有云:獨學而無友,則孤陋而寡聞

歡迎加入 GAN/擴散模型 —交流微信群 !

掃描下面二維碼,添加運營小妹好友,拉你進群。發送申請時,請備注,格式為:研究方向+地區+學校/公司+姓名。如?擴散模型+北京+北航+吳彥祖

請備注格式:研究方向+地區+學校/公司+姓名

點擊?一頓午飯外賣,成為CV視覺的前沿弄潮兒!,領取優惠券,加入?AI生成創作與計算機視覺?知識星球!

總結

以上是生活随笔為你收集整理的PyTorch实现 | 车牌OCR识别,《PyTorch深度学习之目标检测》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。