数据加载: MXNet recordIO#
概述#
此示例演示如何将以 MXNet recordIO 格式存储的数据与 DALI 一起使用。
创建索引#
要使用以 recordIO 格式存储的数据,我们需要使用 readers.mxnet
运算符。除了所有读取器通用的参数(例如 random_shuffle
)之外,此运算符还接受 path
和 index_path
参数
path
是 recordIO 文件路径的列表index_path
是包含索引文件路径的列表(大小为 1)。当您使用 MXNet 的im2rec.py
实用程序时,会自动创建此文件(带有.idx
扩展名);也可以通过使用 DALI 附带的rec2idx
实用程序从 recordIO 文件中获取。
DALI_EXTRA_PATH
环境变量应指向从 DALI extra repository 下载的数据的位置。
重要提示:确保您检出与已安装 DALI 版本对应的正确发布标签。
[1]:
from nvidia.dali.pipeline import Pipeline
import nvidia.dali.fn as fn
import nvidia.dali.types as types
import numpy as np
import os.path
test_data_root = os.environ["DALI_EXTRA_PATH"]
base = os.path.join(test_data_root, "db", "recordio")
batch_size = 16
idx_files = [base + "/train.idx"]
rec_files = [base + "/train.rec"]
定义和运行 Pipeline#
定义一个简单的 pipeline,该 pipeline 接受以 recordIO 格式存储的图像,对其进行解码,并为将其摄取到 DL 框架中做好准备。
图像处理涉及裁剪、归一化和
HWC
->CHW
转换过程。
[2]:
pipe = Pipeline(batch_size=batch_size, num_threads=4, device_id=0)
with pipe:
jpegs, labels = fn.readers.mxnet(path=rec_files, index_path=idx_files)
images = fn.decoders.image(jpegs, device="mixed", output_type=types.RGB)
output = fn.crop_mirror_normalize(
images,
dtype=types.FLOAT,
crop=(224, 224),
mean=[0.0, 0.0, 0.0],
std=[1.0, 1.0, 1.0],
)
pipe.set_outputs(output, labels)
现在让我们构建并运行 pipeline
[3]:
pipe.build()
pipe_out = pipe.run()
要可视化结果,请使用
matplotlib
库,该库期望图像采用HWC
格式,但 pipeline 的输出采用CHW
格式。注意:
CHW
是大多数深度学习框架的首选格式。出于可视化目的,请将图像转置回
HWC
布局。
[4]:
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
%matplotlib inline
def show_images(image_batch):
columns = 4
rows = (batch_size + 1) // (columns)
fig = plt.figure(figsize=(32, (32 // columns) * rows))
gs = gridspec.GridSpec(rows, columns)
for j in range(rows * columns):
plt.subplot(gs[j])
plt.axis("off")
img_chw = image_batch.at(j)
img_hwc = np.transpose(img_chw, (1, 2, 0)) / 255.0
plt.imshow(img_hwc)
[5]:
images, labels = pipe_out
show_images(images.as_cpu())