2020년 4월 30일 목요일

고정밀 LiDAR 스캔 정합 품질 확인하기

이 글은 고정밀 LiDAR 스캔 정합 결과의 품질을 확인하는 과정을 정리한 것이다.

스캔 대상은 한국건설기술연구원 실내 지하 1층부터 지상 5층이다. LiDAR 스캔 장비는 건설 인프라에서 사용하는 고정밀 장비로 Trimble TX8이다. 연구원 장비를 사용해 스캔 및 측량 작업이 수행되었으며, 수행 인원은 3명이었다. 스캔 수행은 담원에서 수고해 주셨다. 이 글에서는 3개 층에 대해 간단한 스캔 정합 품질 검토를 진행하였다. 스캔 용량이 큰 관계로 검토 시간은 2시간 30분 정도 걸렸다.

정합 방식은 Realworks를 이용한 자동 정합 방식을 사용하였다. 자동 정합이므로, 부족한 부분이 있으면 스캔 장면을 추가하기 쉽다. 각 층별 점군 갯수는 2~3억 포인트이다. 파일 용량은 각 층당 약 3GB이다. 파일 포맷은 E57이다.

층당 10에서 15장의 스캔을 수행하였다. 정밀도는 30m에서 11mm 밀도로 설정되었다. 한 스캔 당 4분 소요된다. 그러므로, 순수 스캔 시간에만 4~6시간이 소요된다. 스캔 작업 이동, 측량 및 확인 시간 등을 포함하면, 하루 안에 스캔을 모두 하기에는 어려운 상황이다.
Trimble TX8 Level 2 스캔 파라메터 설정

정확도 검토를 위해 스캔 보다 정확도가 높은 토탈스테이션을 사용해 주요 지점을 측량하였다. 측량 지점은 통계적 처리가 가능한 수준으로 계획해 수행하였다. 측량은 무타겟으로 수행되었고, 타겟은 체커보드를 미리 준비해 부착한 후 스캔 시 장면에 캡쳐되도록 하였다. 이를 통해, 스캔과 측량 결과의 정확도 비교가 가능하다.
스캔 점군 정확도 검증을 위한 토탈 스테이션

실제로는 사람이 없는 주말에 시설물 관리부서의 협조를 받아 하루에 스캔을 수행하였다. 시간 제약으로 인해 각 층별 스캔 장면 개수가 서로 차이가 있어 보인다.

파티션이 많은 환경이고 복도 교차로 부분에서 스캔하고, 각 파티션 안에서는 보안 등의 이유로 스캔하지 않았다. 마찬가지로, 보직자 및 공용 공간이 아닌 곳은 스캔하지 않기로 하였다.

정합 결과 품질 확인
대부분 정합은 큰 문제 없었으나, 부분적으로는 문제가 있는 듯 하다.

쉐도우(shadow) 문제
다음은 2층에서 스캔된 모습이다.

아래 그림에서 객체 트리 구조를 살펴보면, 정합된 스캔 장면 구조가 포함되어 있지 않다. 차후 재정합할 때 원본 파일이 필요하거나 E57파일에 스캔 장면 구조를 포함시켜야 한다. 용량이 커서 각 층별 파일을 로딩하는 데 약 7분 걸린다(MSI INTEL I7. GTX 1070). 이런 로딩 속도를 고려해, 작업 시 개별 스캔 원본 파일도 필요해 보인다.

정합 결과에 이슈가 있는 부분을 살펴보면 다음과 같다.

아래 그림의 하부 쪽 부분은 거의 점군이 없는 공간이 있다.

계단 입구인데, 계단 스캔 시 정합에 문제가 있을 수 있다. 계단부는 보이는 입구와 계단 바닥에 대해 스캔할 필요가 있다.

복도 교차로 부분에 스캔이 덜 되었다. 다른 층들도 유사한 부분이 있다. 

다음은 지하 식당층이다. 전체 스캔 장면은 10개로 보인다.

아래 그림 우측 강당 부분에 스캔이 부족하다. 한점만 스캔되었다.

식당 부이다. 큰 공간만 스캔되었고, 라운트 테이블 뒤쪽은 스캔되지 않았다. 최소 2곳은 스캔되어야 할 것으로 보인다. 쉐도우 현상이 보인다.

노이즈 이슈
아래 부분은 정합이 이상하다. 상부에 동떨어진 점군이 보인다. 유리창을 통해 스캔된 것인지 확인이 필요하다.

