日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

YOLOV3实现车牌检测

發(fā)布時(shí)間:2023/12/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 YOLOV3实现车牌检测 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

計(jì)算機(jī)視覺(jué)無(wú)處不在-從面部識(shí)別,制造,農(nóng)業(yè)到自動(dòng)駕駛汽車。今天,我們將通過(guò)動(dòng)手實(shí)踐進(jìn)入現(xiàn)代計(jì)算機(jī)視覺(jué)世界,學(xué)習(xí)如何使用YOLO算法檢測(cè)車牌。

來(lái)自Pexels的mali maeder的照片應(yīng)用于定制的YOLO車牌檢測(cè)模型
傳統(tǒng)計(jì)算機(jī)視覺(jué)方法使用vision方法進(jìn)行檢測(cè)。但由于閾值和輪廓檢測(cè)的局限性,其算法在部分圖像上有效,但無(wú)法推廣。通過(guò)本次學(xué)習(xí),我們將擁有可以在任何天氣情況下用于檢測(cè)車牌的強(qiáng)大模型。

數(shù)據(jù)收集與準(zhǔn)備

我們有一個(gè)可靠的數(shù)據(jù)庫(kù),其中包含數(shù)百?gòu)埰噲D像,但是在網(wǎng)上共享它是不道德的。因此,小伙伴必須自己收集汽車圖像。我們將使用如下照片進(jìn)行演示和驗(yàn)證:

我們還應(yīng)該收集各種光照條件下的車牌圖像,并從不同角度拍攝圖像。在完成數(shù)據(jù)收集之后,我們將使用一個(gè)名為L(zhǎng)abelIMG的免費(fèi)工具來(lái)完成這項(xiàng)工作。
cd labelImg-master
brew install qt
brew install libxml2
make qt5py3
python labelImg.py
從終端執(zhí)行這些操作將打開(kāi)此窗口:

圖2-啟動(dòng)LabelIMG
接下來(lái),單擊左側(cè)菜單上的“打開(kāi)目錄”圖標(biāo)。找到存儲(chǔ)汽車圖像的文件夾。它會(huì)自動(dòng)打開(kāi)第一個(gè)圖像:

圖像3 -用LabelIMG打開(kāi)圖像(作者提供的圖像)
左側(cè)面板中的標(biāo)簽會(huì)顯示YOLO。接下來(lái),按鍵盤上的W鍵以打開(kāi)RectBox 工具。在車牌周圍繪制一個(gè)矩形,輸入標(biāo)簽,然后單擊“確定”:

圖4 -在板周圍繪制矩形
按CTRL + S將板塊坐標(biāo)保存到文本文件。單個(gè)文件應(yīng)如下所示:

圖像5- LabelIMG生成的文本文件
該LabelIMG軟件將保存的矩形框坐標(biāo)文件對(duì)應(yīng)于保存的每個(gè)圖像。還將所有類的列表保存到名為classes.txt的文件中。我們打開(kāi)它,其中可能列出了許多我們不感興趣的內(nèi)容。可以刪除license-plate以外的所有內(nèi)容。

圖6-類列表
仍然存在一個(gè)問(wèn)題。我們只有一個(gè)類(license-plate),但是坐標(biāo)文件中的類索引為15,我們只需查看圖片5并自行驗(yàn)證即可。

我們將使用Python加載每個(gè)坐標(biāo)文件,以通過(guò)將類索引更改為1來(lái)解決此問(wèn)題。這是代碼段:
import glob

Contains all .txt files except our listof classes

