训练自定义YOLOv4模型用于Google Colab中的物体检测(包括数据注释教程)。

187 阅读10分钟

简介

YOLOV4是一个来自YOLO(You Look Only Once)物体检测器系列的最先进的物体检测模型。我们已经在之前的文章中介绍了它,在那里我们展示了如何使用预训练的YOLOv4模型。在这篇文章中,我们将向你展示如何在谷歌Colab中用GPU训练自定义YOLOV4模型进行物体检测的教程。

注释****YOLOv4的自定义数据

i) 基础知识

为了训练一个物体检测器,我们需要有一个标记图像的数据集,以帮助我们的模型了解它需要检测什么以及如何检测。

为了训练自定义的YOLOv4物体检测,我们需要有特定格式的训练图像数据--每张图像都应该有一个相应的文件,包含图像中存在的物体的坐标。

YOLOv4的训练数据的例子如下所示

Training data format for Custom YOLOv4 Model for Object Detection

用于物体检测的自定义YOLOv4模型的训练数据格式

ii) 关于数据注解工具LabelImg

您可以使用此链接中的LabelImg工具为YOLOv4的自定义训练数据进行注释,该工具适用于Linux或Windows系统。

LabelImg的注释步骤主要包括以下三个步骤-- 1.

  1. 提供图像目录和输出目录(你想保存相应的文本文件的地方)。一般来说,它们都存储在同一个地方。
  2. 将格式从PascalVOC改为YOLO。
  3. 在每个图像中给每个对象(通过在它们周围画出边界框)加上各自的名字(labelImg会自动给类分配零索引的ID)。

Example

例子

iii) YOLOv4的自定义数据注释

让我们看看如何使用LabelImg工具来注释YOLOv4的自定义训练图像的快速教程。

1.打开LabelImg,选择 "Open Dir "选项,转到您保存图像的目录。

LabelImmg

LabelImg

2.2.接下来,选择 "更改保存目录",移动到您想保存注释(文本文件)的目录(您可以保持原样,图像和文本文件将被保存在同一个文件夹中)。

3.通过点击将pascalVOC的格式改为YOLO。

Change PASCALVOC to YOLO format

将PASCALVOC改为YOLO格式

4.现在点击'Create Rectbox'按钮,在你要检测的对象周围创建一个边界框。接下来,添加对象所属的类的名称。

这将创建一个classes.txt文件,你必须将其删除。我们删除它是因为类的名称将在以后的另一个文件中定义。

5.点击 "保存"(在侧边栏)来保存注释。

6.6.点击'下一个',打开下一张图片进行注释。对数据集中的所有图像都要这样做。

你也可以观看这个Youtube视频,以更好地了解LabelImg的注释过程。

重要提示:图像和文本文件应该在同一个文件夹中,所以步骤中的两个目录可以是相同的。LabelImg默认在目录中生成一个 "classes.txt"。你应该把它从文件夹中删除,并把它放在一边。

环境设置

i) 设置Google Colab

我们将利用谷歌Colab提供的免费GPU来训练我们的自定义YOLOv4模型进行物体检测。为此,请访问Colab的顶部 "编辑 "菜单,将运行时间改为GPU。

Change Runtime

改变运行时间

Change Runtime

改变运行时间

ii) 检查GPU版本

谷歌Colab是云中的免费GPU服务。在最大限度内,你可以使用GPU 12小时。它类似于Jupyter笔记本,即一个Linux虚拟环境。你可以通过运行以下命令来检查提供给你的是哪种GPU。

!nvidia-smi
+-----------------------------------------------------------------------------+ 
| NVIDIA-SMI 460.39 Driver Version: 460.32.03 CUDA Version: 11.2 | 
|-------------------------------+----------------------+----------------------+ 
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | 
| | | MIG M. | 
|===============================+======================+======================| 
| 0 Tesla V100-SXM2... Off | 00000000:00:04.0 Off | 0 | 
| N/A 33C P0 23W / 300W | 0MiB / 16160MiB | 0% Default | 
| | | N/A | 
+-------------------------------+----------------------+----------------------+ 

+-----------------------------------------------------------------------------+ 
| Processes: | 
| GPU GI CI PID Type Process name GPU Memory | 
| ID ID Usage | 
|=============================================================================| 
| No running processes found | 
+-----------------------------------------------------------------------------+

iii) 上传数据集

