• 【YOLO系列】YOLO.v1算法原理详解


    YOLO(You Only Look Once)系列算法原理

    前言 :详细介绍了yolo系列目标检测算法的原理和发展过程。

    系列:
    【YOLO系列】YOLO.v1算法原理详解
    【YOLO系列】YOLO.v2算法原理详解
    【YOLO系列】YOLO.v3算法原理详解
    【YOLO系列】YOLO.v4算法原理详解
    【YOLO系列】YOLO.v5算法原理详解

    1. YOLO.v1

    1.1 基本概述

    论文参考:You only look once unified real-time object detection

    yolov1 是使用 one-stage 方法进行目标检测。核心思想是把目标检测问题处理成回归问题。

    输入图像通过一个卷积神经网络,直接输出最终预测框位置和类别(概率)。

    1.2 算法流程

    整个YOLO检测系统如下图所示。

    在这里插入图片描述

    • 假设网络实现的预测类别数为 C 个

      论文中使用 PASCAL VOC数据集,C=20,即实现20类别物品的目标检测;

    • 输入图像首先被 resize 到指定尺寸

      论文中将输入图像统一调整到 448 × \times × 448 ;

      即网络输入: 448 × 448 × 3 448\times 448 \times 3 448×448×3

    • 对图像进行划分,共划分 S × S S\times S S×S 个方格(即grid),

      论文中 S=7, 即共划分 7 × 7 = 49 7\times 7=49 7×7=49个方格 ;

      每个方格包含 64 × 64 64\times 64 64×64 个像素点 ;

    • 针对每个方格grid,

      • 生成 C 个类别目标的概率分数(表示该方格是否存在该目标的概率),用 p 表示。

      • 生成 B 个检测框(即bbox, 用于检测目标),每个检测框共 5 个参数 ( x , y , w , h , c ) (x,y,w,h,c) (x,y,w,h,c)

        使用 ( x , y ) (x, y) (x,y) 表示检测框中心相对于方格左上角的偏移量;

        使用 ( w , h ) (w, h) (w,h) 表示检测框的宽和高;该值是相对于图像宽高的比。

        使用 c o n f i d e n c e confidence confidence 表示该框预测(目标)的置信度;该值综合了含目标的置信度和方框位置准确度。

      每个方格输出向量如下图所示:

      在这里插入图片描述

      因此针对每个方格,共有参数量为 ( C + B × 5 ) (C+B\times 5) (C+B×5) 个。本论文中,即 ( 20 + 2 × 5 ) = 30 (20+2\times 5) = 30 (20+2×5)=30 个。

    • 针对一张图片,最终输出向量: S × S × ( C + B × 5 ) S\times S \times (C+B\times 5) S×S×(C+B×5)

      本论文中即 7 × 7 × 30 = 1470 7\times 7 \times 30 = 1470 7×7×30=1470

    • 对输出向量进行后处理,得到最终预测结果

      根据输出向量提取出的预测框和类别信息,通过非极大值抑制(Non-Maximum Compression, NMS) ,去除重复框,即可得到最终检测结果。
      NMS算法原理及实现可参看: 目标检测之相关指标介绍

    1.3 细节实现

    1.3.1 卷积网络结构

    论文所用卷积神经网络结构,即Backbone基于GoogLeNet,具体如下图所示:

    在这里插入图片描述

    该网络最后一层的输出 7 × 7 × 30 7\times 7 \times 30 7×7×30 即对应上述最终输出向量的分析。

    1.3.2 预测框bbox

    预测框bbox如下所示

    在这里插入图片描述

    ( x , y ) (x,y) (x,y) 表示预测框bbox中心相对于当前所在方格的偏移值,范围在 [0,1];

    ( w , h ) (w,h) (w,h) 表示预测框bbox宽高,该值实际计算为框的实际宽高与整图宽高的比值,范围为 [0,1];

    c c c 即 confidence,表示预测框置信度,范围为[0,1]。
    计算方法如下
    c = P r ( O b j e c t ) ∗ I O U p r e d t r u t h c = Pr(Object)*IOU_{pred}^{truth} c=Pr(Object)IOUpredtruth
    其中, P r ( O b j e c t ) Pr(Object) Pr(Object)表示当前格子包含目标的概率,只有0和1两个数值。如果该目标中心落入该格子,则 P r ( o b j e c t ) = 1 Pr(object)=1 Pr(object)=1,反正,该值为0。

    值得说明的是,在1.2节中提到每个格子共有B(论文中该值为为2)个预测框,也即每个格子共B组(x,y,w,h,c)数据。每个格子只负责预测一类物体,也即两个检测框只预测一类物体。预测物体的类别即是根据置信度大小来确定的。

    1.3.4 损失函数

    损失即计算网络输出值(或预测值)与标签值差异的程度。
    举例说明,如上图的包含狗狗的方格,对应的标签值与预测值形式如下,

    在这里插入图片描述

    yolo v1中损失函数共包含三项,即坐标预测损失、置信度预测损失和类别预测损失。

    三个损失函数都使用了均方误差。计算公式如下所示:
    在这里插入图片描述

    其中,

    S —— 方格数,论文中为 7;

    B —— 每个方格中检测框数量,论文中为 2;

    x i , y i x_i, y_i xi,yi —— 检测框中心坐标;

    w i , h i w_i, h_i wi,hi —— 检测框宽和高;公式中使用开根号,为了增大小物体检测的该部分损失权重;

    C i C_i Ci —— 检测框置信度

    p i p_i pi —— 类别概率

    1 i , j o b j 1^{obj}_{i,j} 1i,jobj —— 标签中,检测框中心点是否落入当前方格,若落入,取值 1,反之,取值 0;
    1 i , j n o o b j 1^{noobj}_{i,j} 1i,jnoobj 与此相反。

    λ c o o r d , λ n o o b j \lambda_{coord}, \lambda_{noobj} λcoord,λnoobj —— 对应损失项的权重,值越大,代表该部分损失越大。论文中分别设为了 5 和 0.5;

    1.4 总结

    本文详细介绍了yolov1的原理和实现过程。

    • 将目标检测问题转化为了回归问题,可以得到较好的检测速度。
    • 原理现在看来相对简单,但作为yolo的开篇之作,相当哇塞。
    • 于是,各方大神发力,yolo开始了更快更准的道路。

    下一篇:YOLO.v2

  • 相关阅读:
    080|为什么阿里的价值观值得你关注?
    Linux安装Redis 手把手教程
    Redis8 实现分布式锁
    C# 查找迷宫路径
    NFC 音乐墙 (不限手机)[web 接口服务实现-折腾记录]
    LeetCode 1359. Count All Valid Pickup and Delivery Options【动态规划,组合数学】1722
    华为mate50和华为mate50pro区别 华为mate50和华为mate50pro参数对比
    SSL单向认证原理
    《剑指offer》【剑指 Offer 19. 正则表达式匹配】
    镜像瘦身:每一层都不能放过
  • 原文地址:https://blog.csdn.net/deepsprings/article/details/126232331