首页 > 解决方案 > YOLO图片可以有一个覆盖整个图片的有界框吗?

问题描述

我想知道为什么YOLO图片需要有边界框。假设我们正在使用Darknet. 每个图像都需要有一个与.txt图像文件同名的对应文件。.txt它需要在文件中。对于所有bounded boxes用于标记的 YOLO 框架都是一样的。

<object-class> <x> <y> <width> <height>

其中xywidthheight是相对于图像的宽度和高度的。

例如。如果我们转到此页面并按下YOLO Darknet TXT按钮并下载.zip文件,然后转到train文件夹。然后我们可以看到这些文件

IMG_0074_jpg.rf.64efe06bcd723dc66b0d071bfb47948a.jpg
IMG_0074_jpg.rf.64efe06bcd723dc66b0d071bfb47948a.txt

文件.txt看起来像这样

0 0.7055288461538461 0.6538461538461539 0.11658653846153846 0.4110576923076923 
1 0.5913461538461539 0.3545673076923077 0.17307692307692307 0.6538461538461539 

每个图像都有大小416x416。此图像如下所示:

在此处输入图像描述

我的想法是每个图像都应该有one类。只one上课。并且图像应该用这样的相机拍摄。

在此处输入图像描述

此相机快照应视为:

  1. 拍照
  2. 将相机卡扣剪成想要的大小
  3. 将其放大为正方形416x416

像这样:

在此处输入图像描述

然后.txt对应于每个图像的每个文件应该如下所示:

<object-class> 0 0 1 1

问题

这对于例如Darknet或其他bounded boxes用于标记类的框架是否可行?

而不是让software例如Darknet将有界框放大到416x416每个类对象,然后我应该这样做并将.txt文件更改x = 0, y = 0, width = 1, height = 1为仅具有one类对象的每个图像。

我有可能以traing set这种方式创建一个并用它训练吗?

标签: tensorflowpytorchyolobounding-boxdarknet

解决方案


一点免责声明我不得不说我不是这方面的专家,我是一个项目的一部分,我们正在使用暗网,所以我有一些时间进行实验。

因此,如果我理解正确,您想使用具有完整图像大小的边界框的裁剪单类图像进行训练。

有可能做到这一点,我正在使用类似的东西,但这很可能不是你想要的。

让我告诉你这个方法产生的问题和意外行为。

当您使用具有完整图像大小边界框的图像进行训练时,yolo 无法进行正确检测,因为在训练时它还会学习数据集的背景和空白空间。更具体地说,您的训练数据集上的对象必须与您的现实生活使用情况相同。如果你用丛林中的狗图像训练它,它就不能很好地预测家里的狗。

如果您只想将它​​与分类一起使用,您仍然可以像这样训练它,它仍然可以很好地分类,但是您要预测的图像也应该像您的训练数据集一样,所以如果您训练这样裁剪的图像,请查看您的示例狗图片您的模型将无法在第一张图片上对狗进行分类。

举个更好的例子,在我的情况下不需要检测。我正在处理食物图像,我只预测盘子上的食物,所以我用全图像大小的 bbox 进行训练,因为每种食物都有一个类。它完美地对食物进行分类,但总是将 bbox 预测为完整图像。

所以我对此的理论部分的理解是,如果你只用完整的图像 bbox 为网络提供信息,它会知道使盒子尽可能大会导致错误率降低,因此它会以这种方式进行优化,这有点浪费一半算法,但它适用于我。

此外,您的图像不需要是 416x416,它可以调整为您给它的任何大小,您也可以从 cfg 文件中更改它。

如果您想快速尝试,我有一个代码可以为目录中的所有图像制作全尺寸的 bbox。(它会覆盖现有的注释,所以要小心)

最后,盒子应该是这样的,这样它们才能以全尺寸居中,x 和 y 是 bbox 的中心,它应该是图像的中心/一半。

<object-class> 0.5 0.5 1 1
from imagepreprocessing.darknet_functions import create_training_data_yolo, auto_annotation_by_random_points
import os

main_dir = "datasets/my_dataset"

# auto annotating all images by their center points (x,y,w,h)
folders = sorted(os.listdir(main_dir))
for index, folder in enumerate(folders):
    auto_annotation_by_random_points(os.path.join(main_dir, folder), index, annotation_points=((0.5,0.5), (0.5,0.5), (1.0,1.0), (1.0,1.0)))

# creating required files
create_training_data_yolo(main_dir)
```

推荐阅读