1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        使用Python和YOLO檢測車牌

        共 9161字,需瀏覽 19分鐘

         ·

        2021-02-06 10:17

        點擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

        重磅干貨,第一時間送達(dá)

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

        來自Pexels的mali maeder的照片應(yīng)用于定制的YOLO車牌檢測模型

        傳統(tǒng)計算機視覺方法使用vision方法進(jìn)行檢測。但由于閾值和輪廓檢測的局限性,其算法在部分圖像上有效,但無法推廣。通過本次學(xué)習(xí),我們將擁有可以在任何天氣情況下用于檢測車牌的強大模型。


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


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


        我們還應(yīng)該收集各種光照條件下的車牌圖像,并從不同角度拍攝圖像。在完成數(shù)據(jù)收集之后,我們將使用一個名為LabelIMG的免費工具來完成這項工作。

        cd labelImg-masterbrew install qtbrew install libxml2make qt5py3python labelImg.py

        從終端執(zhí)行這些操作將打開此窗口:

        圖2-啟動LabelIMG

        接下來,單擊左側(cè)菜單上的“打開目錄”圖標(biāo)。找到存儲汽車圖像的文件夾。它會自動打開第一個圖像:

        圖像3 -用LabelIMG打開圖像(作者提供的圖像)

        左側(cè)面板中的標(biāo)簽會顯示YOLO。接下來,按鍵盤上的W鍵以打開RectBox 工具。在車牌周圍繪制一個矩形,輸入標(biāo)簽,然后單擊“確定”:

        圖4 -在板周圍繪制矩形

        按CTRL + S將板塊坐標(biāo)保存到文本文件。單個文件應(yīng)如下所示:

        圖像5- LabelIMG生成的文本文件

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

        圖6-類列表

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


        我們將使用Python加載每個坐標(biāo)文件,以通過將類索引更改為1來解決此問題。這是代碼段:

        import glob # Contains all .txt files except our listof classestxt_files = [file for file inglob.glob('images/*.txt'if file != 'images/classes.txt']# Read every .txt file and store it'scontent into variable currfor file in txt_files:   with open(file, 'r') as f:       curr = f.read()     # Replace class index 15 with 1 and storeit in a variable newnew = curr.replace('15 ''1 '# Once again open every .txt file and makethe replacementfor file in txt_files:   with open(file, 'w') as f:       f.write(new) 

        到目前為止,我們已經(jīng)完成了數(shù)據(jù)集收集和準(zhǔn)備。接下來,我們需要壓縮文件并進(jìn)行模型訓(xùn)練。


        模型訓(xùn)練


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


        我們將通過接下來的七個步驟來訓(xùn)練模型。


        第1步-配置GPU環(huán)境

        在新的筆記本中,轉(zhuǎn)到運行時-更改運行時類型,然后在下拉列表中選擇GPU:

        圖7-切換到GPU運行時

        第2步-掛載Google云端硬盤

        在Google云端硬盤中,創(chuàng)建一個備份文件夾。我們將其命名為yolo-license-plates。這就是存儲模型權(quán)重和配置的地方。在第一個單元格中,執(zhí)行以下代碼來安裝Google云端硬盤:

        from google.colab import drivedrive.mount('/content/gdrive')!ln -s /content/gdrive/My\ Drive/ /mydrive

        步驟3 —下載并配置Darknet

        Darknet是一個開源神經(jīng)網(wǎng)絡(luò)框架,具有YOLO對象檢測系統(tǒng)。我們可以通過執(zhí)行以下代碼行來下載它:

        !git clonehttps://github.com/AlexeyAB/darknet

        接下來,在darknet/Makefile中我們必須配置一些內(nèi)容。在以下行上更改值:

        • 第1行-從GPU=0到GPU=1

        • 第2行-從CUDNN=0到CUDNN=1

        • 第4行-從OPENCV=0到OPENCV=1

        并保存文件。這些更改使我們可以在訓(xùn)練時使用GPU。我們現(xiàn)在可以編譯Darknet

        %cd darknet!make

        這需要等待幾分鐘,我們在編譯完成后繼續(xù)進(jìn)行下一步。


        步驟4 —配置設(shè)置文件

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


        接下來,我們需要計算批次數(shù)和過濾器數(shù)。以下是計算公式:

        批次=類數(shù)* 2000

        過濾器=(類別數(shù)+ 5)* 3

        在我們的例子中,值分別為2000和18。為了準(zhǔn)確起見,請復(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

        保存文件。接下來,我們必須創(chuàng)建兩個文件-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)建一個文件夾并將其解壓縮:

        !mkdir數(shù)據(jù)/對象!unzip ../images.zip -d data / obj

        現(xiàn)在data/obj文件夾應(yīng)包含圖像及其各自的文本文件。


        步驟6-訓(xùn)練準(zhǔn)備

        接下來,我們要做的就是創(chuàng)建一個data/train.txt文件。它將包含所有訓(xùn)練圖像的路徑:

        import globimages_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

        下載將花費幾秒鐘,但是一旦完成,我們便可以進(jìn)入到模型訓(xùn)練階段。


        步驟7 —模型訓(xùn)練

        現(xiàn)在,開始訓(xùn)練過程可以歸結(jié)為一行shell代碼:./ darknet檢測器火車數(shù)據(jù)/obj.datacfg / yolov3-train.cfg darknet53.conv.74 -dont_show

        圖9-Colab中的YOLO模型訓(xùn)練

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


        模型評估


        模型訓(xùn)練完成后,我們應(yīng)該在Google云端硬盤備份文件夾中擁有三個文件:

        • 權(quán)重文件— yolov3_training_final.weights

        • 配置文件- yolov3_testing.cfg

        • 類文件— classes.txt

        將它們下載到計算機上的單個文件夾中,然后打開JupyterLab,我們可以從LicensePlateDetector下面的代碼段中復(fù)制:

        import cv2import numpy as npimport matplotlib.pyplot as pltclass 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 = img       self.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)–用于從輸入圖像中檢測車牌并在其周圍繪制一個矩形。crop_plate()–用于從圖像中裁剪檢測到的車牌。如果您想應(yīng)用一些OCR來提取文本,則此方法可用。

        lpd = LicensePlateDetector(   pth_weights='yolov3_training_final.weights',   pth_cfg='yolov3_testing.cfg',   pth_classes='classes.txt') # Detect license platelpd.detect('001.jpg') # Plot original image with rectangle aroundthe plateplt.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 platelpd.crop_plate()plt.figure(figsize=(10, 4))plt.imshow(cv2.cvtColor(lpd.roi_image,cv2.COLOR_BGR2RGB)) 

        上面的代碼片段構(gòu)成了LicensePlateDetector該類的一個實例,檢測到車牌,并將其裁剪。這是可視化輸出:

        圖10- YOLO模型和LicensePlateDetector類的評估

        我們可以在過去幾個小時(或幾天)內(nèi)完成的所有工作。YOLO模型可以完美運行,并且可以用于任何使用案例。


        結(jié)論


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

         End 

        下載1:OpenCV-Contrib擴展模塊中文版教程
        在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺實戰(zhàn)項目52講
        小白學(xué)視覺公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。

        下載3:OpenCV實戰(zhàn)項目20講
        小白學(xué)視覺公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        交流群


        歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


        瀏覽 79
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日本午夜在线播放 | 俺也来欧美精品 | 久久精彩视频 | 国产黄色录相 | 欧美精品一区二区三区成人片在线 | 99热这里只有精品在线观看 | 我爱搞搞 | 亚洲日韩免费观看 | 豆花视频18 成人入口 | 国产又粗又猛又爽又黄的视频快8 |