我正试图通过管道模式在sagemaker中编写一个定制的对象检测训练算法,并将一个扩展的清单文件(这里的文档)作为输入。
根据文档,sagemaker应该将recordio发送到我的培训工作中:然后我只需通过mxnet解析它,就可以获得我的图像和它们的标签,然后就可以开始我的培训了。
然而,sagemaker发送的recordio格式似乎与mxnet预期的格式有所不同。
作为一个简单的例子,我第一次尝试(可能是天真地)通过 mxnet.recordio.MXRecordIO
对象,然后使用文档化的函数将其解包:
record = mx.recordio.MXRecordIO("/opt/ml/data/training_0")
item = record.read()
header, img = mx.recordio.unpack_img(item)
但是,我遇到了以下错误: ValueError: buffer is smaller than requested size
经过一番混乱之后,我发现读取的记录实际上在清单中的信息和图像的字节之间交替。
为了更清楚,我编写了一个脚本,它可以快速迭代整个流并打印一些信息
record = mxnet.recordio.MXRecordIO(channel_name)
i = 0
while True:
item = record.read()
if item is None:
print("No more records")
break
if i % 2 == 0:
image = mxnet.image.imdecode(item)
print(image.shape)
else:
print(item.decode())
i += 1
它将交替打印一行图像的形状,另一行包含一个包含我所需信息的字典的字符串:
(300, 300, 3)
{"image_size":[{"width":300,"height":300,"depth":3}],"annotations":[{"class_id":2,"left":166,"top":0,"width":108,"height":176}]}
...
然而,这样调用记录似乎有点复杂,如果我想提高吞吐量,我不知道如何通过多个线程来实现这一点
此外,我还收到了警告 Corrupt JPEG data: 58 extraneous bytes before marker 0xd9
我的问题是:
这是我从sagemaker解析recordio的方式吗?
如何将其发送到gluon数据加载器或等效程序中以加速预处理?
暂无答案!
目前还没有任何答案,快来回答吧!