아래 그림은 중앙에 찌그러져 보이는 점군이 보인다. 잘못 정합된 노이즈로 보인다. 

다음 그림과 같이 노이즈가 발생된 위치를 확인해 보았다. 해당 위치는 소화전 패널 옆 부분으로 금속재질 부착물로 보인다. 스캔 시 반사재질이 영향을 준 것으로 보인다.

아래 그림에서 사람이 지나가면서 발생한 노이즈가 보인다.

아래는 4층이다. Recap을 사용해 확인해 보았다. Recap으로 파일(약 2억 포인트) 로딩은 20분 정도 걸린다. 로딩된 후에 속도는 빠르다. Recap은 LoD 데이터 파일을 뷰 거리에 따라 미리 생성해 놓고 렌더링하여 CloudCompare보다 관찰하는 속도가 체감상 3-5배 빠르다(다만, CloudCompare나 Realworks에 비해 분석 기능이 떨어진다).

4층은 파티션이 많아, 쉐도우가 많다. 이로 인해, 바닥이 잘 안보인다. 다른 층과 마찬가지로 계단부는 정합 시 이슈가 될 수 있다.

기타 사항
점군 품질은 좋은 편이다. 점군 밀도는 균일한 편이고, 노이즈로 크게 튀는 부분은 없다. 다만, 반사 재질이 있을 경우, 노이즈가 발생하는 경우가 있다. 심한 부분은 노이즈 필터링이 필요하다.

스캔 정합 결과에 대한 몇몇 이슈 부분을 살펴보았다. 
 
차후, 스캔 품질을 좀 더 개선하여, Scan To BIM, 딥러닝 시멘틱 세그먼테이션 등 기술 개발에 활용할 계획이다.

참고 - 실내 딥러닝 모델 테스트
쉐도우가 없는 균일 점균 모델로 학습된 실내 포인트 클라우드 시멘틱 세그먼테이션 모델에 본 점군을 입력해 보았다. 결과는 다음과 같다. 벽체는 제대로 세그먼테이션 되지만, 바닥 등은 제대로 분류되지 않는다. 참고로, 점군 밀도는 원본에서 0.02m 간격으로 resample하였고 입력 데이터 크기는 86MB이다.

2020년 4월 20일 월요일

개방형 플랫폼 보안을 위한 OAuth기반 인증 개발 방법

이 글은 OAuth 기반 웹 서비스 인증 기능 개발 방법을 간단히 다룬다. 최근 건설 분야에서 개방형 플랫폼, 디지털 트윈 플랫폼 등의 요구가 많아지고 있다. 개방형 플랫폼을 개발하기 위해서는 API가 필수적이다. 하지만, 누구나 플랫폼에 접근해 필요한 정보를 얻거나 수정한다면 보안상 큰 문제가 된다. 보안 및 인증 문제를 해결하기 위한 방법이 오픈소스 기반 OAuth를 이용하는 것이다. 이 글은 다음 내용을 포함한다.
  • 구글, 페이스 북 등을 포함한 로그인 기능
  • API 접근 인증을 위한 토큰 획득 및 로그인 기능

이 글은 nodejs의 React, Strapi를 이용해 인증을 구현한다. API 사용 인증이나, 다른 인증 제공자(Facebook, GitHub, Google ...)를 이용한 로그인 방법을 다룬다.

프로젝트 개발
우선 Strapi API를 작성한다.

$ npm install strapi@alpha -g
$ strapi new my-app
$ cd my-app && strapi start
$ npm install create-react-app -g
$ create-react-app good-old-react-authentication-flow

이 결과 다음과 같은 폴더가 만들어진다.
/src
└─── containers // React components associated with a Route
 |    └─── App // The entry point of the application
 |    └─── AuthPage // Component handling all the auth views
 |    └─── ConnectPage // Handles the auth with a custom provider
 |    └─── HomePage // Can be accessed only if the user is logged in
 |    └─── NotFoundPage // 404 Component
 |    └─── PrivateRoute // HoC
 |
└─── components // Dummy components
 |
└─── utils
     └─── auth
     └─── request // Request helper using fetch

인증 뷰를 구현하려면 먼저 사용자가 특정 URL에 액세스 할 수 있는지 확인하는 HoC( Higher Order Component)를 만들어야 한다. 이를 위해, auth.js를 사용한다.

import React from 'react';  
import { Redirect, Route } from 'react-router-dom';

// Utils
import auth from '../../utils/auth';

