手语识别及翻译项目实战系列--数据转换 text转为npz格式CSL数据集中的pose-gloss中text 文件一行数据实例-0.01646529 -0.6482327 1.502301 -0.02531151 -0.3631941 1.570885 -0.02312568 0.04488507 1.634066 -0.03375742 -0.08601215 1.62303 -0.1698013 -0.2011915 1.549954 -0.1945323 -0.3977987 1.495995 -0.1950186 -0.5810784 1.407555 -0.1900637 -0.6325662 1.390355 0.1222058 -0.2088086 1.575616 0.1466089 -0.4060238 1.525056 0.162049 -0.582612 1.441606 0.1556938 -0.6228903 1.418582 -0.07448247 -0.6340373 1.46204 -0.09610306 -1.00437 1.446867 -0.1176976 -1.363221 1.457754 -0.1110597 -1.39173 1.339637 0.04221528 -0.6352441 1.479441 0.03347063 -1.007394 1.431241 0.02595523 -1.36769 1.41056 0.03370204 -1.384942 1.28791 -0.0317168 -0.1542985 1.612552 -0.1869177 -0.6876513 1.365173 -0.1652057 -0.6285808 1.371044 0.1484023 -0.6751753 1.395068 0.1230987 -0.6076492 1.428954原来的.txt是 CSL2018 已经提取好的姿态关键点数据不是普通文本语料。我们把它转成.npz主要是为了让 PyTorch 训练更方便、更快、更稳定。原来的 TXT 是什么以这个文件为例P01_01_00_0._body.txt它表示一个手语样本的视频姿态序列。文件名大致可以这样理解P01 第 1 个表演者 / signer 01_00_0 这个类别下的某个样本编号 _body 身体姿态关键点这个.txt里每一行是一帧视频的姿态数据。每一行有75个数字x1 y1 z1 x2 y2 z2 ... x25 y25 z25也就是25 个关键点 × 每个关键点 3 个坐标 75 个数所以一个 TXT 文件本质上是一个三维数组[T, 25, 3]其中T 这个样本的视频帧数 25 每帧有 25 个身体关键点 3 每个关键点的 x、y、z 坐标比如一个文件有 80 行那它就是[80, 25, 3]为什么转成 NPZ.txt是给人看或跨平台保存方便的格式但训练模型时不太适合直接用。转成.npz的原因主要有几个读取更快.txt每次都要一行一行读字符串再把字符串切开、转成浮点数。训练时会反复读很多样本这样很慢。.npz里直接保存的是 NumPy 数组加载后马上就是数值矩阵。数据形状更明确原始 TXT 只是很多数字。转成.npz后我们明确保存为keypoints.shape[T,25,3]训练代码就不用猜每一行怎么拆。和现有 Dataset 代码匹配你现在项目里的CSLIsolatedDataset期望读取的是np.load(path)[keypoints]也就是说.npz里必须有一个叫keypoints的数组。为了接入现有训练代码所以要转成.npz。避免训练时重复预处理如果每次训练都从.txt开始解析会重复消耗时间。现在转换一次以后训练、评估都直接读.npz。更适合深度学习流水线PyTorch 训练需要的是张量.npz比.txt更接近模型需要的输入格式。转换前后关系原始 TXT一行 一帧 一行 75 个数 25 个点 × 3 维坐标 整个文件 一个手语动作样本转换后的 NPZ{keypoints:array([T,25,3],dtypefloat32)}manifest 文件负责告诉训练程序{keypoint_path:keypoints/000/P01_01_00_0_body.npz,label:0,video_id:P01_01_00_0}含义是这个样本的数据文件在哪里 它属于第几个类别 它的视频/样本编号是什么所以可以理解为TXT 是原始姿态序列文本格式 NPZ 是训练用的数值数组缓存格式 manifest 是训练样本索引表核心不是改变数据内容而是把同一份姿态数据整理成模型更容易读取的格式。.npz 文件1. 本质结论.npz 不是 NumPy 专属格式但它是 NumPy 标准的数组存储格式原生设计就是配合 NumPy 使用。底层结构.npz本质是一个zip 压缩包里面每个文件对应一个单独的.npy文件.npy单个数组二进制存储格式NumPy 自定义二进制.npz多个.npy打包压缩的 zip 包2. 谁能读写它① 原生最优NumPyimportnumpyasnp# 保存多个数组np.savez(data.npz,aarr1,barr2)# 读取datanp.load(data.npz)print(data[a],data[b])这是官方标准用法读写最简单、无额外依赖。② 其他 Python 库也能读取只要库支持解析 zip 解析.npy二进制就能打开 npzPyTorch可以先用np.load()读出 numpy 数组再转 tensor无直接 load npz APITensorFlow同理依赖 numpy 中转SciPy完全兼容底层复用 NumPy 的 savez/loadzipfile numpy.lib.format纯底层手动解析不用np.load示例手动拆解 npz证明它是普通zipimportzipfile,numpy.lib.formatasnpyfmtwithzipfile.ZipFile(data.npz)aszf:fornameinzf.namelist():withzf.open(name)asf:arrnpyfmt.read_array(f)③ 非 Python 语言很难直接读C/Matlab/Java 没有原生 npz 解析器需要自己实现.npy二进制解析 zip 解压工业跨语言通用方案一般不用 npz改用hdf5、csv、二进制raw、protobuf3. 关键区分逻辑用途设计初衷就是批量保存多个 NumPy 数组科研、数值计算场景几乎只配合 numpy 使用文件封装底层是通用 zip不是私有加密格式任何能解压 zip 的工具都能打开看到内部.npy数组编码内部单个文件是.npy这是 NumPy 独有的二进制编码别的语言/库不能直接解析裸.npy必须实现对应解码逻辑。4. 总结日常使用场景可以认为它是专门给 NumPy 配套的格式几乎只有做数值计算、操作 ndarray 时才会用到技术底层只是 zip 包裹 NumPy 私有数组文件不是完全封闭专属格式能手动拆解但脱离 NumPy 会非常麻烦。补充对比格式归属适用场景.npyNumPy单个数组.npzNumPy多个数组打包压缩.h5 / .hdf5通用科学存储跨语言、大数据、复杂数据集