计算机视觉之-YOLO目标检测

围绕YOLO 目标检测完整工程链路展开:传统方案与 AI 端到端方案对比、数据标注准备、数据集 yaml 配置、模型训练、推理结果解析、检测评估指标 (Precision/Recall/mAP/IoU)、调优优化与部署,附带可运行代码片段。

一、YOLO 概述:传统开发 vs 人工智能端到端

  1. YOLO 定义 :You Only Look Once,把目标检测任务转化为单一回归问题;一次前向传播同时预测边界框坐标、类别、置信度,端到端输出,不需要分开生成候选框。

  2. 两种实现思路对比 表格

    方案 实现逻辑 特点
    传统开发(正向逻辑) 手动写算法提取边缘、轮廓、颜色,写规则做判断 规则复杂;复杂场景泛化差;硬编码
    AI 人工智能(反向逻辑) 数据驱动,从大量标注数据自动学习特征;原始图像直接输出检测结果 泛化能力强,适配复杂真实场景

伪代码对比

python 复制代码
# 传统方法
def traditional_detection(image):
    edges = extract_edges(image)
    contours = find_contours(edges)
    shapes = analyze_shapes(contours)
    return classify_by_rules(shapes)

# YOLO端到端
def yolo_detection(image):
    return model.predict(image)

二、数据标注与数据集准备

2.1 标注工具 Label Studio

  • 安装:pip install label‑studio
  • 启动:label‑studio start
  • 优势:支持多种标注格式,支持团队协作,适合目标检测框标注。

2.2 数据规范

  1. 类别:类别定义清晰无歧义,至少 1 个目标类别;写classes.txt记录类别名称。
  2. 图像尺寸:YOLO 默认输入640×640;
    • 长宽比差异大:做填充缩放,保持物体不拉伸,放到正方形画布;
    • 超大图像:需要切分,推理后聚合结果。

图像预处理逻辑:等比例缩放 → 创建正方形画布,图像居中放置,空余部分填充 0。

2.3 YOLO 数据集目录结构 & yaml 配置

文件夹结构

复制代码
datasets/dog_cat/
├─images
│  ├─train/   #训练图片
│  └─val/     #验证图片
└─labels
   ├─train/   #训练txt标签(和图片同名)
   └─val/     #验证txt标签

yaml 配置文件dog_cat.yaml

复制代码
path: ../datasets/dog_cat
train: images/train
val: images/val
test:
names:
  0: cat
  1: dog

三、模型训练实践(ultralytics YOLO11)

3.1 基础训练代码

python 复制代码
from ultralytics import YOLO
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "True"

model = YOLO("yolo11n.pt") # pt加载预训练权重;也可以写yolo11n.yaml从零训练
if __name__ == "__main__":
    results = model.train(
        data="dog_cat.yaml",
        epochs=10,
        imgsz=640,
        batch=16,
        workers=1
    )

3.2 训练输出文件与指标含义

训练运行后自动生成运行目录,产出:

  1. best.pt:验证集指标最优模型权重(实际部署优先使用)
  2. last.pt:最后一轮权重
  3. results.csv:全部 epoch 训练指标记录
  4. 各类曲线图:损失曲线、PR 曲线

指标说明

  • box_loss:边界框回归损失
  • cls_loss:分类损失
  • dfl_loss:分布焦点损失
  • metrics/precision(B):精确率
  • metrics/recall(B):召回率
  • metrics/mAP50(B):IoU=0.5 条件下平均精度
  • metrics/mAP50‑95(B):IoU 0.5~0.95 步长 0.05 的平均精度,工业最核心指标

四、推理、结果解析与后处理

4.1 基础推理

python 复制代码
from ultralytics import YOLO
model = YOLO("best.pt")
results = model(source=["1.jpg","2.jpg"])

4.2 result 对象核心属性

  1. result.names:类别映射字典 {0:"cat",1:"dog"}
  2. boxes.cls:检测类别 ID 张量
  3. boxes.conf:每个框置信度分数
  4. boxes.xywh:[cx, cy, w, h] 中心点 + 宽高格式
  5. boxes.xyxy:[x1,y1,x2,y2]左上角、右下角绝对像素坐标

4.3 可视化

python 复制代码
annotated_img = results[0].plot() #绘制带框结果
plt.imshow(annotated_img[:,:,::-1]) #BGR转RGB
plt.axis("off")
plt.show()

4.4 结果后处理函数

