一、前言
本項目通過yolov8/yolov7/yolov5+CRNN訓(xùn)練自己的數(shù)據(jù)集,實現(xiàn)了一個車牌識別、車牌關(guān)鍵點定位、車牌檢測算法,可實現(xiàn)12種單雙層車牌的字符識別:單行藍(lán)牌、單行黃牌、新能源車牌、白色警用車牌、教練車牌、武警車牌、雙層黃牌、雙層白牌、使館車牌、港澳粵Z牌、雙層綠牌、民航車牌。
視頻實時測試效果展示如下:
【準(zhǔn)確度頂滿!車牌識別、關(guān)鍵點定位-YOLOv8+CRNN(原創(chuàng)畢設(shè))】 https://www.bilibili.com/video/BV1hc41117Ms/?spm_id_from=333.999.0.0&vd_source=8c532ded7c7c9041f04e35940d11fdae
【準(zhǔn)確度頂滿!車牌識別-YOLOv8+CRNN(原創(chuàng)畢設(shè))】 https://www.bilibili.com/video/BV12c411U76h/?spm_id_from=333.999.0.0&vd_source=8c532ded7c7c9041f04e35940d11fdae
1、項目介紹
車牌識別技術(shù)通過圖像處理和模式識別,能夠自動識別車輛的車牌信息。其意義在于提高交通管理效率、強化治安監(jiān)控、優(yōu)化停車管理和促進智慧城市建設(shè)。車牌識別可以實現(xiàn)快速準(zhǔn)確的車輛識別,幫助監(jiān)測交通違法行為、追蹤犯罪嫌疑車輛,提升交通流暢度和安全性。在停車場管理中,車牌識別技術(shù)可實現(xiàn)自動識別進出車輛,提高停車效率。綜合運用于城市管理系統(tǒng),車牌識別有助于建設(shè)更智能、安全、便捷的城市生活。本設(shè)計旨在開發(fā)一個能夠及時、準(zhǔn)確地識別車牌的算法,其主要目標(biāo)包括:實時檢測現(xiàn)實道路上的車輛并定位車牌四個角點位置;提供可靠的車牌字符識別結(jié)果。
我們的項目可為兄弟們的畢設(shè)、課設(shè)、大作業(yè)等提供參考,可訓(xùn)練自己的數(shù)據(jù)集,可以換成yolov8/yolov7/yolov5各種版本的權(quán)重。包含特別詳細(xì)的read.md文件和常見問題解答,關(guān)于本項目的任何問題都能在其中找到答案,對剛接觸深度學(xué)習(xí)、目標(biāo)檢測的小白非常友好,兄弟們放心哈。
2、圖片測試效果展示
可以看到,我們實驗室的項目能對圖片、視頻中出現(xiàn)的各類車牌字符進行有效識別,且準(zhǔn)確率較高。
二、項目環(huán)境配置
不熟悉pycharm的anaconda的大兄弟請先看這篇csdn博客,了解pycharm和anaconda的基本操作。
https://blog.csdn.net/ECHOSON/article/details/117220445
anaconda安裝完成之后請切換到國內(nèi)的源來提高下載速度 ,命令如下:
conda config --remove-key channels
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple
首先創(chuàng)建python3.8的虛擬環(huán)境,請在命令行中執(zhí)行下列操作:
conda create -n yolov8 python==3.8.5
conda activate yolov8
1、pytorch安裝(gpu版本和cpu版本的安裝)
實際測試情況是yolov8/yolov7/yolov5在CPU和GPU的情況下均可使用,不過在CPU的條件下訓(xùn)練那個速度會令人發(fā)指,所以有條件的小伙伴一定要安裝GPU版本的Pytorch,沒有條件的小伙伴最好是租服務(wù)器來使用。GPU版本安裝的具體步驟可以參考這篇文章:https://blog.csdn.net/ECHOSON/article/details/118420968。
需要注意以下幾點:
1、安裝之前一定要先更新你的顯卡驅(qū)動,去官網(wǎng)下載對應(yīng)型號的驅(qū)動安裝
2、30系顯卡只能使用cuda11的版本
3、一定要創(chuàng)建虛擬環(huán)境,這樣的話各個深度學(xué)習(xí)框架之間不發(fā)生沖突
我這里創(chuàng)建的是python3.8的環(huán)境,安裝的Pytorch的版本是1.8.0,命令如下:
conda install pytorch==1.8.0 torchvision torchaudio cudatoolkit=10.2 # 注意這條命令指定Pytorch的版本和cuda的版本
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cpuonly # CPU的小伙伴直接執(zhí)行這條命令即可
安裝完畢之后,我們來測試一下GPU是否可以有效調(diào)用:
2、pycocotools的安裝
pip install pycocotools-windows
3、其他包的安裝
另外的話大家還需要安裝程序其他所需的包,包括opencv,matplotlib這些包,不過這些包的安裝比較簡單,直接通過pip指令執(zhí)行即可,我們cd到y(tǒng)olov8/yolov7/yolov5代碼的目錄下,直接執(zhí)行下列指令即可完成包的安裝。
pip install -r requirements.txt
三、yolov8/yolov7/yolov5+CRNN-中文車牌識別、車牌關(guān)鍵點定位、車牌檢測算法
1、yolov8算法介紹
yolov8是yolo系列的最新算法,檢測效果優(yōu)于之前的所有的yolo算法。這里,我們采用了ultralytics官方版本的yolov8來檢測車牌。
在學(xué)習(xí)Yolov8之前,我們需要對Yolov8所做的工作有一定的了解,這有助于我們后面去了解網(wǎng)絡(luò)的細(xì)節(jié),Yolov8在預(yù)測方式上與之前的Yolo并沒有多大的差別,依然分為三個部分:分別是Backbone,F(xiàn)PN以及Yolo Head。
Backbone是Yolov8的主干特征提取網(wǎng)絡(luò),輸入的圖片首先會在主干網(wǎng)絡(luò)里面進行特征提取,提取到的特征可以被稱作特征層,是輸入圖片的特征集合。在主干部分,我們獲取了三個特征層進行下一步網(wǎng)絡(luò)的構(gòu)建,這三個特征層我稱它為有效特征層。
FPN是Yolov8的加強特征提取網(wǎng)絡(luò),在主干部分獲得的三個有效特征層會在這一部分進行特征融合,特征融合的目的是結(jié)合不同尺度的特征信息。在FPN部分,已經(jīng)獲得的有效特征層被用于繼續(xù)提取特征。在YoloV8里依然使用到了Panet的結(jié)構(gòu),我們不僅會對特征進行上采樣實現(xiàn)特征融合,還會對特征再次進行下采樣實現(xiàn)特征融合。
Yolo Head是Yolov8的分類器與回歸器,通過Backbone和FPN,我們已經(jīng)可以獲得三個加強過的有效特征層。每一個特征層都有寬、高和通道數(shù),此時我們可以將特征圖看作一個又一個特征點的集合,每個特征點作為先驗點,而不再存在先驗框,每一個先驗點都有通道數(shù)個特征。Yolo Head實際上所做的工作就是對特征點進行判斷,判斷特征點上的先驗框是否有物體與其對應(yīng)。Yolov8所用的解耦頭是分開的,也就是分類和回歸不在一個1X1卷積里實現(xiàn)。
因此,整個Yolov8網(wǎng)絡(luò)所作的工作依然就是 特征提取-特征加強-預(yù)測先驗框?qū)?yīng)的物體情況。
2、CRNN算法介紹
CRNN是“卷積遞歸神經(jīng)網(wǎng)絡(luò)”(Convolutional Recurrent Neural Network)的縮寫。它是一種深度學(xué)習(xí)架構(gòu),結(jié)合了卷積神經(jīng)網(wǎng)絡(luò)(CNN)和循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的優(yōu)勢,主要用于處理具有序列性和空間信息的數(shù)據(jù),比如圖像中的文字識別。
CRNN的結(jié)構(gòu)包含了卷積層、循環(huán)層和連接層。首先,卷積層用于提取圖像特征,將輸入圖像轉(zhuǎn)換為高層次的抽象特征表示。這些特征捕獲了文字在不同尺度和方向上的信息,使得模型對文字的變化和形態(tài)有較強的理解能力。
接著,循環(huán)層(通常采用長短時記憶網(wǎng)絡(luò),LSTM,或者門控循環(huán)單元,GRU)用于處理序列數(shù)據(jù),它能夠保留文字之間的上下文信息。這使得CRNN能夠更好地理解文字之間的關(guān)系,并且有助于糾正識別錯誤。
最后,連接層用于將卷積層和循環(huán)層的輸出結(jié)合起來,并通過全連接層進行最終的分類或識別。這個結(jié)構(gòu)允許模型同時利用局部特征和全局上下文信息,提高了對文字的準(zhǔn)確識別能力。
CRNN在文字識別領(lǐng)域取得了很大成功,特別是在場景文本識別(如自然場景中的文字識別)方面。它能夠處理不同字體、大小、角度和背景的文字,并且對于不同語言的文字具有一定的通用性。
總的來說,CRNN作為結(jié)合了CNN和RNN的深度學(xué)習(xí)架構(gòu),具有處理序列數(shù)據(jù)和空間信息的能力,特別適用于文字識別等領(lǐng)域,為處理具有結(jié)構(gòu)性數(shù)據(jù)的任務(wù)提供了一種有效的解決方案。
3、算法流程設(shè)計
首先,通過卷積神經(jīng)網(wǎng)絡(luò)(CNN)提取輸入圖像的特征。然后,使用Anchor Boxes來生成候選區(qū)域,這些區(qū)域包含可能的目標(biāo)邊界框。通過對這些候選區(qū)域進行分類和定位回歸,確定最終的目標(biāo)邊界框和其類別。YOLOv8采用多尺度特征融合,以捕捉不同尺度的信息,提高檢測性能。此外,它使用自適應(yīng)的Anchor Box來適應(yīng)不同目標(biāo)形狀。整個過程通過端到端的訓(xùn)練來優(yōu)化網(wǎng)絡(luò)參數(shù),實現(xiàn)高效、準(zhǔn)確的車牌檢測。YOLOv8檢測到的車牌如圖:
如上圖所示,檢測有可能定位不準(zhǔn),導(dǎo)致車牌周邊圖像也被包含在感興趣區(qū)域內(nèi)。另外,檢測出來的車牌會存在一定傾角,不利于后續(xù)的車牌字符識別。因此,對車牌進行關(guān)鍵點回歸定位。如圖所示:
定位到車牌四個角點之后,使用數(shù)學(xué)圖像處理中的透視變化技術(shù)對其進行矯正。透視變換原理詳見,此處不再贅述。具體代碼實現(xiàn)如下:
def four_point_transform(image, pts): #透視變換得到車牌小圖
rect = order_points(pts)
(tl, tr, br, bl) = rect
widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max(int(widthA), int(widthB))
heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max(int(heightA), int(heightB))
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maxHeight - 1],
[0, maxHeight - 1]], dtype = "float32")
M = cv2.getPerspectiveTransform(rect, dst)
warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
return warped
得到的矯正后車牌圖像:
再將矯正后的車牌輸入CRNN中進行字符識別,得到最終的字符識別效果,并在圖像上以文本的形式輸出。
class_label= int(class_num) #車牌的的類型0代表單牌,1代表雙層車牌
roi_img = four_point_transform(img,landmarks_np) #透視變換得到車牌小圖
if class_label: #判斷是否是雙層車牌,是雙牌的話進行分割后然后拼接
roi_img=get_split_merge(roi_img)
plate_number ,plate_color= get_plate_result(roi_img,device,plate_rec_model) #對車牌小圖進行識別,得到顏色和車牌號
for dan in danger: #只要出現(xiàn)‘?!蛘摺U’就是危險品車牌
if dan in plate_number:
plate_number='危險品'
# cv2.imwrite("roi.jpg",roi_img)
result_dict['class_type']=class_type[class_label]
result_dict['rect']=rect #車牌roi區(qū)域
result_dict['landmarks']=landmarks_np.tolist() #車牌角點坐標(biāo)
result_dict['plate_no']=plate_number #車牌號
result_dict['roi_height']=roi_img.shape[0] #車牌高度
result_dict['plate_color']=plate_color #車牌顏色
result_dict['object_no']=class_label #單雙層 0單層 1雙層
result_dict['score']=conf #車牌區(qū)域檢測得分
return result_dict
4、代碼使用
直接執(zhí)行項目中的Car_recognition.py即可。如下主函數(shù)中:“–detect_model”參數(shù)為檢測模型的權(quán)重,“----rec_model”參數(shù)為車牌識別+車牌顏色識別模型的權(quán)重,“----image_path”參數(shù)為測試圖片文件夾的路徑,‘–img_size’代表輸入模型進行推理的圖像尺寸(理論上這個值越接近原始大小,車牌識別越準(zhǔn)確,但推理幀率也會有一定程度下降),’–output’為輸出圖像存放的文件夾名稱或輸出視頻的名稱,'–video’為輸入視頻的路徑。要實現(xiàn)視頻推理,在“–video”參數(shù)處設(shè)置視頻路徑即可。
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--detect_model', nargs='+', type=str, default='weights/detect.pt', help='model.pt path(s)') #檢測模型
parser.add_argument('--rec_model', type=str, default='weights/plate_rec_color.pth', help='model.pt path(s)')#車牌識別+車牌顏色識別模型
parser.add_argument('--car_rec_model',type=str,default='weights/car_rec_color.pth',help='car_rec_model') #車輛識別模型
parser.add_argument('--image_path', type=str, default='test', help='source')
parser.add_argument('--img_size', type=int, default=1080, help='inference size (pixels)')
parser.add_argument('--output', type=str, default='result', help='source')
parser.add_argument('--video', type=str, default='test/test.mp4', help='source')
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
四、自己訓(xùn)練的步驟
對于兄弟們的畢設(shè)、課設(shè)項目來說,沒有必要再重新訓(xùn)練一遍。一方面耗時費力,自己的電腦也不一定跑的動;另一方面我這邊會提供所有的訓(xùn)練過程曲線、數(shù)據(jù)、和訓(xùn)練好的權(quán)重,直接調(diào)用就行。
1、下載數(shù)據(jù)集
數(shù)據(jù)是從CCPD和CRPD數(shù)據(jù)集中選取并轉(zhuǎn)換的,為yolo格式:
label x y w h pt1x pt1y pt2x pt2y pt3x pt3y pt4x pt4y
關(guān)鍵點依次是(左上、右上、右下、左下)。坐標(biāo)都是經(jīng)過歸一化,x、y是中心點除以圖片寬高,w、h是框的寬高除以圖片寬高,ptx、pty是關(guān)鍵點坐標(biāo)除以寬高。車輛標(biāo)注不需要關(guān)鍵點,關(guān)鍵點全部置為-1即可。
2、修改路徑
換成自己的數(shù)據(jù)集路徑。
train: /your/train/path #修改成你的路徑
val: /your/val/path #修改成你的路徑
# number of classes
nc: 3 #這里用的是3分類,0 單層車牌 1 雙層車牌 2 車輛
# class names
names: [ 'single_plate','double_plate','Car']
3、開始訓(xùn)練
python3 train.py --data data/plateAndCar.yaml --cfg models/yolov5n-0.5.yaml --weights weights/detect.pt --epoch 250
五、車牌識別、檢測自建數(shù)據(jù)集
我們實驗室手動收集、整理了一個高質(zhì)量的車牌識別、檢測數(shù)據(jù)集,包含41892張車輛車牌圖片和對應(yīng)的txt格式標(biāo)簽。已將其劃分為訓(xùn)練集、測試集。本數(shù)據(jù)集可直接用于訓(xùn)練yolo系列等神經(jīng)網(wǎng)絡(luò),可提供給兄弟們的畢設(shè)、課設(shè)項目及企業(yè)課題進行使用。數(shù)據(jù)集展示如下:
六、訓(xùn)練曲線等介紹
我們的項目代碼還能自動生成訓(xùn)練過程的loss損失曲線、map平均準(zhǔn)確度曲線,不用手動畫(太麻煩了,能用代碼做的事盡量不手動),兄弟可以直接將這些圖插入論文或課設(shè)報告中。當(dāng)然,也可以自己訓(xùn)練,重新生成對應(yīng)的圖。訓(xùn)練結(jié)束后,這些圖和訓(xùn)練數(shù)據(jù)會(以envents文件形式)存放在根目錄下的runs文件夾中。我項目中已導(dǎo)出為PNG圖片和CSV表格,可以直接拿去用。
包含完整word版本說明文檔,可用于寫論文、課設(shè)報告的參考。
七、資源獲取(yolov8/yolov7/yolov5版本均可提供)
yolov8/yolov7/yolov5車牌識別、定位、檢測系統(tǒng)的實現(xiàn)和訓(xùn)練、數(shù)據(jù)的整理耗費了我們實驗室大量的時間和精力。所以有償提供使用,感謝兄弟們理解。有需要的兄弟可通過以下方式獲取資源。我們的代碼有詳細(xì)注釋,包全程指導(dǎo),任何問題都可以隨時問我。不過有的時候我太忙,可能不會及時回復(fù)消息,看到了肯定回你哈。文章來源:http://www.zghlxwxcb.cn/news/detail-775416.html
獲取整套代碼、測試圖片視頻、車牌識別數(shù)據(jù)集、訓(xùn)練好的權(quán)重和說明文檔(有償)
上交在讀博士,技術(shù)夠硬,也可以指導(dǎo)深度學(xué)習(xí)畢設(shè)、大作業(yè)等。
--------------qq---------------------
3582584734
-------------------------------------
文章來源地址http://www.zghlxwxcb.cn/news/detail-775416.html
到了這里,關(guān)于YOLOv8/YOLOv7/YOLOv5+CRNN-車牌識別、車牌關(guān)鍵點定位、車牌檢測(畢業(yè)設(shè)計)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!