为对象检测创建自定义数据集

数据挖掘 机器学习 深度学习 数据集 美国有线电视新闻网 物体检测
2022-03-05 15:31:54

我目前正在尝试建立一个模型,以在相当受控的环境(冰箱)中识别大约 10 个标签(食品)。我无法找到对我的任务足够好的数据集,所以我正在尝试自己策划一个。

到目前为止,这是我的方法:

  • 使用智能手机拍摄图像
  • 在 LabelImg 中注释
  • 在 Detectron2 / pyTorch 中训练

我有两个问题:

  1. 鉴于所有样本的环境都有些一致,是否有一个大致数字/经验法则可以让每个班级使用相当数量的样本?(100 次训练 / 100 次测试)?这是一个概念验证项目,所以我只是在寻找具有合理准确度的东西(80%+)

  2. 在我捕获了我的图像(比如说通过智能手机)之后,在用作训练数据之前是否有任何必要的预处理步骤(除了注释)?(即调整图像大小,减小文件大小,格式)

绝对感谢任何帮助,当然您认为其他提示/建议可能有用。

2个回答

我已经建立了许多数据集。最新的是一组鸟类物种的数据。我有 100 种鸟类,所以我有 100 个班级。对于每个物种(类),我有 100 个训练图像、5 个测试图像和 5 个验证图像。总共有 11,000 张图像。我构建的分类器在 500 张测试图像(每个物种 5 个测试图像)上的最终准确率为 98% 以下是构建数据集时要考虑的一些事项。1-裁剪数据或不裁剪数据-取决于您通过手机生成的图像,平均感兴趣区域的像素(例如冰箱中的奶瓶)与图像中总像素的比率是多少。当这个比率很高时,你的分类器总是会更好地工作。您希望您的分类器学会将奶瓶识别为一个类。图像中不是奶瓶的任何部分本质上都是噪声。我用来构建高质量数据集的经验法则是 50%。也就是说,平均而言,对于您的数据集,感兴趣区域应占图像中像素的 50%。2- 你应该有多少训练-验证-测试图像?取决于问题,但如果你遵循上面的 50% 规则,我认为你可以构建一个可靠的数据集,每个类大约 100 个图像,每个类 5 个验证图像和每个类 5 个测试图像,所以你需要每个类大约 110 个图像. 3- 图像增强 - 即使图像数量很少,您也可以使用图像增强创建一个好的分类器。这是一种人为地扩展数据集大小的方法。如果您使用 Keras,ImageDataGenerator 提供了几种可用于扩充数据集的转换。文档位于 也就是说,平均而言,对于您的数据集,感兴趣区域应占图像中像素的 50%。2- 你应该有多少训练-验证-测试图像?取决于问题,但如果你遵循上面的 50% 规则,我认为你可以构建一个可靠的数据集,每个类大约 100 个图像,每个类 5 个验证图像和每个类 5 个测试图像,所以你需要每个类大约 110 个图像. 3- 图像增强 - 即使图像数量很少,您也可以使用图像增强创建一个好的分类器。这是一种人为地扩展数据集大小的方法。如果您使用 Keras,ImageDataGenerator 提供了几种可用于扩充数据集的转换。文档位于 也就是说,平均而言,对于您的数据集,感兴趣区域应占图像中像素的 50%。2- 你应该有多少训练-验证-测试图像?取决于问题,但如果你遵循上面的 50% 规则,我认为你可以构建一个可靠的数据集,每个类大约 100 个图像,每个类 5 个验证图像和每个类 5 个测试图像,所以你需要每个类大约 110 个图像. 3- 图像增强 - 即使图像数量很少,您也可以使用图像增强创建一个好的分类器。这是一种人为地扩展数据集大小的方法。如果您使用 Keras,ImageDataGenerator 提供了几种可用于扩充数据集的转换。文档位于 2- 你应该有多少训练-验证-测试图像?取决于问题,但如果你遵循上面的 50% 规则,我认为你可以构建一个可靠的数据集,每个类大约 100 个图像,每个类 5 个验证图像和每个类 5 个测试图像,所以你需要每个类大约 110 个图像. 3- 图像增强 - 即使图像数量很少,您也可以使用图像增强创建一个好的分类器。这是一种人为地扩展数据集大小的方法。如果您使用 Keras,ImageDataGenerator 提供了几种可用于扩充数据集的转换。文档位于 2- 你应该有多少训练-验证-测试图像?取决于问题,但如果你遵循上面的 50% 规则,我认为你可以构建一个可靠的数据集,每个类大约 100 个图像,每个类 5 个验证图像和每个类 5 个测试图像,所以你需要每个类大约 110 个图像. 3- 图像增强 - 即使图像数量很少,您也可以使用图像增强创建一个好的分类器。这是一种人为地扩展数据集大小的方法。如果您使用 Keras,ImageDataGenerator 提供了几种可用于扩充数据集的转换。文档位于 每个类 5 个验证图像和每个类 5 个测试图像,因此每个类总共需要大约 110 个图像。3- 图像增强 - 即使图像数量很少,您也可以使用图像增强创建一个好的分类器。这是一种人为地扩展数据集大小的方法。如果您使用 Keras,ImageDataGenerator 提供了几种可用于扩充数据集的转换。文档位于 每个类 5 个验证图像和每个类 5 个测试图像,因此每个类总共需要大约 110 个图像。3- 图像增强 - 即使图像数量很少,您也可以使用图像增强创建一个好的分类器。这是一种人为地扩展数据集大小的方法。如果您使用 Keras,ImageDataGenerator 提供了几种可用于扩充数据集的转换。文档位于https://keras.io/preprocessing/image/4 图像大小 - CNN 对所有输入图像以固定大小运行。同样,通常图像越大,结果越好(假设使用 50% 规则)。但是,您在计算时间和内存使用方面为大图像付出了代价。我一直使用 224 X 224 X 3(彩色图像)。根据颜色的重要性(即颜色对区分类别的重要性),您可以只使用 224 X 224 X 1 的灰度图像。

