1

目前,我正在阅读 Yolo9000 模型“ https://arxiv.org/pdf/1612.08242.pdf ”,我对模型如何预测目标检测的边界框感到非常困惑,我用 Tensorflow 做了很多示例,并且在其中大部分我们给模型“图像和图像标签”。

我的问题是:1-我们如何将边界框而不是标签传递给模型?2-模型如何知道许多框属于一张图像?

4

3 回答 3

8

在 YOLO 中,我们将图像划分为 7X7 的网格。对于每个网格位置,网络预测三件事 -

  1. 该网格中存在对象的概率
  2. 如果一个对象位于这个网格中,边界框的坐标是多少?
  3. 如果一个对象位于这个网格中,它属于哪个类?

如果我们对所有 49 个网格位置的所有上述变量应用回归,我们将能够判断哪些网格位置有对象(使用第一个参数)。对于有对象的网格位置,我们可以使用第二个和第三个参数告诉边界框坐标和正确的类。

一旦我们设计了一个可以输出我们需要的所有信息的网络,就可以准备这种格式的训练数据,即在数据集中的每个图像中为每个 7X7 网格位置找到这些参数。接下来,您只需训练深度神经网络以针对这些参数进行回归。

于 2017-06-08T10:34:27.693 回答
0

要传递图像的边界框,我们需要先创建它。您可以使用特定工具为任何图像创建边界框。在这里,您必须创建将对象绑定在其中的边界,然后标记该边界框/矩形。您要对图像中的每个对象执行此操作,以便您的模型训练/识别。

此链接 中有一个非常有用的项目,如果您需要了解边界框,您应该检查一下。

我刚刚开始学习使用 tensorflow 进行对象检测。因此,当我获得有关为对象检测模型提供边界框的正确信息时,我也会在此处进行更新。此外,如果您现在已经解决了这个问题,您还可以提供详细信息以帮助其他面临相同问题的人。

于 2017-04-25T05:54:28.600 回答
0

1-我们如何将边界框而不是标签传递给模型?

例如,如果我们想训练一个执行对象检测(而不是对象分类)的模型,我们必须将真实标签作为 .xml 文件传递​​。xml 文件包含有关图像中存在的对象的信息。关于对象的每个信息都由 5 个值组成:

  1. 该对象的类名,例如汽车或人...
  2. xmin:盒子左上角的x坐标
  3. ymin:盒子左上角的y坐标
  4. xmax:盒子右下角的x坐标
  5. ymax:box'x右下点的y坐标

图像中的一个边界框被指定为一组 5 个值,如上所示。如果图像中有 3 个对象,则 xml 文件将包含 3 组此值。

2-模型如何知道许多框属于一张图像?

如您所知,YOLOv2 或 YOLO9000 的输出具有形状 (13, 13, D),其中 D 取决于您要检测的对象类别。您可以看到有 13x13 = 169 个单元格(网格单元格),每个单元格为 D 值(深度)。 在此处输入图像描述

在 169 个网格单元中,有一些网格单元负责预测边界框。如果一个真正的边界框的中心落在一个网格单元上,当给定相同的图像时,该网格单元负责预测该边界框。

我认为必须有一个函数可以读取 xml 注释文件并确定哪些网格单元负责检测边界框。

在此处输入图像描述

为了让模型不仅学习类别,还学习盒子的位置和形状,我们必须建立一个适当的损失函数。YOLOv 中使用的损失函数也将成本放在盒子的形状和位置上。因此,损失计算为以下单个损失值的加权和:

  1. 损失类名
  2. 盒子位置的损失(xy坐标)
  3. 盒子形状的损失(盒子的宽度和高度)

边注:

  • 实际上,一个网格单元最多可以检测 B 个框,其中 B 取决于 YOLOv2 的实现。我使用darkflow在我的
    自定义训练数据上训练YOLOv2,其中B为5。所以模型总共可以检测到169*B个box,loss是169*B个小loss之和。
  • D = B*(5+C),其中 C 是您要检测的类别数。
  • 在传递给模型之前,框的形状和位置被转换为图像大小的相对值。
于 2018-12-24T07:18:20.773 回答