使用 Yolo-NAS 进行简单对象检测

原文:towardsdatascience.com/easy-object-detection-with-yolo-nas-51f9931be979

YOLO(您只需看一次)彻底改变了计算机视觉领域。YOLO 的第一个版本由 Joseph Redmon 等人于 2016 年发布arxiv.org/abs/1506.02640,在速度和准确率方面都打破了基准。当涉及到对象检测时,YOLO 一直是数据科学家和机器学习工程师的首选,也是分割图像中实体的首选模型。

自从它推出以来,YOLO 经历了许多新的迭代,改进了之前版本的一些缺点,例如:

  • 改进了底层深度学习模型的架构。

  • 实现了改进性能的替代方案,例如数据增强技术。

  • 将原始 YOLO 代码迁移到使用pytorch训练和部署框架。

  • 改进了小对象的检测机制。

YOLO 的最后一个版本是 YOLO v9 (arxiv.org/abs/2402.13616)。需要注意的一个重要事项是,每个计算机视觉和对象检测模型都是基于两个参数进行评估的:准确率(由与计算机视觉分割相关的指标定义)和速度(由推理中的延迟定义)。以下是如何评估 CV 算法的一个示例:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3e789b5a0b631efaa469bccd636db469.png

不同 YOLO 模型与 EfficientDet 的比较 – 图片来源:blog.roboflow.com/yolov5-is-here/

在这个例子中,我将向您展示如何在图像和视频上运行您自己的 YOLO 模型,以便您可以进行对象检测和分割。我正在执行的整个代码链接在这里,在这个Google Colab 笔记本中。

部分代码和博客文章受到了这个出色的笔记本的启发,作者是Harpreet Sahota

让我们开始吧!


加载模型

我们将开始训练我们自己的计算机视觉模型…

当然不是,那将是浪费时间 😊

我们将首先加载一个大型 YOLO 模型的预训练版本。在这种情况下,我们将使用一个具有 NAS(神经架构搜索)的 YOLO 实现。神经架构搜索是神经网络优化技术的一种常见实现,旨在改善深度学习模型中参数的自动选择。

我们将使用的模型是在 COCO 数据集(上下文中的常见物体)上训练的。这些权重已经包含了一个非常好的基线,用于在图像上检测物体。

首先,让我们将我们需要的一些库添加到我们的环境中,即:

  • torchinfo,一个用于可视化我们的神经网络架构的辅助工具;

  • super_gradients,我们将使用它来加载我们的模型;

!pip install torchinfo
!pip install super_gradients

接下来,我们将加载我们需要的函数和库:

from super_gradients.training import models
from torchinfo import summary
import torch

_ 注意:如果你在使用 google colab 并且在安装 super_gradients 后收到重启内核的提示,请执行它。这是在该环境中使用 super_learners 时已知的问题之一 _

然后,我们首先使用 super_gradients 将我们的 COCO 预训练模型加载到内存中:

# Using Yolo NAS Large
yolo_nas_l = models.get("yolo_nas_l", pretrained_weights="coco")

太棒了!我们已经将预训练模型存储在 yolo_nas_l 中。使用 models 选择这些 YOLO 的预训练版本非常简单。

torchinfo 给我们提供了一个非常酷的模型架构视图:

summary(model=yolo_nas_l,
        input_size=(16, 3, 640, 640),
        col_names=["input_size", "output_size", "num_params", "trainable"],
        col_width=20,
        row_settings=["var_names"]
)

出于好奇,如果你想检查 YOLO 架构(来自原始论文),请查看下面的图像:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a44625484e4514839574601f98b7f358.png

图像来源:www.researchgate.net/publication/329038564_Complexity_and_accuracy_analysis_of_common_artificial_neural_networks_on_pedestrian_detection

下面是我们 YOLO NAS 模型的架构预览:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0e645d73c73005b17097af24e8056d20.png

Yolo-NAS 模型预览 – 图像由作者提供。