5- 避免数据集中的 BIAS - 使其尽可能多样化。在您的数据集中很容易意外地构建一个无意的 BIAS。这是一个例子。一个人创建了一个包含 2 个类的数据集。一组有各种狗的图像。另一组只有狼的图像。他想建立一个分类器,如果给定一张图像,它将把它分类为狗或狼。他建立了他的数据集并训练了分类器,结果很好,99% 的训练准确率和 98% 的验证准确率。这是一个令人惊讶的结果,因为许多狗非常像狼。但是,当呈现狗或狼的随机图像时,准确率基本上是 50%。为什么?好吧,他在他的数据集中建立了一个很大的偏差。狼的 90% 的训练和验证图像有雪的白色背景。由于他没有裁剪图像,因此大部分图像都是白色的。对于狗来说,他的形象大多是不在雪地里的狗。所以 CNN 学到的是“如果背景是白色的,则必须是狼,如果背景不是白色,则必须是狗。因此,请考虑避免在您的数据集中建立无意的偏差。在您的情况下,假设您有一个类番茄酱瓶。现在,如果您只拍摄 HEINZ 番茄酱瓶的图像(标签上可能带有 HEINZ 文字),您的模型将不会知道不是 Heinz 番茄酱瓶的番茄酱瓶。祝你好运,我希望你的任务顺利完成。再来一个事情,你为什么要考虑做手机图片的所有工作?为什么不只是在谷歌搜索感兴趣的项目并下载图片。例如搜索“番茄酱瓶图片”

鉴于所有样本的环境都有些一致,是否有一个大致数字/经验法则可以让每个班级使用相当数量的样本?(100 次训练 / 100 次测试)?这是一个概念验证项目,所以我只是在寻找具有合理准确度的东西(80%+)

这确实因问题而异。达到给定质量阈值所需的观察次数取决于神经网络正确分类它们的难易程度。不幸的是,只有具有您特定领域知识的人才能这么说。我已经看到 CNN 的多分类任务是根据每个类的数百个观察结果完成的。在这种情况下,大量的数据分析将是基础。一个好的经验法则是至少在数千个数量级。但是,数百个obs。每个类+数据增强可能会起作用,我建议您尝试使用较小的数据集,并增加其大小以防它不够。


在我捕获了我的图像(比如说通过智能手机)之后,在用作训练数据之前是否有任何必要的预处理步骤(除了注释)?(即调整图像大小,减小文件大小,格式)

图像大小是最重要的问题。CNN 需要恒定大小(高度、宽度、通道)的输入。卷积层已经可以处理较小图像的零填充。但是,您可以重新调整更大的尺寸。您可以创建一个输入管道来预处理图像数据,然后将其输入 CNN。此管道的主要目的是将图像保持在可接受的大小(很大程度上取决于您的计算能力)。