2022년 2월 12일 토요일

PDAL 기반 3차원 포인트 클라우드 데이터 처리 파이프라인

PDAL 소개

PDAL은 Ponit Data Abstraction Library의 약자로, C++로 개발된 3차원 점군 처리 라이브러리(BSD 라이센스)이다. PDAL은 3차원 포인트 클라우드를 다루는 대부분의 어플리케이션에 사용될 수 있으며, 유명한 공간정보 오픈소스 플랫폼의 하위 컴포넌트를 구성한다. 
PDAL 활용 사례(Eric, 2018)

PDAL은 래스터 이미지 데이터 처리에 특화된 GDAL과 유사한 사용법을 가진다. 

PDAL은 명령행 배치처리를 제공해, 점군 처리, 필터링, 변환, 질의 등을 실행할 수 있다. 예를 들어, 아래와 같이 유닉스의 파이프라인 데이터 처리 구조를 지원한다. 
data2 = input data1
data3 = filter data2
result = output data3

이 라이브러리는 전형적인 파이프라인 구조로 설계되었다. 파이프라인을 통해, 각 단계(Stage)는 배치처리 자동화될 수 있다. 

수많은 대용량 입력 데이터 파일들에 대한 배치처리 자동화 처리를 위해, 각 단계는 아래와 같이 추상화된 공통 인터페이스를 설계해 놓았다.
Stage Preparation
   addArgs(ProgramArgs)
   initialize()
   addDimensions(PointLayoutPtr layout)
   prepared(PointTableRef)

Stage Execution
   ready(PointTablePtr)
   run(PointViewPtr)
   done(PointTablePtr)

Streaming Stage Execution
   processOne(PointRef)

여기서, Dimensions는 포인트 치수, PointLayout은 포인트 치수 구조(이름, 유형), PointTable은 포인트 값 테이블, PointView는 포인트의 레퍼런스 값이다.

PDAL은 파이썬에서도 활용가능하다. 상세 설명은 아래 링크를 참고한다.
PDAL을 손쉽게 사용하는 방법 중 하나는 아나콘다를 이용하는 것이다. 아나콘다는 패키지 관리 시스템으로 특히 파이썬 개발 시 필요한 패키지 설치 및 관리를 쉽게 해 준다. 

PDAL 설치
아래 링크를 참고해 아나콘다를 설치한다.
콘다 설치 후 아래 명령으로 PDAL 패키지를 추가한다. 상세 내용은 여기를 참고한다.
conda create --yes --name myenv --channel conda-forge pdal
conda update pdal

PDAL 예제
pdal은 명령행 배치 프로세스를 지원한다. shell 명령을 이용하면, 3차원 점군 데이터 처리를 자동화할 수 있는 스크립트를 개발할 수 있다.

다음은 LAS 포맷 요약 정보를 출력한 후, 파일을 변환하고,  명령 예이다. 
pdal info myfile.las
pdal translate input.las output.las
pdal pipeline --stdin < pipeline.json

for f in *.pcd; do pcl_convert_pcd_ascii_binary $f ./ascii/$f 0; done
for f in *.pcd; do pdal translate ./$f $f.las; done

여기서 pipeline은 shell 명령과 같이, 다중 입력 파일에 대한 pdal 명령 처리를 지원한다. 
파이프라인 예시

예를 들어, 다음은 file1, file2를 laz파일로 변환하는 파이프라인 예시이다.
{
    "pipeline" : [
        {
            "tag" : "las1",
            "type" : "readers.las"
        },
        {
            "tag" : "las2",
            "type" : "readers.las"
        },
        "placeholder.laz"
    ]
}

pdal pipeline translate.json --writers.las.filename=output.laz --stage.las1.filename=file1.las --stage.las2.filename=file2.las

다음은 las 파일을 DTM tiff 파일로 변환하는 예시이다. las를 입력받고, 좌표변환을 한 후, tiff 파일로 변환한다. 
pdal pipeline las_to_tiff.json

las_to_tiff.json 파일 정의는 다음과 같다. 
{
  "pipeline": [
    "/home/ktw/Projects/pcd_pl/dbscan/1.pcd.las",
    {
      "type":"filters.transformation",
      "matrix":"0  0  -1  0  1  0  0  0  0  0  1  0  0  0  0  1"
    },
    {
      "type":"writers.las",
      "filename":"/home/ktw/Projects/pcd_pl/dbscan/transformed.las"
    },      
    {
      "filename":"/home/ktw/Projects/pcd_pl/dbscan/dtm.tif",
      "gdaldriver":"GTiff",
      "output_type":"all",
      "resolution":"0.2",
      "type": "writers.gdal"
    }        
  ]
}

결과는 다음과 같다.

PDAL 기능
PDAL은 다음같은 기능을 지원한다.
  • chamfer: 두 점군 간에 Chamfer 거리 계산
  • delta: 점군에서 가장 가까운 점 리턴
  • density: 점군에서 삼각화된 레이어 생성
  • eval: 두 점군 간 classification 치수 계산
  • ground: 점군에서 지반 세그먼트 계산 및 출력
  • hausdorff: 두 점군간 Hausdorff 거리를 계산함
  • info: 점군 통계 정보 등 기본정보 출력
  • merge: 여러 점군들 병합
  • pipeline: 배치 처리 프로세스 지원
  • random: 랜덤 점군 생성
  • sort: 점군 정렬
  • split: 단일 점군에서 그리드 기반 다중 점군 생성
  • tile: 단일 점군에서 정규 격자 기반 점군 생성
  • tindex: 점군의 공간 인덱스 파일 생성
  • translate: 필터, 파이프라인 등을 이용한 점군 데이터 변환. 필터는 Create, Order, Move, Cull, New, Join, Metadata, Mesh 등을 지원.
PDAL의 모든 점 데이터는 치수(Dimensions) 집합으로 저장된다. 이를 이용해, 다양한 필터링을 수행할 수 있다.
포인트에 대한 PDAL 치수 집합

PDAL 데이터는 8비트부터 64비트 실수형 포인트까지 다룰 수 있다.
파이썬과 연결해 다음과 같이 기능을 확장 및 사용할 수있다.
json = """
[
    "1.2-with-color.las",
    {
        "type": "filters.sort",
        "dimension": "X"
    }
]
"""

import pdal
pipeline = pdal.Pipeline(json)
count = pipeline.execute()
arrays = pipeline.arrays
metadata = pipeline.metadata
log = pipeline.log

PDAL은 확장 가능하고 재활용이 쉬운 구조로 되어 있어, 많은 프로젝트에서 활용되고 있다.
PDAL 활용 사례 중 일부(DBSCAN based feature extraction, Batran, 2021. 항공뷰 래스터화 후 특징 추출)

레퍼런스
좀 더 자세한 내용은 아래 링크를 참고한다.

댓글 없음:

댓글 쓰기