YOLOV3实现车牌检测
計算機視覺無處不在-從面部識別,制造,農業到自動駕駛汽車。今天,我們將通過動手實踐進入現代計算機視覺世界,學習如何使用YOLO算法檢測車牌。
來自Pexels的mali maeder的照片應用于定制的YOLO車牌檢測模型
傳統計算機視覺方法使用vision方法進行檢測。但由于閾值和輪廓檢測的局限性,其算法在部分圖像上有效,但無法推廣。通過本次學習,我們將擁有可以在任何天氣情況下用于檢測車牌的強大模型。
數據收集與準備
我們有一個可靠的數據庫,其中包含數百張汽車圖像,但是在網上共享它是不道德的。因此,小伙伴必須自己收集汽車圖像。我們將使用如下照片進行演示和驗證:
我們還應該收集各種光照條件下的車牌圖像,并從不同角度拍攝圖像。在完成數據收集之后,我們將使用一個名為LabelIMG的免費工具來完成這項工作。
cd labelImg-master
brew install qt
brew install libxml2
make qt5py3
python labelImg.py
從終端執行這些操作將打開此窗口:
圖2-啟動LabelIMG
接下來,單擊左側菜單上的“打開目錄”圖標。找到存儲汽車圖像的文件夾。它會自動打開第一個圖像:
圖像3 -用LabelIMG打開圖像(作者提供的圖像)
左側面板中的標簽會顯示YOLO。接下來,按鍵盤上的W鍵以打開RectBox 工具。在車牌周圍繪制一個矩形,輸入標簽,然后單擊“確定”:
圖4 -在板周圍繪制矩形
按CTRL + S將板塊坐標保存到文本文件。單個文件應如下所示:
圖像5- LabelIMG生成的文本文件
該LabelIMG軟件將保存的矩形框坐標文件對應于保存的每個圖像。還將所有類的列表保存到名為classes.txt的文件中。我們打開它,其中可能列出了許多我們不感興趣的內容。可以刪除license-plate以外的所有內容。
圖6-類列表
仍然存在一個問題。我們只有一個類(license-plate),但是坐標文件中的類索引為15,我們只需查看圖片5并自行驗證即可。
我們將使用Python加載每個坐標文件,以通過將類索引更改為1來解決此問題。這是代碼段:
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)
到目前為止,我們已經完成了數據集收集和準備。接下來,我們需要壓縮文件并進行模型訓練。
模型訓練
我們已經有幾百個帶有標簽的汽車圖像。足夠我們訓練一個好的YOLO模型,接下來就是我們要做的。我們將在帶有GPU后端的Google Colab上訓練模型。我們的案例中,在Colab中訓練模型大約需要2個小時,但是時間會有所變化,具體取決于GPU和數據集的大小。
我們將通過接下來的七個步驟來訓練模型。
第1步-配置GPU環境
在新的筆記本中,轉到運行時-更改運行時類型,然后在下拉列表中選擇GPU:
圖7-切換到GPU運行時
第2步-掛載Google云端硬盤
在Google云端硬盤中,創建一個備份文件夾。我們將其命名為yolo-license-plates。這就是存儲模型權重和配置的地方。在第一個單元格中,執行以下代碼來安裝Google云端硬盤:
from google.colab import drive
drive.mount(’/content/gdrive’)
!ln -s /content/gdrive/My\ Drive/ /mydrive
步驟3 —下載并配置Darknet
Darknet是一個開源神經網絡框架,具有YOLO對象檢測系統。我們可以通過執行以下代碼行來下載它:
!git clonehttps://github.com/AlexeyAB/darknet
接下來,在darknet/Makefile中我們必須配置一些內容。在以下行上更改值:
第1行-從GPU=0到GPU=1
第2行-從CUDNN=0到CUDNN=1
第4行-從OPENCV=0到OPENCV=1
并保存文件。這些更改使我們可以在訓練時使用GPU。我們現在可以編譯Darknet
%cd darknet
!make
這需要等待幾分鐘,我們在編譯完成后繼續進行下一步。
步驟4 —配置設置文件
要知道如何設置YOLO配置文件,我們需要知道有多少個類。我們只有一個— license-plate,但這可能會根據我們正在處理的問題的類型而改變。
接下來,我們需要計算批次數和過濾器數。以下是計算公式:
批次=類數* 2000
過濾器=(類別數+ 5)* 3
在我們的例子中,值分別為2000和18。為了準確起見,請復制YOLO配置文件:
!cp cfg / yolov3.cfg cfg / yolov3-train.cfg
并在cfg/yolov3-train.cfg中進行以下更改:
第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
保存文件。接下來,我們必須創建兩個文件-data/obj.names和data/obj.data。這些文件包含有關類名和備份文件夾的信息:
!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
到現在,我們已經完成了配置,現在讓我們上傳并準備圖像。
步驟5-上傳和解壓縮圖像
我們只需將zip文件拖放到“文件”側邊欄菜單中即可。完成后應如下所示:
圖8-zip文件上傳后的Colab文件菜單
下一步是為圖像創建一個文件夾并將其解壓縮:
!mkdir數據/對象
!unzip …/images.zip -d data / obj
現在data/obj文件夾應包含圖像及其各自的文本文件。
步驟6-訓練準備
接下來,我們要做的就是創建一個data/train.txt文件。它將包含所有訓練圖像的路徑:
import glob
images_list = glob.glob(‘data/obj/*.jpg’)
with open(‘data/train.txt’, ‘w’) as f:
f.write(’\n’.join(images_list))
最后,我們必須下載預訓練的Darknet卷積網絡:
!wgethttps://pjreddie.com/media/files/darknet53.conv.74
下載將花費幾秒鐘,但是一旦完成,我們便可以進入到模型訓練階段。
步驟7 —模型訓練
現在,開始訓練過程可以歸結為一行shell代碼:!./ darknet檢測器火車數據/obj.datacfg / yolov3-train.cfg darknet53.conv.74 -dont_show
圖9-Colab中的YOLO模型訓練
現在,我們需要等待。訓練過程可能需要幾個小時,具體取決于圖像的數量。權重每10到15分鐘自動保存到您的Google云端硬盤備份文件夾中。在下一部分中,我們將創建一個腳本,用于在圖像上查找和標記車牌。
模型評估
模型訓練完成后,我們應該在Google云端硬盤備份文件夾中擁有三個文件:
權重文件— yolov3_training_final.weights
配置文件- yolov3_testing.cfg
類文件— classes.txt
將它們下載到計算機上的單個文件夾中,然后打開JupyterLab,我們可以從LicensePlateDetector下面的代碼段中復制:
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 = []
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)–用于從輸入圖像中檢測車牌并在其周圍繪制一個矩形。crop_plate()–用于從圖像中裁剪檢測到的車牌。如果您想應用一些OCR來提取文本,則此方法可用。
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))
上面的代碼片段構成了LicensePlateDetector該類的一個實例,檢測到車牌,并將其裁剪。這是可視化輸出:
圖10- YOLO模型和LicensePlateDetector類的評估
我們可以在過去幾個小時(或幾天)內完成的所有工作。YOLO模型可以完美運行,并且可以用于任何使用案例。
結論
這是一篇很長的分享。祝賀小伙伴一次坐下來就可以完成實踐。我們也是花了幾天的時間才能了解YOLO的工作原理以及如何制作自定義對象檢測器。使用相同的方法,小伙伴們可以構建任何類型的對象檢測器。例如,我們重復使用具有不同文本標簽的相同圖像來檢測汽車顏色和汽車品牌。期待小伙伴們的大顯身手。
總結
以上是生活随笔為你收集整理的YOLOV3实现车牌检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交换机模拟器
- 下一篇: FCRA部分考试题目及答案