2022년 11월 25일 금요일

node.js 가상환경설정 도구 nodeenv

node.js 프로젝트를 개발하다보면, 너무 다양한 node, npm 버전과 패키지들간 충돌 문제로 골치 아픈 경우가 많다. 이 때 virtualenv처럼 특정 폴더 안에서는 특정 패키지 버전과 디펜던시만 사용할 수 있도록 관리하는 것이 편하다. 

nodeenv는 Eugene Kalinin이 개발한 도구로, 노드 JS, 패키지 개발 버전을 특정 폴더 내에서 격리해서, 프로젝트 패키지 버전을 관리한다. 

nodeenv 개발자 Github 페이지

설치는 다음과 같다.

sudo apt-get install nodeenv

가상환경 생성은 다음과 같다.
nodeenv env

다음과 같이, 가상환경을 활성화하거나 비활성화할 수 있다.
. env/bin/activate
node -v
npm -v
deactivate_node

특정 노드와 npm을 설치할 경우, 다음처럼 입력하면 된다.
nodeenv --without-ssl --node=0.4.3 --npm=0.3.17 --with-npm --jobs=4 env-4.3

레퍼런스

  • https://github.com/ekalinin/nodeenv
  • https://howtoinstall.co/en/nodeenv

편리하고 강력한 온라인 코딩 통합개발환경 코드샌드박스 이야기

이 글은 강력한 온라인 코딩 통합 개발 환경 코드샌드박스를 간략히 소개한다. 참고로 이와 유사한 도구로 Replit (2016) 이 있다.

머리말
코드샌드박스는 2017년 전직 페이스북 개발자 Ives van Hoorne, 산업 디자이너 Bas Buursma에 의해 네델란드에서 설립된 회사이다. 협업을 통해 누구나 아이디어를 쉽게 공유하고 배포하는 것이 미션이다. 

CodeSandBox 는 온라인 상에서 코딩, 개발을 지원하는 IDE(Integrated development environment) 도구와 개발 전주기를 지원한다. 샌드박스란 말 그대로, 편하게 프로젝트를 개발하고 실험할 때 편리한 코딩 환경을 제공한다. 자바스크립트, 웹 등 다양한 프로젝트 개발 시 사용되며, 라이브러리 버전 관리, 온라인 협업, 프로젝트 템플릿, 테스트, 배포 등 편리한 기능을 제공한다.

특징 및 기능
코드샌드박스는 React, Vue, Remix와 같은 유명한 자바스크립트 노드 프레임웍을 샌드박스 형식으로 제공한다. 프로젝트 생성 시 다음과 같이 템플릿을 선택하면, 선택된 버전과 패키지들이 도커와 비슷하게 이미지로 샌드박스에 설치된다. 이런 특징은 패키지 버전 관리를 용이하게 한다.  

사용 순서는 일반적으로 vscode와 같이 통합개발환경도구와 유사한 방식을 가진다. 회원가입하고, 프로젝트를 생성하고, 코딩하고, 테스트한 후 배포한다. 
프로젝트가 생성되면, 다음과 같이 코딩을 하거나, 샌드박스에 등록된 오픈소스를 가져다 수정해 개발할 수 있다.

샌드박스 내에서 모든 개발 주기를 제공하기 때문에, 별도의 서버 필요없이, 프로젝트를 배포하고 서비스를 제공할 수 있다. 그러므로, 복잡한 개발환경과 패키지 설치가 필요없이, 신속한 개발이 가능하다.

다음은 코드샌드박스의 대표적 기능이다.
  • codeSandBox에는 CLI 가 제공된다. 이를 통해, 작업 중인 프로젝트를 로컬 혹은 샌드박스로 업로드가 가능하다. 
  • GitHub와 통합되어 있다. 프로젝트 파일 교환이 가능하다.
  • 라이브세션을 통해, 실시간 협업이 지원된다. 
  • vscode와 통합된다. 
  • 코딩 시 트릭, 자동 생성을 지원한다.
  • 서버에서 개발하는 것과 동일하게 컨테이너 샌드박스를 지원한다.
  • 테스트와 배포를 지원한다.
다음 영상은 코드샌드박스를 이용한 간단한 ToDo list 앱 개발 방법을 보여준다.

코드샌드박스의 프론트엔드와 마이크로서비스는 오픈소스로 개발되고 있다. 기능을 개선하기 위해 약 100명 이상의 전세계 프로그래머가 기여하고 있다. 

