1. 简介
模型部署时,常常面临模型精度与执行效率之间的权衡。查表(Look-Up Table, LUT)是一种在推理过程中用空间换时间的技巧,尤其适用于非线性映射函数的加速。本文将介绍如何在地平线平台上通过 SegmentLUT 实现一个自定义查表算子,并对它进行量化与导出。
本文以实现一个 DecInt 模块为例,将输入的 12bit 图像数据(值域为 [0, 4095]),通过自定义查找表进行非线性解码,模拟某种数值映射,然后进行归一化处理,最终输出一个 [-1, 1] 范围的结果图像。
查表算子常用于:实现数据非线性幅度调整、进行颜色空间的转换或者对比度的增强等场景。
2. SegmentLUT模块
SegmentLUT 是地平线提供的用于查表操作的模块,具备以下特性:
支持将输入索引映射到查找表指定输出;
支持对 LUT 函数进行量化;
可导出为 HBIR,用于 BPU 编译执行。
3. 构建查找表函数
定义一个将 [0, 4095] 映射到 [0, 16777215] 的函数。这里使用 numpy.interp 插值得到完整 4096 项的查表数组:
通过这种方式,任意输入 [0, 4095] 的整数值,都可以在查表中获得对应的输出结果,实现近似非线性函数。
在这里,重点解释下
借助np.interp函数来完成线性插值工作,进而生成查找表
np.arange(4096)会生成从 0 到 4095 的整数序列,这些整数代表了查找表的索引。
np.interp(...)会在已知的点(x, y)之间进行线性插值,从而计算出每个索引所对应的插值结果。
.astype(np.int32)会把插值得到的浮点数结果转换为 32 位整数,这样做是为了符合查找表对整数的使用需求。
4. 示例运行
示例很简单,主体包括:
为了方便部署,插入量化、反量化节点
调用 SegmentLUT 查表
数据归一化
全部示例代码:
验证运行在BPU上