const PrivateRoute = ({ component: Component, ...rest }) => (  
  <Route {...rest} render={props => (
    auth.getToken() !== null ? (
      <Component {...props} />
    ) : (
      <Redirect to={{
        pathname: 'auth/login',
        state: { from: props.location }
        }}
      />
    ):
  )} />
);

export default PrivateRoute;  

라우팅을 만들어 본다.
import React, { Component } from 'react';  
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';

// Components
import AuthPage from '../../containers/AuthPage';  
import ConnectPage from '../../containers/ConnectPage';  
import HomePage from '../../containers/HomePage';  
import NotFoundPage from '../../containers/NotFoundPage';

// This component ios HoC that prevents the user from accessing a route if he's not logged in
import PrivateRoute from '../../containers/PrivateRoute';

// Design
import './styles.css';

class App extends Component {  
  render() {
    return (
      <Router>
        <div className="App">
          <Switch>
            {/* A user can't go to the HomePage if is not authenticated */}
            <PrivateRoute path="/" component={HomePage} exact />
            <Route path="/auth/:authType/:id?" component={AuthPage} />
            <Route exact path="/connect/:provider" component={ConnectPage} />
            <Route path="" component={NotFoundPage} />
          </Switch>
        </div>
      </Router>
    );
  }
}

export default App;  

이제 인증 뷰를 만든다. 먼저 forms.json 인증보기 양식을 만든다. 이 구조는 다음 JSON과 같다.

{
  "views": {    
    "login": [
      {
        "customBootstrapClass": "col-md-12",
        "label": "Username",
        "name": "identifier",
        "type": "text",
        "placeholder": "johndoe@gmail.com"
      },
      {
        "customBootstrapClass": "col-md-12",
        "label": "Password",
        "name": "password",
        "type": "password"
      },
      {
        "customBootstrapClass": "col-md-6",
        "label": "Remember me",
        "name": "rememberMe",
        "type": "checkbox"
      }
    ]
  },
  "data": {
    "login": {
      "identifier": "",
      "password": "",
      "rememberMe": false
    }
  }
}

auth/login, auth/register는 다음 같은 수명주기를 사용한다.

componentDidMount() {  
  // Generate the form with a function to avoid code duplication
  // in other lifecycles
  this.generateForm(this.props);
}
componentWillReceiveProps(nextProps) {  
  // Since we use the same container for all the auth views we need to update
  // the UI on location change
  if (nextProps.location.match.params.authType !== this.props.location.match.params.authType) {
    this.generateForm(nextProps);
  }
}

양식을 만들려면 forms.json파일에서 검색한 데이터를 매핑하면 된다.
handleChange = ({ target }) => this.setState({ value: { ...this.state.value, [target.name]: target.value } });

