本篇文章以Yolov5+圖像分割+調(diào)用百度AI的接口實(shí)現(xiàn)車(chē)牌實(shí)時(shí)監(jiān)測(cè)識(shí)別的效果,識(shí)別效果非常優(yōu)秀。
01 Yolov5介紹
YOLOv5算法整體主要有3部分組成:Backbone、Neck和Prediction,以 YOLOv5s模型為例整體算法結(jié)構(gòu)如下所示。Backbone主要有Conv,C3和SPPF基本網(wǎng)絡(luò)模塊組成,其主要功能就是提取圖像特征信息,C3模塊使用殘差網(wǎng)絡(luò)結(jié)構(gòu),可以學(xué)習(xí)到更多的特征信息,SPPF模塊是空間金字塔池化,也是Backbone網(wǎng)絡(luò)的輸出端,主要功能是將提取到的任意大小的特征信息轉(zhuǎn)換成固定大小的特征向量。Neck網(wǎng)絡(luò)采用FPN+ PAN的特征金字塔結(jié)構(gòu)網(wǎng)絡(luò),可以實(shí)現(xiàn)不同尺寸目標(biāo)特征信息的傳遞,可以有效解決多尺度問(wèn)題。Prediction采用3種損失函數(shù)分別計(jì)算目標(biāo)分類(lèi)損失,目標(biāo)定位損失和置信度損失,并通過(guò)NMS提高網(wǎng)絡(luò)檢測(cè)的準(zhǔn)確度。 模型默認(rèn)輸入圖像尺寸大小為640×640的3通道圖像,最終輸出格式是 3×(5+ncls),ncls表示目標(biāo)檢測(cè)分類(lèi)數(shù)量。
YOLO算法從總體上看,是單階段端到端的基于anchor-free的檢測(cè)算法。將圖片輸入網(wǎng)絡(luò)進(jìn)行特征提取與融合后,得到檢測(cè)目標(biāo)的預(yù)測(cè)框位置以及類(lèi)概率。而YOLOv5相較前幾代YOLO算法,模型更小、部署靈活且擁有更好的檢測(cè)精度和速度,適合實(shí)時(shí)目標(biāo)檢測(cè)。YOLOv5根據(jù)模型不同深度和不同特征圖寬度劃分為YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四個(gè)模型。其中YOLOv5s是最小的模型,本文車(chē)牌檢測(cè)既是用YOLOv5s模型。02 圖像分割圖像分割就是把圖像分成若干個(gè)特定的、具有獨(dú)特性質(zhì)的區(qū)域并提出感興趣目標(biāo)的技術(shù)和過(guò)程。它是由圖像處理到圖像分析的關(guān)鍵步驟?,F(xiàn)有的圖像分割方法主要分以下幾類(lèi):基于閾值的分割方法、基于區(qū)域的分割方法、基于邊緣的分割方法以及基于特定理論的分割方法等。從數(shù)學(xué)角度來(lái)看,圖像分割是將數(shù)字圖像劃分成互不相交的區(qū)域的過(guò)程。圖像分割的過(guò)程也是一個(gè)標(biāo)記過(guò)程,即把屬于同一區(qū)域的像素賦予相同的編號(hào)。主要是用opencv進(jìn)行矩陣切割,img = cv2.imread(‘圖片.jpg’)dst = img[num1:num2,num3:num4] #裁剪坐標(biāo)為[y0:y1, x0:x1]我們看一個(gè)demo,還記得我們之前寫(xiě)的算法嗎?我們進(jìn)行一下改進(jìn),之前的效果是:我們將代碼優(yōu)化一下,不僅要在原圖上用紅框標(biāo)記出來(lái),而且要切割出來(lái)。代碼如下:
import cv2 as cv
def face_detect_demo(img):
img = cv.resize(img, dsize=(800, 800))
gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
face_detect = cv.CascadeClassifier(“D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml”)
face = face_detect.detectMultiScale(gary, 1.004, 28, 0, (40, 40), (50, 50))
count = 1
for x, y, w, h in face:
cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 225), thickness=4)
dst = img[y:y + h, x:x + w]
# cv.imshow(“demo”,dst)
cv.imwrite(“temp/face_{0}.jpg”.format(count), dst)
count += 1
cv.imshow(“result”, img)
# img.save(“result.jpg”) # 保存圖片
cv.imwrite(r“final_result.jpg”, img)
img = cv.imread(“photo.jpg”)
face_detect_demo(img) # 檢測(cè)單個(gè)圖片
while True:
if ord(“q”) == cv.waitKey(1):
break
cv.destroyAllWindows()
03 百度AI百度智能云AR開(kāi)放平臺(tái)提供領(lǐng)先的AR技術(shù)能力與一站式平臺(tái)工具,開(kāi)放感知跟蹤、人機(jī)交互等40+技術(shù)能力。它提供了很多技術(shù)的接口,比如說(shuō)人臉識(shí)別,文字識(shí)別,語(yǔ)言識(shí)別等等。
這次我們通過(guò)調(diào)用文字識(shí)別的接口,用來(lái)識(shí)別我們本地圖片上的文字,詳細(xì)教程可以看這位博主的:百度AI調(diào)接口教程。對(duì)了,大家記得領(lǐng)一下百度免費(fèi)送的優(yōu)惠,要不然程序運(yùn)行會(huì)報(bào)錯(cuò),別問(wèn)我怎么知道的,問(wèn)就是搞了兩個(gè)半小時(shí)總結(jié)出來(lái)的。這個(gè)過(guò)程可以理解為調(diào)用百度文字識(shí)別這個(gè)函數(shù),傳入本地的一張圖片,它可以返回本地圖片上的文字。只不過(guò)這個(gè)函數(shù)不是內(nèi)置的,需要你去配置才能夠使用。代碼如下:
# 測(cè)試百度在線圖片文本識(shí)別包
# 導(dǎo)入百度的OCR包
from aip import AipOcr
if __name__ == “__main__”:
# 此處填入在百度云控制臺(tái)處獲得的appId, apiKey, secretKey的實(shí)際值
appId, apiKey, secretKey = [‘28509942’, ‘HbB3GChFwWENkXEI7uCuNG5V’, ‘IRnFhizLzlXnYFiNoq3VcyLxRHaj2dZU’]
# 創(chuàng)建ocr對(duì)象
ocr = AipOcr(appId, apiKey, secretKey)
with open(‘D:/cartarget/result_1.png’, ‘rb’) as fin:
img = fin.read()
res = ocr.basicGeneral(img)
print(res[‘words_result’][0][‘words’])
這里的appId, apiKey, secretKey需要更換成自己的,圖片檢測(cè)的位置也要換成自己的。我是要下載SDK運(yùn)行的,你們也可以試試別的方法。
04 Yolov5+圖片分割+百度AI車(chē)牌實(shí)時(shí)檢測(cè)識(shí)別系統(tǒng)4.1 流程圖Visio淺淺畫(huà)了一個(gè)流程圖,用來(lái)表達(dá)整個(gè)項(xiàng)目的邏輯:
4.2 數(shù)據(jù)集下載首先是數(shù)據(jù)集下載,我用的是CCPD2020的數(shù)據(jù)集,CCPD2020數(shù)據(jù)集采集方法應(yīng)該CCPD2019數(shù)據(jù)集類(lèi)似。CCPD2020僅僅有新能源車(chē)牌圖片,包含不同亮度,不同傾斜角度,不同天氣環(huán)境下的車(chē)牌。CCPD2020中的圖像被拆分為train/val/test數(shù)據(jù)集,train/val/test數(shù)據(jù)集中圖片數(shù)分別為5769/1001/5006。
我用的時(shí)候取了100張train,80張val和20張test。
4.3 Yolov5模型訓(xùn)練然后是Yolov5模型的訓(xùn)練,詳細(xì)代碼還是看之前那篇口罩檢測(cè)的文章吧,配置文件只要改這幾個(gè)。1、數(shù)據(jù)集的配置文件:mask_data.yaml:
修改train的路徑 注意是 /(反斜杠)
修改val的路徑
修改類(lèi)別 nc :1、2 names [“標(biāo)簽名稱(chēng)1”、“標(biāo)簽名稱(chēng)2”] 具體幾個(gè)看你的類(lèi)別有幾個(gè)
2、模型配置文件:yolov5s.yaml
修改類(lèi)別個(gè)數(shù) nc:1、2
這里貼上檢測(cè)數(shù)據(jù),由于是用CPU跑的,考慮到時(shí)間問(wèn)題,我這里僅訓(xùn)練了20次,用時(shí)在40min左右。
可以看到,識(shí)別的精度為80%左右,還是比較可觀的,通過(guò)增大epoch的值,可以調(diào)整成100,識(shí)別率達(dá)到95%是沒(méi)有問(wèn)題的。
再點(diǎn)擊開(kāi)始檢測(cè) ,調(diào)用訓(xùn)練好的pt模型進(jìn)行識(shí)別。
?
4.5 opencv切割圖片我自定義了一個(gè)split.py,里面只有一個(gè)split函數(shù),目的就是為了切割圖片,這里是運(yùn)用了封裝思想。在windows.py文件中通過(guò)import導(dǎo)入,就可以直接運(yùn)用這個(gè)函數(shù)了。以下為split.py文件內(nèi)容。
import cv2 as cv
def split(list_1,img,i):
dst = img[int(list_1[1]):int(list_1[3]),int(list_1[0]):int(list_1[2])] # 裁剪坐標(biāo)為[y0:y1, x0:x1] xyxy
cv.imwrite(“D:/cartarget/result_{0}.png”.format(i+1), dst)
# list_1 =[231,1391,586,1518]
# img = cv.imread(‘train_25.jpg’)
# split(list_1,img,0)
接著需要對(duì)windows.py進(jìn)行修改,在檢測(cè)圖片detect_img函數(shù)中,添加
tem_list = []
tem_list.append(int(xyxy[0]))
tem_list.append(int(xyxy[1]))
tem_list.append(int(xyxy[2]))
tem_list.append(int(xyxy[3]))
print(“準(zhǔn)備切割!”)
split.split(tem_list, im0,count_1)
count_1 += 1
print(“切割完成!”)
這樣,Yolov5檢測(cè)出幾個(gè)目標(biāo),就會(huì)調(diào)用幾次split方法從而切割出來(lái)幾張子圖片,由于這里圖片只有一輛車(chē),所有只有一個(gè)檢測(cè)目標(biāo),所以只會(huì)得到一個(gè)車(chē)牌。4.6 調(diào)用百度AI進(jìn)行圖片檢測(cè)這個(gè)邏輯就很好理解啦!只要把上面這個(gè)圖片丟給百度文字識(shí)別去識(shí)別內(nèi)容就好啦!
if __name__ == “__main__”:
# 此處填入在百度云控制臺(tái)處獲得的appId, apiKey, secretKey的實(shí)際值
appId, apiKey, secretKey = [‘28509942’, ‘HbB3GChFwWENkXEI7uCuNG5V’, ‘IRnFhizLzlXnYFiNoq3VcyLxRHaj2dZU’]
# 創(chuàng)建ocr對(duì)象
ocr = AipOcr(appId, apiKey, secretKey)
with open(‘name.png’, ‘rb’) as fin:
img = fin.read()
res = ocr.basicGeneral(img)
print(res[‘words_result’][0][‘words’])
可以看到識(shí)別完全正確!大功告成!05 總結(jié)這個(gè)車(chē)牌識(shí)別系統(tǒng)到這里就算正式結(jié)束啦!感覺(jué)收獲還是蠻多的,對(duì)Yolov5的理解更加深刻,Opencv的運(yùn)用更加熟練,PyQt5也算是熟悉了。目標(biāo)檢測(cè)、圖片分割、圖像搜索、增強(qiáng)和特效、動(dòng)作識(shí)別等等,慢慢覺(jué)得這些功能更像是一個(gè)個(gè)拼圖,想要完成一個(gè)較大的工程,需要將一個(gè)個(gè)小功能拼在一起。機(jī)器學(xué)習(xí)的路程還很漫長(zhǎng),很多知識(shí)我都未曾了解,其中的數(shù)學(xué)原理更是知之甚少。未來(lái)的學(xué)習(xí)還很漫長(zhǎng),人工智能的領(lǐng)域依然遼闊而精彩。車(chē)牌檢測(cè)這個(gè)項(xiàng)目只是一個(gè)載體,項(xiàng)目本身并不重要,重要的是項(xiàng)目背后學(xué)到的知識(shí),定期總結(jié)才能更好的接受知識(shí)吧!好啦,今天的分享就到這里啦!
編輯:黃飛
評(píng)論