在加载了 YOLO 权重后,是时候玩转图像分割了!


图像分割

让我们从一张以桌子为中心,周围环绕着各种物体的简单图像开始。在这张图像中,我们可以看到:

  • 两把椅子

  • 一张桌子

  • 两个台灯

  • 一台电脑

  • 耳机

  • 一株植物

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8ca117216a0cae624be7c52eb740b542.png

图像 1 – 图像由 dawidliberadzki 在 Unsplash 提供

在我们的代码中,我们只请求模型置信度超过 55% 的边界框。只有这些项目的标签将显示在分割图像中。

url = "https://images.unsplash.com/photo-1476365518243-f738bf58443d?q=80&w=2787&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
yolo_nas_l.predict(url, conf=0.55).show()

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7f2dbb72c67486bc360fddf86e581ddc.png

带有 YOLO 标注的图像 – 图像由作者提供

太好了!我们的模型能够自信地检测到椅子、笔记本电脑、桌子和植物(尽管它错过了台灯、耳机和那个高科技的壶)。让我们看看如果我们降低置信度阈值会发生什么:

url = "https://images.unsplash.com/photo-1476365518243-f738bf58443d?q=80&w=2787&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
yolo_nas_l.predict(url, conf=0.40).show()

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1df3c2675008c45c0612bc743dea07fa.png

带有 YOLO 标注的图像(40% 置信度)– 图像由作者提供

啊,有趣!降低我们的阈值导致了我们第一次误分类的实例。在这种情况下,耳机被错误地识别为电脑鼠标。降低阈值不可避免地会导致物体检测和分割中的更多错误。

让我们尝试一个更拥挤场景的图像:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d92277b18ea55821ac82d3637f4422c3.png

图像由 madebyvadim @unsplash.com 提供

我们的 YOLO 模型将分割哪些物体?由于此图像有更多元素,我将降低推理的置信度:

url = "https://images.unsplash.com/photo-1496664444929-8c75efb9546f?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
yolo_nas_l.predict(url, conf=0.3).show()

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/86ecad199d7872cf878d7e488af06ebe.png

带有 YOLO 标注(30% 置信度)的图像 – 图像由作者提供

如我们所见,YOLO 在分割某些物体方面失败了 – 尤其是较小/较细的物体。尽管如此,性能相当不错,尤其是对于如此拥挤的图像。为了提高某些性能,使用与您的用例相关的图像进行迁移学习 非常重要。

现在,使用 super_gradients,我们正在抽象化大部分实际准备和预测我们图像边界界限的代码。 如果你想深入了解这些模型的基础,请查看文章 从我的 Pytorch 介绍系列训练计算机视觉算法

在下一节中,我们将学习如何使用 YOLO-NAS,但在此处是用于视频分割。


对于本节,我将使用 YouTube 上的一个交通短视频:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/bcc6ed955c59ca069ee804e5c66bcaa6.png

交通视频 – www.youtube.com/watch?v=CftLBPI1Ga4

我们首先将这段视频下载到我们的 Google Colab 环境中。我们也可以通过使用 IPython 的便捷 YoutubeVideo 函数来显示视频:

from IPython.display import YouTubeVideo

video = YouTubeVideo('CftLBPI1Ga4')
display(video)

为了下载我们的视频,我将使用 youtube-dl

video_url = f'https://www.youtube.com/watch?v=CftLBPI1Ga4'

!pip install -U "git+https://github.com/ytdl-org/youtube-dl.git"
!python -m youtube_dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' "$video_url"

我们几乎一切准备就绪。我们只需设置分割视频的输出路径,然后就可以通过 YOLO 模型传递我们的视频了!

input_video_path = f"/content/Cars, Busy Streets, City Traffic - No Copyright Royalty Free Stock Videos-CftLBPI1Ga4.mp4"
output = "traffic.mp4"

一切准备就绪!让我们运行我们的分割模型:

