Transformer 架构在目标检测中的应用:YOLO 系列模型解析

目录

[Transformer 架构在目标检测中的应用:YOLO 系列模型解析](#Transformer 架构在目标检测中的应用:YOLO 系列模型解析)

[一、YOLO 模型概述](#一、YOLO 模型概述)

[二、YOLO 模型的核心架构](#二、YOLO 模型的核心架构)

(一)主干网络

(二)颈部结构

(三)头部结构

[三、YOLO 模型的工作原理](#三、YOLO 模型的工作原理)

(一)输入图像预处理

(二)特征提取与融合

(三)边界框预测与类别分类

(四)损失函数计算与优化

(五)非极大值抑制(NMS)后处理

[四、YOLO 模型的版本演进](#四、YOLO 模型的版本演进)

(一)YOLOv1:开启实时目标检测之门

[(二)YOLOv2 和 YOLOv3:性能与精度的双重提升](#(二)YOLOv2 和 YOLOv3:性能与精度的双重提升)

[(三)YOLOv4 和 YOLOv5:融合先进技术与简化设计](#(三)YOLOv4 和 YOLOv5:融合先进技术与简化设计)

[(四)YOLOv6 和 YOLOv7:追求极致的实时性和通用性](#(四)YOLOv6 和 YOLOv7:追求极致的实时性和通用性)

(五)YOLOv8:集成创新与全面优化

[五、YOLO 模型的实际应用案例](#五、YOLO 模型的实际应用案例)

(一)智能安防:实时监控与警情预警

(二)自动驾驶:环境感知与决策辅助

(三)工业检测:产品质量控制与设备运维

(四)零售行业:顾客行为分析与库存管理

[六、YOLO 模型的实战代码实现](#六、YOLO 模型的实战代码实现)

[(二)加载预训练 YOLOv5 模型](#(二)加载预训练 YOLOv5 模型)

(三)图像预处理

(四)数据格式转换与归一化

(五)目标检测预测

(六)非极大值抑制(NMS)后处理

(七)可视化检测结果

四、模型训练与优化


一、YOLO 模型概述

YOLO(You Only Look Once)系列模型作为目标检测领域的佼佼者,自诞生以来不断推陈出新,以卓越的检测速度和准确率著称。从 YOLOv1 到 YOLOv8,每一版本都在性能和效率上实现了跨越式的提升,广泛应用于智能安防、自动驾驶、工业检测等领域。本文深入剖析 YOLO 模型的核心架构、工作原理以及实战应用,揭示其在目标检测领域的制胜秘诀。

二、YOLO 模型的核心架构

YOLO 系列模型共享一个共同的核心架构,即一个强大的特征提取主干网络,其后连接着颈部(Neck)结构和头部(Head)结构。颈部结构通常采用特征金字塔网络(FPN)或路径聚合网络(PAN)等,用以融合多尺度特征,增强模型对不同大小目标的检测能力。头部结构则负责最终的边界框预测和类别分类,输出检测结果。

(一)主干网络

主干网络负责从输入图像中提取丰富的特征信息。早期的 YOLO 版本多采用 Darknet 系列网络作为主干,如 Darknet-53。Darknet-53 由多个卷积层和池化层堆叠而成,擅长提取图像的深层语义特征。其卷积层使用 3×3 小尺寸卷积核,配合适当的通道扩展和收缩策略,在减少参数量的同时保证了特征提取的效率和质量。

随着研究的深入,YOLO 系列也开始探索更先进的主干网络架构。例如,YOLOv7 引入了 CSPDarknet 作为主干网络,通过跨阶段部分连接(CSP)策略,在几乎不增加计算成本的情况下,显著增强了特征提取能力。CSPDarknet 的设计灵感来源于 ResNet 的残差连接思想,通过将网络划分为多个阶段,并在各阶段之间共享部分特征图,减少了梯度消失问题,加速了模型的收敛,提升了特征的复用率,从而在目标检测任务中取得了更高的检测精度和更快的训练速度。

(二)颈部结构

颈部结构在 YOLO 模型中扮演着特征融合和多尺度处理的关键角色。常见的颈部结构包括特征金字塔网络(FPN)和路径聚合网络(PAN)。FPN 旨在构建一个金字塔式的特征层次结构,将主干网络不同层级输出的特征图进行融合,生成具有多尺度信息的特征金字塔。这使得模型能够有效检测不同大小的目标,从小型的行人、车辆到大型的建筑物等都能应对自如。FPN 的融合方式通常是从上到下依次融合,先对高层的语义丰富但空间信息较小的特征图进行上采样,然后与低层的空间信息丰富但语义较弱的特征图进行逐元素相加或拼接操作,最终生成融合后的特征图。

PAN 结构则在 FPN 的基础上进一步优化了特征融合路径。它不仅包含从上到下的特征融合路径,还引入了从下到上的增强路径,使得特征信息能够在不同尺度之间更加高效地传递和交换。这种双向的特征融合机制进一步提升了模型对多尺度目标的检测性能,尤其在处理复杂场景中的重叠目标和不同尺寸目标混合出现的情况时表现出色。PAN 的设计使得特征在不同尺度上的信息更加完整和丰富,有助于提高模型的鲁棒性和准确性。

(三)头部结构

头部结构负责将颈部输出的特征图转换为最终的检测结果,包括边界框的坐标预测和类别概率预测。YOLO 模型的头部结构通常包含多个卷积层,用于进一步细化特征并生成最终的预测特征图。每个预测特征图上的像素点对应着多个预定义的锚框(Anchor Boxes),这些锚框具有不同的宽高比,用于捕捉不同形状的目标。在训练阶段,模型通过计算预测边界框与真实边界框之间的交并比(IoU)和类别概率损失,利用反向传播算法优化网络参数。在推理阶段,头部结构输出的预测结果经过非极大值抑制(NMS)等后处理步骤,筛选出最优的检测结果,形成最终的检测框和类别标签。

三、YOLO 模型的工作原理

YOLO 模型的工作原理可以概括为以下几个关键步骤:

(一)输入图像预处理

输入图像首先会被调整至模型要求的尺寸,通常是一个固定的大小(如 416×416 或 608×608)。预处理过程还包括归一化操作,将像素值缩放到特定的范围(如 [0, 1] 或 [-1, 1]),以加速网络的收敛并提高数值稳定性。归一化可以通过简单的线性变换实现,例如:

xnorm​=255x​

其中,x 是原始像素值,xnorm​ 是归一化后的像素值。这一步骤确保了输入数据的一致性,使得模型能够更好地处理不同来源的图像数据。

(二)特征提取与融合

经过预处理的图像输入到主干网络中,进行特征提取。主干网络的卷积层和池化层逐步提取图像的空间特征和语义信息。随着网络深度的增加,特征图的空间尺寸逐渐减小,而通道数逐渐增加,形成了不同层次的特征表示。提取到的特征随后被送入颈部结构进行融合。颈部结构中的 FPN 或 PAN 通过多尺度特征融合,将不同层次的特征进行整合,生成富含多尺度信息的特征金字塔。例如,在 FPN 中,高层特征图经过上采样后与低层特征图进行融合,融合方式可以是逐元素相加:

Ffuse​=Upsample(Fhigh​)+Flow​

其中,Fhigh​ 是高层特征图,Flow​ 是低层特征图,Ffuse​ 是融合后的特征图。通过这样的融合操作,特征金字塔中的每个层次都既包含了高层的语义信息,又保留了低层的空间细节,为后续的目标检测提供了更加丰富的信息基础。

(三)边界框预测与类别分类

融合后的特征金字塔被传递到头部结构,头部结构中的卷积层进一步处理特征图,生成预测边界框和类别概率。对于每个预测特征图上的像素点,模型会生成多个锚框,每个锚框对应着一组边界框坐标(x, y, w, h)和类别概率分布。边界框坐标表示目标在图像中的位置和大小,类别概率分布表示该锚框属于各个预定义类别(如人、车、狗等)的概率。边界框坐标的预测通常通过回归的方式实现,而类别概率的预测则采用分类的方式,使用 softmax 激活函数将输出值转换为概率值:

Pclass​=softmax(z)

其中,z 是分类网络的输出,Pclass​ 是类别概率分布。通过这种方式,模型能够同时预测目标的位置和类别,实现端到端的目标检测。

(四)损失函数计算与优化

YOLO 模型的损失函数综合考虑了边界框坐标预测误差和类别概率预测误差。边界框坐标误差通常采用均方误差(MSE)或平滑 L1 损失进行衡量,类别概率误差则采用交叉熵损失。总损失是这两种误差的加权和:

L=λcoord​Lcoord​+λclass​Lclass​

其中,λcoord​ 和 λclass​ 是平衡权重,用于调节边界框损失和类别损失之间的相对重要性。在训练过程中,通过反向传播算法计算梯度,并使用优化算法(如 SGD、Adam 等)更新网络参数,以最小化总损失函数。这一步骤是模型学习的核心,决定了模型对训练数据的拟合能力和对新数据的泛化能力。

(五)非极大值抑制(NMS)后处理

由于每个预测特征图上的像素点都会生成多个锚框,这可能导致同一个目标被多个锚框重复检测。为了解决这个问题,YOLO 模型在推理阶段采用非极大值抑制(NMS)算法对预测结果进行后处理。NMS 的基本思想是保留具有最高置信度的边界框,同时抑制与其高度重叠的其他边界框。具体步骤如下:

  1. 根据类别概率和置信度阈值筛选出候选边界框,过滤掉低置信度的预测结果。

  2. 对于每个类别,按照边界框的置信度从高到低排序。

  3. 选择置信度最高的边界框作为保留结果,删除与其 IoU 大于预设阈值的其他边界框。

  4. 重复步骤 3,直到所有边界框处理完毕。

NMS 算法有效地去除了冗余的检测结果,保留了最可靠的检测框,提高了模型输出的准确性和可读性。通过合理设置置信度阈值和 IoU 阈值,可以在检测精度和召回率之间取得良好的平衡,满足不同应用场景的需求。

四、YOLO 模型的版本演进

YOLO 模型自诞生以来,经历了多个版本的迭代和优化,每个版本都在性能、速度和应用场景上取得了显著的进步。

(一)YOLOv1:开启实时目标检测之门

YOLOv1 是目标检测领域的一次重大突破,它首次将目标检测任务转化为一个端到端的回归问题,实现了实时检测的速度与精度的初步平衡。YOLOv1 将输入图像划分为多个网格单元,每个网格单元负责预测固定数量的边界框和类别概率。这种创新的框架设计使得模型能够直接输出检测结果,无需复杂的后处理操作,大大提高了检测速度。然而,YOLOv1 在处理小目标和多目标重叠的场景时存在一定的局限性,边界框预测的精度也有待提高。

(二)YOLOv2 和 YOLOv3:性能与精度的双重提升

YOLOv2 在 YOLOv1 的基础上进行了多项改进,引入了批归一化(Batch Normalization)技术,提高了模型的训练速度和稳定性。同时,YOLOv2 采用了锚框机制和多尺度训练策略,提升了边界框预测的精度和模型对不同尺寸输入图像的适应能力。YOLOv3 进一步深化了模型结构,使用三个不同尺度的特征图进行目标检测,增强了对多尺度目标的检测性能。YOLOv3 还引入了 Darknet-53 作为主干网络,通过更深的网络结构提取更丰富的特征,提高了检测精度。此外,YOLOv3 改进了损失函数,采用交叉熵损失和均方误差的结合,优化了边界框坐标和类别概率的预测。

(三)YOLOv4 和 YOLOv5:融合先进技术与简化设计

YOLOv4 综合了多种先进的技术,如加权残差连接(WRC)、跨小批归一化(CmBN)、自对抗训练(SAT)等,进一步提升了模型的性能。YOLOv4 的主干网络使用 CSPDarknet53,颈部结构采用 PANet,头部结构则优化了锚框机制和损失函数。这些改进使得 YOLOv4 在速度和精度上达到了新的高度,尤其在处理复杂场景和小目标检测方面表现出色。YOLOv5 对模型结构进行了简化和优化,提出了一个更加统一和高效的框架。YOLOv5 的主干网络采用改进的 CSPDarknet,颈部结构使用 FPN 和 PAN 的结合体,头部结构则进一步优化了边界框预测和类别分类的流程。YOLOv5 还引入了自动锚框计算技术,能够根据训练数据自动调整锚框的尺寸和数量,提高了模型的适应性和检测精度。此外,YOLOv5 在模型训练和推理过程中引入了一系列优化策略,如马赛克数据增强(Mosaic Data Augmentation)、自适应锚框归一化(Adaptive Anchor Normalization)等,使得模型在不同数据集和应用场景中都能取得优异的性能。

(四)YOLOv6 和 YOLOv7:追求极致的实时性和通用性

YOLOv6 着重优化模型的实时性和部署效率,提出了一个名为 "Efficient Reparameterization" 的技术,能够在不损失精度的前提下,将复杂的模型结构转换为高效的部署形式。YOLOv6 的主干网络采用 RepVGG 结构,该结构在训练时使用多分支的 RepBlock,而在推理时将多分支结构重新参数化为一个简单的 3×3 卷积层,大大减少了推理时的计算量。YOLOv6 还引入了通道注意力机制(Channel Attention Mechanism),通过动态调整不同通道的权重,增强了模型对重要特征的关注能力,提高了检测精度。YOLOv7 在保持实时性优势的基础上,进一步提升了模型的通用性和扩展性。YOLOv7 提出了一个名为 "YOLOv7 - E6" 和 "YOLOv7 - E6e" 的高效模型架构,通过增加模型的深度和宽度,同时采用高效的卷积操作和特征融合策略,在速度和精度上实现了新的平衡。YOLOv7 还引入了多种先进的训练技巧,如渐进式训练(Progressive Training)、自监督预训练(Self - Supervised Pre - training)等,使得模型能够更好地泛化到不同的目标检测任务和数据集上。

(五)YOLOv8:集成创新与全面优化

YOLOv8 作为 YOLO 系列的最新力作,融合了前几代模型的优点,并在此基础上进行了全面的创新和优化。YOLOv8 的主干网络进一步改进了 CSPDarknet 的设计,通过增加网络的深度和宽度,同时优化了卷积层和池化层的布局,提高了特征提取的效率和质量。颈部结构采用更加高效的特征融合策略,结合了 FPN 和 PAN 的优点,能够更好地平衡多尺度特征的语义信息和空间信息。头部结构则针对边界框预测和类别分类进行了深度优化,采用了更加精确的回归算法和分类方法,提高了检测结果的准确性和可靠性。此外,YOLOv8 在模型训练过程中引入了多种先进的优化算法和正则化技术,如 AdamW 优化器、标签平滑(Label Smoothing)、DropBlock 正则化等,使得模型在大规模数据集上能够更快地收敛,并具有更强的泛化能力。YOLOv8 还对模型的部署和推理进行了深度优化,支持多种硬件平台和运行环境,能够满足不同用户在不同场景下的实时目标检测需求。

五、YOLO 模型的实际应用案例

YOLO 模型凭借其卓越的性能和效率,在众多领域得到了广泛的应用,以下是一些典型的应用案例:

(一)智能安防:实时监控与警情预警

在智能安防领域,YOLO 模型被广泛应用于实时视频监控系统中,用于检测和识别视频中的目标物体,如行人、车辆、武器等。通过在监控视频流上实时运行 YOLO 模型,系统能够迅速识别出异常行为和潜在威胁,并及时发出警报。例如,在城市交通监控中,YOLO 模型可以实时检测道路上的车辆和行人,实现交通流量监测、违章行为识别(如闯红灯、超速行驶等)以及交通事故检测等功能。一旦检测到异常情况,系统会立即通知交通管理部门采取相应的措施,提高道路安全和交通管理效率。此外,在公共场所的安全监控中,YOLO 模型可以用于检测人群中的可疑物品(如背包、行李箱等)和危险行为(如打架斗殴、持刀伤人等),为维护社会治安和公共安全提供有力的技术支持。

(二)自动驾驶:环境感知与决策辅助

自动驾驶技术的发展离不开高效的目标检测模型,YOLO 模型在自动驾驶领域的应用主要体现在车辆的环境感知和决策辅助方面。自动驾驶汽车通过车载摄像头、激光雷达等传感器采集周围环境的图像和点云数据,YOLO 模型能够快速准确地识别出图像中的其他车辆、行人、交通标志、交通信号灯等关键目标,为自动驾驶汽车的决策系统提供实时的环境信息。基于这些信息,汽车的自动驾驶算法可以做出合理的决策,如加速、减速、转向、避障等,确保行驶的安全和顺畅。例如,当 YOLO 模型检测到前方有行人横穿马路时,自动驾驶系统会及时控制车辆减速并采取避让措施,避免发生交通事故。同时,YOLO 模型的实时性特点使其能够适应高速行驶场景下的快速变化,为自动驾驶汽车提供可靠的目标检测支持,推动自动驾驶技术的商业化和普及。

(三)工业检测:产品质量控制与设备运维

在工业生产领域,YOLO 模型可用于产品质量检测和设备运维监控,提高生产效率和产品质量。在产品质量检测方面,YOLO 模型可以对生产线上的产品图像进行实时检测,识别出表面缺陷、尺寸偏差、装配错误等问题。例如,在电子产品制造中,YOLO 模型可以检测电路板上的元件是否缺失、焊接点是否存在虚焊等问题,及时发现生产过程中的质量问题,降低产品的次品率。在设备运维监控方面,YOLO 模型可以对工业设备的运行状态进行实时监测,识别设备的关键部件(如电机、轴承、传送带等)是否出现异常磨损、松动、损坏等情况。通过对设备状态的实时感知,运维人员可以提前安排设备维修和保养,避免设备故障导致的生产中断,延长设备的使用寿命,降低企业的运营成本。

(四)零售行业:顾客行为分析与库存管理

零售企业利用 YOLO 模型对店内顾客的行为进行实时分析,通过安装在商店内的摄像头采集视频数据,YOLO 模型可以检测顾客在店内的位置、行走轨迹、停留时间等信息。这些数据能够帮助零售商了解顾客的购物习惯和偏好,优化店内商品的布局和陈列方式,提高顾客的购物体验和购买转化率。例如,通过分析顾客在不同商品区域的停留时间,零售商可以将热门商品放置在更显眼的位置,或者调整商品的陈列顺序,引导顾客浏览更多的商品。同时,YOLO 模型还可以用于库存管理,通过检测货架上的商品数量和摆放情况,实时更新库存信息,实现自动化的库存预警和补货提醒功能。这有助于零售商保持合理的库存水平,减少库存积压和缺货现象,提高库存管理的效率和准确性。

六、YOLO 模型的实战代码实现

为了帮助读者更好地理解和应用 YOLO 模型,以下提供一个基于 PyTorch 框架的 YOLOv5 实战代码实现。该代码展示了如何加载预训练的 YOLOv5 模型,进行目标检测预测以及可视化检测结果。

复制代码
import torch
import cv2
import numpy as np
from models.common import DetectMultiBackend
from utils.dataloaders import IMG_FORMATS, VID_FORMATS, LoadImages, LoadStreams
from utils.general import (check_file, check_img_size, check_imshow, check_requirements, colorstr, cv2,
                           increment_path, non_max_suppression, print_args, scale_coords, strip_optimizer, xyxy2xywh)
from utils.plots import Annotator, colors, save_one_box
from utils.torch_utils import select_device, time_sync

# 加载预训练的 YOLOv5 模型
model_path = 'yolov5s.pt'  # 模型文件路径
device = select_device('0' if torch.cuda.is_available() else 'cpu')  # 选择设备(GPU 或 CPU)
model = DetectMultiBackend(model_path, device=device, dnn=False, data='data/coco128.yaml')
stride, names, pt = model.stride, model.names, model.pt
imgsz = check_img_size((640, 640), s=stride)  # 输入图像尺寸

# 加载图像
image_path = 'test_image.jpg'  # 测试图像路径
img = cv2.imread(image_path)
img = cv2.resize(img, imgsz)  # 调整图像尺寸
img = img[:, :, ::-1].transpose(2, 0, 1)  # BGR 转 RGB 并调整维度顺序
img = np.ascontiguousarray(img)

# 图像预处理
img = torch.from_numpy(img).to(device)
img = img.half() if model.fp16 else img.float()  # 转换为 PyTorch 张量并调整数据类型
img /= 255.0  # 归一化
if len(img.shape) == 3:
    img = img.unsqueeze(0)  # 增加批量维度

# 目标检测预测
pred = model(img, augment=False, visualize=False)

# 非极大值抑制(NMS)后处理
pred = non_max_suppression(pred, 0.25, 0.45, None, False, max_det=1000)

# 可视化检测结果
for i, det in enumerate(pred):  # 遍历每个图像的检测结果
    annotator = Annotator(img[0].permute(1, 2, 0).cpu().numpy(), line_width=2, example=str(names))
    if len(det):
        # 将检测结果从模型输出坐标系转换到原始图像坐标系
        det[:, :4] = scale_coords(img.shape[2:], det[:, :4], img.shape[2:]).round()
        # 绘制检测框和标签
        for *xyxy, conf, cls in reversed(det):
            c = int(cls)
            label = f'{names[c]} {conf:.2f}'
            annotator.box_label(xyxy, label, color=colors(c, True))

    # 显示结果图像
    result_img = annotator.result()
    cv2.imshow('YOLOv5 Detection Result', result_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

(二)加载预训练 YOLOv5 模型

Python

复制

复制代码
import torch
from models.common import DetectMultiBackend
from utils.general import check_img_size
from utils.torch_utils import select_device

model_path = 'yolov5s.pt'  # 模型文件路径
device = select_device('0' if torch.cuda.is_available() else 'cpu')  # 选择设备(GPU 或 CPU)
model = DetectMultiBackend(model_path, device=device, dnn=False, data='data/coco128.yaml')
stride, names, pt = model.stride, model.names, model.pt
imgsz = check_img_size((640, 640), s=stride)  # 输入图像尺寸

这段代码首先定义模型路径,指向本地存储的 YOLOv5s 预训练权重文件。接着,调用 select_device 函数智能选择设备,默认优先使用 GPU。利用 DetectMultiBackend 类加载模型,同时加载 COCO 数据集的配置文件,以便模型了解类别信息。check_img_size 函数确保输入图像尺寸符合模型 stride 要求。

(三)图像预处理

Python

复制

复制代码
import cv2
import numpy as np

image_path = 'test_image.jpg'  # 测试图像路径
img = cv2.imread(image_path)
img = cv2.resize(img, imgsz)  # 调整图像尺寸
img = img[:, :, ::-1].transpose(2, 0, 1)  # BGR 转 RGB 并调整维度顺序
img = np.ascontiguousarray(img)

这里使用 OpenCV 的 imread 函数读取图像,随后将其调整至模型要求的输入尺寸。为适配 PyTorch 张量的格式需求,将图像从 BGR 格式转换为 RGB 格式,并将维度从 H×W×C 调整为 C×H×W。np.ascontiguousarray 函数确保数据在内存中连续存储,提高后续计算效率。

(四)数据格式转换与归一化

Python

复制

复制代码
img = torch.from_numpy(img).to(device)
img = img.half() if model.fp16 else img.float()  # 转换为 PyTorch 张量并调整数据类型
img /= 255.0  # 归一化
if len(img.shape) == 3:
    img = img.unsqueeze(0)  # 增加批量维度

将 NumPy 数组转换为 PyTorch 张量并移至目标设备。如果模型支持半精度浮点数(FP16),则将数据类型转换为 FP16,否则使用 FP32。对图像数据进行归一化处理,使其像素值介于 0 到 1 之间。最后,为张量添加批量维度,符合模型输入格式要求。

(五)目标检测预测

Python

复制

复制代码
pred = model(img, augment=False, visualize=False)

将预处理后的图像输入 YOLOv5 模型,得到原始预测结果。augment 参数控制是否采用数据增强技术(如多尺度推理)来提升预测精度,此处设置为 False 表示仅进行单尺度推理;visualize 参数用于指定是否可视化模型内部特征图,一般日常推理时无需开启。

(六)非极大值抑制(NMS)后处理

Python

复制

复制代码
from utils.general import non_max_suppression

pred = non_max_suppression(pred, 0.25, 0.45, None, False, max_det=1000)

模型输出的原始预测结果包含大量冗余的检测框,需要通过非极大值抑制算法筛选出最优的检测框。non_max_suppression 函数接收多个参数:预测结果、置信度阈值(0.25)、IoU 阈值(0.45)、是否应用多类 NMS、是否使用 WebGL 可视化以及单幅图像最大检测目标数(1000)。经过该步骤,保留下来的检测框是模型认为最有可能包含目标的候选框。

(七)可视化检测结果

Python

复制

复制代码
from utils.plots import Annotator, colors

for i, det in enumerate(pred):  # 遍历每个图像的检测结果
    annotator = Annotator(img[0].permute(1, 2, 0).cpu().numpy(), line_width=2, example=str(names))
    if len(det):
        # 将检测结果从模型输出坐标系转换到原始图像坐标系
        det[:, :4] = scale_coords(img.shape[2:], det[:, :4], img.shape[2:]).round()
        # 绘制检测框和标签
        for *xyxy, conf, cls in reversed(det):
            c = int(cls)
            label = f'{names[c]} {conf:.2f}'
            annotator.box_label(xyxy, label, color=colors(c, True))

    # 显示结果图像
    result_img = annotator.result()
    cv2.imshow('YOLOv5 Detection Result', result_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

创建 Annotator 对象用于在图像上绘制检测框和标签。如果存在检测结果,先利用 scale_coords 函数将检测框坐标从模型输出的特征图尺寸映射回原始输入图像尺寸。接着,对每个检测框循环操作,获取类别索引和置信度,构造标签字符串,并调用 box_label 方法绘制检测框和标签。最后,通过 OpenCV 的 imshow 函数显示带有检测结果的图像,按下任意键后关闭窗口。

七、模型训练与优化

除了直接使用预训练模型进行推理,你还可以根据自己的数据集对 YOLOv5 模型进行训练。训练前需要准备标注好的数据集,一般采用 COCO 或 VOC 格式的标注文件。通过调整学习率、批量大小、训练周期等超参数,结合数据增强技术(如随机裁剪、翻转、颜色扰动等),可以有效提升模型在特定数据集上的检测性能。此外,针对小目标检测困难、类别不平衡等问题,可以采用合适的策略加以优化。

相关推荐
却道天凉_好个秋1 小时前
系统架构设计(九):分布式架构与微服务
分布式·架构·系统架构
渡梦酒2 小时前
软考软件评测师——计算机组成与体系结构(分级存储架构)
架构
喵叔哟4 小时前
22.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--增加公共代码
微服务·架构·.net
EulerBlind4 小时前
【架构】RUP统一软件过程:企业级软件开发的全面指南
架构
CopyLower6 小时前
Java在微服务架构中的最佳实践:从设计到部署
java·微服务·架构
Blossom.1186 小时前
从虚拟现实到混合现实:沉浸式体验的未来之路
人工智能·目标检测·机器学习·计算机视觉·语音识别·vr·mr
却道天凉_好个秋7 小时前
系统架构设计(十一):架构风格总结2
架构·系统架构
埃菲尔铁塔_CV算法8 小时前
深度学习驱动下的目标检测技术:原理、算法与应用创新
深度学习·算法·目标检测
霸王蟹8 小时前
React Fiber 架构深度解析:时间切片与性能优化的核心引擎
前端·笔记·react.js·性能优化·架构·前端框架