마무리
코드샌드박스는 매우 인상적인 온라인 프로그램 개발 도구이다. 젊은 CEO의 비전과 재능은 많은 사람들이 이 프로젝트에 관심을 두게 했다. 코드샌드박스에서 매달 250만명 이상(2020년 기준)이 플랫폼 상의 1,000만개 이상 프로젝트에서 협업하고 있다. 샌드박스를 통해, 디자이너는 신속한 UI 피드백을 제공하고, 제품 관리자는 요구사항 스펙을 관리할 수 있으며, 마케팅 담당자는 세일즈에 바로 활용할 수 있다.

레퍼런스

2022년 11월 24일 목요일

최신 딥러닝 기반 3차원 스캔 데이터, 포인트 클라우드 학습, 3D 세그먼테이션 연구 논문 조사 분석

이 글은 최신 딥러닝 기반 3차원 스캔 데이터, 포인트 클라우드 학습, 세그먼테이션 논문 분석 내용을 요약한다. 이 분야는 무인 자율차, 로보틱스 비전 등 관련 분야에서 필수적인 기술을 연구한다. 분석을 위해, Papers with code에 올라온 레퍼런스를 참고하였다. 

참고로, 이 사이트는 페이스북 Meta AI Research에서 운영하는 머신러닝 최신 논문, 코드, 데이터셋을 업데이트하는 가장 유명한 사이트이다. 
페이스북 메타 인공지능 연구소에서 운영하는 Papers with code

기술 조사 분석 준비
Papers with code에서 3D segmentation 로 등록된 논문 리스트를 검색한다.
최신 논문 연구 트랜드(Papers with code)

영향력 높은 논문 조사
관련 모든 연구를 조사, 분석한다는 것은 불가능하다. 그러므로, 다음과 같이 영향력을 정의해, 이에 근거한 방법으로 논문을 조사한다. 철저히 코드로 제대로 구현된 연구만을 조사 대상으로 한다.

Research Impact = {dataset, benchmarking, performance, github impact}

다음은 공개된 3차원 데이터셋에서 가장 성능이 좋은 베스트 모델을 표시한것이다.

데이터셋마다 mAcc, mIoU 등 성능 지표가 가장 뛰어난 모델을 확인한다. 

이 중 코드가 있고, 영향력이 높은 연구 논문들을 선정한다. 참고로, 이 연구는 3년 내로 제한한다. 이전 PointNet, PointNet++ 등 기술 분석은 여기를 참고한다.
  1. Point Transformer. https://paperswithcode.com/paper/point-transformer-1
  2. KPConv: Flexible and Deformable Convolution for Point Clouds. https://paperswithcode.com/paper/kpconv-flexible-and-deformable-convolution
  3. PCT: Point cloud transformer. https://paperswithcode.com/paper/pct-point-cloud-transformer
  4. PointCutMix: Regularization Strategy for Point Cloud Classification. https://paperswithcode.com/paper/pointcutmix-regularization-strategy-for-point
  5. Walk in the Cloud: Learning Curves for Point Clouds Shape Analysis. https://paperswithcode.com/paper/walk-in-the-cloud-learning-curves-for-point
  6. PointMixer: MLP-Mixer for Point Cloud Understanding. https://paperswithcode.com/paper/pointmixer-mlp-mixer-for-point-cloud
  7. Point-PlaneNet: Plane kernel based convolutional neural network for point clouds analysis. https://paperswithcode.com/paper/point-planenet-plane-kernel-based
  8. Dense-Resolution Network for Point Cloud Classification and Segmentation. https://paperswithcode.com/paper/dense-resolution-network-for-point-cloud 
  9. FG-Net: Fast Large-Scale LiDAR Point Clouds Understanding Network Leveraging Correlated Feature Mining and Geometric-Aware Modelling. https://paperswithcode.com/paper/fg-net-fast-large-scale-lidar-point
  10. RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds. https://paperswithcode.com/paper/191111236
  11. Cylinder3D: An Effective 3D Framework for Driving-scene LiDAR Semantic Segmentation. https://paperswithcode.com/paper/cylinder3d-an-effective-3d-framework-for
  12. Multi-scale Interaction for Real-time LiDAR Data Segmentation on an Embedded Platform. https://paperswithcode.com/paper/multi-scale-interaction-for-real-time-lidar
  13. Automatic labelling of urban point clouds using data fusion. https://paperswithcode.com/paper/automatic-labelling-of-urban-point-clouds

연구 핵심 아이디어, 기술 조사 및 분석
선정된 논문을 다음과 같이 분석한다.

Point Transformer. https://paperswithcode.com/paper/point-transformer-1
홍콩대에서 개발. 공간 데이터 특징을 캡쳐할 수 있는 Self-attention 네트웍 특징을 3차원 포인트 클라우드 처리에 적용. S3DIS데이터셋에 적용 후 mIoU 70.4% 획득.  

