0%

使用laszip压缩激光点云数据

LAS是一种用于交换和存储激光点云数据的二进制数据格式。该格式由美国摄影测量与遥感学会(ASPRS)设计,在2003年发布了最初版本。该格式已经成为激光数据的事实标准。然而,LAS格式没有对数据进行任何压缩,所以文件大小通常都很大。

rapidlasso Gmbh.公司设计了LASzip,用于对LAS文件进行压缩,显著减小文件体积,压缩后的文件体积通常只有LAS文件的7%到20%。LASzip所使用的压缩算法不包含任何专利限制,软件使用LGPL license,易于集成,成为了LAS文件压缩的标准方法。

随着激光雷达设备在遥感,个人娱乐终端,自动驾驶等领域的应用,激光点云数据集数据量不断激增。在过去十年,激光点云压缩成为了产业界的研发热点。针对AR/VR娱乐领域,MPEG在2020年初推出了V-PCC和G-PCC两种压缩标准(链接)。谷歌针对点云网络传输的需求,推出了Draco。在自动驾驶领域,多篇学术文章探讨了针对车载激光雷达特点的点云压缩算法(Yu Feng et al. 2020)。在遥感和地图领域,LAS的互交换性得到广泛的认可,在多种GIS软件和地图服务器中兼容性好,并且具有较高的压缩率,因此适用于在高精地图和众包地图应用中使用。

LASzip简介

在介绍LASzip之前,先了解一下LAS点云文件。
LAS文件目前共有v1.0到v1.4数个版本,本文以最新的v1.4版本为例,LAS文件由文件头和数据记录组成,并且包含可选的可变长度记录(VLR)和扩展可变长度记录(EVLR)。

  • 文件头: 文件头包含文件版本,文件头长度等必要元信息;
  • 数据记录:文件标准要求统一使用小端顺序存储LAS数据记录。v1.4一共支持11种点数据格式,包含点云数据格式0 ~ 11。
  • VLR:在文件头之后可以包含可选的VLR数据,VLR数据包含参考坐标系信息,元信息,额外数据定义,或者其他用户自定义的信息。所有VLR的长度不超过65535字节。
  • EVLR:EVLR与VLR存储内容类似,但是允许存储更长的额外信息,并且附加在数据记录之后。
    关于LAS文件格式的更多信息,可以参考LAS 1.4的标准文件

LASzip文件格式

LASzip对于LAS文件头,VLR,EVLR不进行任何压缩,直接拷贝这些字段;只对数据记录段进行压缩。v1.4版本LAS文件与之前版本相比增加了多种点云数据格式,也就是类型6到类型10。针对v1.4版本LAS标准变化,LASzip也在听取了诸多开源社区建议之后,对v1.4版本LAS文件的压缩做出了相应改进。对于类型0-5的类型,文件格式和压缩方法与v1.0到v1.3版本的LAS压缩方法一致,不再叙述。使用类型6到10的点格式,v1.4版本的LAS文件使用最新的LASzip软件压缩后,.laz文件的典型结构如下:

  1. LAS文件头
  2. VLRs + LASzip VLR
  3. n个数据块(chunk)
    1. 块1
    2. 块2
    3. 块3

      块n
  4. 数据块表(块开始地址和点数量)
  5. EVLRs
  6. LASindex EVLR(用于未来实现更快的空间索引和查询)
  7. LASlayers EVLR(用于在文件中原地编辑点的分类和标识位)

数据块结构如下:

  1. 原始点
  2. 数量和字节数
    • 剩余点数
    • 每个层的字节数
  3. 数据记录层
    • 扫描通道、点来源变化、 GPS时间变化、扫描角度变化、返回计数、XY 层
    • Z 层
    • 分类层
    • 标志位层
    • 强度层
    • 扫描角度层
    • 用户数据层
    • 点来源ID层
      可选的:
    • RGB层
    • NIR层
    • 波形包层
    • 额外字节层
      与v1.0到v1.3版本的LAS文件压缩之后的格式相比,v1.4版本的.laz文件有两个主要变化:
  4. 数据块的大小可变;
  5. 每个数据块里按照不同字段分层编码。

LASzip压缩算法

LAS v1.4定义了0 - 10共11种点的类型,其中0-5型继承自v1.0 - v1.3版本,6-10型为v1.4新增类型。LASzip压缩器将不同点格式视作几种“成分”的组合。0-5型点格式由POINT10, GPSTIME10, RGB12, WAVEPACKET13和BYTE五种成分的不同组合表示。详见下表:
类型0-5的组成
6至10型的点由不同成分组成的“数据层”的组合表示。类型6至10的组成详见下表:
LAS v1.4类型6-10点

