人工智能綜合項(xiàng)目開發(fā)- 課件 項(xiàng)目八 車牌識(shí)別閘機(jī)控制系統(tǒng)模擬實(shí)驗(yàn)_第1頁(yè)
人工智能綜合項(xiàng)目開發(fā)- 課件 項(xiàng)目八 車牌識(shí)別閘機(jī)控制系統(tǒng)模擬實(shí)驗(yàn)_第2頁(yè)
人工智能綜合項(xiàng)目開發(fā)- 課件 項(xiàng)目八 車牌識(shí)別閘機(jī)控制系統(tǒng)模擬實(shí)驗(yàn)_第3頁(yè)
人工智能綜合項(xiàng)目開發(fā)- 課件 項(xiàng)目八 車牌識(shí)別閘機(jī)控制系統(tǒng)模擬實(shí)驗(yàn)_第4頁(yè)
人工智能綜合項(xiàng)目開發(fā)- 課件 項(xiàng)目八 車牌識(shí)別閘機(jī)控制系統(tǒng)模擬實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論