device = 'cuda' if torch.cuda.is_available() else "cpu"
yolo_nas_l.to(device).predict(input_video_path).save(output)

注意:此代码的运行可能需要一些时间,具体取决于您本地系统的配置和 Google Colab 上 GPU 的可用性

… 就这样!你可以在我的 YouTube 频道 “The Data Journey” 上查看分割视频 youtu.be/-7j4eJorJSY。这里有一个酷的预览:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/bb6f31f27680b8cf3f2d6b4d16c8a035.png

分段交通视频 – 图像由作者提供


YOLO 模型非常强大!你只需几行代码就可以非常快地使用它们来分割图像或视频。使用我在这里展示的代码,玩转你自己的媒体和实验这个优秀的计算机视觉模型非常简单。

正如你可能注意到的,尤其是在复杂图像或视频中,YOLO 基础模型仍然存在一些需要纠正的缺陷。正如我提到的,这可以通过模型微调得到很好的改善。查看这篇 帖子 获取更多信息。

如果你对深度学习的基石是如何工作的感到好奇,请随意查看我的 pytorch 介绍系列,这应该会给你一个关于深度学习基础的很好概述:

感谢您阅读这篇帖子!再次感谢 Harpreet 提供了出色的 notebook

如果你想阅读/查看更多与 AI 和 DS 相关的内容,请订阅我的 YouTube 频道 “The Data Journey”:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ae662b12877b269f0b217c31048f7a75.png

www.youtube.com/@TheDataJourney42

### 将YOLO模型转换为其他版本或格式 #### YOLO不同版本之间的转换 YOLO的不同版本(如YOLOv3、YOLOv4、YOLOv5等)主要区别在于网络架构和配置文件。为了将一个版本的YOLO模型迁移到另一个版本,通常需要调整以下几个方面: - **权重文件**:YOLO各版本之间可能有不同的层结构和参数数量,因此直接迁移权重通常是不可行的。可以考虑重新训练新版本的模型,使用旧版模型作为预训练模型来初始化权重[^1]。 - **配置文件**:每个YOLO版本都有特定的`.cfg`配置文件定义了网络架构和其他超参数设置。当从一个版本切换到另一个版本时,需修改这些配置文件以适应新版的要求。 #### YOLO与其他框架/工具链的互操作性 对于希望利用YOLO之外的其他深度学习平台或工具的情况,可以通过以下几种方式实现YOLO模型向其他格式的转换: - **ONNX (Open Neural Network Exchange)**:这是一种开放的标准交换格式,支持多种机器学习库间的模型共享。通过PyTorch或TensorFlow导出YOLO模型至ONNX格式后,可以在多个平台上部署该模型[^2]。 ```python import torch.onnx as onnx from models import * # 假设这是加载YOLO模型的地方 model = Darknet('yolov3.cfg', img_size=(416, 416)).cuda() dummy_input = torch.randn(1, 3, 416, 416).cuda() onnx.export(model, dummy_input, 'yolov3.onnx', verbose=True, opset_version=11) ``` - **Core ML / TensorFlow Lite**:如果目标是在移动设备上运行YOLO,则可将其转化为适用于iOS(Core ML) 或 Android(TensorFlow Lite) 的轻量化模型形式。这同样涉及到先将原始YOLO模型保存成中间表示(比如ONNX),再进一步编译为目标平台所需的二进制格式。 #### 数据标注格式转换 除了模型本身的转换外,在某些情况下还需要处理数据集标签格式的变化。例如,要将在YOLO格式中标记的对象位置信息应用于Pascal VOC标准下的项目中,就需要编写专门的脚本来完成这种转变。此过程涉及解析源格式并按照目的格式重组相关信息。 ```bash # 使用命令行调用Python脚本进行批量转换 $ python yolo_to_voc.py --input_dir ./annotations_yolo \ --output_dir ./annotations_voc \ --images_dir ./images ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值