2021년 9월 21일 화요일

딥러닝 3D의 대중화 전환점 Tensorflow 3D 소개 및 분석

 이 글은 딥러닝 3D의 대중화 전환점이 될 Tensorflow 3D 소개 및 분석 내용을 간략히 다룹니다. 

지금까지 딥러닝의 가장 큰 데이터셋은 2D 이미지였습니다. 이는 학습데이터를 가장 구하기 쉽고, 비용이 저렴하기 때문입니다. 하지만, LiDAR와 같은 스캔 데이터 획득 비용이 급격히 낮아지면서, 아이폰 같은 스마트폰에서 쉽게 3차원 데이터를 획득하기 쉬워졌습니다. 

지금까지는 고가의 3차원 센서와 다루기 까다로운 PointNet과 같은 오픈소스를 이용했지만, 앞으로는 쉽게 얻을 수 있는 3차원 데이터를 이용하여, 다양한 어플리케이션 개발이 가능해졌습니다. 개인적으로 텐서플로우 3D가 그 전환점이 될 것이라 기대하고 있습니다.

관련해 릴리즈된 구글 블로그(2/11/2021)에는 관련 내용이 잘 설명되어 있습니다(상세 내용은 레퍼런스 참고).

Tensorflow 3D 릴리즈 내용
실시간 3D 데이터 인식 기술은 자율 주행 자동차 및 로봇과 같은 센서 사용 머신러닝 (ML) 시스템에서 현실 세계를 탐색하고 인식할 수 있으며, 모바일 장치에서 향상된 증강 현실 경험을 얻을 수 있다. 컴퓨터 비전 분야는 최근 모바일 3D 물체 감지, 인식을 위한 모델을 포함하여, 3D 장면 이해 기술 개발에 큰 진전을 이루기 시작했다.

3D 장면 이해를 더욱 향상시키고 연구자의 진입 장벽을 줄이기 위해 3D 딥러닝 기능을 TensorFlow로 가져 오도록 설계했다. 모듈화된 효율적인 라이브러리인 TensorFlow 3D(TF 3D)를 출시한다. TF 3D는 최첨단 3D 장면 인식 모델을 개발, 교육 및 배포 할 수 있도록 관련 기능, 작업, 손실 함수, 데이터 처리 도구, 모델 및 메트릭 집합을 제공한다.

TF 3D에는 최신 3D 시맨틱 분할, 3D 객체 감지 및 3D 인스턴스 분할을 위한 학습 평가 파이프 라인이 포함되어 있다. 아울러, 병렬 분산 학습을 지원한다. 3D 객체 예측, 포인트 클라우드 등록 및 포인트 클라우드 밀도 분석 같은 애플리케이션을 가능하게 한다. 

표준 3D 장면 인식 데이터 세트 훈련 및 평가를 위한 통합 데이터 세트를 제공한다. 현재 Waymo OpenScanNet 및 Rio 데이터 세트를 지원하고 있다. 사용자는 다른 인기있는 데이터 세트로 자유롭게 변환할 수 있다. NuScenes 및 Kitti 를 유사한 형식으로 변환하여, 사용자 지정 생성된 파이프라인에서 사용할 수 있다. 신속한 프로토타이핑 및 아이디어 시도를 통해, 배포에 이르기까지 다양한 3D 딥러닝 연구 및 응용 프로그램 개발이 가능하다.
Waymo Open Dataset 프레임 TF 3D 3D 물체 감지 모델 출력 예와 ScanNet 데이터 세트에서 3D 인스턴스 분할 모델의 출력 예

TF 3D는 효율적인 희소 컨볼루션 모델을 포함했다. 이는 다양한 3D 장면 이해를 위한 최첨단 결과를 달성하는 데 핵심이다. TF 3D가 현재 지원하는 세가지 파이프라인인 3D 시멘틱 분할, 3D 객체 감지 및 3D 인스턴스 분할은 다음과같다.

3D Sparse Convolutional Network
센서에 의해 캡처된 3D 데이터는 주로 관심이 제한된 대상(예. 자동차, 보행자 등)이 포함된 장면으로 구성된다. 따라서 3D 데이터는 본질적으로 희소하다. 이러한 환경에서 일반적인 컨볼루션 구현은 계산 집약적이며 많은 양의 메모리를 소비한다. 따라서 TF 3D에서는 3D 희소 데이터를 보다 효율적으로 처리하도록 설계된 희소 컨볼루션 및 풀링 함수를 사용합니다. Sparse Convolutional 모델은 대부분의 실외 자율 주행 (예. Waymo, NuScenes) 및 실내 벤치 마크(예. ScanNet)에 적용되는 최첨단 기술이다.