你必须把我们在上一节中注释的自定义数据集上传到你的谷歌硬盘。但是为了从Colab访问谷歌硬盘,我们必须将硬盘装入Colab。

使用下面的命令来执行挂载过程。

from
Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly

Enter your authorization code:
··········
Mounted at /content/gdrive

一旦驱动器被挂载,你就可以访问你上传到驱动器的数据了。

Preview

预览

iv) 克隆和建立存储库

为了使用YOLOv4,我们需要使用 "darknet "GitHub仓库来克隆它,该仓库属于Alexey Bochkovskiy,他是YOLO的创建者之一。使用下面的命令克隆该仓库。

!git clone https://github.com/AlexeyAB/darknet

v) 配置中的一些变化

为了最有效地使用YOLO,我们对 "make "配置文件做了一些必要的修改。基本上,我们要确保OpenCV的安装支持CUDA和GPU,以使计算更快。

%cd darknet
!sed -i 's/OPENCV=0/OPENCV=1/' Makefile
!sed -i 's/GPU=0/GPU=1/' Makefile
!sed -i 's/CUDNN=0/CUDNN=1/' Makefile
!sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/' Makefile
!sed -i 's/OPENMP=0/OPENMP=1/' Makefile

vi) 构建暗网

接下来,我们用下面的命令构建暗网----。

!make

vii) 配置文件

a) Train.txt文件

为了使训练过程开始,我们必须向YOLO提供一个文本文件,其中包含训练集中所有图像的路径。你可以在Colab中使用下面的代码来创建这个文件。只要提供你上传的数据集的路径。

import glob
x = '.jpg'
imglist = glob.glob("/content/drive/MyDrive/train/*{}".format(x),recursive=False)
print(len(imglist))
with open("/content/drive/MyDrive/train.txt",'w',encoding='utf-8') as f:
  for img in imglist:
    img=img.replace("\\","/")
    f.write(img+'\n')

输出。

它将输出你提供的目录中的图像数量。我个人总共使用了600张图片。(300匹马,300匹斑马)

600

b) Obj.names文件

obj.names'文件的内容是你的类的名称,与你的类.txt相同。因此,在文本编辑器中制作一个新文件'obj.names'(这个文件的扩展名是'.names',而不是'.txt'),并复制'classes.txt'文件的内容。继续把它上传到你的驱动器。

custom yolov4 object detection tutorial

对象名称文件(classes.txt->obj.names)

c) Obj.data文件

同样地,你可以创建一个'obj.data'文件。这个文件包含所有关于训练路径配置的信息。使用下面的模板来填写必要的细节,并创建obj.data文件的内容。注意:'<'和'>'是占位符,请在填写必要的路径时删除它们。更改后,将其上传到你的驱动器,以便在colab中使用。(这个文件的扩展名应该是'.data')。

classes = <No of classes in your dataset>
train = <path to your train.txt>
names = <Path to obj.names file>
backup = <Path to directory where you weights should be saved>
  • 传递上一步创建的train.txt,obj.names,最后,创建一个名为output的新文件夹并在文件中提供其路径。

custom yolov4 object detection tutorial

对象数据文件

d) Cfg文件

这是迄今为止最重要的文件,它包含了训练过程中使用的所有超参数的值。你可以自己探索这个文件,你将会发现以下内容 -

  1. [net]部分。这一部分包含了一些参数的值,如批量大小、细分、步骤数、烧录步骤、学习率等等。
  2. [yolo]层。这些层是执行物体检测的实际层,它们包含锚点的坐标、损失类型和非最大抑制值。物体检测器模型执行分类以及定位的组合,这被称为检测。
  3. [卷积]层。基本卷积层以及批量归一化和激活函数。

下载这个文件或简单地将内容复制到一个文本文件中,并保存为'yolo-obj.cfg'。

在将文件上传到驱动器之前,请做以下修改。你可以简单地使用以下文件并复制其内容。

(这个文件的扩展名应该是'.cfg')

更改内容

  • 批量=32,分区=16
  • width = 416,height = 416 (更大的会减慢训练速度)
  • max_batches = (类的数量) * 2000 (但不低于6000 例:对于4个类,max_batches=8000)
  • 步骤=(最大批次的80%),(最大批次的90%)(所以如果你的最大批次=10000,那么步骤=8000,9000)
  • classes=你的数据集中的类的数量(我的是2)。在每个YOLO层中改变这个值。
  • 在每个YOLO层是卷积层之前,根据这个公式改变过滤器:过滤器=(类的数量+5)*3(所以如果你为一个类进行训练,那么你的过滤器=18,为两个类进行训练,以此类推)。

