Published on

This Week I learned 10

Summary

[Dev] Pytorch3D & Mesh

  • Mesh 란 Computer Graphic 에서 3D 물체의 표면 구조를 모델링하는 방법
  • Triangle Mesh 를 많이 사용함. 3개의 점은 항상 평면을 구성하기 때문임.
  • Pytorch3D 는 미분 가능한 3D 렌더링을 지원하는 Pytorch 확장 패키지

[Dev] Docker image CUDA Version

  • Docker image 배포 시 Host Driver Version ≥ Container CUDA Version 이면 문제가 없음

[Dev] NPM Package Management

  • npm install 을 수행하면 lock 파일이 업데이트 됨.
  • 따라서 package 변경 없이 현재 lock 파일에 따라 npm package 를 설치할 때에는 npm ci 를 사용하는 것이 좋음(repo clone 뒤 환경 구성 시 등).

[Paper] DexGraspNet: A Large-Scale Robotic Dexterous Grasp Dataset for General Objects Based on Simulation

  • Hand Grasping Pose Generation 데이터셋을 만드는 방법

[Dev] Pytorch3D & Mesh

Pytorch3D

  • Facebook AI Research 에서개발
  • PyTorch 를 기반으로 작성되어 기존 생태계와 통합 가능
  • 미분 가능한 3D 렌더링 지원 → 백 프롭 가능
    • e.g. 2D 이미지만 보고 3D 물체를 복원하는 렌더링 과정을 수행하는 모델을 학습하려면 이 과정이 미분 가능해야 함 → 일반적인 Torch 로 구현하는 것은 매우 어려움
  • 주요 기능
    • Mesh, Point Cloud, Voxel 등과 같이 3D 데이터 구조들을 효율적으로 처리함
    • 렌더링 수행
    • 3D 변환(회전, 이동 등) 수행
    • Chamfer distance 등 3D 특화 loss function 제공
    • 카메라 모델 제공

Mesh

  • 그물망을 뜻함 → 점들을 선으로 연결해서 만든 3D 물체의 표면 구조를 의미
  • 컴퓨터 그래픽스에서, 3D 물체의 표면을 삼각형들의 집합으로 표현하는 것이 일반적 → Triangle Mesh
    • 이미지가 pixel 로 이뤄진다면 3D 모델은 삼각형으로 이뤄져 있음
  • 3개의 점은 항상 하나의 평면을 정의하기 때문에 삼각형을 사용함.
    • 4개의 점 부터는 평면이 아닐 수 있음
    • 가장 단순한 다각형이라 계산이 빠름
    • 어떤 복잡한 곡면도 작은 삼각형들로 근사할 수 있음
  • 삼각형의 갯수가 많아질수록 품질이 좋아짐

[Dev] Docker image CUDA Version

  • Host 에 깔려 있는 Nvidia Driver 가 지원하는 CUDA Version 은 NVIDIA Driver Version
  • Container 에 깔려 있는 것은 CUDA Toolkit Version
    • CUDA Toolkit: CUDA 프로그램을 개발하고 실행하는 데에 필요한 도구 모음
      • 컴파일러(nvcc), 라이브러리(cuBLAS, cuDNN), 런타임 API, 개발 도구 등으로 구성
    • CUDA 프로그램을 개발/실행하려면 Toolkit 이 있어야 함
  • 따라서 Host Driver Version ≥ Container CUDA Version 이면 문제가 없음

[Dev] NPM Package Management

package.json

  • 프로젝트의 메타데이터와 의존성을 정의하는 파일
    • 프로젝트 이름, 버전, 설명, dependencies, devDependencies 등을 포함함

Lock file

  • package-lock.json, yarn.lock 파일 등
  • 정확한 의존성 트리를 고정하는 파일임 → 설치된 정확한 버전과 모든 하위의존성을 기록함
  • 이를 통해 별도의 환경에서 동일한 의존성 버전 사용을 보장할 수 있음 → 커밋 필요

package managers

  • npm: Node Package Manager
  • yarn: npm 의 단점을 보완, 병렬 설치와 캐싱 매커니즘 + 무결점 체크섬 방식 도입으로 속도 향상
  • pnpm: performant npm, npm 과 yarn 의 단점을 보완, 전역 저장소 + 심볼릭 링크 방식으로 효율성 향상

npm commands

npm install

  • package.json, lock file 파일을 읽고 의존성 설치
    • package.json, lock file 간에 충돌이 있는 경우 package.json 이 우선함
  • lock file 이 업데이트됨

npm ci

  • ci/cd 환경에 촤적화된 명령어
  • 기존 node_modules 를 삭제하고, lock file 에 정의된 것에 따라 패키지 설치
  • lock file 이 없거나, package.json 과 충돌이 있으면 에러 발생

사용 가이드

  • “여러 사람과 함께 수행하는 프로젝트의 실행 환경을 만들 때에는 npm install 명령어보다 npm ci 를 쓰는 것이 더 좋다”
    • 동일 환경 보장(package-lock 파일에 따라서만 설치)
    • 더욱 빠르고 클린한 설치(node_modules 를 통째로 지우고 새롭게 설치)
  • npm install 은 새로운 패키지를 추가하거나 업데이트할 때 주로 사용

