使用Python和YOLO检测车牌

重磅干货,第一时间送达

计算机视觉无处不在-从面部识别,制造,农业到自动驾驶汽车。今天,我们将通过动手实践进入现代计算机视觉世界,学习如何使用YOLO算法检测车牌。

来自Pexels的mali maeder的照片应用于定制的YOLO车牌检测模型

传统计算机视觉方法使用vision方法进行检测。但由于阈值和轮廓检测的局限性,其算法在部分图像上有效,但无法推广。通过本次学习,我们将拥有可以在任何天气情况下用于检测车牌的强大模型。

数据收集与准备

我们有一个可靠的数据库,其中包含数百张汽车图像,但是在网上共享它是不道德的。因此,小伙伴必须自己收集汽车图像。我们将使用如下照片进行演示和验证:

我们还应该收集各种光照条件下的车牌图像,并从不同角度拍摄图像。在完成数据收集之后,我们将使用一个名为LabelIMG的免费工具来完成这项工作。

cd labelImg-masterbrew install qtbrew install libxml2make qt5py3python 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 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) 

到目前为止,我们已经完成了数据集收集和准备。接下来,我们需要压缩文件并进行模型训练。

模型训练

我们已经有几百个带有标签的汽车图像。足够我们训练一个好的YOLO模型,接下来就是我们要做的。我们将在带有GPU后端的Google Colab上训练模型。我们的案例中,在Colab中训练模型大约需要2个小时,但是时间会有所变化,具体取决于GPU和数据集的大小。

我们将通过接下来的七个步骤来训练模型。

第1步-配置GPU环境

在新的笔记本中,转到运行时-更改运行时类型,然后在下拉列表中选择GPU:

图7-切换到GPU运行时

第2步-挂载Google云端硬盘

在Google云端硬盘中,创建一个备份文件夹。我们将其命名为yolo-license-plates。这就是存储模型权重和配置的地方。在第一个单元格中,执行以下代码来安装Google云端硬盘:

from google.colab import drivedrive.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 globimages_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 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()–用于从图像中裁剪检测到的车牌。如果您想应用一些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)) 

上面的代码片段构成了LicensePlateDetector该类的一个实例,检测到车牌,并将其裁剪。这是可视化输出:

图10- YOLO模型和LicensePlateDetector类的评估

我们可以在过去几个小时(或几天)内完成的所有工作。YOLO模型可以完美运行,并且可以用于任何使用案例。

结论

这是一篇很长的分享。祝贺小伙伴一次坐下来就可以完成实践。我们也是花了几天的时间才能了解YOLO的工作原理以及如何制作自定义对象检测器。使用相同的方法,小伙伴们可以构建任何类型的对象检测器。例如,我们重复使用具有不同文本标签的相同图像来检测汽车颜色和汽车品牌。期待小伙伴们的大显身手。

End 

下载1:OpenCV-Contrib扩展模块中文版教程
(0)

