YOLO图片是否可以有一个bounded box覆盖整张图片?

Can YOLO pictures have a bounded box that covering the whole picture?

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

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

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

例如。如果我们转到 page 并按 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。此图片看起来像这样:

我的想法是每张图片都应该有oneclass。只有 one class。并且图像应该用这样的相机拍摄。

这张相机快照应该被拍成:

  1. 拍照
  2. 将相机快照剪切成所需大小
  3. 将其放大为正方形 416x416

像这样:

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

<object-class> 0 0 1 1

问题

对于 Darknet 或其他使用 bounded boxes 标记 class 的框架,这是否可行?

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

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

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

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

这是可能的,我正在使用类似的东西,但它很可能不是你想要的。

让我告诉您此方法产生的问题和意外行为。

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

如果你只打算将它与 classification 一起使用,你仍然可以像这样训练它它仍然 classifies 很好但是你要预测的图像也应该像你的训练一样数据集,因此通过查看您的示例,如果您训练像这张裁剪后的狗图片这样的图像,您的模型将无法 class 在第一张图像上验证狗。

举个更好的例子,在我的例子中不需要检测。我正在处理食物图像,我只预测盘子里的食物,所以我用完整图像大小的 bbox 进行训练,因为每种食物都有一个 class。它完美地 class 化了食物,但 bboxes 总是被预测为完整图像。

所以我对这个理论部分的理解是,如果你只给网络提供完整的图像 bbox,它就会知道让盒子尽可能大会导致更少的错误率,所以它会以这种方式进行优化,这很好浪费了一半的算法,但它对我有用。

此外,您的图像不需要是 416x416,它会调整到您指定的任何尺寸,您也可以从 cfg 文件更改它。

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

最终框应该是这样的,以便它们以全尺寸居中,x 和 y 是 bbox 的中心它应该是图像的 center/half。

<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)
```