- 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 이 있어야 함
- CUDA Toolkit: CUDA 프로그램을 개발하고 실행하는 데에 필요한 도구 모음
- 따라서 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 로 리매쉬함
- 여기서 manifold 란 완벽하게 닫힌 3차원 객체의 표면 구조를 의미함
- 데이터 중에는 CAD 데이터, 스캔 데이터 등도 포함되어 있는데, 이 경우 물리 시뮬레이션에서 사용하기 부적절함 → 보다 견고하게 만드는 과정을 거치는 것
- Manifoldplus: A robust and scalable watertight manifold surface generation method for triangle soups
- 마지막으로 모든 mesh 에 대한 collision meshes 를 생성함
- collision mesh 란 충돌 여부를 효율적으로 계산하기 위해 객체 모델을 단순화하는 과정을 의미
- 여기서는 CoACD 라는 도구를 사용하여 모든 객체 mesh 에 대해 convex decomposition 을 적용하여 collision mesh 를 생성함
- Approximate convex decomposition for 3d meshes with collision-aware concavity and tree search
Grasp Generation
- 튜플 사용
- : Translation - 3차원 공간에서 손의 위치를 정의
- : Rotation - 3차원 공간에서 손의 방향 또는 자세를 정의
- : Shadow hand 의 joint angle(d=22) - 손가락의 형상을 정의
- 이 튜플이 있으면 손의 다양한 형태를 정의할 수 있음
- 여기에 140개의 수동 선택된 접촉 후보에 대한 정보를 추가하여 를 도입함
- 객체 가 주어지면 와의 거리를 통해 가깝게 만들어줌
- 기존 알고리즘
- 를 최소화하는 방향으로 최적화된 를 찾는 것을 목표로 함
- MALA(Metropolis-Adjusted Langevin Algorithm) 알고리즘 적용
- 무작위로 초기화된 손 자세 에서 시작하여, 반복적으로 업데이트하는 방법
- 이러한 방법들 만으로는 한계가 있음
- 낮은 성공률과 느린 수렴 속도, 무작위 초기화로 인한 왜곡
- 를 최소화하는 방향으로 최적화된 를 찾는 것을 목표로 함
- 제안하는 방법
- 초기화 전략에 대한 제약
- 다섯 손가락이 파지를 위한 공간을 형성하도록 충분히 벌어지도록 함
- 손바닥이 객체를 향하도록 함
- 초기 손 자세 생성 방법 변경
- truncated normal distribution 을 활용하여 각 관절의 각도를 한계 내에서 미세하게 변경함
- 객체 mesh 의 convex hull 을 가져와서 모든 꼭짓점에서 0.2m 만큼 떨어진 inflated convex hull 을 생성함
- 이 inflated convex hull 에서 무작위로 점을 샘플링하여 손의 위치를 결정함.
- 샘플링된 점에서 object mesh 와 가장 가까운 점으로 향하는 방향 벡터를 계산함.
- 손을 샘플링된 점으로 이동하고, 손바닥이 객체를 향하는 방향 벡터를 바라보도록 회전.
- 이와 같은 방법으로 초기 손 자세를 생성하여 성공률을 높임
- 또한 기존 알고리즘의 의 항 중에서 관통과 관련된 부분을 업데이트함
- 끝으로 거리 계산 알고리즘으로 DeepSDF 대신 Kaolin 을 사용하여 point-to-mesh signed distance 를 계산함
- 초기화 전략에 대한 제약
- Validation
- Issac Gym 과 PhysX 등의 물리 시뮬레이터 상에서 검증을 완료함
- 성공 조건
- 6개의 축 정렬된 중력 방향 모두에서 100 시뮬레이션 단계 후에도 객체와 여전히 접촉하고 있는 경우
- 최대 관통 깊이가 0.1cm 미만인 경우
- 성공 조건을 통과한 pose 만이 데이터셋으로 저장됨