계산 속도를 높이기 위해 다양한 CUDA 기술을 사용한다(예. 해싱, 공유 메모리에서 필터 분할, 캐싱 및 비트 연산 사용 등). Waymo Open 데이터 세트에 대한 실험에 따르면 이 기술은 기존에 잘 설계된 기술보다 약 20배 더 빠르다.

TF 3D는 3D 서브 매니폴드 희소 U-Net 아키텍처를 사용하여 각 복셀(Voxel)에 대한 특성을 추출한다. U-Net 아키텍처는 네트워크가 미세한 특징을 모두 추출하고 이를 결합하여 예측할 수 있게 한다. U-Net 네트워크는 인코더, 병목 및 디코더의 세 가지 모듈로 구성되며 각 모듈은 풀링 또는 풀링 해제 작업이 가능한 여러 희소 컨볼류션 블록으로 구성된다.
3D 희소 복셀 U-Net 아키텍처

3차원 희소 복셀 U-Net은 복셀 기능을 가져와 하위 다양체 희소 컨볼류션 모델에 데이터를 적용한다. 또한, 하위 다양체 희소 풀링을 수행한다. 
위에서 설명한 희소 컨볼루션 네트워크는 TF 3D에서 제공되는 파이프라인을 이해하는 3D 장면의 중추이다. 각 모델은 이 백본 네트워크를 사용하여 희소 복셀의 특징을 추출한 다음, 하나 이상의 추가 예측 데이터를 추가하여 관심있는 객체를 추론한다. 사용자는 인코더, 디코더 레이어 수와 각 레이어의 컨볼루션 수를 변경하여, 컨볼루션 필터 크기를 수정한 후, U-Net 네트워크를 구성한다. 

3D Semantic Segmentation와 3D Instance Segmentation
3D 의미 분할 모델은 의미 라벨을 예측하는 포인트로 복셀 시멘틱 점수를 예측하는 하나의 출력 head가 있다.

ScanNet 데이터 세트 에서 실내 장면의 3D 시맨틱 분할

의미를 예측하는 것 외에도 동일한 객체에 속하는 복셀을 함께 그룹화하는 것이 중요하다. TF 3D에서 사용되는 3D 인스턴스 분할 알고리즘은 딥 메트릭 학습을 사용한 2D 이미지 분할에 대한 작업을 기반으로 한다. 이 모델은 복셀 별 인스턴스 내장 벡터와 각 복셀의 의미론적 스코어를 예측한다. 인스턴스 내장 벡터는 동일한 객체 인스턴스에 해당하는 복셀이 서로 가깝고 다른 객체에 해당하는 정보를 계산한다. 이 경우 입력은 이미지가 아닌 포인트 클라우드이며, 2D 이미지 네트워크 대신 3D 희소 네트워크를 사용한다. 

3D Object Detection
3D 객체 인식 모델은 복셀당 크기, 중심 및 회전 행렬, 객체 시멘틱 점수를 예측한다. 수십만 개의 복셀별 박스(Box) 예측을 몇 개의 정확한 박스로 줄인 다음, 훈련 시 상자 예측 및 분류 손실 값을 복셀​​별 예측에 적용한다. Huber loss 함수를 이용해, 예측 및 실측 상자 모서리 사이 간의 거리. 크기, 중심 및 회전 행렬에서 상자 모서리를 추정하는 함수를 적용한다. 계산된 손실 값은 객체 속성로 취급하여 자동으로 다시 전파된다. Ground True와 겹치는 상자를 분류하고 겹치지 않는 상자를 음수로 분류하는 Dynamic box 분류 손실 함수를 계산한다.

ScanNet 데이터 세트에 대한 3D 물체 감지 결과

최근 논문인 “DOPS: 3D 물체 감지 및 3D 모양 예측 학습”에서 TF 3D에서 물체 감지에 사용되는 단일 단계 지도 학습 알고리즘을 적용한다. 후속 작업에서 희소 LSTM 기반 다중 프레임 모델 을 제안하여 시간 정보를 활용하도록 3D 물체 감지 모델을 확장했다. 이 시간 모델이 Waymo Open 데이터 세트에서 프레임 별 접근 방식보다 7.5 %더 우수한 성능을 보여준다는것을 발견했다.
DOPS 논문에 소개된 3D 물체 인식 및 형상 예측 모델