txt_files = [file for file inglob.glob(‘images/*.txt’) if file != ‘images/classes.txt’]

Read every .txt file and store it’scontent into variable curr

for file in txt_files:
with open(file, ‘r’) as f:
curr = f.read()

Replace class index 15 with 1 and storeit in a variable new

new = curr.replace('15 ', '1 ')

Once again open every .txt file and makethe replacement

for file in txt_files:
with open(file, ‘w’) as f:
f.write(new)
到目前為止,我們已經(jīng)完成了數(shù)據(jù)集收集和準(zhǔn)備。接下來(lái),我們需要壓縮文件并進(jìn)行模型訓(xùn)練。

模型訓(xùn)練

我們已經(jīng)有幾百個(gè)帶有標(biāo)簽的汽車圖像。足夠我們訓(xùn)練一個(gè)好的YOLO模型,接下來(lái)就是我們要做的。我們將在帶有GPU后端的Google Colab上訓(xùn)練模型。我們的案例中,在Colab中訓(xùn)練模型大約需要2個(gè)小時(shí),但是時(shí)間會(huì)有所變化,具體取決于GPU和數(shù)據(jù)集的大小。

我們將通過(guò)接下來(lái)的七個(gè)步驟來(lái)訓(xùn)練模型。

第1步-配置GPU環(huán)境
在新的筆記本中,轉(zhuǎn)到運(yùn)行時(shí)-更改運(yùn)行時(shí)類型,然后在下拉列表中選擇GPU:

圖7-切換到GPU運(yùn)行時(shí)
第2步-掛載Google云端硬盤
在Google云端硬盤中,創(chuàng)建一個(gè)備份文件夾。我們將其命名為yolo-license-plates。這就是存儲(chǔ)模型權(quán)重和配置的地方。在第一個(gè)單元格中,執(zhí)行以下代碼來(lái)安裝Google云端硬盤:
from google.colab import drive
drive.mount(’/content/gdrive’)
!ln -s /content/gdrive/My\ Drive/ /mydrive
步驟3 —下載并配置Darknet
Darknet是一個(gè)開(kāi)源神經(jīng)網(wǎng)絡(luò)框架,具有YOLO對(duì)象檢測(cè)系統(tǒng)。我們可以通過(guò)執(zhí)行以下代碼行來(lái)下載它:
!git clonehttps://github.com/AlexeyAB/darknet
接下來(lái),在darknet/Makefile中我們必須配置一些內(nèi)容。在以下行上更改值:
第1行-從GPU=0到GPU=1
第2行-從CUDNN=0到CUDNN=1
第4行-從OPENCV=0到OPENCV=1
并保存文件。這些更改使我們可以在訓(xùn)練時(shí)使用GPU。我們現(xiàn)在可以編譯Darknet
%cd darknet
!make
這需要等待幾分鐘,我們?cè)诰幾g完成后繼續(xù)進(jìn)行下一步。

步驟4 —配置設(shè)置文件
要知道如何設(shè)置YOLO配置文件,我們需要知道有多少個(gè)類。我們只有一個(gè)— license-plate,但這可能會(huì)根據(jù)我們正在處理的問(wèn)題的類型而改變。

接下來(lái),我們需要計(jì)算批次數(shù)和過(guò)濾器數(shù)。以下是計(jì)算公式:
批次=類數(shù)* 2000
過(guò)濾器=(類別數(shù)+ 5)* 3
在我們的例子中,值分別為2000和18。為了準(zhǔn)確起見(jiàn),請(qǐng)復(fù)制YOLO配置文件:
!cp cfg / yolov3.cfg cfg / yolov3-train.cfg
并在cfg/yolov3-train.cfg中進(jìn)行以下更改:
第3行-從batch=1到batch=64
第4行-從subdivisions=1到subdivisions=16
第20行-從max_batches=500200到max_batches=2000
603、689和776行-從filters=255到filters=18
610、696和783行-從classes=80到classes=1
保存文件。接下來(lái),我們必須創(chuàng)建兩個(gè)文件-data/obj.names和data/obj.data。這些文件包含有關(guān)類名和備份文件夾的信息:
!echo -e ‘license-plate’ >data/obj.names
!echo -e ‘classes = 1\ntrain =data/train.txt\nvalid = data/test.txt\nnames = data/obj.names\nbackup =/mydrive/yolo-license-plates’ > data/obj.data
到現(xiàn)在,我們已經(jīng)完成了配置,現(xiàn)在讓我們上傳并準(zhǔn)備圖像。

步驟5-上傳和解壓縮圖像
我們只需將zip文件拖放到“文件”側(cè)邊欄菜單中即可。完成后應(yīng)如下所示:

圖8-zip文件上傳后的Colab文件菜單
下一步是為圖像創(chuàng)建一個(gè)文件夾并將其解壓縮:
!mkdir數(shù)據(jù)/對(duì)象
!unzip …/images.zip -d data / obj
現(xiàn)在data/obj文件夾應(yīng)包含圖像及其各自的文本文件。

步驟6-訓(xùn)練準(zhǔn)備
接下來(lái),我們要做的就是創(chuàng)建一個(gè)data/train.txt文件。它將包含所有訓(xùn)練圖像的路徑:
import glob
images_list = glob.glob(‘data/obj/*.jpg’)
with open(‘data/train.txt’, ‘w’) as f:
f.write(’\n’.join(images_list))
最后,我們必須下載預(yù)訓(xùn)練的Darknet卷積網(wǎng)絡(luò):
!wgethttps://pjreddie.com/media/files/darknet53.conv.74
下載將花費(fèi)幾秒鐘,但是一旦完成,我們便可以進(jìn)入到模型訓(xùn)練階段。

步驟7 —模型訓(xùn)練
現(xiàn)在,開(kāi)始訓(xùn)練過(guò)程可以歸結(jié)為一行shell代碼:!./ darknet檢測(cè)器火車數(shù)據(jù)/obj.datacfg / yolov3-train.cfg darknet53.conv.74 -dont_show

圖9-Colab中的YOLO模型訓(xùn)練
現(xiàn)在,我們需要等待。訓(xùn)練過(guò)程可能需要幾個(gè)小時(shí),具體取決于圖像的數(shù)量。權(quán)重每10到15分鐘自動(dòng)保存到您的Google云端硬盤備份文件夾中。在下一部分中,我們將創(chuàng)建一個(gè)腳本,用于在圖像上查找和標(biāo)記車牌。

模型評(píng)估

模型訓(xùn)練完成后,我們應(yīng)該在Google云端硬盤備份文件夾中擁有三個(gè)文件:
權(quán)重文件— yolov3_training_final.weights
配置文件- yolov3_testing.cfg
類文件— classes.txt
將它們下載到計(jì)算機(jī)上的單個(gè)文件夾中,然后打開(kāi)JupyterLab,我們可以從LicensePlateDetector下面的代碼段中復(fù)制:
import cv2
import numpy as np
import matplotlib.pyplot as plt
class LicensePlateDetector:
def init(self, pth_weights: str, pth_cfg: str, pth_classes: str):
self.net = cv2.dnn.readNet(pth_weights, pth_cfg)
self.classes = []
with open(pth_classes, ‘r’) as f:
self.classes = f.read().splitlines()
self.font = cv2.FONT_HERSHEY_PLAIN
self.color = (255, 0, 0)
self.coordinates = None
self.img = None
self.fig_image = None
self.roi_image = None

def detect(self, img_path: str):
orig = cv2.imread(img_path)
self.img = orig
img = orig.copy()
height, width, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1 / 255, (416, 416), (0, 0, 0),swapRB=True, crop=False)
self.net.setInput(blob)
output_layer_names = self.net.getUnconnectedOutLayersNames()
layer_outputs = self.net.forward(output_layer_names)
boxes = []
confidences = []
class_ids = []

for output in layer_outputs:for detection in output:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.2:center_x = int(detection[0]* width)center_y = int(detection[1]* height)w = int(detection[2] *width)h = int(detection[3] *height)x = int(center_x - w / 2)y = int(center_y - h / 2)boxes.append([x, y, w, h])confidences.append((float(confidence)))class_ids.append(class_id)indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.2, 0.4)if len(indexes) > 0:for i in indexes.flatten():x, y, w, h = boxes[i]label = str(self.classes[class_ids[i]])confidence =str(round(confidences[i],2))cv2.rectangle(img, (x,y), (x +w, y + h), self.color, 15)cv2.putText(img, label + ' ' +confidence, (x, y + 20), self.font, 3, (255, 255, 255), 3)self.fig_image = imgself.coordinates = (x, y, w, h)return

def crop_plate(self):
x, y, w, h = self.coordinates
roi = self.img[y:y + h, x:x + w]
self.roi_image = roi
return
此類有兩種方法:
detect(img_path)–用于從輸入圖像中檢測(cè)車牌并在其周圍繪制一個(gè)矩形。crop_plate()–用于從圖像中裁剪檢測(cè)到的車牌。如果您想應(yīng)用一些OCR來(lái)提取文本,則此方法可用。
lpd = LicensePlateDetector(
pth_weights=‘yolov3_training_final.weights’,
pth_cfg=‘yolov3_testing.cfg’,
pth_classes=‘classes.txt’
)

Detect license plate

lpd.detect(‘001.jpg’)

Plot original image with rectangle aroundthe plate

plt.figure(figsize=(24, 24))
plt.imshow(cv2.cvtColor(lpd.fig_image, cv2.COLOR_BGR2RGB))
plt.savefig(‘detected.jpg’)
plt.show()

Crop plate and show cropped plate

lpd.crop_plate()
plt.figure(figsize=(10, 4))
plt.imshow(cv2.cvtColor(lpd.roi_image,cv2.COLOR_BGR2RGB))
上面的代碼片段構(gòu)成了LicensePlateDetector該類的一個(gè)實(shí)例,檢測(cè)到車牌,并將其裁剪。這是可視化輸出:

圖10- YOLO模型和LicensePlateDetector類的評(píng)估
我們可以在過(guò)去幾個(gè)小時(shí)(或幾天)內(nèi)完成的所有工作。YOLO模型可以完美運(yùn)行,并且可以用于任何使用案例。

結(jié)論

這是一篇很長(zhǎng)的分享。祝賀小伙伴一次坐下來(lái)就可以完成實(shí)踐。我們也是花了幾天的時(shí)間才能了解YOLO的工作原理以及如何制作自定義對(duì)象檢測(cè)器。使用相同的方法,小伙伴們可以構(gòu)建任何類型的對(duì)象檢測(cè)器。例如,我們重復(fù)使用具有不同文本標(biāo)簽的相同圖像來(lái)檢測(cè)汽車顏色和汽車品牌。期待小伙伴們的大顯身手。

總結(jié)

以上是生活随笔為你收集整理的YOLOV3实现车牌检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。