对每种数据LASzip设计了不同的压缩器。由不同成分组成的不同类型点可以复用这些压缩器,实现模块化复用。在每个数据块的开始,LASzip存储了第一个点的原始数据,并且初始化编码器。该点的数据用来作为后续预测的初值,之后每个点的数值全部依次进行编码。
LASzip采用了基于自适应的基于上下文的算术编码器对数值进行差分编码。对于每种不同的成分,采用不同策略进行压缩,追求最高的压缩率。详情可以参考文献。

LASzip压缩测试

测试数据准备

测试数据来自于众包地图构建中生成的一些道路点云数据集。数据集格式是二进制编码的pcd文件,在后续测试中,pcd格式文件的大小也是压缩率的基准。在本次测试中,一共准备了8组测试数据。

测试方法

  • 压缩倍率测试:
    1. 使用LASzip和zip对pcd文件进行编码,分别记录编码后文件的大小。
    2. 重复步骤1,多次测量,分别记录不同编码算法编码前后文件大小。
    3. 计算原始pcd文件大小之和,编码之后.laz文件大小之和,编码之后.zip文件大小之和。
    4. 根据公式“压缩倍率 = 原始文件大小 / 压缩后文件大小”计算多种编码方法的平均压缩率。
  • 编码速度测试:
    1. 使用PDAL库的writers.las模块测试.las、.laz文件的编码速度。
    2. 重复步骤1,对每一个数据pcd文件进行编码,记录所用时间。
    3. 根据公式“编码速度 = 模型点数/编码耗时”计算平均编码速度。
  • 解码速度测试:
    1. 对编码速度测试中生成的.las、.laz文件使用PDAL进行解码。
    2. 重复步骤1,对每一个文件解码,并计算总时间。
    3. 根据公式“解码速度 = 模型点数/解码耗时”计算平均解码速度。

测试结论

本文对LASzip的压缩性能进行了一些测试,下表对LASzip压缩测试结果进行了总结。

项目 PCD LAS LASzip GZIP
平均压缩倍率(源文件大小/压缩后文件大小) 1.0 0.42 4.61 1.52
编码+输出文件速度(万点/秒) - 21.3 17.8 -
解码速度(万点/秒) - - 51.8 -
点云存储效率 0.900 2.119 0.195 -
LICENSE BSD LGPL LGPL zlib license
LIBRARY PCL PDAL Libels Laszip Pylaz zlib

根据表格中的结果,可以得到以下结论:

  1. LASzip压缩算法的压缩倍率确实远高于通用压缩算法。
  2. LASzip编解码器的速度很快,可以满足自动驾驶的实时性要求。

LASzip项目集成

总的来说,LASzip具有压缩倍率高,无损,编解码速度快,受到业界广泛支持等优点,特别适用于高精地图和众包地图业务。在众包地图业务中,已经集成了LASzip作为点云存储格式。目前,比较流行的LASzip编解码库主要是LASzip,lazperf, 和PDAL。下面对这三种库进行比较。

  • LASzip:LASzip是rapidlasso Gmbh.官方出品的LASzip参考实现,使用c编码,对LASzip压缩算法的支持是最全面和可靠的,软件无专利限制,采用LGPL License,易于集成。
  • lazperf:lazperf是开源组织Hobu实现的LASzip替代编解码库。该库的实现采用C++编码,面向对象模式开发,更加直观简洁,据称在某些情况下性能更好。不过该库只能支持1.3之前版本的LASzip编解码,并且已经不再维护了。
  • PDAL:PDAL是主要由Hobu维护的一个点云数据抽象层库,采用LGPL授权,功能更加全面,远不止LASzip编解码功能,定位类似于适量和标量地图领域的GDAL。PDAL支持多种主流点云格式的编解码,点云的滤波等处理。PDAL对LASzip的支持也是通过封装LASzip库实现。相比c实现的LASzip库,功能更加全面,接口更加简洁。
    以上三个库都可以用于编解码LASzip,下表对他们的特性进行了一个总结。
LASzip Lazperf PDAL
License LGPL LGPL LGPL
支持LASzip v1.4
语言 c c++ c++
编码
解码
复杂功能
依赖其他第三方软件
是否符合车规