简介
YOLOV4是一个来自YOLO(You Look Only Once)物体检测器系列的最先进的物体检测模型。我们已经在之前的文章中介绍了它,在那里我们展示了如何使用预训练的YOLOv4模型。在这篇文章中,我们将向你展示如何在谷歌Colab中用GPU训练自定义YOLOV4模型进行物体检测的教程。
- 还可以阅读 - YOLOv4物体检测教程与图片和视频。初学者指南
- 同时阅读 - 教程 - YOLOv5在Colab中的自定义物体检测
注释****YOLOv4的自定义数据
i) 基础知识
为了训练一个物体检测器,我们需要有一个标记图像的数据集,以帮助我们的模型了解它需要检测什么以及如何检测。
为了训练自定义的YOLOv4物体检测,我们需要有特定格式的训练图像数据--每张图像都应该有一个相应的文件,包含图像中存在的物体的坐标。
YOLOv4的训练数据的例子如下所示
用于物体检测的自定义YOLOv4模型的训练数据格式
ii) 关于数据注解工具LabelImg
您可以使用此链接中的LabelImg工具为YOLOv4的自定义训练数据进行注释,该工具适用于Linux或Windows系统。
LabelImg的注释步骤主要包括以下三个步骤-- 1.
- 提供图像目录和输出目录(你想保存相应的文本文件的地方)。一般来说,它们都存储在同一个地方。
- 将格式从PascalVOC改为YOLO。
- 在每个图像中给每个对象(通过在它们周围画出边界框)加上各自的名字(labelImg会自动给类分配零索引的ID)。
iii) YOLOv4的自定义数据注释
让我们看看如何使用LabelImg工具来注释YOLOv4的自定义训练图像的快速教程。
1.打开LabelImg,选择 "Open Dir "选项,转到您保存图像的目录。
LabelImg
2.2.接下来,选择 "更改保存目录",移动到您想保存注释(文本文件)的目录(您可以保持原样,图像和文本文件将被保存在同一个文件夹中)。
3.通过点击将pascalVOC的格式改为YOLO。
将PASCALVOC改为YOLO格式
4.现在点击'Create Rectbox'按钮,在你要检测的对象周围创建一个边界框。接下来,添加对象所属的类的名称。
这将创建一个classes.txt文件,你必须将其删除。我们删除它是因为类的名称将在以后的另一个文件中定义。
5.点击 "保存"(在侧边栏)来保存注释。
6.6.点击'下一个',打开下一张图片进行注释。对数据集中的所有图像都要这样做。
你也可以观看这个Youtube视频,以更好地了解LabelImg的注释过程。
重要提示:图像和文本文件应该在同一个文件夹中,所以步骤中的两个目录可以是相同的。LabelImg默认在目录中生成一个 "classes.txt"。你应该把它从文件夹中删除,并把它放在一边。
环境设置
i) 设置Google Colab
我们将利用谷歌Colab提供的免费GPU来训练我们的自定义YOLOv4模型进行物体检测。为此,请访问Colab的顶部 "编辑 "菜单,将运行时间改为GPU。
改变运行时间
改变运行时间
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
一旦驱动器被挂载,你就可以访问你上传到驱动器的数据了。
预览
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'文件的内容。继续把它上传到你的驱动器。
对象名称文件(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的新文件夹并在文件中提供其路径。
对象数据文件
d) Cfg文件
这是迄今为止最重要的文件,它包含了训练过程中使用的所有超参数的值。你可以自己探索这个文件,你将会发现以下内容 -
- [net]部分。这一部分包含了一些参数的值,如批量大小、细分、步骤数、烧录步骤、学习率等等。
- [yolo]层。这些层是执行物体检测的实际层,它们包含锚点的坐标、损失类型和非最大抑制值。物体检测器模型执行分类以及定位的组合,这被称为检测。
- [卷积]层。基本卷积层以及批量归一化和激活函数。
下载这个文件或简单地将内容复制到一个文本文件中,并保存为'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
训练过程
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
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%
输出YOLOv4
输出YOLOv4
输出YOLOv4
输出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
输出。
视频输出
- 还可以阅读 - YOLOv4图像和视频的物体检测教程。初学者指南
- 还可以阅读 - 教程 - YOLOv5在Colab中的自定义物体检测
The postTrain Custom YOLOv4 Model for Object Detection in Google Colab (Including Data Annotation Tutorial)appeared first onMLK - Machine Learning Knowledge.