无法使用mxnet从已分段的清单解析sagemaker recordio

jhkqcmku  于 2021-09-08  发布在  Java
关注(0)|答案(0)|浏览(274)

我正试图通过管道模式在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数据加载器或等效程序中以加速预处理?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题