Point Transformer는 셀프 주의 네트웍을 구성하는 위치 인코딩, MLP, softmax를 사용함.


이를 다음과 같이 residual point transformer 로 중첩하고, U-Net을 적용한 Transition Down, Up을 통해, 포인트를 세그먼테이션하고, pooling, MLP를 통해 객체 분류함. 위치 인코딩은 delta = theta(Pi - Pj) 식으로 정의됨. 각 층은 [N, N/4, N/16, N/64, N/256]으로 축소되고, 특징 텐서는 증가되도록 설계됨(N=입력 포인트수).


테스트 결과는 다음과 같음. 이 결과는 실내 3차원 스캔 데이터셋만 적용된 한계가 있음. 

코드는 파이토치로 구현됨.

KPConv: Flexible and Deformable Convolution for Point Clouds. https://paperswithcode.com/paper/kpconv-flexible-and-deformable-convolution
Kernel Point Convolution 기술 제안. 커널 포인트의 유클리드 거리를 사용해 특징 추출. 

좋은 성능을 가지며, 테스트 결과 ModelNet40에서 mIoU 86.4를 가짐.

PCT: Point cloud transformer. https://paperswithcode.com/paper/pct-point-cloud-transformer
Benchmarking Robustness of 3D Point Cloud Recognition Against Common Corruptions. https://paperswithcode.com/paper/benchmarking-robustness-of-3d-point-cloud
앞에서 설명한 논문과 같은 attention을 사용함. 관련 초기 논문으로 테스트 데이터셋 부족. 구조는 Point Transformer와 유사하며 다음과 같음. 영향력 낮음.


PointCutMix: Regularization Strategy for Point Cloud Classification. https://paperswithcode.com/paper/pointcutmix-regularization-strategy-for-point
소규모 데이터셋에서만 테스트됨.

Walk in the Cloud: Learning Curves for Point Clouds Shape Analysis. https://paperswithcode.com/paper/walk-in-the-cloud-learning-curves-for-point
포인트의 커브를 탐지하는 커브넷을 정의하고, 이를 통해, 분류 적용. 테스트 소규모.


PointMixer: MLP-Mixer for Point Cloud Understanding. https://paperswithcode.com/paper/pointmixer-mlp-mixer-for-point-cloud
이 연구는 최근 CNN, 트랜스포머 기술 적용된 세그먼테이션 방식에서, 다른 접근을 취함. 3차원 스캔 데이터셋은 사진 이미지와는 다르게, 본질적으로 분산, 정렬되지 않음, 비규칙성 등의 한계로 MLP를 직접 사용할 수 없음. 이 논문은 토큰 혼합 MLP(token-mixing MLP)와 softmax를 사용한 PointMixer 제안. 


Point-PlaneNet: Plane kernel based convolutional neural network for point clouds analysis. https://paperswithcode.com/paper/point-planenet-plane-kernel-based
스캔 데이터셋에서 평면을 학습할 수있는 PlaneConv제안. 

다음은 그 결과임.


Dense-Resolution Network for Point Cloud Classification and Segmentation. https://paperswithcode.com/paper/dense-resolution-network-for-point-cloud 
다양한 해상도 스캔 데이터셋을 학습할 수 있는 Dense resolution network(DRNet)을 제안.


FG-Net: Fast Large-Scale LiDAR Point Clouds Understanding Network Leveraging Correlated Feature Mining and Geometric-Aware Modelling. https://paperswithcode.com/paper/fg-net-fast-large-scale-lidar-point
빠른 대용량 스캔 라이다 데이터셋 모델 학습 FG-Net 기술 제안.  

 이 모델 개발 순서는 같음. 

  1. 스캔 데이터에서 밀도 낮은 노이즈 및 아웃라이어 제거
  2. 포인트 지역 특징 캡쳐하는 FG-Conv 정의.  포인트 상관 특정 추출기 PFM, 형상 컨볼루션 모델 GCM, 어텐션 수집 AG로 구성됨. 
  3. 특징 피라미트 잔차 계층 구조 적용. ResNet, Encoder-decoder 기반 구조 설계.  

 디자인된 구조는 다음과 같음.

테스트 결과는 mIoU 70.8임. 상세 성능은 다음과 같음.

 GTX 1080 GPU with 8 GB memory. The sampling methods include Random Sampling (RS), Reinforcement Learning based Sampling (RLS) [48], GSS [46], IDS, Farthest Point Sampling (FPS), and Generative Network (GS) [49]

테스트에 사용된 데이터셋은 다음과 같음.