render() {  
  const inputs = get(forms, ['views', this.props.match.params.authType, []);

  return (
    <div>
      <form onSubmit={this.handleSubmit}>
        {inputs.map((input, key) => (
          <Input
            autoFocus={key === 0}
            key={input.name}
            name={input.name}
            onChange={this.handleChange}
            type={input.type}
            value={get(this.state.value, [input.name], '')}
          />
        ))}
        <Button type="submit" />
      </form>
    </div>
  );
}

이제 사용자 인증에 필요한 모든 보기를 작성해야 한다.

API 호출을 수행하려면 request 헬퍼를 사용한다.

handleSubmit = (e) => {  
  e.preventDefault();
  const body = this.state.value;
  const requestURL = 'http://localhost:1337/auth/local';

  request(requestURL, { method: 'POST', body: this.state.value})
    .then((response) => {
      auth.setToken(response.jwt, body.rememberMe);
      auth.setUserInfo(response.user, body.rememberMe);
      this.redirectUser();
    }).catch((err) => {
      console.log(err);
    });
}

redirectUser = () => {  
  this.props.history.push('/');
}

API에서 응답을 받으면 필요한 정보를 localStorageor 에 저장하고 사용자를 HomePage로 리디렉션한다.

인증 공급자 사용
사용자가 Facebook, GitHub 또는 Google을 선택하더라도 Strapi를 사용하여 사용자를 인증하는 것은 쉽다. 이 예에서는 Facebook을 사용하는 방법을 보여준다.

흐름은 다음과 같다.

  1. 사용자는 Facebook으로 로그인을 클릭한다
  2. 앱을 승인 할 수 있도록 다른 페이지로 리디렉션한다.
  3. 승인되면 Facebook은 URL의 코드를 사용하여 사용자를 앱으로 리디렉션한다.

componentDidMount에서 ConnectPage컨테이너 응답에 따라 API를 호출하고 사용자를 리디렉션한다.

componentDidMount() {  
  const { match: {params: { provider }}, location: { search } } = this.props;
  const requestURL = `http://localhost:1337/auth/${provider}/callback${search}`;

 request(requestURL, { method: 'GET' })
   .then((response) => {
      auth.setToken(response.jwt, true);
      auth.setUserInfo(response.user, true);
      this.redirectUser('/');
   }).catch(err => {
      console.log(err.response.payload)
      this.redirectUser('/auth/login');
   });
}

redirectUser = (path) => {  
  this.props.history.push(path);
}

SocialLink 컴포넌트 구현은 다음과 같다.

/**
*
* SocialLink
*
*/

import React from 'react';  
import PropTypes from 'prop-types';

import Button from '../../components/Button'

function SocialLink({ provider }) {  
  return (
    <a href={`http://localhost:1337/connect/${provider}`} className="link">
      <Button type="button" social={provider}>
        <i className={`fab fa-${provider}`} />
        {provider}
      </Button>
    </a>
  );
}

SocialLink.propTypes = {  
  provider: PropTypes.string.isRequired,
};

export default SocialLink;  

이제 AuthPage를 추가한다.
render() {  
  const providers = ['facebook', 'github', 'google', 'twitter']; // To remove a provider from the list just delete it from this array...

  return (
     <div>
       {providers.map(provider => <SocialLink provider={provider} key={provider} />)}
       {/* Some other code */}
     </div>
  );
}

결과는 다음과 같다.
레퍼런스


오픈소스 Grafana 기반 공간정보지도 데쉬보드 개발 방법

이 글은 오픈소스 Grafana 기반 공간정보지도 데쉬보드 개발 방법에 대한 간단한 소개이다. 최근 IoT 등 센서 데이터, 박데이터 분석 결과를 효과적으로 보여주는 데쉬보드의 활용도가 높아지고 있다. 예를 들어, 텍스트 정보를 시각적으로 보여주려면 데쉬보드를 이용해야 한다.

그라파나는 유명한 오픈소스 기반 데쉬보드이며, 쉽게 다양한 패널을 플러그인할 수 있다. 다음은 그라파나를 이용한 다양한 형태의 패널 플러그인을 보여준다.


그라파나를 설치하고, 실행하는 자세한 방법은 레퍼런스를 참고한다.

레퍼런스

2020년 4월 18일 토요일

저렴한 ROS 온라인 강좌 소개

이 글은 괜찬은 ROS(Robot Operating System) 튜토리얼을 소개하는 글이다. 보통 ROS를 제일 먼저 접할 때 ROS Tutorials를 따라한다. 하지만, 딱딱하고 친절하지는 않다. 이 글은 로봇 운영 시스템을 쉽게 접하고 따라할 때 좋은 사이트를 소개한다.

ROS Course (YouTube)
Youtube로 제공하는 ROS코스이다. ROS.org에서 새로운 ROS 온라인 코스(Old version)를 개발하였고, 이 안에 포함되어 있는 컨텐츠이다. 이 코스는 ROS 핸드북과 함께 보면 효과적이다.

Robotics Back-End
ROBITICS Back-End 사이트에서 제공하는 ROS tutorials은 쉽게 이 기술을 따라할 수 있도록 만들어져 있다.


Robotigniteacademy.com
이 사이트에서 제공하는 ROS 코스는 동영상과 시뮬레이션을 함께 사용해 효과적인 교육을 돕는다. 이 사이트는 The Contruct for ROS에서 제공한다.

Deft 공대 ROS 온라인 코스
델프트 공대에서 제공하는 온라인 코스이다. 명문대인 만큼 쉽고 충실하게 내용을 설명하고 있다.

Udemy
다양한 온라인 강좌를 제공하는 Udemy의 ROS 코스이다.

Robocademy
로보카데미는 로봇에 관한 다양한 도구, 코딩 및 기술을 온라인으로 제공한다.

얼마전 ROS 실습 교육 요청이 있었다. 하지만, 대면접촉 어려운 이 시기 교육 일정을 잡는 데 쉽지가 않았다. 이런 온라인 사이트를 잘 활용한다면 지금 같이 코로나 바이러스로 인해 대규모 대면 강의가 불가능할 경우 효과적인 학습이 될 것이라 생각한다. 

기타, 온라인 코스는 이 소개 링크를 참고바란다.


추신 - 요즘 바이러스로 집에서 애들보고, 일하고, 가족과 잠깐 산책하고 이렇게 루프에 갇혀 있다. 회사일은 별게로 바쁘게 돌아가고, 집안일은 개학이 늦어져 일이 많아져 간다. 언제나 정상화되려나... 

2020년 4월 8일 수요일

Sony HDR-CX450 캠코더 스트리밍 방법

요즘 코로나 바이러스로 인해 유튜브 온라인 강의 및 방송 필요성이 늘어나고 있다. 이 글은 Sony 캠코더 스트리밍 레퍼런스를 소개한다.

2020년 4월 3일 금요일

파이썬 pdb 디버깅 명령 요약

이 글은 파이썬 디버깅 명령을 요약한 것이다.

PDB 디버거 사용 방법
파이썬을 설치하면, pdb 란 디버거가 함께 설치된다. 이를 이용해 코드 실행 순서를 디버깅할 수 있다.
l: 주변 소스코드 출력
ll: 모든 소스코드 출력
n: 다음 문장으로 이동.
s: ‘Step Into’로 함수 내부 들어감.
c: 다음줄부터 중단점을 만날때까지 코드를 실행. 중단점이 없다면 끝까지 실행.
r: 현재 함수의 return이 나올때까지 실행.
w: 함수의 call stack을 보여줌.
cl: 모든 중단점들을 삭제.unt(il) [lineno]: line no까지 실행
b [lineno | function]: 특정파일이나 패키지의 줄번호나 함수명으로 중단점을 만듬. 예) b 20
a: 현재 함수의 매개변수들을 출력
p: 변수값 확인
pp: 변수값 확인
!변수명=값: 변수에 값 재설정
q: quit
h: 도움말
restart: 디버그 재시작함
다음과 같이 실행하면 된다. 주로 사용하는 명령은 b, c, n, l, p, pp, ll, restart 이다.
python -m pdb train.py

