第一章:计算机视觉中图像的基础认知
第二章:计算机视觉:卷积神经网络(CNN)基本概念(一)
第三章:计算机视觉:卷积神经网络(CNN)基本概念(二)
第四章:搭建一个经典的LeNet5神经网络(附代码)
第五章:计算机视觉:神经网络实战之手势识别(附代码)
第六章:计算机视觉:目标检测从简单到容易(附代码)
第七章:MTCNN 人脸检测技术揭秘:原理、实现与实战(附代码)
第八章:探索YOLO技术:目标检测的高效解决方案
第九章:计算机视觉:主流数据集整理
YOLO__10">一、YOLO 简介
YOLO(You Only Look Once) 是一种用于计算机视觉任务的对象检测系统,它由Joseph Redmon等人于2015年提出,于2016年发布YOLOv1,并在随后的几年中经历了多次迭代和改进,目前最新的版本是2024年9月发布的YOLO11。YOLO的目标是实现实时对象检测,同时保持较高的准确率。
“You Only Look Once”强调的是YOLO算法的高效性——对于每一张输入图片,只需要一次完整的神经网络推理即可完成所有的目标检测任务,一次性输出所有检测到的对象的位置和类别信息。无需反复查看或分析图像的不同部分。
“You Only Look Once”不仅仅是一个名字,它概括了YOLO算法的本质特征:简洁、快速且有效。这一特性使得YOLO成为许多实际应用中的首选目标检测解决方案。
YOLO_19">1.1 YOLO可以做什么?
- 实时对象检测:YOLO能够在视频流或实时摄像头输入中快速识别并定位多种类型的对象。
- 多对象分类:不仅可以检测出对象的存在,还可以对其进行分类,如区分人、车、动物等不同种类的对象。
- 位置估计:除了识别对象类别外,还能给出每个对象在图像中的精确位置,通常以边界框的形式表示。
- 应用场景广泛:可用于自动驾驶汽车、智能安防监控、零售分析等多个领域。
YOLO_26">1.2 YOLO的优点
-
全局推理:与滑动窗口和基于候选区域的技术不同,YOLO在整个图像上进行训练和测试,这使得它能够利用上下文信息来提高检测精度。
-
泛化能力强:YOLO模型对新领域或意外输入有较好的适应性,因为它学习到了目标的一般表示形式。
-
易于优化:作为一个端到端的系统,YOLO可以直接在检测性能上进行优化,简化了训练流程。
-
多尺度预测:特别是从YOLOv2开始引入了多尺度预测的概念,允许模型更好地捕捉不同大小的目标。
-
支持多种设备部署:YOLO提供了多种版本的模型,可以根据需要选择适合特定硬件配置的版本,从而实现高效的部署。
YOLO_39">二、YOLO与同类算法对比
目标检测算法对比表,这个表格,从网络搜集资料,整理而来,具体数字没有可参考性,主要是看整体的表现。
算法 | 检测速度(FPS) | 模型大小(MB) | 检测精度(COCO mAP) | 核心改进/特点 | 适用场景 |
---|---|---|---|---|---|
YOLOv11 | 120-180(GPU) | 3.5-240(分版本) | 55-65% | Anchor-free、可逆网络优化、动态标签分配、支持开放词汇检测 | 实时多类别检测(自动驾驶、安防监控) |
RT-DETR | 30-60(GPU) | 150-300 | 68-72% | Transformer架构、全局注意力机制、端到端检测 | 高精度静态图像分析(医疗影像、工业质检) |
Faster R-CNN | 5-15(GPU) | 200-350 | 50-70% | 两阶段检测、区域提议网络(RPN)、高定位精度 | 非实时高精度需求(学术研究、精密测量) |
RetinaNet | 20-40(GPU) | 180-300 | 45-55% | Focal Loss解决类别不平衡、单阶段检测中的精度标杆 | 长尾分布数据集(罕见物体检测) |
MobileNet-SSD | 50-100(CPU) | 2-15 | 25-35% | 轻量化设计、适用于移动端部署 | 移动端/嵌入式实时检测(手机应用、IoT设备) |
从表格里看,虽然具体的数字没有可参考性,但是也能看出一个整体情况,在模型选择上可以有一个参考:
- 工业级实时检测:YOLO或MobileNet-SSD。
- 高精度静态分析:RT-DETR或Faster R-CNN。
YOLO_53">三、Ultralytics与YOLO
Ultralytics与YOLO之间的关系非常紧密。Ultralytics是一家致力于开发和推广先进计算机视觉算法的公司,而YOLO是一种广泛使用的目标检测算法。
-
YOLO的发展:YOLO最初由Joseph Redmon等人开发,并经历了多个版本的迭代(YOLOv1到YOLOv3)。然而,在YOLOv4之后,由于Redmon退出了计算机视觉领域,官方YOLO的发展似乎有所停滞。
-
Ultralytics的角色:Ultralytics接手了YOLO的进一步发展,尤其是在YOLOv5及后续版本中,Ultralytics通过其优化和改进,使得这一系列成为了非常流行且实用的目标检测工具。
四、安装与环境搭建
运行YOLO通常需要满足一定的硬件和软件要求,以确保模型能够顺利执行并达到预期的性能。以下是一般运行要求:
4.2 硬件要求
- 处理器:推荐使用高性能的多核CPU,尤其是对于训练任务来说,更强大的CPU可以显著减少训练时间。
- 内存:至少需要8GB RAM,但为了处理较大的数据集或进行模型训练,建议配置16GB或更多的内存。
- GPU:虽然不是必须的,但对于加速训练过程和提高推理速度而言,拥有一个兼容CUDA的NVIDIA GPU是非常有益的。
- 存储空间:取决于具体需求,如数据集大小、预训练模型等,至少需要几十GB的硬盘空间。
4.2 软件要求
- 操作系统:YOLO可以在多种操作系统上运行,包括Windows、macOS以及各种Linux发行版。
- Python环境:需要安装Python 3.8或更高版本,并建议创建虚拟环境来管理依赖项。
- PyTorch:YOLO基于PyTorch框架构建,因此需要安装适合您系统和硬件配置的PyTorch版本。如果使用GPU加速,需确保安装了正确的CUDA和cuDNN库。
- 其他依赖库:根据具体的实现,可能还需要安装额外的Python包,例如
numpy
,opencv-python
,matplotlib
等,这些通常可以通过项目的requirements.txt
文件一次性安装。 - 开发工具:Jupyter、PyCharm、 VSCode等可以帮助编写和调试代码。
安装过程可以到ultralytics的官网上去看看,安装过程很简单。Ultralytics 提供了多种安装方法,包括 pip、conda 和 Docker。
- YOLO 通过 ultralytics pip 软件包的最新稳定版本,
- 或通过克隆 Ultralytics GitHub 存储库 获取最新版本。
- 可以使用 Docker 在隔离的容器中执行软件包,避免本地安装。
一、安装前的准备
- 查看电脑状况 :检查 Mac 电脑的硬件配置,包括 CPU、内存、显卡等信息,确保电脑能够满足 YOLO 的运行要求。
- 安装所需软件 :
- Anaconda :用于创建和管理虚拟环境,方便安装和管理 Python 包。可以从 Anaconda 官网下载安装包进行安装。
- 开发工具:Jupyter、PyCharm、 VSCode,任选一款常用的 Python 集成开发环境(IDE),方便编写和调试代码。
二、安装环境
-
安装python,最新的版本是python3.12
-
打开 命令行终端,输入以下命令创建一个名为 yolov11 的虚拟环境,Python 版本为 3.12:
conda create -n yolov11 python=3.12
创建完成后,激活虚拟环境:
conda activate yolov11
-
安装 PyTorch :
打开PyTorch的官网,会告诉你安装的命令:
Compute Platform: 选中的是Default,其他都带有删除线,表示没有 GPU,就只有 CPU,安装命令:pip3 install torch torchvision torchaudio
-
安装 ultralytics 库 :
打开官网,进入快速入门,有安装指导。
输入以下命令安装 ultralytics 库,该库包含了运行 YOLOv11 所需的大部分环境:
# Install the ultralytics package from PyPI pip install ultralytics
三、下载 YOLOv11 源码及使用环境
下载 YOLOv11 源码 :从 YOLOv11 官网或 GitHub 仓库下载源码,解压后放置在合适的目录下。
PyCharm 导入环境 :在 PyCharm 中打开 YOLOv11 的源码目录,配置虚拟环境为之前创建的 yolov11 环境,确保代码能够正确运行。
四、验证环境
运行测试代码 :在 YOLOv11 的源码目录中,找到测试代码或示例代码,运行代码查看是否能够正常输出结果。
检查依赖库版本 :确保安装的 PyTorch、ultralytics 等库的版本与 YOLOv11 要求的版本一致,避免出现兼容性问题。
五、图像分类任务
在ultralytics的官网上,针对每种任务类型,有简单的案例。
图像分类是三项任务中最简单的一项,涉及将整幅图像归入一组预定义类别中的某一类。
图像分类器的输出是单一类别标签和置信度分数。当你只需要知道图像属于哪一类,而不需要知道该类对象的位置或确切形状时,图像分类就非常有用。
5.1 预训练分类模型介绍
YOLO11 这里显示的是经过预训练的分类模型。是在ImageNet数据集上预先训练的。
首次使用时,模型会自动从最新的Ultralytics 版本下载。
第一列是模型的不同杯型,YOLO11n-cls,n代表的是YOLO11最小参数量的模型,YOLO11x-cls,x代表的是YOLO11最大参数量的模型,后面的 cls 表示这是一个图像分类模型。
尺寸
是指的输入图片的像素大小,输入到模型中的图像将被调整(缩放和/或填充)到224x224像素的大小。acc
值是指模型在ImageNet数据集验证集上的准确性。acc top1和acc top5是两个常用的指标。Acc Top1(Top-1 Accuracy)
:这是指模型预测概率最高的那一类(即置信度最高的类别)是否正确匹配了实际标签。换句话说,对于给定的一张图片,如果模型认为最有可能的那个类别正好是这张图片的真实类别,则该预测被认为是正确的。Top-1准确率直接反映了模型对每个样本的最佳猜测是否准确。Acc Top5(Top-5 Accuracy)
:相比之下,Top-5准确率则更为宽松一些。它指的是真实类别是否出现在模型给出的前五个可能性最大的类别之中。也就是说,如果一个模型为一张图片提供了五个最可能的标签预测,只要其中包含了正确的那个标签,即使不是概率最高的那个,也视为预测正确。这在多类别分类问题中尤其有用,因为有时候几个类别之间的差异可能很小,或者图像可能包含多个相关但不完全相同的对象。Top-1
准确率更适合用于评估那些需要精确识别单一类别的情况。Top-5
准确率则可以作为一种补充度量,尤其是在处理具有挑战性的分类任务或当存在较高不确定性时,它可以提供额外的信息来判断模型的整体表现如何。
速度
是在ImageNet验证图像上使用Amazon EC2 P4d实例平均得出的。Amazon EC2 P4d实例是亚马逊云服务(AWS)提供的一种高性能计算实例。params
通常指的是模型参数的数量,单位通常是百万(M代表Million)。例如,当提到YOLO的一个变体有1.6M或28.4M参数时,这意味着该模型包含了160万或2840万个学习参数。这些参数包括但不限于卷积层中的权重、偏置项等。参数数量直接影响到模型的复杂度、表达能力和所需的计算资源。一般来说:- 更多的参数意味着模型具有更高的容量去拟合训练数据,有可能提高模型的性能,特别是在处理复杂任务时。
- 然而,过多的参数也可能导致过拟合问题,尤其是在训练数据集不够大时。此外,参数越多,模型所需的存储空间越大,推理速度也可能越慢。
FLOPs
表示 浮点运算次数,用于衡量模型的计算复杂度或算法执行所需的计算量,用于评估不同模型架构之间的相对效率。较低的FLOPs值通常意味着模型运行更快、消耗的能量更少,这对于移动设备或其他资源受限环境非常重要。(B)
中的 B 代表 Billion(十亿),即该模型的浮点运算次数以十亿为单位。例如,5B FLOPs 表示 50 亿次浮点运算。at 640
通常指输入图像的尺寸为 640×640 像素,表示在此分辨率下模型的计算量16。
在选择YOLO模型版本时,需要根据具体的任务需求(如精度要求、速度要求、硬件限制等)来权衡模型大小。例如,对于实时性要求高的应用,可能会倾向于选择参数较少的版本;而对于追求最高准确性的应用场景,则可能愿意接受更大的模型。
5.2 模型训练
官方给出的示例,使用Ultralytics的YOLO库来加载、配置和训练一个分类模型。
# 导入Ultralytics提供的YOLO类,可以利用YOLO的各种功能,包括加载预训练模型、从配置文件构建新模型以及训练模型等。
from ultralytics import YOLO
# 这里有三种不同的方式来初始化YOLO模型对象
# 从YAML文件新建模型
# 这行代码基于指定的yolo11n-cls.yaml文件定义的新架构创建一个YOLO模型。该文件通常包含了网络结构的配置信息。
model = YOLO("yolo11n-cls.yaml")
# 加载预训练模型
# 直接加载一个已经训练好的模型权重文件(.pt文件),这种方式推荐用于继续训练或直接进行推理,因为它可以节省大量时间,并且提供了一个较好的起点。
model = YOLO("yolo11n-cls.pt")
# 从YAML文件构建并加载权重
# 首先根据YAML文件构建模型架构,然后从给定的.pt文件中加载权重。这种方法适用于当你想要修改模型架构但还想保留原有的部分权重时使用。
model = YOLO("yolo11n-cls.yaml").load("yolo11n-cls.pt")
# 这行代码开始训练过程
results = model.train(data="mnist160", epochs=100, imgsz=64)
训练接受以下参数:
data="mnist160"
:指定数据集配置文件路径或名称。这里假设是一个名为mnist160的数据集配置,它定义了训练和验证数据的位置、类别信息等。epochs=100
:设置训练周期数为100,意味着整个训练集会被完整地遍历100次。imgsz=64
:设置输入图像的尺寸大小为64x64像素。这个参数会影响模型输入层的设计以及预处理步骤中的图像缩放操作。
最终,train()
方法会返回一个包含训练结果的对象,如损失值、准确率等指标的变化情况,便于后续分析和可视化。
要训练一个图像分类模型,数据集需要遵循一定的规则,查看官方的分类数据集的介绍。
YOLO 分类任务的数据集结构
对于 Ultralytics YOLO 分类任务,数据集必须以特定的分割目录结构组织起来,置于 root 目录,以便于进行适当的培训、测试和可选的验证过程,这里说的root目录不是指的操作系统的文件根目录,而是我们自己指定的数据集的总目录,比如下面案例的cifar-10。该目录结构包括单独的培训目录 (train)和测试(test)阶段,以及一个可选的验证目录 (val).
每个目录应包含数据集中每个类别的一个子目录。子目录以相应类别命名,包含该类别的所有图像。确保每个图像文件都有唯一的名称,并以 JPEG 或 PNG 等通用格式存储。
文件夹结构示例
以 CIFAR-10 数据集为例。CIFAR-10:一个包含 60K 幅 32x32 彩色图像的数据集,分为 10 类,每类 6K 幅图像。文件夹结构应如下所示:
cifar-10-/
|
|-- train/
| |-- airplane/
| | |-- 10008_airplane.png
| | |-- 10009_airplane.png
| | |-- ...
| |
| |-- automobile/
| | |-- 1000_automobile.png
| | |-- 1001_automobile.png
| | |-- ...
| |
| |-- bird/
| | |-- 10014_bird.png
| | |-- 10015_bird.png
| | |-- ...
| |
| |-- ...
|
|-- test/
| |-- airplane/
| | |-- 10_airplane.png
| | |-- 11_airplane.png
| | |-- ...
| |
| |-- automobile/
| | |-- 100_automobile.png
| | |-- 101_automobile.png
| | |-- ...
| |
| |-- bird/
| | |-- 1000_bird.png
| | |-- 1001_bird.png
| | |-- ...
| |
| |-- ...
|
|-- val/ (optional)
| |-- airplane/
| | |-- 105_airplane.png
| | |-- 106_airplane.png
| | |-- ...
| |
| |-- automobile/
| | |-- 102_automobile.png
| | |-- 103_automobile.png
| | |-- ...
| |
| |-- bird/
| | |-- 1045_bird.png
| | |-- 1046_bird.png
| | |-- ...
| |
| |-- ...
5.3 模型验证
上面的模型训练完成之后,需要验证模型的效果,使用评价指标,看看模型训练的情况,使用Ultralytics的YOLO库来加载一个已经训练好的分类模型,并对其进行验证,以评估其在特定数据集上的准确性。
from ultralytics import YOLO
# 这里有两种方式来加载YOLO模型对象
# 加载官方预训练模型
# 加载一个名为yolo11n-cls.pt的预训练模型文件。这个模型文件包含了模型的架构和权重信息。
model = YOLO("yolo11n-cls.pt")
# 加载自定义模型
# 如果你有一个自己训练好的模型文件(例如通过训练得到的最佳模型),可以通过指定该文件的路径来加载它。
model = YOLO("path/to/best.pt")
# 验证模型的性能
# no arguments needed, dataset and settings remembered
metrics = model.val()
metrics.top1 # top1 accuracy
metrics.top5 # top5 accuracy
验证模型的性能:
model.val()
:调用此方法对模型进行验证。由于模型在训练时保存了数据集和设置参数作为属性,因此这里不需要传递任何额外参数。
注意:这意味着之前训练时使用的数据集配置(如mnist160)以及相关的超参数(如图像大小、批次大小等)会被自动应用到验证过程中。metrics.top1
和metrics.top5
:这两个属性分别表示模型在验证集上的Top-1准确率和Top-5准确率。Top-1 Accuracy
:指预测概率最高的那一类是否正确匹配了实际标签。Top-5 Accuracy
:指真实类别是否出现在模型给出的前五个可能性最大的类别之中。
5.4 模型预测
下面展示如何使用Ultralytics的YOLO库加载一个已经训练好的分类模型,并利用该模型对图像进行预测。
from ultralytics import YOLO
# 有两种方式来加载YOLO模型对象
# 加载官方预训练模型
# 加载一个名为yolo11n-cls.pt的预训练模型文件。这个文件包含了模型的架构和权重信息,适用于直接开始预测或进一步训练。
model = YOLO("yolo11n-cls.pt")
# 如果你有一个自己训练好的模型文件(例如通过训练得到的最佳模型),可以通过指定该文件的路径来加载它。
model = YOLO("path/to/best.pt")
# 加载自定义模型
results = model("https://ultralytics.com/images/bus.jpg") # predict on an image
使用加载的模型对一张图片进行预测:
model("https://ultralytics.com/images/bus.jpg")
:这里直接调用了model对象,传入了一张图片的URL作为输入。YOLO库支持多种输入格式,包括图片文件路径、URL、甚至是图像数据本身。
在这个例子中,给定的是一张网络上的图片URL(指向一张公交车的图片)。YOLO模型将下载这张图片并对其进行处理,以识别图片中的对象类别。results
:这是模型预测的结果,通常包含每个检测到的对象的信息,如类别标签、置信度分数、边界框坐标等。具体的内容取决于模型的类型(如目标检测还是图像分类)以及输出设置。
5.5 模型导出
将 YOLO11n-cls 模型导出为不同格式,如ONNX、CoreML 等。
from ultralytics import YOLO
# 2种不同的加载模型方式
# 加载官方的模型
model = YOLO("yolo11n-cls.pt")
# 加载自己训练的模型
model = YOLO("path/to/best.pt")
# 导出模型
model.export(format="onnx")
可用的 YOLO11-cls 导出格式如下表所示。可以使用 format
参数导出到任何格式,例如 format='onnx'
或 format='engine'
。可以在导出的模型上直接进行预测或验证,例如 yolo predict model=yolo11n-cls.onnx
。
六、目标检测任务
物体检测是一项涉及识别图像或视频流中物体的位置和类别的任务。物体检测器的输出是一组包围图像中物体的边框,以及每个边框的类标签和置信度分数。
6.1 预训练检测模型介绍
YOLO11 这里显示的是经过预训练的检测模型。是在COCO数据集上预先训练的。首次使用时,模型会自动从最新的Ultralytics 版本下载。
mAP val
值是指在COCO val2017数据集上单模型单尺度的结果。mAP,即mean Average Precision(平均精度均值),它用于衡量模型在检测不同类别对象时的准确性。速度
是在COCO验证图像上使用Amazon EC2 P4d实例平均得出的。
6.2 模型训练
下面是如何使用Ultralytics的YOLO库来加载一个模型并在COCO8数据集上进行训练。
from ultralytics import YOLO
# 加载模型,这里有三种不同的方式来初始化YOLO模型对象
# 1.从YAML文件新建模型:
# 基于指定的yolo11n.yaml文件定义的新架构创建一个YOLO模型。
# 该文件通常包含了网络结构的配置信息。
model = YOLO("yolo11n.yaml")
# 2. 加载预训练模型:
# 直接加载一个已经训练好的模型权重文件(.pt文件),这种方式推荐用于继续训练或直接进行推理,
# 因为它可以节省大量时间,并且提供了一个较好的起点。
model = YOLO("yolo11n.pt")
# 3.从YAML文件构建并加载权重:
# 首先根据YAML文件构建模型架构,然后从给定的.pt文件中加载权重。
# 这种方法适用于当你想要修改模型架构但还想保留原有的部分权重时使用。
model = YOLO("yolo11n.yaml").load("yolo11n.pt")
# 训练模型
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)
训练过程,接受以下参数:
data="coco8.yaml"
:指定数据集配置文件路径或名称。这里假设是一个名为coco8.yaml的数据集配置文件,它定义了训练和验证数据的位置、类别信息等。epochs=100
:设置训练周期数为100,意味着整个训练集会被完整地遍历100次。imgsz=640
:设置输入图像的尺寸大小为640x640像素。这个参数会影响模型输入层的设计以及预处理步骤中的图像缩放操作。
6.3 模型验证
这段代码演示如何使用Ultralytics的YOLO库加载一个已经训练好的模型,并在COCO8数据集上进行验证以评估其准确性。
from ultralytics import YOLO
# 有两种方式来加载YOLO模型对象
# 1.加载官方预训练模型
# 加载一个名为yolo11n.pt的预训练模型文件。
# 这个文件包含了模型的架构和权重信息,适用于直接开始验证或进一步训练。
model = YOLO("yolo11n.pt")
# 2.加载自定义模型:
# 如果你有一个自己训练好的模型文件(例如通过训练得到的最佳模型),可以通过指定该文件的路径来加载它。
model = YOLO("path/to/best.pt")
# 验证模型
# 这行代码调用val()方法对模型进行验证。
# 由于模型在训练时保存了数据集和设置参数作为属性,因此这里不需要传递任何额外参数。
# 这意味着之前训练时使用的数据集配置(如COCO8)以及相关的超参数(如图像大小、批次大小等)会被自动应用到验证过程中。
metrics = model.val()
metrics.box.map # map50-95
metrics.box.map50 # map50
metrics.box.map75 # map75
metrics.box.maps # a list contains map50-95 of each category
解析验证结果,具体含义如下:
metrics.box.map
:这是mAP(mean Average Precision)值,计算的是IoU(Intersection over Union)阈值从0.5到0.95之间的平均值(步长为0.05)。它提供了模型在整个IoU范围内的整体表现。metrics.box.map50
:这是IoU阈值为0.5时的mAP值,通常称为map50。较高的IoU阈值意味着模型需要更精确地定位物体才能被认为是正确的检测。metrics.box.map75
:这是IoU阈值为0.75时的mAP值,通常称为map75。这个指标更加严格,要求更高的定位精度。metrics.box.maps
:这是一个列表,包含每个类别在IoU阈值从0.5到0.95之间的mAP值。这对于分析模型在不同类别上的表现特别有用。
上面代码提供一种简单而有效的方法来评估YOLO模型在特定数据集(这里是COCO8)上的性能。通过解析metrics对象的不同属性,可以全面了解模型的表现,从而为进一步的优化和调整提供依据。这种方式不仅节省了手动配置的时间,还确保了验证条件与训练条件的一致性。
IoU怎么理解?
全称为Intersection over Union(交并比),是目标检测任务中广泛使用的一种评估指标。它用于衡量预测边界框与真实边界框之间的重叠程度,从而评估模型定位的准确性。
计算步骤为:
- 计算两个边界框的重叠部分的面积。
- 计算两个边界框合并后的总面积。
- 将重叠面积除以合并后的总面积得到 IoU 值。
IoU 的值范围在 0 到 1 之间:
- IoU = 0:表示两个边界框完全不重叠。
- IoU = 1:表示两个边界框完全重合。
示例
假设有一个真实边界框和一个预测边界框:
- 真实边界框坐标:(x1=100, y1=100, x2=200, y2=200)
- 预测边界框坐标:(x1=120, y1=120, x2=220, y2=220)
首先计算重叠区域的坐标:
- 重叠区域左上角坐标:(max(100, 120), max(100, 120)) = (120, 120)
- 重叠区域右下角坐标:(min(200, 220), min(200, 220)) = (200, 200)
然后计算重叠区域和合并区域的面积:
- 重叠区域面积 = (200 - 120) * (200 - 120) = 80 * 80 = 6400
- 真实边界框面积 = (200 - 100) * (200 - 100) = 100 * 100 = 10000
- 预测边界框面积 = (220 - 120) * (220 - 120) = 100 * 100 = 10000
- 合并区域面积 = 真实边界框面积 + 预测边界框面积 - 重叠区域面积 = 10000 + 10000 - 6400 = 13600
最后计算 IoU:
IoU = 6400 / 13600 ≈ 0.47
6.4 模型验证
下面这段代码展示如何使用Ultralytics的YOLO库加载一个已经训练好的模型,并利用该模型对图像进行预测。
from ultralytics import YOLO
# 有两种方式来加载YOLO模型对象
# 加载官方预训练模型:
# 加载一个名为yolo11n.pt的预训练模型文件。
# 这个文件包含了模型的架构和权重信息,适用于直接开始预测或进一步训练。
model = YOLO("yolo11n.pt")
# 加载自定义模型
# 如果你有一个自己训练好的模型文件(例如通过训练得到的最佳模型),可以通过指定该文件的路径来加载它。
model = YOLO("path/to/best.pt")
# 使用模型进行预测
# 这里直接调用了model对象,传入了一张图片的URL作为输入。
# YOLO库支持多种输入格式,包括图片文件路径、URL、甚至是图像数据本身。
# YOLO模型将下载这张图片并对其进行处理,以识别图片中的对象类别。
results = model("https://ultralytics.com/images/bus.jpg")
# 访问预测结果
for result in results:
xywh = result.boxes.xywh # center-x, center-y, width, height
xywhn = result.boxes.xywhn # normalized
xyxy = result.boxes.xyxy # top-left-x, top-left-y, bottom-right-x, bottom-right-y
xyxyn = result.boxes.xyxyn # normalized
names = [result.names[cls.item()] for cls in result.boxes.cls.int()] # class name of each box
confs = result.boxes.conf # confidence score of each box
访问和解析预测结果:
xywh
:边界框的中心点坐标 (center-x, center-y) 以及宽度和高度 (width, height)。xywhn
:归一化的 xywh 值,范围在 [0, 1] 之间,相对于图像的尺寸。xyxy
:边界框的左上角坐标 (top-left-x, top-left-y) 和右下角坐标 (bottom-right-x, bottom-right-y)。xyxyn
:归一化的 xyxy 值,范围在 [0, 1] 之间,相对于图像的尺寸。names
:每个检测框对应的类别名称。通过 result.names[cls.item()] 获取每个类别ID对应的名称。confs
:每个检测框的置信度分数,表示模型对该检测框内存在目标的确信程度。
6.5 模型导出
将 YOLO11n 模型导出为不同格式,如ONNX、CoreML 等。
from ultralytics import YOLO
# 2种不同的加载模型方式
# 加载官方的模型
model = YOLO("yolo11n.pt")
# 加载自己训练的模型
model = YOLO("path/to/best.pt")
# 导出模型
model.export(format="onnx")
可用的 YOLO11 导出格式如下表所示。可以使用 format
参数导出到任何格式,例如 format='onnx'
或 format='engine'
。可以在导出的模型上直接进行预测或验证,例如 yolo predict model=yolo11n.onnx
。
七、实例分割任务
实例分割比物体检测更进一步,它涉及识别图像中的单个物体,并将它们与图像的其他部分分割开来。
实例分割模型的输出是一组勾勒出图像中每个物体的遮罩或轮廓,以及每个物体的类标签和置信度分数。当你不仅需要知道物体在图像中的位置,还需要知道它们的具体形状时,实例分割就非常有用了。
YOLO11 分割模型使用 -seg
后缀,例如 yolo11n-seg.pt
,并且这些模型是在 COCO 数据集上预训练的。
7.1 预训练分割模型介绍
YOLO11 预训练分割模型:这些模型专门用于图像分割任务,并且已经在COCO数据集上进行了预训练。首次使用时,这些模型会自动从最新的Ultralytics版本中下载。
模型性能表
模型 | 尺寸 (像素) | mAPbox 50-95 | mAPmask 50-95 | CPU ONNX 推理时间 (ms) | T4 TensorRT10 推理时间 (ms) | 参数量 (M) | FLOPs (B) |
---|---|---|---|---|---|---|---|
YOLO11n-seg | 640 | 38.9 | 32.0 | 65.9 ± 1.1 | 1.8 ± 0.0 | 2.9 | 10.4 |
YOLO11s-seg | 640 | 46.6 | 37.8 | 117.6 ± 4.9 | 2.9 ± 0.0 | 10.1 | 35.5 |
YOLO11m-seg | 640 | 51.5 | 41.5 | 281.6 ± 1.2 | 6.3 ± 0.1 | 22.4 | 123.3 |
YOLO11l-seg | 640 | 53.4 | 42.9 | 344.2 ± 3.2 | 7.8 ± 0.2 | 27.6 | 142.2 |
YOLO11x-seg | 640 | 54.7 | 43.8 | 664.5 ± 3.2 | 15.8 ± 0.7 | 62.1 | 319.0 |
关键指标解释
- 尺寸 (pixels):输入图像的尺寸,这里是640x640像素。
- mAPbox 50-95:边界框的平均精度(mean Average Precision),计算的是IoU阈值从0.5到0.95之间的平均值。
- mAPmask 50-95:分割掩码的平均精度,同样计算的是IoU阈值从0.5到0.95之间的平均值。
- CPU ONNX 推理时间 (ms):在CPU上使用ONNX格式模型进行推理的时间(毫秒)。
- T4 TensorRT10 推理时间 (ms):在NVIDIA T4 GPU上使用TensorRT10格式模型进行推理的时间(毫秒)。
- 参数量 (M):模型的参数数量(百万)。
- FLOPs (B):模型执行一次前向传播所需的浮点运算次数(十亿次)。
7.2 模型训练
使用Ultralytics的YOLO库加载一个分割模型并在COCO8-seg数据集上进行训练。
from ultralytics import YOLO
# 3种方式加载模型
# 1.根据yaml文件加载模型
model = YOLO("yolo11n-seg.yaml")
# 2.加载YOLO预训练好的模型
model = YOLO("yolo11n-seg.pt")
# 3.从YAML文件构建并加载权重
model = YOLO("yolo11n-seg.yaml").load("yolo11n.pt")
# 训练模型
results = model.train(data="coco8-seg.yaml", epochs=100, imgsz=640)
训练过程,并接受以下参数:
data="coco8-seg.yaml"
:指定数据集配置文件路径或名称。这里假设是一个名为coco8-- seg.yaml的数据集配置文件,它定义了训练和验证数据的位置、类别信息等。epochs=100
:设置训练周期数为100,意味着整个训练集会被完整地遍历100次。imgsz=640
:设置输入图像的尺寸大小为640x640像素。这个参数会影响模型输入层的设计以及预处理步骤中的图像缩放操作。
数据集格式
YOLO分割数据集的格式可以在《数据集指南》中找到详细的说明。如果你现有的数据集是其他格式(如COCO等),可以使用Ultralytics提供的JSON2YOLO工具将其转换为YOLO格式。
COCO8-seg是一个小型数据集,适合快速测试和调试模型。对于更全面的评估和实际应用,则需要转向更大规模的数据集,如完整的COCO数据集。
7.3 模型验证
使用Ultralytics的YOLO库加载一个已经训练好的分割模型,并在COCO8-seg数据集上进行验证以评估其准确性。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo11n-seg.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Validate the model
metrics = model.val() # no arguments needed, dataset and settings remembered
metrics.box.map # map50-95(B)
metrics.box.map50 # map50(B)
metrics.box.map75 # map75(B)
metrics.box.maps # a list contains map50-95(B) of each category
metrics.seg.map # map50-95(M)
metrics.seg.map50 # map50(M)
metrics.seg.map75 # map75(M)
metrics.seg.maps # a list contains map50-95(M) of each category
代码调用val()方法对模型进行验证。由于模型在训练时保存了数据集和设置参数作为属性,因此这里不需要传递任何额外参数。这意味着之前训练时使用的数据集配置(如COCO8-seg)以及相关的超参数(如图像大小、批次大小等)会被自动应用到验证过程中。
解析验证结果,具体含义如下:
- 边界框(Box)相关指标:
metrics.box.map
:这是mAP(mean Average Precision)值,计算的是IoU(Intersection over Union)阈值从0.5到0.95之间的平均值(步长为0.05)。这里的(B)表示这是针对边界框的评估。metrics.box.map50
:这是IoU阈值为0.5时的mAP值,通常称为map50。metrics.box.map75
:这是IoU阈值为0.75时的mAP值,通常称为map75。metrics.box.maps
:这是一个列表,包含每个类别在IoU阈值从0.5到0.95之间的mAP值。
- 分割掩码(Segmentation Mask)相关指标:
metrics.seg.map
:这是针对分割掩码的mAP值,同样计算的是IoU阈值从0.5到0.95之间的平均值。这里的(M)表示这是针对分割掩码的评估。metrics.seg.map50
:这是IoU阈值为0.5时的分割掩码mAP值。metrics.seg.map75
:这是IoU阈值为0.75时的分割掩码mAP值。metrics.seg.maps
:这是一个列表,包含每个类别在IoU阈值从0.5到0.95之间的分割掩码mAP值。
7.4 模型预测
使用Ultralytics的YOLO库加载一个已经训练好的分割模型,并利用该模型对图像进行预测。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo11n-seg.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Predict with the model
results = model("https://ultralytics.com/images/bus.jpg") # predict on an image
# Access the results
for result in results:
xy = result.masks.xy # mask in polygon format
xyn = result.masks.xyn # normalized
masks = result.masks.data # mask in matrix format (num_objects x H x W)
访问和解析预测结果:
xy
:每个检测到的对象的分割掩码,以多边形顶点坐标的形式表示。这对于可视化或者进一步处理掩码形状非常有用。xyn
:归一化的多边形顶点坐标,范围在 [0, 1] 之间,相对于图像的尺寸。这种形式方便于跨不同分辨率的图像进行比较或应用。masks
:每个检测到的对象的分割掩码,以矩阵(二维数组)的形式表示。每张图像的掩码矩阵大小为 (num_objects x H x W),其中 num_objects 是检测到的对象数量,H 和 W 分别是图像的高度和宽度。这种格式适合用于后续的图像处理操作,比如计算面积、提取特定区域等。
7.5 模型导出
和分类模型、检测模型类似,可以直接参考
from ultralytics import YOLO
# 加载模型
# 加载官方的预训练模型
model = YOLO("yolo11n-seg.pt")
# 加载自定义的模型
model = YOLO("path/to/best.pt")
# 导出模型
model.export(format="onnx")
八、数据集介绍
在计算机视觉(CV)领域,数据集的质量和多样性对于推动算法创新和技术进步至关重要。本文 整理当前最流行且最具影响力的数据集,涵盖目标检测、图像分类、语义分割、姿态估计等多个关键方向。
8.1 ImageNet数据集
ImageNet是一个大规模的图像数据库,主要用于训练和评估机器学习模型,特别是那些用于图像分类任务的模型。以下是关于ImageNet数据集的一些关键点:
-
起源与发展:ImageNet项目始于2007年,由李飞飞等人发起,旨在构建一个大规模的、高质量的图像数据集,并通过众包的方式为每个类别标注大量的图片。“众包的方式”意味着项目团队通过在线平台邀请广大网络用户参与图像的分类与标注工作。每个参与者会被分配一定数量的图片,并要求根据指示为这些图片打上相应的标签,即识别出图片中的主要物体属于哪个或哪些类别。
-
规模与内容:截至2010年代中期,ImageNet包含了超过1400万张手工标注的图像,这些图像被分配到了大约21,000个类别中。这些类别覆盖了从动物、植物到人造物品等各种对象。
-
ILSVRC竞赛:ImageNet最著名的应用之一是其关联的年度竞赛——ImageNet大规模视觉识别挑战赛(ILSVRC)。该竞赛自2010年开始举办,吸引了全球的研究人员参与,促进了深度学习技术的发展,尤其是卷积神经网络(CNNs)的进步。
-
对AI领域的影响:由于其庞大的规模和多样性,ImageNet成为了开发和测试新的计算机视觉算法的重要资源。许多现代深度学习模型,包括AlexNet、VGG、ResNet等,在它们的研究初期都是在ImageNet数据集上进行训练和验证的,这大大推动了图像识别技术的发展。
“Classify”模型在ImageNet数据集上预先训练意味着该模型已经在一个广泛且多样化的图像集合上进行了学习,从而获得了强大的泛化能力,这对于解决各种实际问题非常有帮助。ImageNet数据集的配置文件ImageNet.yaml
8.2 COCO数据集
COCO数据集是一个广泛用于计算机视觉任务,特别是目标检测、分割、关键点检测和图像字幕生成等领域的大型数据集。它由微软资助并由一群研究人员共同创建。以下是样例图片:
主要特点
-
规模:
- COCO 数据集包含超过 33 万张图像。
- 其中有超过 20 万张标注了对象边界框,适用于目标检测任务。
- 约 16 万张图像标注了实例分割,适合于更精细的对象识别任务。
- 还有大约 25 万张图像标注了人物的关键点,可用于人体姿态估计。
-
类别:
- 数据集覆盖了 80 个不同的对象类别,从常见的“人”、“车”到较为具体的“叉子”、“飞盘”等。
- 每个类别都包含了大量实例,确保了模型学习的多样性和鲁棒性。
-
上下文信息:
- 与许多其他数据集不同的是,COCO 强调对象在具体场景中的位置和相互关系,这使得它非常适合研究如何理解和处理复杂的视觉场景。
- 提供了丰富的语义信息,如每张图片的描述性文字(caption),有助于进行图像理解的研究。
-
数据格式:
- 图像通常以高分辨率JPEG格式提供。
- 标注文件采用 JSON 格式,包含了详细的对象边界框、分割掩码、类别标签以及关键点坐标等信息。
-
子集划分:
- 数据集被划分为训练集(train)、验证集(val)和测试集(test)。
- 常用的版本包括
train2017
,val2017
, 和test2017
,这些版本的数据量和用途各有侧重,方便研究人员根据需要选择合适的子集进行实验。
-
应用场景:
- 目标检测:识别图像中所有对象的位置和类型。
- 实例分割:精确地描绘出每个对象的轮廓。
- 关键点检测:定位人体上的特定部位,如眼睛、肩膀等。
- 图像字幕生成:为图像自动生成描述性的文本。
使用示例
在使用COCO数据集进行模型训练或评估时,通常会参考其官方提供的配置文件(如 .yaml
文件),这些文件定义了数据集的位置、类别映射以及其他相关信息。例如,在YOLO框架中,可以这样加载COCO数据集:
from ultralytics import YOLO
# Load a model
model = YOLO("yolo11n.yaml") # 或者加载预训练模型
# Train the model on COCO dataset
results = model.train(data="coco.yaml", epochs=100, imgsz=640)
这里的 "coco.yaml"
是一个配置文件,指定了COCO数据集的具体路径和其他必要的参数。
COCO数据集由于其广泛的覆盖面、详细的标注以及丰富的应用场景支持,成为了计算机视觉领域内最为重要的基准之一。
8.3 COCO8数据集
COCO8 是一个小型但功能齐全的数据集,专门设计用于测试和调试目的。它是从更大的 COCO(Common Objects in Context)数据集中提取出来的子集,包含来自 COCO train 2017 数据集的前 8 张图像,并分为训练集和验证集。以下是样例图片
主要特点
- 规模:COCO8 包含总共 8 张图像,其中 4 张用于训练,另外 4 张用于验证。
- 用途:这个数据集非常适合用来快速测试新的检测方法、实验不同的模型配置或进行代码调试,因为它足够小,可以迅速处理,同时又足够多样化以揭示潜在的问题。
- 类别:尽管是小规模的数据集,COCO8 保留了原始 COCO 数据集中的丰富类别信息。具体来说,它包含了从 ‘person’ 到 ‘toothbrush’ 的 80 个类别。
- 格式:遵循 YOLO 所需的标准格式,包括图像文件以及相应的标注文件(通常为
.txt
文件),每个标注文件对应一张图像,并列出所有对象的位置(边界框坐标)和类别标签。 - 下载与使用:可以通过提供的 YAML 文件 (
coco8.yaml
) 轻松地将其集成到 Ultralytics YOLO 框架中。该 YAML 文件定义了数据集路径、类别名称以及其他相关信息。
示例 YAML 配置 (coco8-seg.yaml
)
# Ultralytics YOLO , AGPL-3.0 license
# COCO8-seg dataset (first 8 images from COCO train2017) by Ultralytics
path: ../datasets/coco8-seg # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images
test: # test images (optional)
# Classes
names:
0: person
1: bicycle
...
79: toothbrush
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/coco8-seg.zip
使用场景
由于其小巧的体积,COCO8 特别适合以下情况:
- 快速迭代开发过程中对新想法进行初步验证。
- 在大规模训练之前检查管道是否存在基本错误。
- 教育和学习目的,帮助新手理解如何准备和使用目标检测数据集。
虽然 COCO8 对于最终的产品级模型评估并不适用,但它是一个非常有用的工具,可以帮助研究人员和开发者在投入更多资源之前确保他们的算法和实现是正确的。对于更全面的评估,则需要转向更大规模的数据集,如完整的 COCO 数据集或其他类似的大型数据集合。