3D 희소 U-Net은 각 복셀에 대한 특징 벡터를 추출하는 데 사용된다. 객체 감지 모듈은 이러한 기능을 사용하여 3D 상자 및 의미론적 점수를 계산한다. 동시에 네트워크의 다른 브랜치는 각 객체에 대한 메쉬(mesh)를 출력하는 데 사용되는 모양을 예측한다.

이 기술은 Google 연구원들 간의 광범위한 협력의 결과였다. Guangda Lai, Abhijit Kundu, Pei Sun, Thomas Funkhouser, David Ross, Caroline Pantofaru, Johanna Wald, Angela 에게 특별한 감사와 함께 Alireza Fathi와 Rui Huang의 핵심적인 공헌을 강조하고 싶다. 시작하려면 github 저장소를 방문하라.

TF 3D github 내용 및 Train 코드 분석
TF3D github 내용을 간략히 분석한다. 이 소스코드는 다음 기능을 제공한다. 
  • GPU/CPU op for 3d submanifold sparse convolution.
  • A configurable 3d sparse voxel unet network that is used as the feature extractor in our models.
  • Training and evaluation code for 3D Semantic Segmentation, 3D Object Detection and 3D Instance Segmentation.
  • Data and configuration for training and evaluation on Waymo Open Dataset, ScanNet Dataset, and Rio Dataset.
폴더는 doc, instance_segmentation, layers, losses, object_detection, ops, sementic_segmentation, utils로 구성된다. 각 폴더는 기능별로 구현된 코드가 포함되어 있다. utils는 포인트 클라우드 처리와 관련된 유용한 코드가 포함되어 있다. PCD 로딩, 희소 행렬 변환, 법선 벡터 계산, 복셀 처리 등이 구현되어 있다. 코드 분석에는 기존 2D 이미지 객체 인식때 사용된 딥러닝 알고리즘을 포함해 아래 개념을 이해하면 도움이 된다. 
  • 3D 그래픽스 이론. 특히, 3D 공간 인덱싱, 복셀.
  • 포인트 클라우드 및 관련 계산. 특히, 법선 벡터 계산
Sparse Matrix 의 예(대부분 0으로 채워져 있음. 이를 포함한 연산은 큰 데이터에서 나쁜 계산 성능을 유발함. 이를 다음과 같이 압축 저장해 계산함).
        V         = [ 10 20 30 40 50 60 70 80 ]
            COL_INDEX = [  0  1  1  3  2  3  4  5 ]  
ROW_INDEX = [  0  2  4  7  8 ]

아직 적절한 예제가 부족한 것이 아쉽다. 소스가 공개되었으니, 곧 많은 예제가 CoLab으로 올라올 것이라 기대한다. 

TF 3D 컴파일 및 실행 요구사항은 다음과 같다. 
tensorflow==2.3.0
tensorflow_datasets>=4.1.0
numpy>=1.18.5
gin-config>=0.4.0
tensorflow-probability>=0.11.1
shapely>=1.7.1

핵심 코드 중 하나인 train.py 소스 주요 부분을 분석해 본다. 

import tensorflow as tf
from tf3d.utils import callback_utils  # tf3d util 포함

flags.DEFINE_string('train_dir', '/tmp/masternet/',
                    'Directory where to write event logs.')  # 훈련 폴더
flags.DEFINE_string('config_file', None, 'The path to the config file.')  # 설정 파일 지정
flags.DEFINE_integer(
    'num_steps_per_epoch', 1000,
    'Number of batches to train before saving the model weights again. The next'
    'epoch will continue loading the data stream from where the current epoch'
    'left behind.') # epoch 값 설정
flags.DEFINE_integer(
    'num_workers', 1,
    'Number of workers (including chief) for calculating total batch size')  # 배치 크기 계산용 워커 숫자 설정
flags.DEFINE_integer(
    'num_gpus', 1, 'Number of gpus per worker for calculating total batch size') # GPU 숫자
flags.DEFINE_integer('batch_size', 1, 'Per worker batch size.')  # 배치 크기
flags.DEFINE_integer('gpu_memory_limit', 14700,
                     'Memory size to request per GPU.')  # GPU 메모리 크기. 꽤 큰 메모리를 요구.

