最近,Ultralytics推出了YOLOv5,但它的名字却引发了争议。为了了解背景,《YOLO》(你只能看一次)的前三个版本是由约瑟夫·雷蒙(Joseph Redmon)创作的。在此之后,Alexey Bochkovskiy在darknet上创建了YOLOv4,号称比之前的迭代具有更高的平均精度(AP)和更快的结果。
现在,Ultralytics已经发布了YOLOv5,具有可比的AP和比YOLOv4更快的推断时间。这就产生了许多疑问:新版本是否保证了与YOLOv4相似的准确性?无论答案是什么,这绝对是目标检测界发展速度的一个标志。
自从他们第一次移植YOLOv3以来,Ultralytics就使得使用Pytorch创建和部署模型变得非常简单,所以我很想尝试YOLOv5。事实证明,Ultralytics 进一步简化了这个过程,结果不言自明。
在本文中,我们不探讨YOLOv5这个名字是否正规,我们只使用YOLOv5创建一个检测模型,从创建数据集和注释到使用它们出色的库进行训练和推断。这篇文章主要关注YOLOv5的实现,包括:
创建数据集注释图像数据创建项目结构训练YOLOv5创建自定义数据集
使用OIDv4下载图片:
要从开放的数据集下载图像,我们首先克隆OIDv4_ToolKit并安装依赖。
git clone github /EscVM/OIDv4_ToolKit cd OIDv4_ToolKit pip install -r requirements.txt
我们现在可以使用这个文件夹中的main.py脚本来下载图像以及多个类的标签。
下面我正在下载板球和足球的数据来创建我们的自定义数据集。也就是说,我们将创建一个包含足球和板球的数据集,而学习任务就是检测这些球。
python3 main.py downloader --classes Cricket_ball Football --type_csv all -y --limit 500
下面的命令创建一个名为“OID”的目录,其结构如下:
OID目录结构。我们将只使用这里的图像文件(.jpgs),而不使用我们将手动注释以创建自定义数据集的标签,尽管我们可以在不同项目需要时使用它们。
在继续之前,我们需要将所有图像复制到同一个文件夹中,以便从头开始标记练习。你可以选择手动完成,但这也可以快速完成通过递归glob函数:
import os from glob import globos.system("mkdir Images") images = glob(r'OID/**/*.jpg', recursive=True) for img in images: os.system(f"cp {img} Images/")
使用HyperLabel标签图像
我们将使用一个名为Hyperlabel的工具来标记图像。过去,我使用过很多工具来创建注释,比如labelimg、labelbox等,但从来没有遇到过这么简单、这么开源的工具。唯一的缺点是你不能在Linux上使用这个工具,只能在Mac和Windows上使用,但我想这对我们大多数人来说是可以的。
创建项目
2,设置标签
3。添加本地图像数据源
4。标注
这个工具最好的部分是它提供的各种输出格式。因为我们想要得到Yolo的数据,我们将使用Yolo格式并在注释完成后导出它。但是如果希望获得JSON格式(COCO)或XML格式(Pascal VOC)的注释,也可以选择使用这个工具。
以Yolo格式导出实际上为我们的每个图像创建了一个.txt文件,其中包含图像的classid、xcenter、ycenter、宽度和高度。它还创建了一个名为obj.names的文件,这有助于将classid映射到类名。例如:
注意,注释文件中的坐标从0到1。另外,请注意,根据obj.names文件(从0开始),class_id对于板球是0,对于足球是1。我们还使用它创建了一些其他文件,但在本例中不会使用它们。
一旦我们完成了这些操作,我们就基本上建立了自定义数据集,并且只需要重新安排这些文件中的一些,以便在以后训练模型时进行后续的训练和验证分割。数据集目前将是一个单独的文件夹,如下所示,包含图像和注释:
dataset - 0027773a6d54b960.jpg - 0027773a6d54b960.txt - 2bded1f9cb587843.jpg - 2bded1f9cb587843.txt -- --
建立项目
为了训练我们的自定义目标检测器,我们将使用来自Ultralytics的Yolov5。我们首先克隆存储库并安装依赖项:
git clone github /ultralytics/yolov5 # clone repo cd yolov5 pip install -U -r requirements.txt
然后我们开始创建自己的名为training的文件夹,我们将在其中保存自定义数据集。
!mkdir training
我们首先将自定义数据集文件夹复制到该文件夹中,并使用简单的trainvalfolder_split创建训练和验证文件夹。下面的代码创建了一些训练和验证文件夹,并用图像填充它们。
import glob, os import random# put your own path here dataset_path = 'dataset'# Percentage of images to be used for the validation set percentage_test = 20!mkdir data !mkdir data/images !mkdir data/labels !mkdir data/images/train !mkdir data/images/valid !mkdir data/labels/train !mkdir data/labels/valid# Populate the folders p = percentage_test/100 for pathAndFilename in glob.iglob(os.path.join(dataset_path, "*.jpg")): title, ext = os.path.splitext(os.path.basename(pathAndFilename)) if random.random() <=p : os.system(f"cp {dataset_path}/{title}.jpg data/images/valid") os.system(f"cp {dataset_path}/{title}.txt data/labels/valid") else: os.system(f"cp {dataset_path}/{title}.jpg data/images/train") os.system(f"cp {dataset_path}/{title}.txt data/labels/train")
运行之后,您的数据文件夹结构应该如下所示。它应该有两个目录映像和标签。
我们现在必须添加两个配置文件到训练文件夹:
数据集。我们创建一个文件“dataset”。包含训练和验证图像的路径以及类。# train and val datasets (image directory or *.txt file with image paths) train: training/data/images/train/ val: training/data/images/valid/# number of classes nc: 2# class names names: ['Cricketball', 'Football']
模型。yaml:在创建网络时,我们可以使用从小到大的多种模型。例如,yolov5s。yolov5/models目录中的yaml文件是带有7M参数的小Yolo模型,而yolov5x。yaml是最大的Yolo型号,有96M Params。对于这个项目,我将使用yolov5l。有50m params的yaml。首先从yolov5/models/yolov5l中复制文件。将yaml转换到training文件夹,并更改nc,即根据我们的项目需求将类数改为2。# parameters nc: 2 # change number of classes depth_multiple: 1.0 # model depth multiple width_multiple: 1.0 # layer channel multiple
训练
此时,我们的训练文件夹看起来如下:
一旦我们完成了上述步骤,我们就可以开始训练我们的模型了。这和运行下面的命令一样简单,在这里我们提供配置文件和各种其他参数的位置。您可以在train.py文件中查看其他不同的选项,但这些是我认为值得注意的选项。
# Train yolov5l on custom dataset for 300 epochs $ python train.py --img 640 --batch 16 --epochs 300--data training/dataset.yaml --cfg training/yolov5l.yaml --weights ''
有时你可能会得到一个错误,PyTorch 1.5版本在这种情况下运行在一个单一的GPU使用:
# Train yolov5l on custom dataset for 300 epochs $ python train.py --img 640 --batch 16 --epochs 300--data training/dataset.yaml --cfg training/yolov5l.yaml --weights '' --device 0
开始训练之后,可以通过检查自动创建的filetrainbatch0.jpg和testbatch0_gt.jpg来检查训练是否已经设置好,前者包含第一批的训练标签,后者包含测试图像的groundtruth
结果
要查看使用tensorboard在浏览器中的localhost:6006上的结果,请在另一个命令行终端中运行此命令
tensorboard --logdir=runs
下面是各种验证度量。在训练结束时,这些度量也会保存在一个results.png文件中。
预测
Yolov5提供了很多不同的方法来检查新数据的结果。
要检测一些图像,您可以简单地将它们放入名为inference/images的文件夹中,然后根据自动运行推断:
python detect.py --weights weights/best.pt
您也可以在视频使用detect.py文件进行检测:
python detect.py --weights weights/best.pt --source inference/videos/messi.mp4 --view-img --output inference/output
在这里,我指定希望使用- view-img标志查看输出,并将输出存储在位置推断/输出中。这将在这个位置创建一个.mp4文件。令人印象深刻的是,网络模型可以找到球,在这里进行推断的速度,以及从未观察到的数据令人震惊的准确性。
您还可以通过将——source指定为0来使用webcam作为源。您可以在detect.py文件中查看其他各种选项。
结论
在这篇文章中,我讨论了如何使用自定义数据集创建Yolov5对象检测模型。我喜欢Ultralytics让创建物体检测模型变得如此容易。
此外,他们提供的查看模型结果的各种方式使它成为我很久以来看到的一个完整的包。
如果你想亲身体验自定义数据集,你可以在Kaggle上下载注释数据,在Github上下载代码。