按置信度阈值过滤检测框,提取class_id、confidence、x1/y1/x2/y2结构化检测结果,返回 python 字典列表,方便业务逻辑调用。

五、目标检测核心评估指标

1. Precision 精确率

\(Precision =\frac{TP}{TP+FP}\)

含义:所有模型预测出来的正样本里面,真正目标占多少;衡量预测出来的框 "准不准"。

2. Recall 召回率

\(Recall =\frac{TP}{TP+FN}\)

含义:图片里面真实存在的目标,有多少被找出来;衡量漏检程度。

3. IoU 交并比

两个边界框交集面积 / 并集面积;用来判断预测框与真实框是否匹配。

python 复制代码
def calculate_iou(box1, box2):
    x1_1, y1_1, x2_1, y2_1 = box1
    x1_2, y1_2, x2_2, y2_2 = box2
    # 交集坐标
    x1_inter = max(x1_1, x1_2)
    y1_inter = max(y1_1, y1_2)
    x2_inter = min(x2_1, x2_2)
    y2_inter = min(y2_1, y2_2)
    if x2_inter <= x1_inter or y2_inter <= y1_inter:
        return 0.0
    inter_area = (x2_inter - x1_inter) * (y2_inter - y1_inter)
    area1 = (x2_1 - x1_1) * (y2_1 - y1_1)
    area2 = (x2_2 - x1_2) * (y2_2 - y1_2)
    union_area = area1 + area2 - inter_area
    return inter_area / union_area if union_area>0 else 0.0

4. mAP 平均精度

  • mAP@0.5:IoU 阈值固定 0.5 时所有类别的 AP 求平均;
  • mAP@0.5:0.95:IoU 从 0.5 到 0.95 步长 0.05 一共 10 个阈值,全部取平均;是目标检测最重要综合指标。

5. 读取 csv 分析训练效果

读取results.csv,查看每一轮精确率、召回率、mAP 变化,判断是否收敛、过拟合。

六、优化策略、训练高级配置、部署

6.1 数据层面优化

  1. 保证标注质量,标注框紧贴目标;
  2. 尽量做到类别样本均衡;
  3. 开启数据增强:mosaic、mixup、copy‑paste。

6.2 高级训练参数示例

python 复制代码
model.train(
    data="dog_cat.yaml",
    epochs=100,
    imgsz=640,
    batch=32,
    optimizer="AdamW",
    lr0=0.01,
    weight_decay=0.0005,
    mosaic=1.0,
    mixup=0.1,
    copy_paste=0.1,
    device=0
)

6.3 部署方案

  1. 模型量化:缩小体积、加速推理;
  2. TensorRT:NVIDIA GPU 硬件推理加速;
  3. 导出 ONNX:跨框架、跨平台部署。
python 复制代码
model.export(format="onnx")
model.export(format="tensorrt")

七、总结

  1. YOLO 是端到端一阶段检测 ,区别传统手工特征工程,依靠标注数据自动学习特征;数据标注质量是检测项目成败关键。
  2. 工程完整链路:数据标注(Label Studio)→ 整理目录 + 编写 yaml 数据集配置 → ultralytics 训练 → 监控 box/cls 损失、Precision、Recall、mAP 指标。
  3. 推理重点:掌握boxes.xyxy / xywh两套坐标格式,做置信度过滤后处理。
  4. 评估核心:IoU 交并比;Precision 看预测框准度,Recall 看漏检;mAP@0.5:0.95是综合性能指标。
  5. 调优方向:数据质量优先,再调整增强、优化器、学习率;训练完成导出 ONNX/TensorRT 用于生产部署。

实践建议:从小规模数据集上手,优先保证标注质量,不要盲目堆数据数量。

OLO 推理获取检测结果、解析框信息、可视化结果 的最小示例,基于ultralytics库。 注意:YOLO 输出图像通道为BGR ,matplotlib 显示必须反转通道 [:, :, ::-1] 转为 RGB。

