美文网首页
目标检测快速入门(含YOLO V1原理详解)

目标检测快速入门(含YOLO V1原理详解)

作者: CV算法恩仇录 | 来源:发表于2022-02-24 14:28 被阅读0次

    原创:悬鱼铭

    目标检测(Object Detection)任务是计算机视觉中非常重要且热门的研究方向之一,是计算机视觉算法工程师的必考的知识点。本文通过以下几点阐述:

    • 目标检测的简介

    • 目标检测的发展

    • YOLO V1 原理详解

    全文总共3千字左右,阅读时间12分钟!

    目标检测的简介

    目标检测是解决图像分割、目标跟踪、图像描述等问题的基础,推动着它们的发展。目标检测到现今已经研究20年有余,04年,Viola 和 Jones学者研究的实时人脸检测的文章,引用量高达2万1千多[2]。

    目标检测有非常广泛的应用, 例如在安防监控、手机支付中的人脸检测,在智慧交通,自动驾驶中的车辆检测,在智慧商超,无人结账中的商品检测。在工业领域中有例如钢材、轨道表面缺陷检测。

    目标检测关注的是图片中特定目标物体的位置。一个检测任务包含两个子任务,其一是输出这一目标的类别信息,属于分类任务;其二是输出目标的具体位置信息,属于定位任务。类比我们去摘草莓,找到草莓和草莓的位置。

    • 物体在图像中的位置信息(用矩形框的坐标值表示,Xmin、Ymin、Xmax、Ymax),Xmin、Ymin 是矩形框左上角的坐标,Xmax、Ymax 是矩形框右下角的坐标。

    • 物体的中心点可以根据坐标值计算得到:中心点( Xmin + (Xmax - Xmin)/2 , Ymin + (Ymax - Ymin)/2 )

    图1:目标检测的坐标表示

    目标检测的发展

    早期,传统目标检测算法还没有使用深度学习,一般分为三个阶段:区域选取(找到物体的位置)、特征提取(描述物体的特征,特征类比苹果与西瓜的颜色与形状,苹果:小小的红色椭圆,西瓜:大大的绿色椭圆)、特征分类(看见小小的红色椭圆,知道是苹果;看见大大的绿色椭圆,知道是西瓜)。

    • 区域选取:采用滑动窗口(Sliding Windows)算法(可以想象一个窗口在图像从左到右,从上到下,框出图像内容),选取图像中可能出现物体的位置,这种算法会存在大量冗余框,并且计算复杂度高。
    • 特征提取:通过手工设计的特征提取器(如SIFT和HOG等)进行特征提取。
    • 特征分类:使用分类器(如SVM)对上一步提取的特征进行分类。

    2014年的R-CNN(Regions with CNN features)[3]使用深度学习实现目标检测,从此拉开了深度学习做目标检测的序幕。并且随着深度学习的方法快速发展,基于深度学习的目标检测,其检测效果好,逐渐成为主流。

    基于深度学习的目标检测大致可以分为一阶段(One Stage)模型和二阶段(Two Stage)模型。目标检测的一阶段模型是指没有独立地提取候选区域(Region Proposal),直接输入图像得到图中存在的物体类别和相应的位置信息。典型的一阶段模型有SSD(Single Shot multibox-Detector)[4]、YOLO(You Only Look Once)[5]系列模型等。二阶段模型是有独立地候选区域选取,要先对输入图像筛选出可能存在物体的候选区域,然后判断候选区域中是否存在目标,如果存在输出目标类别和位置信息。经典的二阶段模型有R-CNN[3]、Fast R-CNN[6]、Faster R-CNN[7]。

    两阶段的检测算法精度会比一阶段检测算法高,而检测速度确不如一阶段的检测算法,二阶段检测算法适合对精度要求高的业务,一阶段检测算法适合对实时性要求高的业务。

    接下来以一阶段检测算法YOLO V1为例,详细介绍算法思想。学懂YOLO V1, 便懂了YOLO系列的核心思想。以下内容非常适合有深度学习基础的读者,没有此基础,可以收藏回顾哦!

    YOLO V1 原理详解

    YOLO V1 是深度学习的方法,可以看成黑盒子,输入一张图片,输出图中物体类别信息和物体的位置。

    精华一:网络结构的输出

    为什么网络能输出物体的类别信息和物体的位置呢?这里需要了解网络的输出是什么样子的!

    网络输出的特征图会划分为 S\times S 的网格,每个网格会预测B 个Bounding Boxes(简称bbox),由x , y, w, h表示 ,x , y 是物体中心点坐标,w, hbbox的长宽;以及每个bbox对应一个置信度,置信度反映检测框是否包含物体的概率confidence。除了确定是否包含物体,还需进一步确定物体是什么?对于有C个类别的数据集,会对每个类别预测出类别概率。

    注意每个网格会包含多个物体,那个物体的中心落在网格里,就负责预测这个物体。

    图二:YOLO V1 [5]

    图二中展示了把输入图像划分为 S\times S 的网格,本文提到是特征图,我的理解这里都可以,输入图像的网格区域与特征图的网格区域有对应关系。

    这个留了一个疑惑:每个bbox包含物体的概率confidence如何计算?

    confidence 计算公式为 Pr(Object) ∗ IOU^{truth}_{pred}

    • IOU^{truth}_{pred} 指网络生成的bbox框和GT标注bbox计算IOU值(两个框的重叠率)。

    • 不包含物体: If no object exists in that cell, the confidence scores should be zero. = > Pr(Object) = 0 = > confidence = 0

    • 包含物体:Otherwise we want the confidence score to equal the intersection over union (IOU) between the predicted box and the ground truth. = > Pr(Object) = 1 = > confidence = IOU^{truth}_{pred}

    因此,网络输出的张量尺寸为 S\times S\times(5\times B + C)。这里5指的是检测框的位置信息和包含物体的概率(x , y, w, h, confidence)。YOLO V1中S = 7,B = 2,C = 20。YOLO V1 网络输出的张量尺寸为7×7×30,张量结构如下图三,X1 , Y1, W1, H1表示第一个物体的bboxC1是其包含物体的概率。cl1 , cl2, ..., cl20 是每个类别的概率。

    图三:YOLO V1 网络的输出张量结构

    精华二:损失函数( Loss Function)

    一个网络如何学习预测物体类别和物体位置,这就要看损失函数了~

    损失函数包含三个部分:(1)2.1 中心点、宽、高;(2)2.2 置信度;(3)2.3 物体的类别标签

    损失函数公式[1]

    损失函数三个部分的细节分别了解一下

    2.1 中心点、宽、高的损失计算,关于物体边框的回归。

    损失函数公式[1]

    • x,y: predicated bbox center(预测的中心点), w,h: predicated bbox width & height(预测的宽和高)
    • \hat{x}, \hat{y}: labeled bbox center(真值的中心点), \hat{w}, \hat{h} : labeled bbox width & height(真值的宽和高)
    • \sqrt{w},\sqrt{h}: Suppress the effect for larger bbox ==> 物体大,宽高变化大、物体小,宽高变化小,抑制之后,两者变化区别不大
    • i:0-(S^2-1) [对每个cell迭代 (0-48)]

    • j:0-(B-1) [对每个预测bbox迭代 (0 - 1)]

    • \lambda_{coord}:5: 为了平衡“非物体”bbox过多的影响

    • l_{ij}^{obj} 指正样本,类似mask,例如下面的表格,正样本的位置为1,C_i == 1
    0 0 0 0 0 0 0
    0 0 0 0 0 1 0
    0 0 0 0 0 0 0
    0 0 1 0 0 0 0
    0 1 0 0 0 0 0
    0 0 0 0 0 0 0
    0 0 0 0 0 0 0
    • l_{ij}^{noobj} 指负样本,类似 mask, 例如下面的表格,负样本的位置为1,C_i == 0
    1 1 1 1 1 1 1
    1 1 1 1 1 0 1
    1 1 1 1 1 1 1
    1 1 0 1 1 1 1
    1 0 1 1 1 1 1
    1 1 1 1 1 1 1
    1 1 1 1 1 1 1

    对于 l_{ij}^{obj} ,每个cell会预测 B 个 bbox, 只有IoU最大的预测框会 被标注为1,另一个bbox一般设置为noobj,如果另一个bbox与GT的IOU过大(例如0.65),可以不加入noobj,不参与计算。

    2.2 置信度的损失计算,关于置信度的回归。

    损失函数公式[1]

    \hat{C_i}: confidence score [IoU] of predicated and labeled bbox

    \hat{C_i}进一步翻译: 网络生成的 x,y,w,h 与 label(真值)的\hat{x}, \hat{y},\hat{w}, \hat{h} 计算IOU

    C_i : predicated confidence score [IoU] generated from networks (网络生成的置信度)

    • 此图中的Test: 公式来源论文,代码中,网络直接生成confidence的值。

    2.3 类别标签的损失计算,关于类别的预测

    损失函数公式[1]

    每个cell最终只预测一个物体边框,依据预测出B个bbox与标注框计算IOU,选取最大的IOU的物体边框。

    这里给一个思考题:如果两个物体很近,物体的中心点也靠的很近,标签会标两个物体还是一个物体呢?

    这个主要看代码的实现,以下代码是一个。

    
     for box in boxes:
                class_label, x, y, width, height = box.tolist()
       
                class_label = int(class_label)
       
    
                # i,j represents the cell row and cell column
                i, j = int(self.S * y), int(self.S * x)
               
                x_cell, y_cell = self.S * x - j, self.S * y - i
           
    
                """
                Calculating the width and height of cell of bounding box,
                relative to the cell is done by the following, with
                width as the example:
    
                width_pixels = (width*self.image_width)
                cell_pixels = (self.image_width)
    
                Then to find the width relative to the cell is simply:
                width_pixels/cell_pixels, simplification leads to the
                formulas below.
                """
                width_cell, height_cell = (
                    width * self.S,
                    height * self.S,
                )
    
                # If no object already found for specific cell i,j
                # Note: This means we restrict to ONE object
                # per cell!
                if label_matrix[i, j, 20] == 0:
                    # Set that there exists an object
                    label_matrix[i, j, 20] = 1
    
                    # Box coordinates
                    box_coordinates = torch.tensor(
                        [x_cell, y_cell, width_cell, height_cell]
                    )
    
                    label_matrix[i, j, 21:25] = box_coordinates
    
                    # Set one hot encoding for class_label
                    label_matrix[i, j, class_label] = 1
    
            return image, label_matrix
    

    代码来源

    最后总结一下YOLO V1的优缺点

    优点: 速度快

    缺点:

    • 对拥挤的物体检测不太友好
    • 对小物体检测不好
    • 没有Batch Normalize

    今天分享到这里,希望对你有所帮助!

    参考资料:

    [1] 开课吧人工智能计算机视觉课程

    [2] Viola P, Jones M J. Robust real-time face detection[J]. International journal of computer vision, 2004, 57(2): 137-154.

    [3] Girshick R, Donahue J, Darrell T, et al. Rich feature hierarchies for accurate object detection and semantic segmentation[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2014: 580-587.

    [4] Liu W, Anguelov D, Erhan D, et al. Ssd: Single shot multibox detector[C]//European conference on computer vision. Springer, Cham, 2016: 21-37.

    [5] Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788.

    [6] Girshick R. Fast r-cnn[C]//Proceedings of the IEEE international conference on computer vision. 2015: 1440-1448.

    [7] Ren S, He K, Girshick R, et al. Faster r-cnn: Towards real-time object detection with region proposal networks[J]. Advances in neural information processing systems, 2015, 28.

    相关文章

      网友评论

          本文标题:目标检测快速入门(含YOLO V1原理详解)

          本文链接:https://www.haomeiwen.com/subject/wlvzlrtx.html