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],dtype=float32)}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. 谁能读写它?
① 原生最优:NumPy
importnumpyasnp# 保存多个数组np.savez("data.npz",a=arr1,b=arr2)# 读取data=np.load("data.npz")print(data["a"],data["b"])这是官方标准用法,读写最简单、无额外依赖。
② 其他 Python 库也能读取
只要库支持解析 zip + 解析.npy二进制,就能打开 npz:
- PyTorch:可以先用
np.load()读出 numpy 数组,再转 tensor;无直接 load npz API - TensorFlow:同理,依赖 numpy 中转
- SciPy:完全兼容,底层复用 NumPy 的 savez/load
- zipfile + numpy.lib.format:纯底层手动解析(不用
np.load)
示例手动拆解 npz(证明它是普通zip):
importzipfile,numpy.lib.formatasnpyfmtwithzipfile.ZipFile("data.npz")aszf:fornameinzf.namelist():withzf.open(name)asf:arr=npyfmt.read_array(f)③ 非 Python 语言很难直接读
C++/Matlab/Java 没有原生 npz 解析器:
- 需要自己实现
.npy二进制解析 + zip 解压 - 工业跨语言通用方案一般不用 npz,改用:hdf5、csv、二进制raw、protobuf
3. 关键区分
- 逻辑用途:设计初衷就是批量保存多个 NumPy 数组,科研、数值计算场景几乎只配合 numpy 使用;
- 文件封装:底层是通用 zip,不是私有加密格式,任何能解压 zip 的工具都能打开看到内部
.npy; - 数组编码:内部单个文件是
.npy,这是 NumPy 独有的二进制编码,别的语言/库不能直接解析裸.npy,必须实现对应解码逻辑。
4. 总结
- 日常使用场景:可以认为它是专门给 NumPy 配套的格式,几乎只有做数值计算、操作 ndarray 时才会用到;
- 技术底层:只是 zip 包裹 NumPy 私有数组文件,不是完全封闭专属格式,能手动拆解,但脱离 NumPy 会非常麻烦。
补充对比
| 格式 | 归属 | 适用场景 |
|---|---|---|
| .npy | NumPy | 单个数组 |
| .npz | NumPy | 多个数组打包压缩 |
| .h5 / .hdf5 | 通用科学存储 | 跨语言、大数据、复杂数据集 |