YOLO v1 原理到代码(一)

前沿

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

  • 物体在图像中的位置信息(矩形框的坐标值表示, X m i n 、 Y m i n 、 X m a x 、 Y m a x Xmin、Ymin、Xmax、Ymax XminYminXmaxYmax), X m i n 、 Y m i n Xmin、Ymin XminYmin 左上角, X m a x 、 Y m a x Xmax、Ymax XmaxYmax 右下角。

  • 物体的中心点可以根据坐标值计算得到,中心点 ( X m i n + ( X m a x − X m i n ) / 2 , Y m i n + ( Y m a x − Y m i n ) / 2 ) ( Xmin + (Xmax - Xmin)/2 , Ymin + (Ymax - Ymin)/2 ) (Xmin+(XmaxXmin)/2,Ymin+(YmaxYmin)/2)
    在这里插入图片描述

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

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

YOLO 的算法流程

以下适合有深度学习基础的读者

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

为什么网络能输出物体的类别信息和物体的位置呢?这里需要了解网络的输出是什么样子的?
在这里插入图片描述

网络输出的张量尺寸为 7 × 7 × 30 7×7×30 7×7×30
S × S × ( 5 × B + C ) S\times S\times(5\times B + C) S×S×(5×B+C)
S = 7 , B = 2 , C = 20 S = 7,B = 2,C = 20 S=7B=2C=20

  • 7 × 7 7×7 7×7 是最后的特征图化为 7 × 7 7×7 7×7 grid cell.
  • 每个grid cell 里有 2个 bounding boxes [简称bbox],生成 x , y , w , h x , y, w, h x,y,w,h x , y x , y x,y是物体中心点坐标, w , h w, h w,hbbox 的长宽。
  • 每个bbox有包含物体的概率 c o n f i d e n c e confidence confidence
  • Each grid cell predicts B B B B = 2 B = 2 B=2) bounding boxes and confidence scores for those boxes.
    • define c o n f i d e n c e confidence confidence as P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object) ∗ IOU^{truth}_{pred} Pr(Object)IOUpredtruth
      • I O U p r e d t r u t h IOU^{truth}_{pred} IOUpredtruth 指网络生成的bbox框和GT标注bbox计算IOU值(两个框的重叠率)。
      • 不包含物体: If no object exists in that cell, the c o n f i d e n c e confidence confidence scores should be zero. = > P r ( O b j e c t ) = 0 Pr(Object) = 0 Pr(Object)=0
      • 包含物体:Otherwise we want the confidence score to equal the intersection over union (IOU) between the predicted box and the ground truth. = > P r ( O b j e c t ) = 1 Pr(Object) = 1 Pr(Object)=1
  • C C C是类别概率,根据这个可以得到物体的类别标签 ,在YOLO v1论文中,使用VOC的数据集,有20个类别。实际在代码里还有一个背景类,不包含物体的情况下,confidence = 0,是背景类

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

Loss Function

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

2.1 中心点、宽、高的损失计算
在这里插入图片描述

  • x , y x,y x,y: predicated bbox center, w , h w,h w,h: predicated bbox width & height
  • x ^ , y ^ \hat{x}, \hat{y} x^,y^: labeled bbox center, w ^ , h ^ \hat{w}, \hat{h} w^,h^ : labeled bbox width & height
  • w , h \sqrt{w},\sqrt{h} w ,h : Suppress the effect for larger bbox ==> 物体大,宽变化大、物体小,变化小,抑制之后,两者变化区别不大
  • i : 0 − ( S 2 − 1 ) i:0 -(S^2-1) i:0S21 [iterate each grid cell ( 0 − 48 0-48 048)]

  • j : 0 − ( B − 1 ) j:0-(B-1) j:0(B1) [iterate each bbox ( 0 − 1 ) (0 - 1) (01)]

2.2 置信度的损失计算
在这里插入图片描述

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

C i ^ \hat{C_i} Ci^进一步翻译: 网络生成的 x , y , w , h x,y,w,h x,y,w,h 与 label的 x ^ , y ^ , w ^ , h ^ \hat{x}, \hat{y},\hat{w}, \hat{h} x^,y^,w^,h^计算IOU

C i C_i Ci : predicated confidence score [IoU] generated from networks

image-20210410223756359

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

    • l i j o b j l_{ij}^{obj} lijobj 指正样本,类似mask, 例如下面的表格, 正样本的位置为1, C i = = 1 C_i == 1 Ci==1
0000000
0000010
0000000
0010000
0100000
0000000
0000000
  • l i j n o o b j l_{ij}^{noobj} lijnoobj 指负样本,类似 mask, 例如下面的表格,负样本的位置为1。 C i = = 0 C_i == 0 Ci==0
1111111
1111101
1111111
1101111
1011111
1111111
1111111
  • For l i j o b j l_{ij}^{obj} lijobj, we have B B B predictions in each cell, only the one with largest IoU shall be labeled as 1,另一个bbox一般设置为noobj,如果另一个bbox与GT的IOU过大(例如0.65),可以不加入noobj,不参与计算。

2.3 物体的类别标签,损失计算
在这里插入图片描述

Each cell will only predict 1 object, which is decided by the bbox with largest 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

这里代码只会标注一个

代码来源

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值