tensorflow - YOLO图片可以有一个覆盖整个图片的有界框吗?
问题描述
我想知道为什么YOLO图片需要有边界框。假设我们正在使用Darknet
. 每个图像都需要有一个与.txt
图像文件同名的对应文件。.txt
它需要在文件中。对于所有bounded boxes
用于标记的 YOLO 框架都是一样的。
<object-class> <x> <y> <width> <height>
其中x
、y
、width
和height
是相对于图像的宽度和高度的。
例如。如果我们转到此页面并按下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
上课。并且图像应该用这样的相机拍摄。
此相机快照应视为:
- 拍照
- 将相机卡扣剪成想要的大小
- 将其放大为正方形
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
这种方式创建一个并用它训练吗?
解决方案
一点免责声明我不得不说我不是这方面的专家,我是一个项目的一部分,我们正在使用暗网,所以我有一些时间进行实验。
因此,如果我理解正确,您想使用具有完整图像大小的边界框的裁剪单类图像进行训练。
有可能做到这一点,我正在使用类似的东西,但这很可能不是你想要的。
让我告诉你这个方法产生的问题和意外行为。
当您使用具有完整图像大小边界框的图像进行训练时,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)
```
推荐阅读
- javascript - 尝试使用 Dropzone.js 将多个文件上传到 Amazon S3 时,只有最后一个文件被上传到 AWS S3
- html - 如何将每个循环值放入 django 中的单独 div
- promise - discord.js .msg.channel.send().then 承诺不工作
- python - 有没有办法让列表处理和 np.array 一样快?
- javascript - 从单独的 Vue JS 前端使用 Hapi JS API。request.payload 未定义
- jquery - 为什么我的移动汉堡不起作用?如何解决问题?
- python - 为什么 smtplib 不适用于所有电子邮件服务?
- azure - 无法通过 REST 操作关闭 Azure 安全中心中的警报。不支持的资源操作
- android - 如何在 Android Jetpack Compose 中更改布局子项的绘制顺序?
- python - 如何对日本语料库数据进行主题建模