다음은 테스트 결과 일부임. 이 연구는 코드 개발에 KPConv(Flexible and Deformable Convolution for Point Clouds) 등을 사용함. 코드 빌드 및 사용은 다소 불편함.


RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds. https://paperswithcode.com/paper/191111236
이 기술은 스캔 데이터 지역 특징 수집을 위한, 지역 특징 수집기를 램덤 샘플링을 이용해 처리. 이를 통해, 대용량 스캔 데이터 처리 지원. 


입력 포인트는 (N, 3+d) 텐서 모양. 지역 공간 인코딩 LocSE를 통해, 특징 수집 후 Attentive Pooling 수행해 데이터 특징 일반화해 분류함. 확산 잔자 블럭을 사용해 ResNet과 같이 기울기 소멸 문제 해결하고, Encoding-decoding 구조로 세그먼테이션함.

RTX 2080 에서 SemanticKITTI 8번 데이터셋 평가에 전체 185초 소요됨. mIoU는 77.4임. 결과는 다음과 같음. 


Cylinder3D: An Effective 3D Framework for Driving-scene LiDAR Semantic Segmentation. https://paperswithcode.com/paper/cylinder3d-an-effective-3d-framework-for
스캔 데이터 분산을 격자를 사용하지 않고, 실린더를 사용해 성능을 높임.

Multi-scale Interaction for Real-time LiDAR Data Segmentation on an Embedded Platform. https://paperswithcode.com/paper/multi-scale-interaction-for-real-time-lidar
임베디드 보드에서도 초당 24 스캔 데이터 처리 가능한 기술 제안. 많은 딥러닝 모델이 실제 데이터에서 성능과 정확도 문제가 있었음. 이런 문제 해결을 시도함.


Automatic labelling of urban point clouds using data fusion. https://paperswithcode.com/paper/automatic-labelling-of-urban-point-clouds
이 논문은 라벨링하는 방법을 region-growing 알고리즘 등을 이용해 자동화하는 기술을 제안함. 기술적 내용은 비전 분야에 알려진 알고리즘 사용.
마무리
지금까지 딥러닝 최신 기술을 조사해 분석하였다. 13개 연구를 조사해 본 결과 이중 유의미한 결과는 가지는 기술은 몇개로 추려진다. 개발된 코드에 대한 품질과 사용성은 논문을 통해 알수는 없다. 이는 딥러닝 학습 가능한 개발 환경에서 직접 소스 설치, 빌드 후 테스트해야 하는 것으로, 좀 더 정확한 분석에는 더 많은 시간이 필요하다.

레퍼런스

파이썬, OSGeo, QGIS를 이용한 SHP 레이어 생성 프로그램 개발, 속성 테이블 추가 및 엑셀 파일 생성하기

이 글은 파이썬, OSGeo, QGIS를 이용한 SHP 레이어 생성 프로그램 개발, 속성 테이블 추가 및 엑셀 파일 생성하는 방법을 간략히 보여준다.

공간정보 데이터를 분석하다보면, 가끔, 텍스트 같은 다른 데이터소스에 저장된 폴리곤 데이터를 SHP파일로 변환하고, 피처 속성 테이블을 생성한 후 엑셀로 출력하고 싶을 때가 있다. 이 글은 관련 개발 방법을 요약한다. 

개발 환경 준비
이 글의 내용을 따라하기 위해서는 다음과 같은 개발환경을 준비해야 한다. 
  • Ubuntu 리눅스, windows 개발환경
  • QGIS 설치
  • Python 및 사용 패키지 설치: pip install numpy, geopandas, osgeo
참고로, OSGEO는 공간정보 오픈소스 데이터 표준화, 라이브러리 및 개발 도구를 개발하는 전세계 민간 오픈소스 조직이다. 
OSGEO 소개(참고) 및 오픈소스 아키텍처

폴리곤 입력 데이터 준비
폴리곤 입력 데이터 input 은 다음과 같이 저장되어 있다고 가정한다. 

input = [[폴리곤 (x, y) 좌표들], [폴리곤 (x, y) 좌표들], ...]
예. [[(x, y), (x,y), ...], [(x, y), (x,y), ...], [...]]

이 데이터가 어떤 좌표계로 저장되어 있는 지 미리 알고 있어야 한다.

데이터 로딩 및 폴리곤 객체 생성
GIS 공간정보 데이터구조는 매우 다양하다. 폴리곤은 연결링 라인 자료 구조를 이용한다. 여기서는 관련 자료구조를 생성하기 위해 OSGEO 패키지를 사용한다. 상세 설명은 여기를 참고한다. 
OSGEO 패키지로 생성한 shape 형상들