@gin.configurable
def train(strategy,
          write_path,
          learning_rate_fn=None,
          model_class=None,
          input_fn=None,
          optimizer_fn=tf.keras.optimizers.SGD):
  """A function that build the model and train.
  Args:
    strategy: tf.distribute.전략 객체
    write_path: 훈련 로그 및 체크 포인트 저장 경로
    learning_rate_fn: learning rate 함수
    model_class: 훈련용 모델 클래스
    input_fn: 데이터셋 tf.data입력용 함수
    optimizer_fn: 최적화 함수
  """

  with strategy.scope():
    model = model_class(
        train_dir=os.path.join(write_path, 'train'),
        summary_log_freq=FLAGS.log_freq)

    model.compile(optimizer=optimizer_fn(learning_rate=learning_rate_fn()))  # 최적함수 컴파일

    total_batch_size = FLAGS.batch_size * FLAGS.num_workers * FLAGS.num_gpus  # 전체 배치 크기 계산
    inputs = input_fn(is_training=True, batch_size=total_batch_size)  # 입력 설정

  model.fit(
      x=inputs,
      callbacks=[backup_checkpoint_callback, checkpoint_callback],
      steps_per_epoch=FLAGS.num_steps_per_epoch,
      epochs=FLAGS.num_epochs,
      verbose=1 if FLAGS.run_functions_eagerly else 2)   # 모델 피팅
  model.close_writer()


def main(argv):
  del argv
  try:
      gin.parse_config(FLAGS.params)  # 학습 파라메터 설정
    train(strategy=strategy, write_path=write_path)  # 데이터 학습 훈련

@gin.configurable
def step_decay(initial_learning_rate, boundary_list, ratio_list):
  rates = []
  for ratio in ratio_list:
    rates.append(initial_learning_rate * ratio)
  return tf.keras.optimizers.schedules.PiecewiseConstantDecay(
      boundaries=boundary_list, values=rates)  # 침식 함수 리턴

설치 방법은 다음과 같다. 
Ubuntu 18.04 이미지가 있는 GPU 지원 머신을 기반으로 한다. 참고로, 제일 쉬운 설정 환경은 GCP(Google Cloud Platform)을 이용하는 것이다.  

다음 명령을 우분투 터미널에서 차례대로 실행한다. 
1. 아래 패키지 설치
sudo apt update
sudo apt install subversion git virtualenv

2. CUDA 10.1 and cuDNN 7.6.5 설치

3. tf3d 코드 다운로드
git clone https://github.com/google-research/google-research.git --depth=1

3. virtual environment 설정 (optional but preferred)
virtualenv -p python3 tf3d_env
source ./tf3d_env/bin/activate

4. 의존 패키지 설치
pip install -r tf3d/requirements.txt

5. Tensorflow Object Detection API 설치
sudo apt update
sudo apt install protobuf-compiler python3-dev

6. tf3d/ops 폴더 내용 참고해 사용함. TensorFlow 3D dataset 사용 가능.

7. 훈련 및 평가 예제 실행

마무리
이 글을 통해, 텐서플로우 3D에 대한 기능, 릴리즈 내용, 깃허브 제공 소스 및 일부 코드를 분석하고, 사용 방법을 간단히 알아보았다. 아이폰에 라이다가 장착되고, 다른 스마트폰 제조사도 이를 따라하게 되면, 3차원 데이터셋은 더욱 풍부해 질 것이고, 이를 통해, 가치있는 어플리케이션이 많이 개발될 것이다. 아이폰 라이다에 대한 소개는 다음 링크를 참고하길 바란다. 

레퍼런스 

추신 - 개인적으로 3차원 그래픽스를 좋아해, 오래동안 연구 개발하고 있는 연구자로서, 오래전 본인이 캐드 엔진과 기하 계산 라이브러리 개발때 사용한 수학 함수, 기하학과 수식이 텐서플로우 3D에서 그대로 활용되고 있는 것을 보니 반가운 느낌이 든다. 근본적인 기초 수학 지식은 응용 목적에 따라 형태만 바뀔 뿐이지, 재사용되어, 가치를 만들다는 사실을 한번 더 느낀다. 평소 준비하고 있는 자에게 좋은 기회는 항상 열려져 있는 것 같다. 

댓글 없음:

댓글 쓰기

2024년 하반기 스마트 건설과 생성AI 기술 동향

이 글은 2024년 하반기 스마트 건설과 생성AI 기술 동향에 대한 내용을 정리한다. 머리말 건설 분야에서도 제조업과 마찬가지로 생성 AI의 시대가 도래하고 있다. 2023년 글로벌 건설 시장 내 인공지능(AI) 규모는 9억 3,356만 달러에서 20...