




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
人工智能綜合項(xiàng)目開發(fā)項(xiàng)目八車牌識(shí)別閘機(jī)控制系統(tǒng)模擬實(shí)驗(yàn)成都職業(yè)技術(shù)學(xué)院項(xiàng)目分析01任務(wù)一車牌識(shí)別模型部署02任務(wù)二閘機(jī)控制系統(tǒng)構(gòu)建03項(xiàng)目八
車牌識(shí)別閘機(jī)控制系統(tǒng)模擬實(shí)驗(yàn)項(xiàng)目分析智慧停車場(chǎng)管理系統(tǒng)首先實(shí)現(xiàn)車牌數(shù)據(jù)采集;然后利用深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)算法進(jìn)行
車牌檢測(cè)和車牌識(shí)別;然后根據(jù)識(shí)別結(jié)果對(duì)閘機(jī)進(jìn)行控制,以及
LCD
屏幕顯示車牌識(shí)別
結(jié)果。學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)數(shù)學(xué)模型基本概念;學(xué)習(xí)損失函數(shù)、優(yōu)化器的基本概念;掌握神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練的基本流程;掌握使用神經(jīng)網(wǎng)絡(luò)解決車牌識(shí)別問(wèn)題的方法;掌握嵌入式系統(tǒng)開發(fā)基本流程。
1.車牌識(shí)別概述車牌識(shí)別系統(tǒng)是計(jì)算機(jī)視頻圖像識(shí)別技術(shù)在車輛牌照識(shí)別中的一種應(yīng)用,能夠?qū)⑦\(yùn)
動(dòng)中的車輛牌照信息(包括漢字字符、英文字母、阿拉伯?dāng)?shù)字及號(hào)牌顏色)從復(fù)雜的背
景中提取并識(shí)別出來(lái),通過(guò)車牌提取、圖像預(yù)處理、特征提取、車牌字符識(shí)別等技術(shù),
識(shí)別車輛牌號(hào)、顏色等信息。目前對(duì)車牌的字母和數(shù)字的識(shí)別率均可達(dá)到
99%以上。根據(jù)應(yīng)用條件和要求的不同,車牌識(shí)別產(chǎn)品也有多種類型。從實(shí)現(xiàn)模式來(lái)說(shuō),分為
軟識(shí)別和硬識(shí)別兩種。軟識(shí)別即車牌識(shí)別軟件,基本是安裝的
PC
端、服務(wù)器端,前端硬件設(shè)備采集視頻或
抓拍圖片,傳輸?shù)胶蠖藥в凶R(shí)別軟件識(shí)別端進(jìn)行識(shí)別,這種技術(shù)多數(shù)應(yīng)用在前期模擬相
機(jī)時(shí)代停車場(chǎng),高速公路,電子警察,但這種方式對(duì)分析端要求較高,如中間傳輸出現(xiàn)
中斷或者后端出現(xiàn)重啟情況,就無(wú)法實(shí)時(shí)進(jìn)行識(shí)別。特別是在一些小型場(chǎng)景,比如停車
場(chǎng),加油站,新能源電動(dòng)車充電站內(nèi),PC
在崗?fù)せ蛘邫C(jī)房,經(jīng)常由于溫度、潮濕等條件
影響,也會(huì)存在不穩(wěn)定情況;另外在特定場(chǎng)景,由于天氣、復(fù)雜環(huán)境、角度影響,識(shí)別率遲遲達(dá)不到很高標(biāo)準(zhǔn),所以軟識(shí)別已經(jīng)很少使用。硬識(shí)別即前端實(shí)現(xiàn)視頻圖像采集處理,自動(dòng)補(bǔ)光,自適應(yīng)各種復(fù)雜環(huán)境,車輛號(hào)碼
自動(dòng)識(shí)別并輸出一體化設(shè)備,這種模式采用嵌入式技術(shù),把深度學(xué)習(xí)算法植入到專用攝
像機(jī)硬件中。具有運(yùn)算速度快、器件體積小、穩(wěn)定性強(qiáng),自適應(yīng)強(qiáng)等特點(diǎn)。當(dāng)前,車牌識(shí)別技術(shù)已經(jīng)廣泛應(yīng)用于停車管理、稱重系統(tǒng)、靜態(tài)交通車輛管理、公
路治超、公路稽查、車輛調(diào)度、車輛檢測(cè)等各種場(chǎng)合,對(duì)于維護(hù)交通安全和城市治安,
防止交通堵塞,實(shí)現(xiàn)交通自動(dòng)化管理有著現(xiàn)實(shí)的意義。車牌識(shí)別技術(shù)是智慧停車場(chǎng)系統(tǒng)中的重要組成部分。本次智慧停車場(chǎng)管理的第一個(gè)
任務(wù)就是車牌識(shí)別模型部署,如圖
8.0-1
所示的車牌識(shí)別系統(tǒng)開發(fā)流程圖中,獲取到車
牌圖像后就進(jìn)行車牌識(shí)別模型部署任務(wù)。圖
8.0-1
車牌識(shí)別系統(tǒng)開發(fā)流程圖其中車牌識(shí)別模型部署主要分為三個(gè)步驟實(shí)現(xiàn),首先提取出圖像中的車牌大致位置;
然后再利用透視變換和垂直精細(xì)繪圖提取出車牌的精確位置;最后利用
OCR(Optical
Character
Recognition)字符識(shí)別方法識(shí)別出車牌號(hào)并輸出。車牌提取詳細(xì)流程如圖
8.0-2
所示。圖
8.0-2
車牌提取詳細(xì)流程圖2.閘機(jī)控制系統(tǒng)概述實(shí)現(xiàn)車牌識(shí)別之后就可以確定是否放行然后控制道閘打開或者關(guān)閉。閘機(jī)控制系統(tǒng)
流程如圖
8.0-3
所示:圖
8.0-3
閘機(jī)控制系統(tǒng)流程圖閘機(jī)系統(tǒng)底層功能實(shí)現(xiàn)結(jié)構(gòu)分析流程圖如圖
8.0-4
所示,識(shí)別到車牌信息后,通過(guò)
WiFi
通信協(xié)議將識(shí)別結(jié)果發(fā)送給智能節(jié)點(diǎn)核心控制板,智能節(jié)點(diǎn)核心控制板再通過(guò)串口
控制舵機(jī)執(zhí)行器開啟,同時(shí)語(yǔ)音識(shí)別模塊自動(dòng)播報(bào)閘機(jī)狀態(tài)及識(shí)別的車牌和車位數(shù)信息。
LCD
顯示屏將識(shí)別的車牌號(hào)和車位數(shù)量信息進(jìn)行顯示。智能節(jié)點(diǎn)核心控制板再將底層實(shí)現(xiàn)
的功能數(shù)據(jù)通過(guò)
WiFi
通信協(xié)議上傳。圖
8.0-4
閘機(jī)系統(tǒng)底層功能實(shí)現(xiàn)結(jié)構(gòu)分析流程圖任務(wù)一
車牌識(shí)別模型部署(1)車牌粗定位首先對(duì)車牌進(jìn)行初步檢測(cè)定位,檢測(cè)出車牌的大致位置。對(duì)圖像進(jìn)行一些插補(bǔ)和調(diào)
整圖像大小比例,然后核心的部分就是
cascade
級(jí)聯(lián)分類器的應(yīng)用。這里的級(jí)聯(lián)分類器
是基于
Haar+Adaboost
構(gòu)成的,也即
cascade.xml
文件,該文件存放了一些車牌的
Haar
特征。在這里我們采用了
cascade.xml
檢測(cè)模型,然后使用
OpenCV
的
detectMultiscale的方法來(lái)對(duì)圖像進(jìn)行滑動(dòng)窗口遍歷尋找車牌,實(shí)現(xiàn)車牌的粗定位。
#
實(shí)現(xiàn)車牌粗定位watch_cascade
=
cv2.CascadeClassifier("cascade.xml")
#
加載車牌檢測(cè)的級(jí)聯(lián)分類器#
獲取車牌粗定位區(qū)域。image_gray:灰度圖。def
detectPlateRough(watch_cascade,
image_gray,
resize_h=720,
en_scale=1.08,
top_bottom_padding_rate=0.05):if
top_bottom_padding_rate
>
0.2:print("error:top_bottom_padding_rate
>
0.2:",
top_bottom_padding_rate)exit(1)height
=
image_gray.shape[0]padding
=
int(height
*
top_bottom_padding_rate)scale
=
image_gray.shape[1]
/
float(image_gray.shape[0])image
=
cv2.resize(image_gray,
(int(scale*resize_h),
resize_h))image_color_cropped
=
image[padding:resize_h-padding,
0:image_gray.shape[1]]image_gray
=
cv2.cvtColor(image_color_cropped,
cv2.COLOR_RGB2GRAY)5#
滑動(dòng)窗口遍歷尋找車牌watches
=
watch_cascade.detectMultiScale(image_gray,
en_scale,
2,
minSize=(36,
9),
maxSize=(36*40,
9*40))cropped_images
=
[]for
(x,
y,
w,
h)
in
watches:#
從圖形中剪裁車牌區(qū)域cropped_origin
=
cropped_from_image(image_color_cropped,
(int(x),
int(y),
int(w),
int(h)))x
-=
w
*
0.14w
+=
w
*
0.28y
-=
h
*
0.6h
+=
h
*
1.1
其中
detectMultiscale()函數(shù)為多尺度多目標(biāo)檢測(cè)。多尺度通常搜索目標(biāo)的模板尺
寸大小是固定的,但不同圖片大小不同,目標(biāo)對(duì)象的大小也是不定的,因此多尺度即不
斷縮放圖片大小(縮放到與模板匹配),通過(guò)模板滑動(dòng)窗函數(shù)搜索匹配。同一幅圖片可
能在不同尺度下都得到匹配值,所以多尺度檢測(cè)函數(shù)
detectMultiscale()是多尺度合并
的結(jié)果。因此
cascade.xml
這個(gè)文件是通過(guò)很多的正樣本車牌圖片和負(fù)樣本非車牌圖片轉(zhuǎn)換
的
cascade.xml
文件,其中的
Haar
特征數(shù)據(jù)已經(jīng)過(guò)
Adaboost
處理。通過(guò)這個(gè)
xml
文件就
可以訓(xùn)練出一個(gè)級(jí)聯(lián)分類器,該分類器的判別車牌標(biāo)準(zhǔn)是通過(guò)計(jì)算大量車牌特征后得出
的一個(gè)閾值,大于這個(gè)閾值判別為車牌,否則判別為非車牌,如圖
8.0-1
所示。通過(guò)該
方法就得到了圖像中車牌的粗定位。cropped
=
cropped_from_image(image_color_cropped,
(int(x),
int(y),
int(w),
int(h)))#
將找到的所有車牌存放入列表cropped_images.append([cropped,
[x,
y+padding,
w,
h],
cropped_origin])return
cropped_images
#
返回車牌位置圖
8.0-1
車牌檢測(cè)判定示意圖粗定位后的圖像如圖
8.0-2
所示:圖
8.0-2
車牌粗定位(2)車牌精定位對(duì)車牌進(jìn)行粗定位后,再對(duì)車牌進(jìn)行精定位。這里的精定位其實(shí)就是切掉原來(lái)粗定
位后車牌的多余部分,這里使用首先使用透視變換矯正車牌位置,然后調(diào)用
tflite
模型實(shí)現(xiàn)垂直精細(xì)繪圖方法輸出車牌精定位。使用
OpenCV
的
getPerspectiveTransform()和
warpPerspective()函數(shù)實(shí)現(xiàn)透視變換,矯正圖像中的車牌位置。#
透視變換實(shí)現(xiàn)車牌矯正def
findContoursAndDrawBoundingBox(image_rgb):line_upper
=
[]line_lower
=
[]line_experiment
=
[]gray_image
=
cv2.cvtColor(image_rgb,cv2.COLOR_BGR2GRAY)for
k
in
np.linspace(-50,
0,
15):binary_niblack
=
cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,17,k)
#
自適應(yīng)閾值二值化contours,
hierarchy
=
cv2.findContours(binary_niblack.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for
contour
in
contours:bdbox
=
cv2.boundingRect(contour)if
(bdbox[3]/float(bdbox[2])>0.7
and
bdbox[3]*bdbox[2]>100
and
bdbox[3]*bdbox[2]<1200)
line_upper.append([bdbox[0],bdbox[1]])
line_lower.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])
line_experiment.append([bdbox[0],bdbox[1]])
line_experiment.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])rgb
=
cv2.copyMakeBorder(image_rgb,30,30,0,0,cv2.BORDER_REPLICATE)
#
邊緣填充
leftyA,
rightyA
=
fitLine_ransac(np.array(line_lower),
3)leftyB,
rightyB
=
fitLine_ransac(np.array(line_upper),
-3)or
(bdbox[3]/float(bdbox[2])>3
and
bdbox[3]*bdbox[2]<100):rows,cols
=
rgb.shape[:2]pts_map1
=
np.float32([[cols
-
1,
rightyA],
[0,
leftyA],
[cols
-
1,
rightyB],
[0,
leftyB]])pts_map2
=
np.float32([[136,36],[0,36],[136,0],[0,0]])mat
=
cv2.getPerspectiveTransform(pts_map1,pts_map2)
#
透視變換image
=
cv2.warpPerspective(rgb,mat,(136,
36),flags=cv2.INTER_CUBIC)
#
透視變換image,
M
=
fastDeskew(image)
#
圖像矯正return
image
#
返回矯正后的圖像矯正后的圖像如圖
8.0-3
所示:圖
8.0-3
車牌矯正調(diào)用
tflite
模型實(shí)現(xiàn)垂直精細(xì)繪圖方法輸出車牌精定位。#
加載
tflite
模型class
TfliteRun:def
init
(self,
model_name="model12",
model_path=POSENET_MODEL):"""model_name:
模型名稱model_path:
模型路徑"""erpreter
=
tflite.Interpreter(model_path=model_path)
#
讀取模型self.interpreter.allocate_tensors()
self.model_name
=
model_name#
分配張量#
獲取輸入層和輸出層維度self.input_details
=
erpreter.get_input_details()
self.output_details
=
erpreter.get_output_details()#
實(shí)現(xiàn)模型推理
def
inference(self,
img):input_data
=
img
self.interpreter.set_tensor(self.input_details[0]['index'],
input_data)
erpreter.invoke()
#
模型推理output_data1
=
erpreter.get_tensor(self.output_details[0]['index'])
#
獲取輸出層數(shù)據(jù)
return
output_data1#
模型推理class
model12Rec(object):def
init
(self,
model_path=L12REC_PATH):self.tflite_run
=
TfliteRun(model_path=model_path)
#
加載
tflite
模型
def
imgPreprocessing(self,
img):resized
=
cv2.resize(img,
(66,
16))
resized
=
resized.astype(np.float32)
/
255
resized
=
resized[np.newaxis,
:]return
resized
def
inference(self,
img):img
=
self.imgPreprocessing(img)
#
圖片預(yù)處理
return
self.tflite_run.inference(img)[0]
#
模型推理#
定義垂直精細(xì)繪圖函數(shù)def
finemappingVertical(res,
image):
print("keras_predict",
res)res
=
res*image.shape[1]
res
=
res.astype(16)
H,T
=
res
H
-=
3if
H
<
0:
H
=
0T
+=
2if
T
>=
image.shape[1]-1:
T
=
image.shape[1]-1image
=
image[0:35,
H:T+2]image
=
cv2.resize(image,
(int(136),
int(36)))
return
image
#
返回車牌精定位圖片model12_rec
=
model12Rec("model12.tflite")plate
=
finemappingVertical(self.model12_rec.inference(plate),
plate)
#
輸入矯正后的車牌,調(diào)用模型實(shí)現(xiàn)垂直精細(xì)繪圖,輸出車牌精定位。精定位后的圖像如圖
8.0-4
所示:圖
8.0-4
車牌精定位(3)車牌識(shí)別實(shí)現(xiàn)確定好車牌的位置后,對(duì)該車牌字符信息進(jìn)行識(shí)別,最終輸出車牌號(hào)。車牌字符信
息識(shí)別采用
OCR
字符識(shí)別技術(shù),也就是在不分割字符的前提下能夠識(shí)別出車牌一共七個(gè)
字符。傳統(tǒng)的車牌字符識(shí)別就是先分割字符然后再逐一使用分類算法進(jìn)行識(shí)別。不分割
字符直接識(shí)別方式的優(yōu)點(diǎn)就是僅需要較少的字符樣本即可用于分類器的訓(xùn)練。目前大多
數(shù)商業(yè)車牌識(shí)別軟件采用的就是這種方法。如果在某些惡劣的自然情況下,車牌字符的
分割和識(shí)別就變得尤其困難,傳統(tǒng)的方法并不能取得很好的結(jié)果,這時(shí)候也可以采用整
體識(shí)別方式。通常車牌由七個(gè)字符組成,就可以采用多標(biāo)簽分類的方法直接輸出多個(gè)標(biāo)
簽,如圖
8.0-5
所示:
圖
8.0-5
車牌識(shí)別多標(biāo)簽分類輸出示例輸入車牌精定位圖片,加載
OCR
字符識(shí)別模型返回字符識(shí)別結(jié)果。import
onnxruntime
as
ort#
加載
ONNX
模型,識(shí)別字符
class
OnnxRun:def
init
(self,
model_name="ocr_rec",
model_path="ocr_rec.onnx"):
"""model_name:
模型名稱
model_path:
模型路徑
"""self.model_name
=
model_nameself.ort_session
=
ort.InferenceSession(model_path)
self.input_name
=
self.ort_session.get_inputs()[0].name
input
=
self.ort_session.get_inputs()output
=
self.ort_session.get_outputs()#
模型推理
def
inference(self,
img):input_data
=
imgreturn
self.ort_session.run(None,
{self.input_name:
input_data})加載字符標(biāo)簽文件解析
OCR
字符識(shí)別模型推理結(jié)果,輸出車牌字符。
class
ProcessPred(object):#
獲取字符識(shí)別標(biāo)簽文件def
init
(self,
character_dict_path=None,
character_type='ch',
use_space_char=False):
self.character_str
=
''with
open(character_dict_path,
'rb')
as
fin:
lines
=
fin.readlines()for
line
in
lines:line
=
line.decode('utf-8').strip('\n').strip('\r\n')self.character_str
+=
lineif
use_space_char:self.character_str
+=
'
'dict_character
=
list(self.character_str)dict_character
=
self.add_special_char(dict_character)self.dict
=
{}for
i,
char
in
enumerate(dict_character):self.dict[char]
=
iself.character
=
dict_characterdef
add_special_char(self,
dict_character):dict_character
=
['blank']
+
dict_characterreturn
dict_character最后返回車牌識(shí)別結(jié)果,如圖
8.0-6
所示:圖
8.0-6
車牌識(shí)別結(jié)果任務(wù)二
閘機(jī)控制系統(tǒng)構(gòu)建1.系統(tǒng)硬件模塊在閘機(jī)系統(tǒng)中,采用了智能節(jié)點(diǎn)核心控制板、舵機(jī)執(zhí)行器、LCD
顯示屏、語(yǔ)音識(shí)別模塊攝像頭等硬件模塊。1)智能節(jié)點(diǎn)核心控制板:主要實(shí)現(xiàn)與項(xiàng)目軟件部分進(jìn)行通信,獲取車牌識(shí)別結(jié)果并將閘機(jī)狀態(tài)上傳,同時(shí)通
過(guò)串口控制舵機(jī)執(zhí)行器開關(guān),控制
LCD
顯示屏顯示車牌號(hào)等功能。2)舵機(jī)執(zhí)行器:舵機(jī)是一種位置(角度)伺服的驅(qū)動(dòng)器,適用于一些需要角度不斷變化并可以保持
的控制系統(tǒng)。舵機(jī)實(shí)際上是一種俗稱,其是一種伺服馬達(dá)。舵機(jī)
SG90
有三根線控制。暗灰色線為
GND,地線;紅色線為
VCC,電源線,工作電壓
為
4.8~7.2V,通常情況下使用+5V
做電源電壓;橙黃色線為控制線,通過(guò)該線輸入脈沖
信號(hào),從而控制舵機(jī)轉(zhuǎn)動(dòng),其轉(zhuǎn)動(dòng)角度為
180°。3)LCD
顯示屏:TFT-LCD
即薄膜晶體管液晶顯示器。主要實(shí)現(xiàn)車牌號(hào)和車位數(shù)顯示功能。2.基于車牌識(shí)別的道閘控制系統(tǒng)
1)車牌識(shí)別功能插件構(gòu)建實(shí)現(xiàn)第一個(gè)功能插件,車牌圖像獲取功能插件。調(diào)用攝像頭獲取車牌圖像,獲取車
牌識(shí)別結(jié)果消息隊(duì)列,并調(diào)用函數(shù)實(shí)現(xiàn)車牌識(shí)別結(jié)果繪制。class
VideoThread(threading.Thread):def
init
(self,
camera="0",
q_flask:Queue=None,q_img:Queue=None,
q_rec:Queue=None,
q_send=None,
full_dict=None):
threading.Thread.
init
(self)self.cap
=
setCamera(camera)
#
網(wǎng)絡(luò)攝像頭
self.q_flask
=
q_flaskself.full_dict
=
full_dictself.embd_drive
=
EmbdDrive(q_send=q_send)def
run(self):
pricet
=
[]
while
True:if
self.cap
!=
"":ret,
frame
=
self.cap.read()#
調(diào)用攝像頭,獲取車牌圖像幀frame
=
cv2.resize(frame,
(ai_cfg.CAM_WIDTH,
ai_cfg.CAM_HEIGHT))self.q_img
=
q_img
self.q_rec
=
q_rec#
消息隊(duì)列傳遞原始圖像到識(shí)別插件
#
消息隊(duì)列傳遞
AI
模型的推理結(jié)果#
原始圖像傳遞if
not
self.q_img.full()
and
not
frame
is
None:self.q_img.put(bytearray(frame))if
not
self.q_rec.empty():pricet
=
self.q_rec.get()
#
獲取車牌識(shí)別結(jié)果消息隊(duì)列frame,
lpr_strs
=
recImgDis(frame,
pricet)
#
車牌識(shí)別結(jié)果繪制self.embd_drive.gatePlate(lpr_strs[0])self.full_dict[config.PLATE_STR]
=
lpr_strs[0]log.info(lpr_strs)#
傳遞結(jié)果繪制圖像if
not
self.q_flask.full()
and
not
frame
is
None:self.q_flask.put(bytearray(frame))2)車牌識(shí)別模型推理功能插件實(shí)現(xiàn)。獲取待識(shí)別車牌圖像,調(diào)用車牌識(shí)別函數(shù)實(shí)現(xiàn)車牌識(shí)別,并將識(shí)別結(jié)果傳遞到消息隊(duì)列。class
FaceMaskRecThread(threading.Thread):def
init
(self,
q_img:Queue=None,
q_rec:Queue=None):threading.Thread.
init
(self)self.q_img
=
q_img
self.q_rec
=
q_rec#
消息隊(duì)列傳遞原始圖像到識(shí)別插件
#
消息隊(duì)列傳遞
AI
模型的推理結(jié)果self.face_detect_rec
=
LicensePlateRec(detect_path=ai_cfg.PLATE_DETECT_PATH,
ocr_rec_path=ai_cfg.PLATE_OCR_PATH,
ocr_keys_path=ai_cfg.OCR_KEYS_PATH,
l12_path=ai_cfg.L12REC_PATH)def
run(self):while
True:if
self.q_img.empty():continueelse:image
=
self.q_img.get()
#
獲取當(dāng)前圖片幀if
image
!=
False:image
=
np.array(image).reshape(ai_cfg.CAM_HEIGHT,
ai_cfg.CAM_WIDTH,
3)else:breakface_detect_pricet
=
self.face_detect_rec.inference(image)
#
調(diào)用車牌識(shí)別模型推理函數(shù)if
self.q_rec.full():continueelse:self.q_rec.put(face_detect_pricet)
#
傳遞識(shí)別結(jié)果
q_rec
消息隊(duì)列然后定義車牌識(shí)別模型推理函數(shù),輸入待識(shí)別車輛圖像,然后調(diào)用車牌檢測(cè)級(jí)聯(lián)分類器模型提取車牌圖像,再對(duì)提取出的車牌圖像進(jìn)行矯正和精提取,最后調(diào)用
OCR
字符識(shí)別模型和字符標(biāo)簽文件輸出車牌號(hào)。class
LicensePlateRec(object):def
init
(self,
detect_path=PLATE_DETECT_PATH,
#
車牌檢測(cè)級(jí)聯(lián)分類器ocr_rec_path=PLATE_OCR_PATH,#
OCR
字符識(shí)別模型ocr_keys_path=OCR_KEYS_PATH,#
字符標(biāo)簽文件l12_path
=
L12REC_PATH):
#
加載車牌檢測(cè)的級(jí)聯(lián)分類器#
車牌精定位模型self.watch_cascade
=
cv2.CascadeClassifier(detect_path)
self.model12_rec
=
model12Rec(l12_path)self.onnx_run
=
OnnxRun(model_path=ocr_rec_path)
self.postprocess_op
=
ProcessPred(ocr_keys_path,
'ch',
True)
self.predictions
=
[]#
輸入數(shù)據(jù)預(yù)處理函數(shù)
def
imgPreprocessing(self,
img):h,
w
=
img.shape[:2]
max_wh_ratio
=
w
*
1.0
/
himgC,
imgH,
imgW
=
[int(v)
for
v
in
"3,
32,
100".split(",")]assert
imgC
==
img.shape[2]
imgW
=
int((32
*
max_wh_ratio))
h,
w
=
img.shape[:2]ratio
=
w
/
float(h)
if
math.ceil(imgH
*
ratio)
>
imgW:resized_w
=
imgW
else:resized_w
=
int(math.ceil(imgH
*
ratio))resized_image
=
cv2.resize(img,
(resized_w,
imgH)).astype('float32')
resized_image
=
resized_image.transpose((2,
0,
1))
/
255resized_image
-=
0.5
resized_image
/=
0.5padding_im
=
np.zeros((imgC,
imgH,
imgW),
dtype=np.float32)padding_im[:,
:,
0:resized_w]
=
resized_image
padding_im
=
padding_im[np.newaxis,
:]return
padding_im
#
車牌識(shí)別
def
inference(self,
img):lpr_strs
=
[]
boxs
=
[]#
車牌區(qū)域提取images
=
detectPlateRough(self.watch_cascade,
img,
img.shape[0],
top_bottom_padding_rate=0.1)for
i,
plate
in
enumerate(images):plate,
rect,
origin_plate
=
plate
#
邊距填充后的車牌、車牌坐標(biāo)、原始車牌圖片
plate
=
cv2.resize(plate,
(136,
36
*
2))plate
=
findContoursAndDrawBoundingBox(plate)
#
車牌位置字符較正plate
=
finemappingVertical(self.model12_rec.inference(plate),
plate)
#
垂直精細(xì)繪圖
plate
=
finemappingVertical(self.model12_rec.inference(plate),
plate)
#
垂直精細(xì)繪圖
input_data
=
self.imgPreprocessing(plate)
#
輸入數(shù)據(jù)預(yù)處理ocr_rec
=
self.onnx_run.inference(input_data)
#
字符識(shí)別模型推理#
調(diào)用字符標(biāo)簽文件解析車牌字符識(shí)別模型輸出結(jié)果
lpr_str
=
self.postprocess_op(ocr_rec[0])[0]boxs.append(rect)
#
獲取車牌位置lpr_strs.append(lpr_str[0])
#
獲取車牌識(shí)別結(jié)果self.predictions
=
[lpr_strs,
boxs]
#
返回車牌號(hào)和車牌位置
return
self.predictions識(shí)別到車牌后,將識(shí)別結(jié)果傳遞到
q_rec
識(shí)別結(jié)果消息隊(duì)列,車牌圖像獲取線程就
會(huì)對(duì)識(shí)別結(jié)果進(jìn)行繪制。根據(jù)返回的車牌位置坐標(biāo),利用
OpenCV
繪制出矩形框?qū)④嚺瓶?/p>
選出,再將車牌號(hào)顯示到矩形框上方,從而實(shí)現(xiàn)車牌識(shí)別結(jié)果的可視化顯示。
#
繪制識(shí)別結(jié)果def
recImgDis(img,
process_pred,
font_path=False):lpr_strs
=
[]if
process_pred:lpr_strs,
boxs
=
process_predfor
i,
rect
in
enumerate(boxs):cv2.rectangle(img,
(int(rect[0]),
int(rect[1])),(int(rect[0]
+
rect[2]),
int(rect[1]
+
rect[3])),(0,
0,
255),
2,
cv2.LINE_AA)cv2.rectangle(img,
(int(rect[0]
-
1),
int(rect[1])
-
16),(int(rect[0]
+
115
+
50),
int(rect[1])),(0,
0,
255),
-1,
cv2.LINE_AA)if
font_path:img
=
putText(img,
str(lpr_strs[i]),org=(int(rect[0]+1),
int(rect[1]-16)),font_path=FONT_PATH)else:img
=
putText(img,
str(lpr_strs[i]),
org=(int(rect[0]+1),
int(rect[1]-16)))if
not
lpr_strs:
識(shí)別效果如圖
8.11
所示:圖
8.11
車牌識(shí)別任務(wù)(2)道閘控制系統(tǒng)功能插件構(gòu)建最后實(shí)現(xiàn)嵌入式設(shè)備數(shù)據(jù)傳遞插件,將車牌識(shí)別結(jié)果以及閘機(jī)控制指令傳遞給閘機(jī)
控制系統(tǒng)。識(shí)別到車牌后不能直接將字符識(shí)別結(jié)果傳遞到道閘控制系統(tǒng),需要將字符識(shí)別結(jié)果
進(jìn)行轉(zhuǎn)換后再發(fā)送給道閘控制系統(tǒng)。
lpr_strs.append("")return
img,
lpr_strs#
嵌入式系統(tǒng)控制指令轉(zhuǎn)換def
gatePlate(self,
plt="京
1_+23)(456"):#
清除字母數(shù)字之外的所有字符
plate
=
re.sub("\W",
"",
plt)plate
=
re.sub("_",
"",
plate)
try:if
len(plate)
<
7:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 系統(tǒng)管理師考前準(zhǔn)備清單試題及答案
- 藥劑科研能力提升試題及答案
- 池館英語(yǔ)試題及答案
- 山東二建市政試題及答案
- 激光工程師職業(yè)道德與行業(yè)發(fā)展研究試題及答案
- 數(shù)學(xué)人教版2 百分?jǐn)?shù)(二)折扣教案及反思
- 量具使用規(guī)范培訓(xùn)
- 新疆烏魯木齊初中體育 第五周《技巧:前滾翻、后滾翻》教學(xué)設(shè)計(jì) 人教新課標(biāo)版
- 用字母表示簡(jiǎn)單的數(shù)量關(guān)系(教學(xué)設(shè)計(jì))-2024-2025學(xué)年數(shù)學(xué)五年級(jí)上冊(cè)蘇教版
- 非營(yíng)利組織工傷處理流程探討
- 河北省唐山市路北區(qū)2023-2024學(xué)年八年級(jí)下學(xué)期4月期中物理試題
- 幼兒園中班韻律《阿凡提尋寶記》課件
- 海面之下:海洋生物形態(tài)圖鑒
- 手衛(wèi)生與無(wú)菌操作
- 質(zhì)量經(jīng)理能力培訓(xùn)課件
- 《辦公室用語(yǔ)》課件
- 光伏并網(wǎng)前單位工程驗(yàn)收?qǐng)?bào)告-2023
- 中國(guó)特色社會(huì)主義理論與實(shí)踐復(fù)習(xí)資料-研究生
- 除濕防潮施工方案
- 基于PLC的自動(dòng)化立體倉(cāng)庫(kù)控制系統(tǒng)設(shè)計(jì)
- 高速公路施工安全培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論