사용 예시
디버깅을 GUI로 하려면 다음 프로그램을 설치해 사용해 본다.
Debug in PyCharm

참고 -  파이참 임포트 에러
PyCharm 사용시 import 에러가 발생하면, 몇 가지 원인이 있다. 다음 같은 방법을 사용한다. 
1. 직접 터미널에서 PyCharm.sh를 실행한다.
2. 다음과 같이 경로를 추가한다.
import os
print(os.environ['PATH'])  # 경로 확인
PATH environment variable를 Run/Debug Configuration에 설정한다.

2020년 4월 2일 목요일

우분투 apt-get update Packages 404 Not Found 에러 해결 방법

우분투 apt-get update 명령 시 다음과 같은 Packages 404 Not Found (403) 에러가 발생하는 경우가 있다.

apt-get update Err:10 http://archive.ubuntu.com/ubuntu xenial/main arm64 Packages   404  Not Found gen cpu

오래된 패키지에 대한 지원은 old-release로 이동되어 있을 수 있다. 이 경우, 다음과 같이 처리해 본다.
sudo sed -i -re 's/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo apt-get update && sudo apt-get dist-upgrade
sudo do-release-upgrade

2020년 4월 1일 수요일

무료 딥러닝 이미지 및 점군 데이터 라벨링 도구 소개 및 사용방법

이 글은 무료 이미지 및 점군 데이터 라벨링(labeling) 도구를 소개한다. 딥러닝에 필요한 데이터를 라벨링하는 작업은 노가다다.

개요
라벨링은 딥러닝 모델에 입력되는 데이터에 대한 출력이 무엇인지를 정의하는 것을 말한다. 예를 들어, 이미지에서 고양이를 분류한다면, 입력 이미지에서 출력 고양이 경계를 그리고 'cat'이라고 클래스 이름을 붙이는 것을 라벨링 작업이라 한다.

다음은 라벨링 작업이 무엇인지 잘 보여준다.
라벨링 도구 사용 사례

이 작업은 학습용 데이터를 준비하는 수많은 과정 중 하나이다. 다음 순서도는 다른 관련 단계들을 보여준다.
일반적으로 하나의 사진 이미지에 여러 객체를 라벨링하는 작업은 하나의 경계 박스 클릭에 1~2초 정도 걸린다. 한 장당 평균 2~4개의 경계박스를 선택해야 할 경우, 400장이라면, 대략 40분이 걸린다. 이 경우, 라벨링 속도는 10장/분이고, 6초당 1장을 라벨링하는 수준이다. 딥러닝을 위해서는 수천장의 데이터가 필요하므로, 3000장을 준비하려면 약 8시간 정도 시간이 필요하다.

