首页 > 解决方案 > 为机器学习存储/索引/管理大量图像训练数据的最佳方式?

问题描述

我了解您通常不想将图像存储在数据库中。相反,您要做的是存储有关图像的元数据(所有者、创建日期、大小、文件格式等)和指向图像的链接(S3 位置或本地文件系统上图像的路径)。如果您需要恢复映像,则可以在数据库中查找路径并从对象存储或本地文件系统中读取它。

这个用例似乎是为系统需要在每个请求中读取一些图像的情况设计的,例如,获取一些属于用户网页的图像。

我的情况有点不同。我正在聚合大量标记图像,用于各种机器学习算法的训练数据。对于每个图像,表格中将有一行包含有关图像来源、大小以及与该图像关联的标签的信息(即,一个图像可能具有标签:["car", "vehicle", “轿车”、“本田”、“思域”、“蓝色”、“2002”],另一个可能只有 [“车辆”、“卡车”],另一个可能有 [“人类”、“行人”、“女人” ])。

我的目标是以这样一种方式构建数据,以便我可以根据不同的标签分组任意地从该表中制作我认为合适的数据集。所以我可以说“收集所有带有标签“动物”的图像,并根据标签“狗”、“猫”、“马”进行分组”(如果其中一个标签存在的话)。现在,从我的训练数据平面列表中,我将图像分为三类,我可以从中训练 CNN 分类器。

问题在于我可以拥有数百万张图像,因此如果我运行上述查询以获取所有带有“动物”标签的图像,我将需要运行 SQL 查询来查找所有带有该标签的图像,然后我需要对 S3 或本地文件系统进行数百万次 RPC 调用才能真正获得我需要的图像数据。如果我真的将图像保存在数据库中,图像将直接来自查询本身。

那么,作为一个普遍的问题,为机器学习存储和索引大量图像及其元数据的最佳方式是什么?一方面,我们可以简单地将大量图像分组到 ZIP 文件中,并将 zip 文件存储在某个对象存储中。这很方便,因为我只需要一个句柄和 RPC 调用即可将所有训练数据获取到我正在执行 ML 训练序列的任何服务器上,但这会导致我失去对训练数据的任何细粒度可见性。另一方面,我可以将所有索引数据存储在一些大型 SQL 表中,包括图像数据。这使我可以最大限度地了解我的数据,但成本高昂,并且不方便将图像实际获取到需要图像数据来执行训练序列的服务器上。

标签: databaseimagemachine-learningtraining-data

解决方案


对于培训,我假设您只想按顺序读取所有内容,因此我会将所有内容(包括图像)放在 SQL 数据库中或仅放在一个文件中,该文件在奇数行中包含元数据,在偶数行中包含图像(二进制)。喜欢

0|meta: Car,blue,Mercedes....
1|001010100010101011111111111111000010101000..............
2|meta: motorcycle,red,yamaha.....
3|010110101010101010110101011010101010101010..............    
.
.
.

当您无法一次读取整个文件并且您想知道上次训练在哪一行停止时,您还应该在每一行包含一个索引 (0|...,1|....)。

实际需要将单词转换为数字以进行真正的训练:

0|meta: 0,101,1001....
1|001010100010101011111111111111000010101000..............
2|meta: 2,102,1002.....
3|010110101010101010110101011010101010101010..............    
.
.
.

推荐阅读