.npmrc

  • npm 관련 설정을 관리하는 파일
  • 위치별 우선 순위는 다음과 같음
    • 프로젝트 루트(.npmrc) > 사용자 홈 디렉토리(~/.npmrc) > 전역 설정(/etc/npmrc)
  • 설정 예시
# Registry 설정
registry=https://registry.npmjs.org/

# Private registry 설정
@mycompany:registry=https://npm.mycompany.com/

# 인증 토큰
//npm.mycompany.com/:_authToken=${NPM_TOKEN}

# 기타 설정
save-exact=true
engine-strict=true

[Paper] DexGraspNet: A Large-Scale Robotic Dexterous Grasp Dataset for General Objects Based on Simulation

Concept

  • 손으로 dexterous grasping 하는 문제는 데이터셋 부족으로 인해 연구에 한계가 있어왔음
  • 효율적인 합성 방법을 통해 생성한 대규모 grasping dataset 제안 - DexGraspNet 이 데이터셋 이름임
    • differentiable force closure estimator 를 활용하여 grasp 생성
    • 5355 종류의 객체에 대해 132만 개의 파지 생성
    • Issac Gym 시뮬레이터로 검증함
  • GraspIt! 과 같은 다른 다이터셋과 비교해 볼 때 품질과 다양성 측면에서 더욱 우수

Method

Object Preperation

  • ShapeNet-Core, ShapeNetSem 에서 3980 개의 객체(133개의 카테고리) 선택
  • TCB, Big-BIRD, Grasp, KIT, Google’s scanned object Dataset 에서 1357개의 객체 선택 - 카테고리 없음
  • 모두 제 각각 크기가 다름 → unit sphere 로 정규화 + 5개의 고정된 크기로 스케일링하여 사용
  • closed figure 를 만들기 위해 manifolds 로 리매쉬함
  • 마지막으로 모든 mesh 에 대한 collision meshes 를 생성함

Grasp Generation

  • g=(T,R,θ)g = (T, R, \theta) 튜플 사용
    • TR3T \in \mathbb{R}^3: Translation - 3차원 공간에서 손의 위치를 정의
    • RSO(3)R \in SO(3): Rotation - 3차원 공간에서 손의 방향 또는 자세를 정의
    • θRd\theta \in \mathbb{R}^d : Shadow hand 의 joint angle(d=22) - 손가락의 형상을 정의
    • 이 튜플이 있으면 손의 다양한 형태를 정의할 수 있음
  • 여기에 140개의 수동 선택된 접촉 후보에 대한 정보를 추가하여 g=(T,R,θ,x)g' = (T, R, \theta, x) 를 도입함
    • 객체 OO 가 주어지면 xx 와의 거리를 통해 가깝게 만들어줌
  • 기존 알고리즘
    • E=Efc+wdisEdis+wpenEpen+wpriorEpriorE = E_{fc} + w_{dis}E_{dis} + w_{pen}E_{pen} + w_{prior}E_{prior} 를 최소화하는 방향으로 최적화된 gg’ 를 찾는 것을 목표로 함
      • MALA(Metropolis-Adjusted Langevin Algorithm) 알고리즘 적용
      • 무작위로 초기화된 손 자세 g0g’_0 에서 시작하여, 반복적으로 업데이트하는 방법
    • 이러한 방법들 만으로는 한계가 있음
      • 낮은 성공률과 느린 수렴 속도, 무작위 초기화로 인한 왜곡
  • 제안하는 방법
    • 초기화 전략에 대한 제약
      • 다섯 손가락이 파지를 위한 공간을 형성하도록 충분히 벌어지도록 함
      • 손바닥이 객체를 향하도록 함
    • 초기 손 자세 생성 방법 변경
      • truncated normal distribution 을 활용하여 각 관절의 각도를 한계 내에서 미세하게 변경함
      • 객체 mesh 의 convex hull 을 가져와서 모든 꼭짓점에서 0.2m 만큼 떨어진 inflated convex hull 을 생성함
      • 이 inflated convex hull 에서 무작위로 점을 샘플링하여 손의 위치를 결정함.
      • 샘플링된 점에서 object mesh 와 가장 가까운 점으로 향하는 방향 벡터를 계산함.
      • 손을 샘플링된 점으로 이동하고, 손바닥이 객체를 향하는 방향 벡터를 바라보도록 회전.
      • 이와 같은 방법으로 초기 손 자세를 생성하여 성공률을 높임
    • 또한 기존 알고리즘의 EE 의 항 중에서 관통과 관련된 부분을 업데이트함
    • 끝으로 거리 계산 알고리즘으로 DeepSDF 대신 Kaolin 을 사용하여 point-to-mesh signed distance 를 계산함
  • Validation
    • Issac Gym 과 PhysX 등의 물리 시뮬레이터 상에서 검증을 완료함
    • 성공 조건
      • 6개의 축 정렬된 중력 방향 모두에서 100 시뮬레이션 단계 후에도 객체와 여전히 접촉하고 있는 경우
      • 최대 관통 깊이가 0.1cm 미만인 경우
    • 성공 조건을 통과한 pose 만이 데이터셋으로 저장됨