viii)下载初始权重

为了确保我们的物体检测器是准确的,我们使用预先训练的权重,而不是随机权重初始化。这也有助于我们的模型快速收敛,即比正常的训练时间少。

!wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137

训练自定义YOLOv4物体检测模型

i) 训练命令语法

我们首先需要了解以下命令行语法和参数,以便用暗网训练自定义YOLOv4模型。

!./darknet detector train <path to obj.data> <path to custom config> <path to weight file> -dont_show -map
  • <path to obj.data>:obj.data的路径。
  • <path to custom config>:obj.cfg文件的路径。
  • <path to weight file>:下载的(yolov4.conv.137)重量文件的路径

ii) 开始训练

最后,我们开始训练过程,如下 -

!./darknet detector train /content/drive/MyDrive/obj.data /content/drive/MyDrive/yolov4-obj.cfg  /content/darknet/yolov4.conv.137 -dont_show -map

custom yolov4 object detection tutorial

训练过程

iii) 如果Colab断开连接,恢复训练

尽管Colab提供免费的GPU,但它有一个严重的、令人沮丧的缺点--当浏览器窗口保持关闭或空闲时,会话就会断开。你的完整的培训可能会一败涂地,你必须重新开始。但我们在这里为你提供了保障!

还记得我们提供的保存权重的备份路径吗?如果在任何情况下google Colab断开连接,它就会派上用场。它将会保存一个名为'obj-last.weights'的文件,你就可以使用下面的命令继续训练。

!./darknet detector train /content/drive/MyDrive/obj.data /content/drive/MyDrive/yolov4-obj.cfg <path to last.weights> -dont_show

测试我们的模型

i) 检查mAP

我们可以看到它大约是77%,这是一个相当好的分数。

!./darknet detector map /content/drive/MyDrive/obj.data /content/drive/MyDrive/yolov4-obj.cfg /content/drive/MyDrive/outputs/yolov4-obj_1000.weights

custom yolov4 object detection tutorial - mAP Score

MAP得分

ii) 测试命令格式

!./darknet detector test <path to obj.data> <path to cfg file> <weight file> <query image/video> -thresh <x>
  • <path to obj.data>:到obj.data的路径。
  • <path to custom config>:obj.cfg文件的路径。
  • <path to weight file>::您想要运行检测的权重文件的路径
  • <query image>:要运行检测的图像的路径。
  • <x>:最小置信度,即阈值。

iii) 测试我们的自定义YOLOv4模型

让我们在一些图片上运行我们的自定义YOLOv4模型,并直观地看到结果。

!./darknet detector test /content/drive/MyDrive/obj.data /content/drive/MyDrive/yolov4-obj.cfg /content/drive/MyDrive/outputs/yolov4-obj_last.weights /mydrive/images/car2.jpg -thresh 0.3

输出。

Loading weights from /content/drive/MyDrive/outputs/yolov4-obj_last.weights... 
seen 64, trained: 76 K-images (1 Kilo-batches_64) 
Done! Loaded 162 layers from weights-file 
Detection layer: 139 - type = 28 
Detection layer: 150 - type = 28 
Detection layer: 161 - type = 28 
/content/drive/MyDrive/testfolder/test3.jpg: Predicted in 32.792000 milli-seconds. 
Horse: 93% 
Zebra: 98%

custom yolov4 object detection - Output

输出YOLOv4

custom yolov4 object detection - Output

输出YOLOv4

custom yolov4 object detection - Output

输出YOLOv4

custom yolov4 object detection - Output

输出YOLOv4

iv) 在视频上测试我们的自定义YOLOv4模型

让我们在视频上运行我们的自定义YOLOv4模型,看看结果。很明显,它能够很好的检测出视频中的马和斑马。

!./darknet detector demo /content/drive/MyDrive/obj.data /content/drive/MyDrive/yolov4-obj.cfg /content/drive/MyDrive/outputs/yolov4-obj_last.weights /content/drive/MyDrive/TestVid.mp4 -out_filename res.mp4 -dont_show -thresh 0.3

输出。

Video Output

视频输出

The postTrain Custom YOLOv4 Model for Object Detection in Google Colab (Including Data Annotation Tutorial)appeared first onMLK - Machine Learning Knowledge.