3.3.1 准备lmdb数据集
我们需要将原始量化数据集转换成lmdb格式,供后续校准量化工具Quantization-tools 使用。
Quantization-tools对数据格式的要求:
Quantization-tools 对输入数据的格式要求是 [N,C,H,W] :即先按照 W 存放数据,再按照 H 存放 数据,依次类推
Quantization-tools 对输入数据的 C 维度的存放顺序与原始框架保持一致:例如 caffe 框架要求的 C 维度存放顺序是 BGR;tensorflow 要求的 C 维度存放顺序是 RGB
将数据转换成 lmdb 数据集有两种方法:
使用 auto_cali一键量化工具 工具,将图片目录转化为lmdb供分步量化使用;
运用U-FrameWork接口,在网络推理过程中或编写脚本将网络推理输入抓取存成lmdb,方法请参考 create_lmdb。与LMDB相关的功能已经独立成为ufwio包,该安装包不再依赖Sophgo的SDK,可以在任何Python3.5及以上环境下运行。
在U-FrameWork中,网络的输入数据使用LMDB形式保存,作为data layer的数据来源。对于一般简单的情况,只需将量化输入图片进行解码和格式转换就可以了, 推荐在制作LMDB过程中即进行减均值除方差等操作,lmdb中保存前处理后的数据。而对于前处理不能精确表达的复杂处理, 或者在级联网络中需要把中间结果作为下一级网络的输入进行训练的情况,用户可以自己开发预处理脚本,直接生成lmdb。
3.3.1.1 LMDB API组成
lmdb = ufwio.LMDB_Dataset(path, queuesize=100, mapsize=20e6) # 建立一个 LMDBDataset对象,
put(data, labels=None, keys=None) # 存储图片和标签信息
close()
with Blocks
3.3.1.2 LMDB API使用方式
import ufwio
txn = ufwio.LMDB_Dataset(‘to/your/path’)
txn.put(images) # 放置在循环中
在pytorch和tensorflow中,images通常是xxx.Tensor,可以使用images.numpy(),将其转化为numpy.array格式
txn.close()
3.3.1.3 示例代码
使用对象方法存储数据
使用with语法来管理存储过程
读取lmdb数据
命令行查看lmdb内容
注意事项:
此功能不会检查给定路径下是否已有文件,如果之前存在LMDB文件,该文件会被覆盖。
使用重复的key会导致数据覆盖或污染,使用非递增的key会导致写入性能下降。
解析该LMDB的时候需要使用Data layer。
BMNNSDK工具包中也包含了创建lmdb的示例程序: 示例2:create_lmdb_demo ,位于bmnnsdk/examples/calibration/create_lmdb_demo
。此示例程序可以直接作为工具使用也可以在其基础上修改加入自定义的预处理。
如何使用生成的lmdb在 使用lmdb数据集 中描述,配合其中描述的前处理为量化期间的推理准备好数据。
最后更新于