이 경우에도 경계박스가 작은 경우이고, 한장에 많은 객체가 포함되어 있으면 그와 비례해서 많은 시간이 소요될 수 있다. 2차원 이미지에 비해 3차원 점군은 훨씬 더 많은 작업 시간이 필요하다.

라벨링 후에는 딥러닝 모델에 맞는 학습용 데이터 형식으로 변환되어야 한다. 이 부분은 다음 링크를 참고한다.
참고로 여기에서 소개되는 라벨링 도구는 주로 잘 사용하는 것만 공유한 것이다. 나머지 도구는 아래 링크를 참고하길 바란다.
이미지 데이터 라벨링
이미지 라벨링은 크게 각 클래스에 대한 경계박스, 폴리곤을 이용한 세그먼테이션 등으로 구분할 수 있다.

가장 편하게 사용할 수 있는 도구는 BBox Label Tool이다. 이 도구는 다음과 같이 라벨과 경계박스를 입력해 그 결과를 텍스트파일로 저장할 수 있다. 
경계 박스 라벨링(BBox Label Tool)

설치가 가장 간단한 도구로 다음 명령을 통해 쉽게 실행할 수 있다.
BBox_Label_Tool은 메뉴가 간단해 사용이 매우 쉽다. 자세한 사용 방법은 다음 링크를 참고한다.
LabelMe는 경계 박스 뿐 아니라, 폴리곤 등 세그먼테이션을 위한 라벨링까지 가능하다. 설치가 간단하고, 작업방식도 어렵지 않다. png, bmp 등을 지원한다.
폴리곤 이용한 세그먼테이션 라벨링(LabelMe)

Labelbox는 웹사이트에서 실행되고, 경계 박스, 폴리곤 등 라벨링이 가능하다. 다만, 이미지 저작권 체크 및 과금이 존재한다.
Labelbox

Scalabel는 경계박스, 폴리곤 라벨링이 가능하며, 반자동식 폴리곤 라벨링도 지원한다.
기타 다음과 같은 라벨링 도구가 있다.
포인트 클라우드 데이터 라벨링
점군 입력 자료를 만들기 위해서는 3차원 점들을 그룹화할 수 있는 라벨링 도구를 이용해야 한다. 라벨링도구를 이용해 딥러닝 학습을 하면, 뭉쳐져 있는 점군에서 객체를 자동으로 인식할 수 있다. 물론, 알고리즘적으로도 가능하나, 점군 기반 딥러닝 기법(다음 링크 참고)은 이보다 더 정교하고 신뢰성있으며 성능 좋은 방법으로 진화되고 있다. 
여기서는 Semantic Segmentation Editor 를 간단히 소개한다. 다음과 같이 설치하고, 실행해 본다.
  • meteor npm install
  • meteor npm start
  • run http://localhost:3000

실행 후에는 private/samples 폴더 아래에 있는 이미지나 점군을 다음과 같이 라벨링할 수 있다.
Semantic Segmentation Editor

JSON VOC file format
점군 라벨링 도구는 다음 링크를 참고한다.
참고 - 점군 라벨링 준비 과정
라벨링을 위해 준비한 점군은 S건물 지하이며, 점군 LoD를 낮추어 180만 포인트 수준으로 처리했다. 처리에 사용된 소프트웨어는 Realworks와 Cloudcompare이다. 

파일 포맷은 PTS이며, 데이터 구조 XYZRGBI로 다음과 같다. 이제 이 점군을 앞서 소개한 라벨링 도구를 이용해 작업한다. 
-8.14260960 3.62140012 56.08124161 200 163 144 1694.000000 
-8.13253975 3.60634995 56.08150864 194 164 136 1678.000000 
-8.12275028 3.59173012 56.08126068 197 168 136 1614.000000 

실제 라벨링에는 매우 많은 노력이 들어간다. 이는 이미지 데이터 라벨링에 비할바가 아니다. 라벨링을 위해서는 객체 클래스에 대한 정확한 이해가 필요하며, 이후, 검수과정도 있어야 한다.

레퍼런스
기타 관련 내용은 아래 링크를 참고한다.