前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Yolov5进行端到端目标检测

使用Yolov5进行端到端目标检测

作者头像
deephub
发布2020-07-21 09:58:17
1.5K0
发布2020-07-21 09:58:17
举报
文章被收录于专栏:DeepHub IMBADeepHub IMBA

最近,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并安装依赖。

代码语言:javascript
复制
 git clone https://github.com/EscVM/OIDv4_ToolKit
 cd OIDv4_ToolKit
 pip install -r requirements.txt

我们现在可以使用这个文件夹中的main.py脚本来下载图像以及多个类的标签。

下面我正在下载板球和足球的数据来创建我们的自定义数据集。也就是说,我们将创建一个包含足球和板球的数据集,而学习任务就是检测这些球。

代码语言:javascript
复制
 python3 main.py downloader --classes Cricket_ball  Football --type_csv all -y --limit 500

下面的命令创建一个名为“OID”的目录,其结构如下:

OID目录结构。我们将只使用这里的图像文件(.jpgs),而不使用我们将手动注释以创建自定义数据集的标签,尽管我们可以在不同项目需要时使用它们。

在继续之前,我们需要将所有图像复制到同一个文件夹中,以便从头开始标记练习。你可以选择手动完成,但这也可以快速完成通过递归glob函数:

代码语言:javascript
复制
 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上使用,但我想这对我们大多数人来说是可以的。

  1. 创建项目

2,设置标签

3。添加本地图像数据源

4。标注

这个工具最好的部分是它提供的各种输出格式。因为我们想要得到Yolo的数据,我们将使用Yolo格式并在注释完成后导出它。但是如果希望获得JSON格式(COCO)或XML格式(Pascal VOC)的注释,也可以选择使用这个工具。

以Yolo格式导出实际上为我们的每个图像创建了一个.txt文件,其中包含图像的class_id、x_center、y_center、宽度和高度。它还创建了一个名为obj.names的文件,这有助于将class_id映射到类名。例如:

注意,注释文件中的坐标从0到1。另外,请注意,根据obj.names文件(从0开始),class_id对于板球是0,对于足球是1。我们还使用它创建了一些其他文件,但在本例中不会使用它们。

一旦我们完成了这些操作,我们就基本上建立了自定义数据集,并且只需要重新安排这些文件中的一些,以便在以后训练模型时进行后续的训练和验证分割。数据集目前将是一个单独的文件夹,如下所示,包含图像和注释:

代码语言:javascript
复制
 dataset
     - 0027773a6d54b960.jpg  
     - 0027773a6d54b960.txt
     - 2bded1f9cb587843.jpg
     - 2bded1f9cb587843.txt
     --
     --

建立项目

为了训练我们的自定义目标检测器,我们将使用来自Ultralytics的Yolov5。我们首先克隆存储库并安装依赖项:

代码语言:javascript
复制
 git clone https://github.com/ultralytics/yolov5 # clone repo
 cd yolov5
 pip install -U -r requirements.txt

然后我们开始创建自己的名为training的文件夹,我们将在其中保存自定义数据集。

代码语言:javascript
复制
 !mkdir training

我们首先将自定义数据集文件夹复制到该文件夹中,并使用简单的train_val_folder_split创建训练和验证文件夹。下面的代码创建了一些训练和验证文件夹,并用图像填充它们。

代码语言:javascript
复制
 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")

运行之后,您的数据文件夹结构应该如下所示。它应该有两个目录映像和标签。

我们现在必须添加两个配置文件到训练文件夹:

  1. 数据集。我们创建一个文件“dataset”。包含训练和验证图像的路径以及类。
代码语言:javascript
复制
 # 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']
  1. 模型。yaml:在创建网络时,我们可以使用从小到大的多种模型。例如,yolov5s。yolov5/models目录中的yaml文件是带有7M参数的小Yolo模型,而yolov5x。yaml是最大的Yolo型号,有96M Params。对于这个项目,我将使用yolov5l。有50m params的yaml。首先从yolov5/models/yolov5l中复制文件。将yaml转换到training文件夹,并更改nc,即根据我们的项目需求将类数改为2。
代码语言:javascript
复制
 # parameters
 nc: 2  # change number of classes
 depth_multiple: 1.0  # model depth multiple
 width_multiple: 1.0  # layer channel multiple

训练

此时,我们的训练文件夹看起来如下:

一旦我们完成了上述步骤,我们就可以开始训练我们的模型了。这和运行下面的命令一样简单,在这里我们提供配置文件和各种其他参数的位置。您可以在train.py文件中查看其他不同的选项,但这些是我认为值得注意的选项。

代码语言:javascript
复制
 # 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使用:

代码语言:javascript
复制
 # 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

开始训练之后,可以通过检查自动创建的filetrain_batch0.jpg和test_batch0_gt.jpg来检查训练是否已经设置好,前者包含第一批的训练标签,后者包含测试图像的ground truth。

结果

要查看使用tensorboard在浏览器中的localhost:6006上的结果,请在另一个命令行终端中运行此命令

代码语言:javascript
复制
 tensorboard --logdir=runs

下面是各种验证度量。在训练结束时,这些度量也会保存在一个results.png文件中。

预测

Yolov5提供了很多不同的方法来检查新数据的结果。

要检测一些图像,您可以简单地将它们放入名为inference/images的文件夹中,然后根据自动运行推断:

代码语言:javascript
复制
 python detect.py --weights weights/best.pt

您也可以在视频使用detect.py文件进行检测:

代码语言:javascript
复制
 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上下载代码。

https://www.kaggle.com/mlwhiz/detection-footballvscricketball

https://github.com/MLWhiz/data_science_blogs/tree/master/yolov5CustomData

作者:Rahul Agarwal

deephub翻译组

DeepHub

微信号 : deephub-imba

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DeepHub IMBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建自定义数据集
  • 建立项目
  • 训练
  • 结果
  • 预测
  • 结论
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档