YOLOv1 随笔

YOLO 系列

<img src="./image/../images/ironman_evolution.jpg">

YOLOv1

<img src="images/yolov1_cover.jpeg">

  • 作者 AlexAB

计算机视觉

随着深度学习中卷积神经网络的发展,掀起了一次目标检测的浪潮,逐渐趋近于成熟

目标检测

<img src="images/object_detector_01.jpeg">

  • 语义分割
  • 单目标检测
  • 多目标检测
    • 实例分割
    • 目标检测
单目标

我们要做目标检测,先看一下计算机视觉可以做那些图像那些识别问题。目标检测从 2012 年目标检测人提升了一倍,图像目标是什么,还需要对其进行定位,单目标任务,同时输出 1000

  • softmax 损失
  • L2 损失||\hat{x} - x^{8}||^2 +

可以选择一个,然后分出两个 head 分别做分类任务和回归任务,可以定位
<img src="images/object_detector_02.png">

多目标(区域)

adaboost 就足够快可以通过滑动窗口来做人脸检测

目标检测任务
  • 输入图像
  • 输出一个目标所属类别的概率以及表示出该目标在图像位置
    • xywh
    • cwh
    • xyxy
目标检测思路
  • 生成局部区域图像
  • 对区域图像进行分类任务
滑动窗口(slide window)

这种方式进行目标检测的缺点很明显,运算量大,所以耗时在当前算力下无法投入到生产,对于每张图片都等同生成一个小型的数据集.

<img src="images/yolov2_001.jpeg">

目标检测中的问题和难点
  • 如何生成区域图像
  • 如何表示一个预测结果
  • 如何表示多个预测结果

我们如何将这生成局部区域图像和对区域图像进行分类两个任务结合在一起,如何更精准地生成区域图像。其实图像检测一路走来大家对生成区域图像花费很多心思。
<img src="./images/yolov1_cover_02.jpeg">

YOLOv1

如何准备数据集

  • 类别信息
  • 位置信息

网络结构

  • 输入图像
  • 输出向量表示预测结果 [c,x,y,w,h]
    <img src="images/yolov1_001.jpeg">

训练

训练网络,多组输出与位置强相关, 按空间位置来映射 N = W^{\prime} \times H^{\prime}

用每一个对应框进行预测,只需要

  • 一个目标出现在多个框(中心点)
  • 多个目标出现在同一个框(不同尺度的框)
    \begin{bmatrix} [c,x,y,w,h] & [c,x,y,w,h] & \cdots &[c,x,y,w,h] \\ [c,x,y,w,h] & [c,x,y,w,h] & \cdots &[c,x,y,w,h] \\ \vdots & \vdots & \vdots & \vdots\\ [c,x,y,w,h] & [c,x,y,w,h] & \cdots &[c,x,y,w,h] \\ \end{bmatrix}
loss_total = 0
for img in images:
    for i in range(0,7):
        for j in range(0,7):
            loss_ij = (c_hat - c_true)**2 + 
            c_true (x_hat - x_true)**2 +  
            c_true (y_hat - y_true)**2 +  
            c_true (w_hat - w_true)**2 +  c_true(h_hat - h_true)**2
            loss_total + loss_ij

<img src="images/yolov1_007.png"/>
<img src="images/yolov1_008.png"/>
<img src="images/yolov1_009.png"/>
<img src="images/yolov1_011.png"/>

loss = (\hat{c} - c^{*})^2 + c^{*}(\hat{x} - x^{*}) + c^{*}(\hat{y} - y^{*}) + c^{*}(\hat{w} - w^{*}) + c^{*}(\hat{h} - h^{*})

  • c \in [0,1]
  • x,y,h,w \in [1,416]
    这样问题就是因为置信度loss 值与边界框位置信息的loss 存在不平衡问题,因此需要引入一个权重来进行调整。

loss = \lambda(\hat{c} - c^{*})^2 + c^{*}(\hat{x} - x^{*}) + c^{*}(\hat{y} - y^{*}) + c^{*}(\hat{w} - w^{*}) + c^{*}(\hat{h} - h^{*})
而且这里 w 和 h 与 x 和 y 也表示不同属性还需要进一步进行处理

loss = \lambda(\hat{c} - c^{*})^2 + c^{*}(\hat{x} - x^{*}) + c^{*}(\hat{y} - y^{*}) + c^{*}( \sqrt{\hat{w}} - \sqrt{w^{*}} ) + c^{*}( \sqrt{\hat{h}} - \sqrt{h^{*}})

因为只需要计算有物体的放框

IOU和NMS

<img src="images/iou_001.jpg">
可能输出预测框数量要大于实际目标数量,可以通过 IOU 可以去掉一些冗余的候选框,通过将两个重合度比较高的候选框计算为一个候选框。我们实际上可以用 IOU 来判断两个框。

找到置信度最高框,然后利用 IOU 去掉与置信度最高框(抑制掉),还剩下没有被抑制掉,然后在没有被抑制掉的框找到置信度最高的框,然后计算 IOU 来去掉和这个框,NMS(非极大值抑制)

多分类

loss = \lambda(\hat{c} - c^{*})^2 + c^{*}(\hat{x} - x^{*}) + c^{*}(\hat{y} - y^{*}) + c^{*}( \sqrt{\hat{w}} - \sqrt{w^{*}} ) + c^{*}( \sqrt{\hat{h}} - \sqrt{h^{*}}) + c^{*}\sum_i^cls (\hat{y_i} - y_i^{*})^2

<img src="images/yolov1_003.jpeg"/>

<img src="images/yolov1_002.jpeg"/>

损失函数

<img src="images/yolov1_006.png">

  • S 是 7,grid 数量
  • B 两个框
  • \mathbb{1}_{i,j}^{obj}

YOLOv1 中的问题

  • 小目标检测
  • 多目标
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容