相关推荐

  • 解决yolov3中darknet.py预测位置不准和使用python3执行报错的问题

    本文总结了使用yolo过程中出现的一些问题,在网络上找到了相关的解决方案. 1 使用darknet.py预测位置不准 1.1 使用python调用darknet 一般来说,模型训练好了,也可以使用sh ...

  • 图像物体中心点

    对于刚刚入门人工智能的小伙伴来说,常常需要阅读其他人员写的代码,更多的时候这些代码可能即没有文档也没有注释.大大超过了我们能够阅读理解的范围.其结果是我们每每下定决心阅读,投入巨大的精力,却收效甚微. ...

  • Windows系统下训练yolo模型(yolov3

    目录 step1 制作数据集 step2 训练模型 step3 测试 step4 可视化训练日志 Darknet深度学习框架是由Joseph Redmon提出的一个用C和CUDA编写的开源神经网络框架 ...

  • 基于Darknet的YOLOv4目标检测

    目录 一.Windows环境下的YOLOv4目标检测 1.环境配置 2.克隆或下载YOLOv4 3.Visual Studio2019配置YOLOv4项目 4.Visual Studio2019编译Y ...

  • 【目标检测代码实战】从零开始动手实现yolov3:训练篇(一)

    前言 在前面几篇文章中小糖豆为大家讲解了yolo系列算法的演变.俗话说,光说不练假把式.接下来小糖豆将带领大家从零开始,亲自动手实现yolov3的训练与预测. 本教程说明: 需要读者已经基本了解pyt ...

  • YOLOV4训练自己的数据集—从环境配置到完成检测任务(Windows)

    文章采用的是官方开源代码: https://github.com/AlexeyAB/darknet YOLOV4的详细阐述可以阅读原汁原味的论文: https://arxiv.org/abs/2004 ...

  • YOLOv3训练自己的模型

    3.0 前言 本文是YOLOv3系列第3篇,记录YOLOv3如何训练自己的模型. YOLOv3系列第1篇:win10下YOLOv3下载与编译 YOLOv3系列第2篇:YOLOv3的应用 YOLOv3系 ...

  • 用自己的数据集训练pytorch版的yolo模型

    参考资料:https://www.cnblogs.com/pprp/p/10863496.html#3-%E8%AE%AD%E7%BB%83%E6%A8%A1%E5%9E%8B 下载yolo和安装环境 ...

  • (4条消息) OpenCV DNN之YOLO实时对象检测

    OpenCV在3.3.1的版本中开始正式支持Darknet网络框架并且支持YOLO1与YOLO2以及YOLO Tiny网络模型的导入与使用.YOLO是一种比SSD还要快的对象检测网络模型,算法作者在其 ...

  • 超详细:自制yolo3训练数据集总结

    概述 本文总结yolo作者实现的darknet版本的yolo3训练数据集格式. 数据集文件目录 最终数据集需要3个文本文件和2个目录: train.txt # 文本文件,保存训练图片目录列表 test ...

  • [2G显卡]使用darknet/YOLO训练自己的数据

    本文主要针对用显存较小的电脑上训练自己的YOLO数据,在clone了最新的darknet后结果只能跑得动yolov2,使用的是yolo.cfg与yolo.weights做的初始测试.随后修改配置文件, ...

  • SlimYOLOv3:更窄、更快、更好的无人机目标检测算法

    无人机因为硬件计算能力较弱,要在其上实现实时的目标检测,需要算法参数量小.占用内存少.推断时间短.常见的算法往往难以直接应用. 一种比较直接的做法是对模型进行剪枝,尽量减少模型卷积层不必要的通道. 今 ...

  • 目标检测、目标跟踪、重识别,这个项目里都有 ...

    环境 ubuntu 18.04 64位 yolov5 deepsort fastreid 前言 前文 基于YOLOv5和DeepSort的目标跟踪 介绍过针对行人的检测与跟踪.本文介绍另一个项目,结合 ...

  • yolov4——训练自己的数据集(完整版)

    好了,多的也不说,直接开始吧! 1.下载预训练的好权重文件 yolov4.conv.137,放在build/darknet/x64/下 2.创建配置文件:在darknet-master/cfg/下,创 ...

  • 基于Opencv4.4的YOLOv4目标检测

    2020年7月18日,OpenCV官网发布了OpenCV的最新版本OpenCV4.4.0,令我比较兴奋的是,其中支持了YOLOv4,之前的一段时间,我都在YOLO系列苦苦挣扎,虽然YOLOv4的性能很 ...

  • 目标检测:YOLOv3: 训练自己的数据

    update:20200424 YOLOV4出来啦!!!快去把玩一下!!! https://github.com/AlexeyAB/darknet -------------------------- ...

  • YOLO模型训练自己数据

    参考)YOLOv2训练自己的数据集(voc格式)进行实验,基本上是正确的,但其初始给出的代码并非是在linux下可以运行的,因此参考部分博客写了下面的程序,可以实现对文件夹内图片的批量读取以及更改名称 ...