python 复制代码
# %%
from ultralytics import  YOLO
# %%
# 加载预训练YOLO11n模型(n是nano轻量版本)
model = YOLO(model="yolo11n.pt")
# %%
# 批量推理,输入图片路径列表,可以单张/多张图片
results = model(source=["dog2.jpg", "cat2.jpg"])
# %%
# 获取类别映射字典:{类别id:类别名字}
results[0].names
# %%
# 得到预测框的类别ID,转到cpu张量
results[0].boxes.cls.cpu()
# %%
# 获取每个检测框的置信度confidence
results[0].boxes.conf
# %%
# xywh格式:(中心点x,中心点y,宽度w,高度h)
results[0].boxes.xywh
# %%
# xyxy绝对像素坐标格式:(左上角x1,左上角y1,右下角x2,右下角y2)
results[0].boxes.xyxy
# %%
# plot()方法绘制图片,画上检测框、类别、置信度,返回BGR格式图像数组
img = results[0].plot()
# %%
from matplotlib import pyplot as plt
# %%
# BGR → RGB通道反转,正常显示图片
plt.imshow(X=img[:, :, ::-1])

各对象属性说明

表格

代码 作用
results = model(source=[...]) 推理,返回结果列表,一张图片对应一个 result 对象
results[i].names 类别字典 {0:'person',1:'car'...}
results[i].boxes.cls 检测框对应的类别 ID (tensor)
results[i].boxes.conf 每个框预测置信度分数
results[i].boxes.xywh 中心点 + 宽高格式
results[i].boxes.xyxy 左上角、右下角绝对像素坐标(业务解析最常用)
results[i].plot() 绘制标注框,返回 BGR 图像 numpy 数组
img[:, :, ::-1] BGR 通道反转 → RGB,适配 matplotlib

拓展:完整解析 + 过滤置信度(处理函数)

python 复制代码
def parse_result(results, conf_thresh=0.5):
    res_list = []
    for r in results:
        boxes = r.boxes
        if boxes is None:
            continue
        for idx in range(len(boxes)):
            conf = float(boxes.conf[idx].cpu())
            if conf < conf_thresh:
                continue
            cls_id = int(boxes.cls[idx].cpu())
            x1,y1,x2,y2 = boxes.xyxy[idx].cpu().numpy()
            res_list.append({
                "cls_id":cls_id,
                "cls_name": r.names[cls_id],
                "conf": conf,
                "bbox_xyxy":[float(x1),float(y1),float(x2),float(y2)]
            })
    return res_list

detections = parse_result(results,0.5)
print(detections)

重要踩坑点

  1. GPU 运行时,boxes.cls / boxes.conf / boxes.xyxy 在 GPU 显存上,必须调用.cpu()再转 numpy,否则报错。
  2. plot()返回图像是 BGR,直接 plt.imshow 颜色错乱,必须切片反转通道。
  3. results是列表,输入 N 张图片就有 N 个 result 对象,results[0]对应第一张图。
相关推荐
兴通物联科技8 小时前
对俄出口诚实标识 2026 时间节点与产线赋码采集技术方案
大数据·服务器·单片机·嵌入式硬件·深度学习·计算机视觉
欧特克_Glodon9 小时前
OpenCV计算机视觉开发入门与实践(基于C++):专栏内容介绍及目录
c++·人工智能·opencv·计算机视觉
AI浩9 小时前
WeDetect: 作为检索的快速开放词汇目标检测
人工智能·目标检测·计算机视觉
YFJ_mily9 小时前
CVISPR 2026计算机视觉模式识别智能系统|已上线IEEE官网 EI&Scopus检索
人工智能·计算机视觉·模式识别·智能系统·rdlink研发家·机器人自动化·ieee出版
sali-tec9 小时前
C# 基于OpenCv的视觉工作流-章110-YOLO 实例分割
图像处理·人工智能·opencv·算法·yolo·计算机视觉
YOLO数据集集合10 小时前
小鸡计数检测数据集 |小鸡计数 密集目标检测 智慧畜牧 雏鸡管理9124期
人工智能·目标检测·目标跟踪·小鸡·小鸡计数
YOLO数据集集合11 小时前
风力发电机检测数据集 | 风机检测 电缆塔识别 风电运维 无人机巡检 9122期
运维·人工智能·目标检测·目标跟踪·无人机·风力发电·电力巡检
TAN-90°-12 小时前
Deep Learning for Computer Vision——Vision and Language
人工智能·深度学习·神经网络·算法·目标检测·机器学习·计算机视觉
小蒋观天下20 小时前
两轮车检测AI摄像头——2026行业竞争格局、商业模式与核心痛点
大数据·人工智能·安全·计算机视觉·ai大模型
小蒋观天下1 天前
两轮车检测AI摄像头——2026-2030年未来市场规模、增长逻辑与行业天花板
大数据·人工智能·安全·计算机视觉·ai大模型