原文:
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 算法的一个示例:
不同 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 架构(来自原始论文),请查看下面的图像:
下面是我们 YOLO NAS 模型的架构预览:
Yolo-NAS 模型预览 – 图像由作者提供。
在加载了 YOLO 权重后,是时候玩转图像分割了!
图像分割
让我们从一张以桌子为中心,周围环绕着各种物体的简单图像开始。在这张图像中,我们可以看到:
-
两把椅子
-
一张桌子
-
两个台灯
-
一台电脑
-
耳机
-
一株植物
图像 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()
带有 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()
带有 YOLO 标注的图像(40% 置信度)– 图像由作者提供
啊,有趣!降低我们的阈值导致了我们第一次误分类的实例。在这种情况下,耳机被错误地识别为电脑鼠标。降低阈值不可避免地会导致物体检测和分割中的更多错误。
让我们尝试一个更拥挤场景的图像:
图像由 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()
带有 YOLO 标注(30% 置信度)的图像 – 图像由作者提供
如我们所见,YOLO 在分割某些物体方面失败了 – 尤其是较小/较细的物体。尽管如此,性能相当不错,尤其是对于如此拥挤的图像。为了提高某些性能,使用与您的用例相关的图像进行迁移学习 非常重要。
现在,使用 super_gradients,我们正在抽象化大部分实际准备和预测我们图像边界界限的代码。 如果你想深入了解这些模型的基础,请查看文章 从我的 Pytorch 介绍系列训练计算机视觉算法。
在下一节中,我们将学习如何使用 YOLO-NAS,但在此处是用于视频分割。
对于本节,我将使用 YouTube 上的一个交通短视频:
交通视频 – 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。这里有一个酷的预览:
分段交通视频 – 图像由作者提供
YOLO 模型非常强大!你只需几行代码就可以非常快地使用它们来分割图像或视频。使用我在这里展示的代码,玩转你自己的媒体和实验这个优秀的计算机视觉模型非常简单。
正如你可能注意到的,尤其是在复杂图像或视频中,YOLO 基础模型仍然存在一些需要纠正的缺陷。正如我提到的,这可以通过模型微调得到很好的改善。查看这篇 帖子 获取更多信息。
如果你对深度学习的基石是如何工作的感到好奇,请随意查看我的 pytorch 介绍系列,这应该会给你一个关于深度学习基础的很好概述:
-
张量基础;
-
[使用自定义数据。](http://We’ve seen how to use custom data in the context of the library.)
感谢您阅读这篇帖子!再次感谢 Harpreet 提供了出色的 notebook。
如果你想阅读/查看更多与 AI 和 DS 相关的内容,请订阅我的 YouTube 频道 “The Data Journey”:
371

被折叠的 条评论
为什么被折叠?