다음과 같이, osgeo 패키지 등을 이용해, LinearRing 데이터 구조를 입력으로 부터 생성한다. 
import numpy as np
import geopandas as gpd
import osgeo.ogr as ogr
from osgeo import gdal, osr

def create_polygon(input):
shapes = []
for xy in input:
# 연결링 구조 라인 객체 생성
# 참고. 
line_string = ogr.Geometry(ogr.wkbLinearRing)
for p in xy:
    line_string.AddPoint(p[0], p[1])    
shapes.append(line_string)

    return shapes

SHP파일 출력
앞에서 LinearRing 자료구조로 정의된 폴리곤을  shp파일로 출력한다. 이를 위해 다음 과정을 실행해야 한다. 
  1. ESRI shp 파일 생성
  2. 좌표계 프로젝션 정의
  3. 레이어 생성
  4. shp 속성 필드 정의
  5. 레이어에 폴리곤 feature(형상) 객체 생성 및 추가
이를 구현하면 다음과 같다.

def save_shp(out_fname, shapes, projection_EPSG_ID = 25832):
    try:
        # shp 파일 생성
        driver = ogr.GetDriverByName("ESRI Shapefile")    # 드라이버 정의
        dataset_out = driver.CreateDataSource(out_fname)

        ref = osr.SpatialReference()
        ref.ImportFromEPSG(int(projection_EPSG_ID))

        # 레이어 생성
        layer = dataset_out.CreateLayer("data", ref, ogr.wkbPolygon)

        # shp 필드 정의 
        id_field = ogr.FieldDefn("id", ogr.OFTInteger)
        layer.CreateField(id_field)

        # 레이어에 피쳐 추가
        featureDefn = layer.GetLayerDefn()
        for index, s in enumerate(shapes):
            poly = ogr.Geometry(ogr.wkbPolygon) 
            poly.AddGeometry(s)

            feature = ogr.Feature(featureDefn)
            feature.SetGeometry(poly)
            feature.SetField("id", index)
            layer.CreateFeature(feature)

            feature = None
        dataset_out = None
    
    except BaseException as err:
        print(err)    

전체 처리 흐름은 다음과 같다.
def read_file():
input = []
# todo 
return input

def main():
input = read_file()
shapes = create_polygon(input)
save_shp('./output.shp', shapes)

전체 소스 코드는 다음 github 링크에서 다운로드할 수 있다.

QGIS 에서 속성 테이블 자동계산 및 추가 
생성된 output.shp 파일은 사용자가 생성한 피쳐들이 포함되어 있다. 여기서, 일부 속성 정보를 자동계산, 생성한다. 

shp 파일을 qgis 에 추가하면, 레이어가 생성된다. qgis 레이어 패널에서 레이어 선택 후 컨텍스트 메뉴의 Open Attribute Table 메뉴를 선택한다.
다이얼로그에서 Open field calculator (Ctrl+I) 메뉴를 선택한다.

Field calculator 다이얼로그에서 Output field name은 area, field type은 Decimal number (real) 을 선택하고, Search field에서 Geometry > $area 필드를 더블클릭한다. 그리고 OK 버튼을 클릭한다. 

참고로, 이외에, 필드에 대한 통계값, 배열 조작 연산, 색상 연산자, 컨디션, 데이터 유형 변환, 퍼지 함수, 기하 함수, 수학 등 매우 다양한 연산자를 이용해 해당 필드 값을 계산하는 프로그래밍이 가능하다.
필드 계산 프로그래밍 기능

다음과 같이 속성 테이블에 면적(area) 필드가 자동계산되어 생성된다. 만약, 해당 컬럼이 NULL로 출력된다면, 앞서 정의한 좌표계 프로젝션 유형이 값을 계산할 수 없는 경우이므로, 좌표계를 변경해 본다(여기 참고).

툴바의 Select Features 메뉴를 선택하고, 화면의 피쳐를 선택하면, 해당 속성들을 테이블에서 확인할 수 있다. 

레이어 객체의 컨텍스트 메뉴 > Export > Save features as 메뉴를 선택해 해당 결과를 엑셀, shp, kml, dxf, gml, geojson, sqlite 등 다양한 파일로 출력한다. 

다음은 출력된 엑셀파일, gml 파일이다. 


마무리
이 글에서 파이썬을 이용한 SHP 사용자 레이어, 피쳐 속성 테이블 추가, 계산 및 엑셀 출력하는 방법을 설명하였다. 앞서 다룬 OGR, qgis를 좀 더 깊게 이해하면 공간정보 데이터 처리를 자동화할 수 있는 다양한 기능을 개발할 수 있다.

레퍼런스