《博主簡介》
小伙伴們好,我是阿旭。專注于人工智能、AIGC、python、計(jì)算機(jī)視覺相關(guān)分享研究。
?更多學(xué)習(xí)資源,可關(guān)注公-仲-hao:【阿旭算法與機(jī)器學(xué)習(xí)】,共同學(xué)習(xí)交流~
??感謝小伙伴們點(diǎn)贊、關(guān)注!
《------往期經(jīng)典推薦------》
一、AI應(yīng)用軟件開發(fā)實(shí)戰(zhàn)專欄【鏈接】
項(xiàng)目名稱 | 項(xiàng)目名稱 |
---|---|
1.【人臉識(shí)別與管理系統(tǒng)開發(fā)】 | 2.【車牌識(shí)別與自動(dòng)收費(fèi)管理系統(tǒng)開發(fā)】 |
3.【手勢識(shí)別系統(tǒng)開發(fā)】 | 4.【人臉面部活體檢測系統(tǒng)開發(fā)】 |
5.【圖片風(fēng)格快速遷移軟件開發(fā)】 | 6.【人臉表表情識(shí)別系統(tǒng)】 |
7.【YOLOv8多目標(biāo)識(shí)別與自動(dòng)標(biāo)注軟件開發(fā)】 | 8.【基于YOLOv8深度學(xué)習(xí)的行人跌倒檢測系統(tǒng)】 |
9.【基于YOLOv8深度學(xué)習(xí)的PCB板缺陷檢測系統(tǒng)】 | 10.【基于YOLOv8深度學(xué)習(xí)的生活垃圾分類目標(biāo)檢測系統(tǒng)】 |
11.【基于YOLOv8深度學(xué)習(xí)的安全帽目標(biāo)檢測系統(tǒng)】 | 12.【基于YOLOv8深度學(xué)習(xí)的120種犬類檢測與識(shí)別系統(tǒng)】 |
13.【基于YOLOv8深度學(xué)習(xí)的路面坑洞檢測系統(tǒng)】 | 14.【基于YOLOv8深度學(xué)習(xí)的火焰煙霧檢測系統(tǒng)】 |
15.【基于YOLOv8深度學(xué)習(xí)的鋼材表面缺陷檢測系統(tǒng)】 | 16.【基于YOLOv8深度學(xué)習(xí)的艦船目標(biāo)分類檢測系統(tǒng)】 |
17.【基于YOLOv8深度學(xué)習(xí)的西紅柿成熟度檢測系統(tǒng)】 | 18.【基于YOLOv8深度學(xué)習(xí)的血細(xì)胞檢測與計(jì)數(shù)系統(tǒng)】 |
19.【基于YOLOv8深度學(xué)習(xí)的吸煙/抽煙行為檢測系統(tǒng)】 | 20.【基于YOLOv8深度學(xué)習(xí)的水稻害蟲檢測與識(shí)別系統(tǒng)】 |
21.【基于YOLOv8深度學(xué)習(xí)的高精度車輛行人檢測與計(jì)數(shù)系統(tǒng)】 | 22.【基于YOLOv8深度學(xué)習(xí)的路面標(biāo)志線檢測與識(shí)別系統(tǒng)】 |
23.【基于YOLOv8深度學(xué)習(xí)的智能小麥害蟲檢測識(shí)別系統(tǒng)】 | 24.【基于YOLOv8深度學(xué)習(xí)的智能玉米害蟲檢測識(shí)別系統(tǒng)】 |
25.【基于YOLOv8深度學(xué)習(xí)的200種鳥類智能檢測與識(shí)別系統(tǒng)】 | 26.【基于YOLOv8深度學(xué)習(xí)的45種交通標(biāo)志智能檢測與識(shí)別系統(tǒng)】 |
27.【基于YOLOv8深度學(xué)習(xí)的人臉面部表情識(shí)別系統(tǒng)】 | 28.【基于YOLOv8深度學(xué)習(xí)的蘋果葉片病害智能診斷系統(tǒng)】 |
29.【基于YOLOv8深度學(xué)習(xí)的智能肺炎診斷系統(tǒng)】 | 30.【基于YOLOv8深度學(xué)習(xí)的葡萄簇目標(biāo)檢測系統(tǒng)】 |
31.【基于YOLOv8深度學(xué)習(xí)的100種中草藥智能識(shí)別系統(tǒng)】 | 32.【基于YOLOv8深度學(xué)習(xí)的102種花卉智能識(shí)別系統(tǒng)】 |
33.【基于YOLOv8深度學(xué)習(xí)的100種蝴蝶智能識(shí)別系統(tǒng)】 | 34.【基于YOLOv8與ByteTrack的車輛行人多目標(biāo)檢測與追蹤系統(tǒng)】 |
二、機(jī)器學(xué)習(xí)實(shí)戰(zhàn)專欄【鏈接】,已更新31期,歡迎關(guān)注,持續(xù)更新中~~
三、深度學(xué)習(xí)【Pytorch】專欄【鏈接】
四、【Stable Diffusion繪畫系列】專欄【鏈接】
《------正文------》
基本功能演示
摘要:
智能車牌檢測與識(shí)別系統(tǒng)
通過使用最新的YOLOv8與PaddleOCR算法能夠迅速、準(zhǔn)確地在多種環(huán)境下實(shí)現(xiàn)實(shí)時(shí)車牌的檢測和識(shí)別。本文基于YOLOv8深度學(xué)習(xí)框架
,通過16770張圖片
,訓(xùn)練了一個(gè)進(jìn)行車牌檢測
模型,可以檢測藍(lán)牌與綠牌
,然后對(duì)檢測到的車牌使用OCR識(shí)別技術(shù)
,進(jìn)行車牌的識(shí)別。最終基于此模型開發(fā)了一款帶UI界面的車牌檢測與識(shí)別系統(tǒng)
,可用于實(shí)時(shí)檢測與識(shí)別場景中的車牌
,更方便進(jìn)行功能的展示。該系統(tǒng)是基于python
與PyQT5
開發(fā)的,支持圖片
、視頻
以及攝像頭
進(jìn)行目標(biāo)檢測與識(shí)別
,并保存檢測識(shí)別結(jié)果
。本文提供了完整的Python代碼和使用教程,給感興趣的小伙伴參考學(xué)習(xí),完整的代碼資源文件獲取方式見文末。
點(diǎn)擊跳轉(zhuǎn)至文末《完整相關(guān)文件及源碼》獲取
前言
智能車牌檢測與識(shí)別系統(tǒng)
通過使用最新的YOLOv8與PaddleOCR算法能夠迅速、準(zhǔn)確地在多種環(huán)境下實(shí)現(xiàn)實(shí)時(shí)車牌的檢測和識(shí)別。這項(xiàng)技術(shù)在現(xiàn)代交通管理中具有重要作用,因?yàn)樗軌蜃詣?dòng)化和簡化許多涉及車輛識(shí)別和記錄的流程。這樣的系統(tǒng)不僅提高了工作效率,還降低了人工錯(cuò)誤,提供了便捷且可靠的數(shù)據(jù)支持,對(duì)于加強(qiáng)交通安全、輔助執(zhí)法以及促進(jìn)智慧城市構(gòu)建具有深遠(yuǎn)意義。
智能車牌檢測與識(shí)別系統(tǒng)的
應(yīng)用場景包括
:交通違章抓拍
:自動(dòng)檢測違章車輛,并記錄車牌號(hào)碼,用于交通違規(guī)的證據(jù)收集和處理。停車場管理
:車牌識(shí)別用于自動(dòng)化的停車場出入管理,實(shí)現(xiàn)無人值守收費(fèi)系統(tǒng),提升停車場的服務(wù)效率。門禁系統(tǒng)
:在小區(qū)或企業(yè)區(qū)域的門禁系統(tǒng)中應(yīng)用,僅允許認(rèn)可的車輛進(jìn)入,增強(qiáng)安全管理。
城市交通監(jiān)控:監(jiān)測和分析城市交通流量,以輔助交通規(guī)劃和擁堵管理。電子收費(fèi)(ETC
):高速公路和其他收費(fèi)公路上使用車牌識(shí)別系統(tǒng)來自動(dòng)化收費(fèi)流程,減少交通延誤。車輛找尋與監(jiān)控
:在大型公共場所輔助找尋特定車輛,或是監(jiān)控特定車輛的行駛情況。總而言之
,智能車牌檢測與識(shí)別系統(tǒng)的實(shí)施為交通管理和城市安全帶來了顯著改進(jìn)。這一系統(tǒng)不僅提高了相關(guān)領(lǐng)域的工作效率和處理速度,也加強(qiáng)了安全監(jiān)管能力。在未來,隨著智慧城市和智能交通系統(tǒng)的持續(xù)發(fā)展,智能車牌識(shí)別技術(shù)將會(huì)扮演更加關(guān)鍵的角色,為城市的可持續(xù)和有序發(fā)展貢獻(xiàn)重要力量。
博主通過搜集不同綠牌與藍(lán)牌的車牌
相關(guān)圖片,根據(jù)YOLOv8的目標(biāo)檢測技術(shù)結(jié)合PaddleOCR識(shí)別技術(shù),基于python與Pyqt5
開發(fā)了一款界面簡潔的智能車牌檢測與識(shí)別系統(tǒng)
,可支持圖片、視頻以及攝像頭檢測
,同時(shí)可以將圖片或者視頻檢測結(jié)果進(jìn)行保存
。
軟件初始界面如下圖所示:
檢測結(jié)果界面如下:
一、軟件核心功能介紹及效果演示
軟件主要功能
1. 可進(jìn)行實(shí)時(shí)綠牌與藍(lán)牌這兩種車牌的檢測與識(shí)別
;
2. 支持圖片、視頻及攝像頭
進(jìn)行檢測,同時(shí)支持圖片的批量檢測
;
3. 界面可實(shí)時(shí)顯示目標(biāo)位置
、識(shí)別結(jié)果
、置信度
、用時(shí)
等信息;
4. 支持圖片
或者視頻
的檢測結(jié)果保存
;
(1)圖片檢測演示
點(diǎn)擊圖片
圖標(biāo),選擇需要檢測的圖片,或者點(diǎn)擊文件夾圖標(biāo)
,選擇需要批量檢測圖片所在的文件夾,操作演示如下:
點(diǎn)擊保存
按鈕,會(huì)對(duì)圖片或視頻檢測結(jié)果進(jìn)行保存,存儲(chǔ)路徑為:save_data
目錄下。
單個(gè)圖片檢測操作如下:
批量圖片檢測操作如下:
點(diǎn)擊表格中的指定行,可以顯示指定圖片的檢測結(jié)果。
(2)視頻檢測演示
點(diǎn)擊視頻
圖標(biāo),打開選擇需要檢測的視頻,就會(huì)自動(dòng)顯示檢測結(jié)果。點(diǎn)擊保存
按鈕,會(huì)對(duì)視頻檢測結(jié)果進(jìn)行保存,存儲(chǔ)路徑為:save_data
目錄下。
(3)攝像頭檢測演示
點(diǎn)擊攝像頭
圖標(biāo),可以打開攝像頭,可以實(shí)時(shí)進(jìn)行檢測,再次點(diǎn)擊攝像頭
圖標(biāo),可關(guān)閉攝像頭。
(4)保存圖片與視頻檢測結(jié)果
點(diǎn)擊保存
按鈕后,會(huì)將當(dāng)前選擇的圖片【含批量圖片】或者視頻
的檢測結(jié)果進(jìn)行保存。檢測的圖片與視頻結(jié)果會(huì)存儲(chǔ)在save_data
目錄下。
二、車牌檢測與識(shí)別流程
要進(jìn)行車牌識(shí)別,主要分為兩步。第一步:進(jìn)行車輛車牌位置的檢測
,本文使用yolov8,通過16770
張圖片訓(xùn)練了一個(gè)可用于檢測綠牌與藍(lán)牌的車牌檢測模型來進(jìn)行車牌檢測,檢測精度為0.995
;第二步:對(duì)第一步檢測出的車牌進(jìn)行識(shí)別
,直接使用的是PaddleOCR
對(duì)于車牌進(jìn)行識(shí)別。
下面對(duì)這些內(nèi)容進(jìn)行詳細(xì)介紹
2.1 第一步:車牌檢測
本文主要基于yolov8訓(xùn)練了一個(gè)車牌檢測模型,用于進(jìn)行車牌位置的檢測,主要步驟如下:
2.1.1 yolov8環(huán)境配置
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
yolov8源碼地址:https://github.com/ultralytics/ultralytics
YOLOv8的基本原理
YOLOv8是一種前沿的目標(biāo)檢測技術(shù),它基于先前YOLO版本在目標(biāo)檢測任務(wù)上的成功,進(jìn)一步提升了性能和靈活性。主要的創(chuàng)新點(diǎn)包括一個(gè)新的骨干網(wǎng)絡(luò)、一個(gè)新的 Ancher-Free 檢測頭和一個(gè)新的損失函數(shù),可以在從 CPU 到 GPU 的各種硬件平臺(tái)上運(yùn)行
。
其主要網(wǎng)絡(luò)結(jié)構(gòu)如下:
2.1.2 數(shù)據(jù)集準(zhǔn)備與處理
本文訓(xùn)練模型使用的數(shù)據(jù)集為CPDD2020綠牌數(shù)據(jù)集與部分CCPD2019的藍(lán)牌數(shù)據(jù)集
。數(shù)據(jù)集下載地址:https://github.com/detectRecog/CCPD
CCPD是一個(gè)大型的、多樣化的、經(jīng)過仔細(xì)標(biāo)注的中國城市車牌開源數(shù)據(jù)集。CCPD數(shù)據(jù)集主要分為CCPD2019數(shù)據(jù)集和CCPD2020(CCPD-Green)數(shù)據(jù)集。CCPD2019數(shù)據(jù)集車牌類型僅有普通車牌(藍(lán)色車牌),CCPD2020數(shù)據(jù)集車牌類型僅有新能源車牌(綠色車牌)。
在CCPD數(shù)據(jù)集中,每張圖片僅包含一張車牌,車牌的車牌省份主要為皖。CCPD中的每幅圖像都包含大量的標(biāo)注信息,但是CCPD數(shù)據(jù)集沒有專門的標(biāo)注文件,每張圖像的文件名就是該圖像對(duì)應(yīng)的數(shù)據(jù)標(biāo)注。
標(biāo)注最困難的部分是注釋四個(gè)頂點(diǎn)的位置。為了完成這項(xiàng)任務(wù),數(shù)據(jù)發(fā)布者首先在10k圖像上手動(dòng)標(biāo)記四個(gè)頂點(diǎn)的位置。然后設(shè)計(jì)了一個(gè)基于深度學(xué)習(xí)的檢測模型,在對(duì)該網(wǎng)絡(luò)進(jìn)行良好訓(xùn)練后,對(duì)每幅圖像的四個(gè)頂點(diǎn)位置進(jìn)行自動(dòng)標(biāo)注。最后,數(shù)據(jù)發(fā)布者雇用了7名兼職工人在兩周內(nèi)糾正這些標(biāo)注。CCPD提供了超過250k個(gè)獨(dú)特的車牌圖像和詳細(xì)的注釋。每張圖像的分辨率為720(寬度)× 1160(高)× 3(通道)。實(shí)際上,這種分辨率足以保證每張圖像中的車牌清晰可辨,但是該數(shù)據(jù)有些圖片標(biāo)注可能不準(zhǔn)。不過總的來說CCPD數(shù)據(jù)集非常推薦研究車牌識(shí)別算法的人員學(xué)習(xí)使用。
本文使用的數(shù)據(jù)集一共包含16770張車牌數(shù)據(jù)
。部分圖片如下:
數(shù)據(jù)集中圖片的命名規(guī)則如下:圖片命名:“025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg”
解釋:
1. 025:車牌區(qū)域占整個(gè)畫面的比例;
2. 95_113: 車牌水平和垂直角度, 水平95°, 豎直113°
3. 154&383_386&473:標(biāo)注框左上、右下坐標(biāo),左上(154, 383), 右下(386, 473)
4. 86&473_177&454_154&383_363&402:標(biāo)注框四個(gè)角點(diǎn)坐標(biāo),順序?yàn)橛蚁?、左下、左上、右?5. 0_0_22_27_27_33_16:車牌號(hào)碼映射關(guān)系如下: 第一個(gè)0為省份 對(duì)應(yīng)省份字典provinces中的’皖’,;第二個(gè)0是該車所在地的地市一級(jí)代碼,對(duì)應(yīng)地市一級(jí)代碼字典alphabets的’A’;后5位為字母和文字, 查看車牌號(hào)ads字典,如22為Y,27為3,33為9,16為S,最終車牌號(hào)碼為皖A(yù)Y339S
省份:[“皖”, “滬”, “津”, “渝”, “冀”, “晉”, “蒙”, “遼”, “吉”, “黑”, “蘇”, “浙”, “京”, “閩”, “贛”,
“魯”, “豫”, “鄂”, “湘”, “粵”, “桂”, “瓊”, “川”, “貴”, “云”, “藏”, “陜”, “甘”, “青”, “寧”,
“新”]
地市:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘Q’,
‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’,‘X’, ‘Y’, ‘Z’]
車牌字典:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’,
‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’,‘Y’, ‘Z’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’,
‘6’, ‘7’, ‘8’, ‘9’]
制作車牌檢測數(shù)據(jù)集:
這個(gè)數(shù)據(jù)集的檢測和識(shí)別標(biāo)簽都在圖片名中,可以直接通過上述圖片的命名規(guī)則
,從圖片讀取出來,再寫入txt文件中即可。代碼如下:
import shutil
import cv2
import os
def txt_translate(path, txt_path):
print(path)
print(txt_path)
for filename in os.listdir(path):
# print(filename)
list1 = filename.split("-", 3) # 第一次分割,以減號(hào)'-'做分割
subname = list1[2]
list2 = filename.split(".", 1)
subname1 = list2[1]
if subname1 == 'txt':
continue
lt, rb = subname.split("_", 1) # 第二次分割,以下劃線'_'做分割
lx, ly = lt.split("&", 1)
rx, ry = rb.split("&", 1)
width = int(rx) - int(lx)
height = int(ry) - int(ly) # bounding box的寬和高
cx = float(lx) + width / 2
cy = float(ly) + height / 2 # bounding box中心點(diǎn)
img = cv2.imread(path + filename)
if img is None: # 自動(dòng)刪除失效圖片(下載過程有的圖片會(huì)存在無法讀取的情況)
print(path + filename)
os.remove(path + filename)
continue
width = width / img.shape[1]
height = height / img.shape[0]
cx = cx / img.shape[1]
cy = cy / img.shape[0]
txtname = filename.split(".", 1)
txtfile = txt_path + txtname[0] + ".txt"
# 綠牌是第0類,藍(lán)牌是第1類
with open(txtfile, "w") as f:
f.write(str(0) + " " + str(cx) + " " + str(cy) + " " + str(width) + " " + str(height))
if __name__ == '__main__':
# det圖片存儲(chǔ)地址
trainDir = r"G:/datasets/CarPlateData/CCPD2020/ccpd_green/train/"
validDir = r"G:/datasets/CarPlateData/CCPD2020/ccpd_green/val/"
testDir = r"G:/datasets/CarPlateData/CCPD2020/ccpd_green/test/"
# det txt存儲(chǔ)地址
train_txt_path = r"G:/datasets/CarPlateData/CCPD2020/ccpd_green/train_labels/"
val_txt_path = r"G:/datasets/CarPlateData/CCPD2020/ccpd_green/val_labels/"
test_txt_path = r"G:/datasets/CarPlateData/CCPD2020/ccpd_green/test_labels/"
txt_translate(trainDir, train_txt_path)
txt_translate(validDir, val_txt_path)
txt_translate(testDir, test_txt_path)
制作完成后,如上圖所示。
2.1.3 目標(biāo)檢測模型訓(xùn)練
圖片數(shù)據(jù)集的存放格式如下,在項(xiàng)目目錄中新建datasets
目錄,同時(shí)將分類的圖片分為訓(xùn)練集、驗(yàn)證集與測試集放入PlateData
目錄下。
同時(shí)我們需要新建一個(gè)data.yaml
文件,用于存儲(chǔ)訓(xùn)練數(shù)據(jù)的路徑及模型需要進(jìn)行檢測的類別。YOLOv8在進(jìn)行模型訓(xùn)練時(shí),會(huì)讀取該文件的信息,用于進(jìn)行模型的訓(xùn)練與驗(yàn)證。data.yaml
的具體內(nèi)容如下:
train: E:\MyCVProgram\CarPlateDetection\datasets\PlateData\images\train # train images (relative to 'path') 128 images
val: E:\MyCVProgram\CarPlateDetection\datasets\PlateData\images\val # val images (relative to 'path') 128 images
# number of classes
nc: 2
# Classes
names: ['GreenLicense','BlueLicense']
注:train與val后面表示需要訓(xùn)練圖片的路徑,建議直接寫自己文件的絕對(duì)路徑。
數(shù)據(jù)準(zhǔn)備完成后,通過調(diào)用train.py
文件進(jìn)行模型訓(xùn)練,epochs
參數(shù)用于調(diào)整訓(xùn)練的輪數(shù),batch
參數(shù)用于調(diào)整訓(xùn)練的批次大小【根據(jù)內(nèi)存大小調(diào)整,最小為1】,代碼如下:
#coding:utf-8
from ultralytics import YOLO
# 加載預(yù)訓(xùn)練模型
model = YOLO("yolov8n.pt")
# Use the model
if __name__ == '__main__':
# Use the model
results = model.train(data='datasets/PlateData/data.yaml', epochs=300, batch=4) # 訓(xùn)練模型
# 將模型轉(zhuǎn)為onnx格式
# success = model.export(format='onnx')
訓(xùn)練結(jié)果評(píng)估
在深度學(xué)習(xí)中,我們通常用損失函數(shù)下降的曲線來觀察模型訓(xùn)練的情況。YOLOv8在訓(xùn)練時(shí)主要包含三個(gè)方面的損失:定位損失(box_loss)、分類損失(cls_loss)和動(dòng)態(tài)特征損失(dfl_loss),在訓(xùn)練結(jié)束后,可以在runs/
目錄下找到訓(xùn)練過程及結(jié)果文件,如下所示:
各損失函數(shù)作用說明:定位損失box_loss
:預(yù)測框與標(biāo)定框之間的誤差(GIoU),越小定位得越準(zhǔn);分類損失cls_loss
:計(jì)算錨框與對(duì)應(yīng)的標(biāo)定分類是否正確,越小分類得越準(zhǔn);動(dòng)態(tài)特征損失(dfl_loss)
:DFLLoss是一種用于回歸預(yù)測框與目標(biāo)框之間距離的損失函數(shù)。在計(jì)算損失時(shí),目標(biāo)框需要縮放到特征圖尺度,即除以相應(yīng)的stride,并與預(yù)測的邊界框計(jì)算Ciou Loss,同時(shí)與預(yù)測的anchors中心點(diǎn)到各邊的距離計(jì)算回歸DFLLoss。這個(gè)過程是YOLOv8訓(xùn)練流程中的一部分,通過計(jì)算DFLLoss可以更準(zhǔn)確地調(diào)整預(yù)測框的位置,提高目標(biāo)檢測的準(zhǔn)確性。
本文訓(xùn)練結(jié)果如下:
我們通常用PR曲線
來體現(xiàn)精確率和召回率的關(guān)系,本文訓(xùn)練結(jié)果的PR曲線如下。mAP
表示Precision和Recall作為兩軸作圖后圍成的面積,m表示平均,@后面的數(shù)表示判定iou為正負(fù)樣本的閾值。mAP@.5:表示閾值大于0.5的平均mAP,可以看到本文模型目標(biāo)檢測的mAP@0.5
平均值為0.995
,結(jié)果相當(dāng)不錯(cuò)。
4. 檢測結(jié)果識(shí)別
模型訓(xùn)練完成后,我們可以得到一個(gè)最佳的訓(xùn)練結(jié)果模型best.pt
文件,在runs/trian/weights
目錄下。我們可以使用該文件進(jìn)行后續(xù)的推理檢測。
圖片檢測代碼如下:
#coding:utf-8
from ultralytics import YOLO
import cv2
# 所需加載的模型目錄
path = 'models/best.pt'
# 需要檢測的圖片地址
img_path = "TestFiles/013671875-93_102-226&489_426&558-426&558_234&546_226&489_417&494-0_0_5_25_33_24_24_33-86-80.jpg"
# 加載預(yù)訓(xùn)練模型
# conf 0.25 object confidence threshold for detection
# iou 0.7 intersection over union (IoU) threshold for NMS
model = YOLO(path, task='detect')
# model = YOLO(path, task='detect',conf=0.5)
# 檢測圖片
results = model(img_path)
res = results[0].plot()
# res = cv2.resize(res,dsize=None,fx=0.3,fy=0.3,interpolation=cv2.INTER_LINEAR)
cv2.imshow("YOLOv8 Detection", res)
cv2.waitKey(0)
執(zhí)行上述代碼后,會(huì)將執(zhí)行的結(jié)果直接標(biāo)注在圖片上,結(jié)果如下:
可以發(fā)現(xiàn),該模型能夠很好的檢測出車牌區(qū)域。下面我們需要對(duì)檢測出的車牌進(jìn)行識(shí)別。
2.2 第二步:車牌識(shí)別
本文的車牌識(shí)別直接使用的是開源的PaddleOCR檢測模型。地址:https://github.com/PaddlePaddle/PaddleOCR
2.2.1環(huán)境配置
pip install paddlepaddle2.5.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install paddleocr2.7.0.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2.2 模型使用demo
from paddleocr import PaddleOCR, draw_ocr
# Paddleocr目前支持的多語言語種可以通過修改lang參數(shù)進(jìn)行切換
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
cls_model_dir='paddleModels/whl/cls/ch_ppocr_mobile_v2.0_cls_infer'
rec_model_dir='paddleModels/whl/rec/ch/ch_PP-OCRv4_rec_infer'
ocr = PaddleOCR(use_angle_cls=True, lang="ch", det=False,cls_model_dir=cls_model_dir,rec_model_dir=rec_model_dir) # need to run only once to download and load model into memory
img_path = '22.png'
result = ocr.ocr(img_path, cls=True)
license_name, conf = result[0][0][1]
if '·' in license_name:
license_name = license_name.replace('·', '')
print(license_name,conf)
2.2.3加載ocr模型
# 加載ocr模型
cls_model_dir = 'paddleModels/whl/cls/ch_ppocr_mobile_v2.0_cls_infer'
rec_model_dir = 'paddleModels/whl/rec/ch/ch_PP-OCRv4_rec_infer'
ocr = PaddleOCR(use_angle_cls=False, lang="ch", det=False, cls_model_dir=cls_model_dir,rec_model_dir=rec_model_dir)
2.2.4 獲取車牌位置信息
# 所需加載的模型目錄
path = 'models/best.pt'
# 加載預(yù)訓(xùn)練模型
# conf 0.25 object confidence threshold for detection
# iou 0.7 int.ersection over union (IoU) threshold for NMS
model = YOLO(path, task='detect')
# model = YOLO(path, task='detect',conf=0.5)
# 檢測圖片
results = model(img_path)[0]
# 車牌區(qū)域信息
location_list = results.boxes.xyxy.tolist()
2.2.5摳出上述車牌位置
if len(location_list) >= 1:
location_list = [list(map(int, e)) for e in location_list]
# 截取每個(gè)車牌區(qū)域的照片
license_imgs = []
for each in location_list:
x1, y1, x2, y2 = each
cropImg = now_img[y1:y2, x1:x2]
license_imgs.append(cropImg)
cv2.imshow('111',cropImg)
cv2.waitKey(0)
2.2.6使用ocr進(jìn)行車牌識(shí)別
def get_license_result(ocr,image):
"""
image:輸入的車牌截取照片
輸出,車牌號(hào)與置信度
"""
result = ocr.ocr(image, cls=True)[0]
if result:
license_name, conf = result[0][1]
if '·' in license_name:
license_name = license_name.replace('·', '')
return license_name, conf
else:
return None, None
# 車牌識(shí)別結(jié)果
lisence_res = []
conf_list = []
for each in license_imgs:
license_num, conf = get_license_result(ocr, each)
if license_num:
lisence_res.append(license_num)
conf_list.append(conf)
else:
lisence_res.append('無法識(shí)別')
conf_list.append(0)
2.2.7將識(shí)別結(jié)果顯示在圖片上
for text, box in zip(lisence_res, location_list):
now_img = tools.drawRectBox(now_img, box, text, fontC)
2.2.8完整代碼
#coding:utf-8
from ultralytics import YOLO
import cv2
import detect_tools as tools
from PIL import ImageFont
from paddleocr import PaddleOCR
def get_license_result(ocr,image):
"""
image:輸入的車牌截取照片
輸出,車牌號(hào)與置信度
"""
result = ocr.ocr(image, cls=True)[0]
if result:
license_name, conf = result[0][1]
if '·' in license_name:
license_name = license_name.replace('·', '')
return license_name, conf
else:
return None, None
# 需要檢測的圖片地址
img_path = "TestFiles/013671875-93_102-226&489_426&558-426&558_234&546_226&489_417&494-0_0_5_25_33_24_24_33-86-80.jpg"
now_img = tools.img_cvread(img_path)
fontC = ImageFont.truetype("Font/platech.ttf", 50, 0)
# 加載ocr模型
cls_model_dir = 'paddleModels/whl/cls/ch_ppocr_mobile_v2.0_cls_infer'
rec_model_dir = 'paddleModels/whl/rec/ch/ch_PP-OCRv4_rec_infer'
ocr = PaddleOCR(use_angle_cls=False, lang="ch", det=False, cls_model_dir=cls_model_dir,rec_model_dir=rec_model_dir)
# 所需加載的模型目錄
path = 'models/best.pt'
# 加載預(yù)訓(xùn)練模型
# conf 0.25 object confidence threshold for detection
# iou 0.7 int.ersection over union (IoU) threshold for NMS
model = YOLO(path, task='detect')
# model = YOLO(path, task='detect',conf=0.5)
# 檢測圖片
results = model(img_path)[0]
location_list = results.boxes.xyxy.tolist()
if len(location_list) >= 1:
location_list = [list(map(int, e)) for e in location_list]
# 截取每個(gè)車牌區(qū)域的照片
license_imgs = []
for each in location_list:
x1, y1, x2, y2 = each
cropImg = now_img[y1:y2, x1:x2]
license_imgs.append(cropImg)
cv2.imshow('111',cropImg)
cv2.waitKey(0)
# 車牌識(shí)別結(jié)果
lisence_res = []
conf_list = []
for each in license_imgs:
license_num, conf = get_license_result(ocr, each)
if license_num:
lisence_res.append(license_num)
conf_list.append(conf)
else:
lisence_res.append('無法識(shí)別')
conf_list.append(0)
for text, box in zip(lisence_res, location_list):
now_img = tools.drawRectBox(now_img, box, text, fontC)
now_img = cv2.resize(now_img,dsize=None,fx=0.5,fy=0.5,interpolation=cv2.INTER_LINEAR)
cv2.imshow("YOLOv8 Detection", now_img)
cv2.waitKey(0)
以上便是關(guān)于此款智能車牌檢測與識(shí)別系統(tǒng)
的原理與代碼介紹?;诖四P停┲饔?code>python與Pyqt5
開發(fā)了一個(gè)帶界面的軟件系統(tǒng),即文中第二部分的演示內(nèi)容,能夠很好的支持圖片、視頻及攝像頭進(jìn)行檢測,同時(shí)支持檢測結(jié)果的保存
。
關(guān)于該系統(tǒng)涉及到的完整源碼、UI界面代碼、數(shù)據(jù)集、訓(xùn)練代碼、測試圖片視頻等相關(guān)文件,均已打包上傳,感興趣的小伙伴可以通過下載鏈接自行獲取。
【獲取方式】
關(guān)注下方名片G-Z-H:【阿旭算法與機(jī)器學(xué)習(xí)】,發(fā)送【源碼】即可獲取下載方式
本文涉及到的完整全部程序文件:包括python源碼、數(shù)據(jù)集、訓(xùn)練代碼、UI文件、測試圖片視頻等(見下圖),獲取方式見文末:
注意:該代碼基于Python3.9開發(fā),運(yùn)行界面的主程序?yàn)?code>MainProgram.py,其他測試腳本說明見上圖。為確保程序順利運(yùn)行,請(qǐng)按照
程序運(yùn)行說明文檔txt
配置軟件運(yùn)行所需環(huán)境。
關(guān)注下方名片GZH:【阿旭算法與機(jī)器學(xué)習(xí)】,發(fā)送【源碼】即可獲取下載方式
結(jié)束語
以上便是博主開發(fā)的基于YOLOv8深度學(xué)習(xí)的智能車牌檢測與識(shí)別系統(tǒng)
的全部內(nèi)容,由于博主能力有限,難免有疏漏之處,希望小伙伴能批評(píng)指正。
關(guān)于本篇文章大家有任何建議或意見,歡迎在評(píng)論區(qū)留言交流!文章來源:http://www.zghlxwxcb.cn/news/detail-829224.html
覺得不錯(cuò)的小伙伴,感謝點(diǎn)贊、關(guān)注加收藏哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-829224.html
到了這里,關(guān)于基于YOLOv8深度學(xué)習(xí)的智能車牌檢測與識(shí)別系統(tǒng)【python源碼+Pyqt5界面+數(shù)據(jù)集+訓(xùn)練代碼】目標(biāo)檢測、深度學(xué)習(xí)實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!