为 TensorFlow 构建数据集

Build a dataset for TensorFlow

我有大量代表车辆的 JPG。我想为 TensorFlow 创建一个分类数据集,这样每个车辆图像都描述侧面、角度或屋顶,即我想创建九个图像子集(正面、背面、驾驶员侧面、驾驶员前角、驾驶员后角,乘客侧,乘客前角,乘客后角,车顶)。目前每个JPG的文件名都描述了所需的点。

如何将这个集合变成 TensorFlow 可以轻松操作的数据集?另外,我是否应该 运行 裁剪 JPG 以仅提取车辆部分的程序?我如何使用 TensorFlow 做到这一点?

对于没有提供这个问题的细节和示例,我提前表示歉意,但我真的不知道如何才能找到这个问题的切入点。我正在学习的所有教程都假设已经创建了一个可以使用的数据集。

好的,我会尽力回答这个问题,但是生成和预处理用于 ML 算法的数据是费力的,而且通常很昂贵(因此重复使用众所周知的数据集测试算法设计)。

先解决几个简单的问题:

should I run a procedure which crop the JPG to extract only the vehicle portion?

没有。这是没有必要的。神经网络会将图像中的相关信息从不相关的信息中分类出来,拥有多样化的图像集将有助于构建一个强大的 classifier。此外,您以后可能会通过调整图像大小让自己的生活变得更加困难(有关更多信息,请参见下面的 1. 点)。

How could I do that using TensorFlow?

你不会。 Tensorflow 旨在构建和测试 ML 模型,并且没有用于预处理数据的工具。 (也许 TensorFlow Extended 可以,但这不是必需的)

现在是关于如何从所述文件创建数据集的粗略指南:

1) 需要 做的第一件事是将 .jpg 图像加载到 python 并调整大小他们都是一样的。神经网络在每个训练示例中都需要相同数量的输入(在这种情况下为像素),因此具有不同大小的图像将不起作用。

  • 有一个很好的答案详细说明了如何在堆栈溢出 时使用 python 图像库 (PIL) 加载图像。
  • PIL 图像实例(上例中列表 loadedImages 的元素)然后可以使用 data = np.asarray(image) 转换为 numpy 数组,tensorflow 可以使用它。
  • 除了构建一组数据的 numpy 数组外,您还需要为该数据构建第二个 numpy 标签数组。一种典型的编码方法是将其作为一个 numpy 数组,其长度与您的图像数量相同,每个点的整数值表示该图像所属的 class(0-8 表示您的 9 class)。您可以手动输入这些,但这将是劳动密集型的,我建议使用 python 字符串内置 find 方法在文件名中定位关键字以自动确定它们的 class。这可以在

    内完成
    for image in imagesList:
    

    上面link的循环,因为image应该是一个包含图像文件名的字符串。

    • 正如我上面提到的,有必要调整图像大小以确保它们完全相同。您可以使用 numpy 执行此操作,在转换为 numpy 之前使用 indexing to choose a subsection of each image array, or using PIL's resize 函数。这里没有正确的答案,并且为此目的使用了许多方法来调整图像大小,从填充到拉伸再到裁剪。

那么这里的最终结果应该是 2 个 numpy 数组。具有形状 [w,h,3,n] 的图像数据之一,其中 w=图像宽度,h=图像高度,3 = 三个 RGB 层(假设图像是彩色的)和 n = 您拥有的图像数量。与这些图像关联的第二个标签,形状为 [n,],其中长度 n 数组的每个元素都是 0-8 的整数,指定其 class。

此时最好使用 numpy.save() 以这种格式保存数据集,这样您就不必再次执行此过程。

2) 一旦你有了这种格式的图像,tensorflow 就会有一个名为 tf.Dataset 的 class,你可以将图像和标签数据加载到其中如上所述,并允许您从中随机播放和采样数据。

我希望这对您有所帮助,很抱歉没有解决此问题的快速解决方案(至少我不知道)。祝你好运。