YOLOv5 目标检测概述
YOLOv5 是 Ultralytics 开发的基于 PyTorch 的实时目标检测模型,属于 YOLO(You Only Look Once)系列。它将图像分成网格,并在单次前向传播中预测边界框(bounding boxes)、置信度分数和类别概率。YOLOv5 的处理流程包括前处理(preprocessing)、模型推理(inference)和后处理(postprocessing)。前处理准备输入图像以适应模型,后处理则从模型输出中提取有效的检测结果。
Yolov5整体流程图
前处理(Preprocessing)细节
前处理是将原始图像转换为模型可接受的输入张量。主要目标是确保输入一致性(如固定大小)、提高效率,并保持图像比例以避免扭曲。YOLOv5 的前处理通常在 letterbox 函数中实现,包括以下步骤:
-
图像缩放和填充(Resizing and Padding):
- YOLOv5 默认输入大小为 640x640 像素(可配置)。
- 使用 Letterbox 缩放:保持原始宽高比,按比例缩放图像到目标大小。如果图像不成比例,会在短边填充灰色像素(padding)。
- 数学公式:假设原始图像大小为 (h,w)(h, w)(h,w),目标大小为 (img_size,img_size)(img\_size, img\_size)(img_size,img_size)。
- 计算缩放比例: r=min(img_sizeh,img_sizew)r = \min\left(\frac{img\_size}{h}, \frac{img\_size}{w}\right)r=min(himg_size,wimg_size)
- 新高度和宽度: h′=r⋅hh' = r \cdot hh′=r⋅h, w′=r⋅ww' = r \cdot ww′=r⋅w
- 填充量:顶部/底部填充 img_size−h′2\frac{img\_size - h'}{2}2img_size−h′,左侧/右侧填充 img_size−w′2\frac{img\_size - w'}{2}2img_size−w′
- 这确保了无扭曲,并记录填充信息用于后处理中的边界框调整。
-
颜色通道转换和归一化(Normalization):
- 如果图像是 BGR 格式(OpenCV 默认),转换为 RGB。
- 像素值归一化到 [0, 1]: pixel′=pixel255pixel' = \frac{pixel}{255}pixel′=255pixel
- 可选:减均值除标准差(YOLOv5 默认不使用 ImageNet 均值,因为它是端到端训练的,但可自定义)。
-
转换为张量并批处理(To Tensor and Batching):
- 将图像转换为 PyTorch 张量:形状为 ( (batch_size, 3, img_size, img_size) )
- 如果是单张图像,batch_size=1。
- 通道顺序:RGB,数据类型:float32。
前处理确保模型输入标准化,提高检测准确性和速度。
后处理(Postprocessing)细节
后处理从模型的原始输出中提取有意义的检测结果。YOLOv5 的输出是多尺度锚框(anchors)的预测,包括边界框坐标、对象置信度(objectness)和类别概率。输出形状示例:(batch_size,num_anchors×num_scales,4+1+num_classes)(batch\_size, num\_anchors \times num\_scales, 4 + 1 + num\_classes)(batch_size,num_anchors×num_scales,4+1+num_classes),其中 4 是边界框(cx, cy, w, h),1 是置信度,num_classes 是类别数(如 COCO 的 80)。
- 边界框解码(Bounding Box Decoding):
- 模型输出是相对于网格的相对坐标,需要转换为绝对坐标。
- YOLOv5 使用 sigmoid 激活将输出限制在 [0,1]。
- 数学公式:对于每个预测框:
- 中心坐标:
- x=(2⋅σ(tx)−0.5+cx)⋅stridex = (2 \cdot \sigma(t_x) - 0.5 + c_x) \cdot stridex=(2⋅σ(tx)−0.5+cx)⋅stride
- y=(2⋅σ(ty)−0.5+cy)⋅stridey = (2 \cdot \sigma(t_y) - 0.5 + c_y) \cdot stridey=(2⋅σ(ty)−0.5+cy)⋅stride
- 宽度/高度:
- w=(2⋅σ(tw))2⋅aw⋅stridew = (2 \cdot \sigma(t_w))^2 \cdot a_w \cdot stridew=(2⋅σ(tw))2⋅aw⋅stride
- h=(2⋅σ(th))2⋅ah⋅strideh = (2 \cdot \sigma(t_h))^2 \cdot a_h \cdot strideh=(2⋅σ(th))2⋅ah⋅stride
- 中心坐标:
- 其中 σ\sigmaσ 是 sigmoid 函数,tx,ty,tw,tht_x, t_y, t_w, t_htx,ty,tw,th 是模型输出,cx,cyc_x, c_ycx,cy 是网格偏移,aw,aha_w, a_haw,ah 是锚框尺寸,stride 是特征图下采样率(如 8、16、32)。
- 调整填充:使用前处理中的比例 r 和填充 (dw, dh) 缩放回原始图像大小:
- x′=(x−dw)/rx' = (x - dw) / rx′=(x−dw)/r
- y′=(y−dh)/ry' = (y - dh) / ry′=(y−dh)/r
- w′=w/rw' = w / rw′=w/r
- h′=h/rh' = h / rh′=h/r
- 调整填充:使用前处理中的比例 r 和填充 (dw, dh) 缩放回原始图像大小:
-
置信度计算和过滤(Confidence Scoring and Thresholding):
- 对象置信度: conf=σ(objectness)⋅max(class_probs)conf = \sigma(objectness) \cdot \max(class\_probs)conf=σ(objectness)⋅max(class_probs)
- 过滤低置信度框:通常阈值如 0.25,只保留 ( conf > threshold ) 的框。
-
非最大抑制(Non-Maximum Suppression, NMS):
- 去除重叠框:对于同一对象的多重检测,选择 IoU(Intersection over Union)最高的。
- IoU 公式: IoU=A∩BA∪BIoU = \frac{A \cap B}{A \cup B}IoU=A∪BA∩B,其中 A 和 B 是两个边界框的面积。
- NMS 步骤:
- 按置信度降序排序所有框。
- 选择最高置信度框,移除与其 IoU > threshold(通常 0.45)的框。
- 重复直到无剩余框。
- YOLOv5 支持类内 NMS 或 agnostic NMS(忽略类别)。
-
最终输出:
- 返回列表:每个检测为 [x1, y1, x2, y2, conf, class_id],其中 (x1,y1,x2,y2) 是左上右下角坐标。
后处理流程图
以下是后处理的详细流程图:
后处理确保结果干净、无冗余,提高实际应用精度。
7186

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



