我了解到,您通常不希望将图像存储在数据库中。相反,您要做的是存储有关图像的元数据(所有者,创建日期,大小,文件格式等)以及图像的链接(S3位置或本地文件系统上图像的路径)。如果需要恢复映像,则可以在数据库中查找路径,然后从对象存储或本地文件系统中读取它。
该用例似乎是为系统仅需要按每个请求读取一些图像(例如,获取属于用户网页的一些图像)的情况设计的。
我的情况有些不同。我正在聚集大量标记图像,以训练各种机器学习算法的数据。对于每张图片,表格中都会有一行,其中包含有关该图片的来源,其大小以及与该图片相关联的标签的信息(即,一张图片可能具有以下标签:[“ car”,“ vehicle”, “轿车”,“本田”,“公民”,“蓝色”,“ 2002”],另一个可能只有[“车辆”,“卡车”],另一个可能只有[“人类”,“行人”,“女人” ])。
我的目标是使数据结构化,以便我可以根据不同的标签分组随意地从此表中训练数据集。因此,我可以说“收集所有带有标签“动物”的图像,并基于标签“狗”,“猫”,“马”进行分组(如果存在这些标签之一)。现在,从我的训练数据列表中,我将图像分为三类,可以从中训练CNN分类器。
问题来自于我可以拥有数百万个图像的事实,因此,如果运行上述查询以获取所有带有“动物”标签的图像,则需要运行SQL查询以查找具有该图像的所有图像。标签,那么我将需要对S3或本地文件系统进行数百万次RPC调用,以实际获取所需的图像数据。如果我实际上将图像存储在数据库中,则图像将直接来自查询本身。
因此,作为一个普遍的问题,为机器学习存储和索引大量图像及其元数据的最佳方法是什么?一方面,我们可以简单地将大量图像分组为ZIP文件,然后将zip文件存储在某个对象存储中。这很方便,因为我只需要一个句柄和RPC调用即可将所有训练数据存储到我正在执行ML训练序列的任何服务器上,但这会导致我无法完全了解训练数据。另一方面,我可以将所有索引的数据存储在一个大型SQL表中,其中包括图像数据。这使我可以最大程度地查看我的数据,但成本高昂,并且不方便将图像实际获取到需要图像数据执行训练序列的服务器上。
答案 0 :(得分:0)
为进行培训,我假设您只是想顺序读取所有内容,因此我将所有内容(包括图像)放入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..............
.
.
.