Machine Learning/Computer Vision

CenterPose 환경 구성 및 shoes 예제 수행

코방코 2024. 1. 14. 22:56
728x90

 

 

Object Pose Optimization 방식 중 하나인 CenterPose 예제 구동을 위해 환경 구성 및 구현을 수행하는 글입니다.

CenterPose는 Category에 존재하는 Monocular RGB Input Source 만으로도

Object의 3D Object Bounding Box를 Output으로 도출할 수 있습니다.

 

2022년 ICRA에 등재된 논문이고 해당 논문에 대한 소개는 아래 글을 참조하시기 바랍니다.

 

[논문 리뷰] CenterPose - Single-Stage Keypoint-Based Category-Level Object Pose Estimation from an RGB Image (2022 ICRA)

최근 Object Pose Estimation 에 관해 연구를 하게 되어 작성하는 글입니다. 2022년 Nvidia Lab과 Georgia Institute of Technology 에서 ICRA에 게제한 논문이며, CAD 모델 없이 Monocular RGB input 만으로 Category Object의 Pose

cobang.tistory.com

 

이러한 Object Pose Estimation에 관한 연구는 최근 Robotics 의 발전에 따라 꾸준히 발전해나가고 있습니다.

Object 의 Pose를 알면 어디를 잡아야 유리한지 로봇이 학습을 할 수 있겠죠.

 

비록 2022년 논문이라 더더욱 최신 기술이 많이 나왔지만,

(하루가 다르게 세상이 바뀌는 듯 합니다. 정말 너무너무 빠른 것 같습니다.)

간단하게 RGB camera 만으로도 학습된 category 가 존재하는 물체에 대해 

Pose Estimation이 가능하다는 장점이 있어 해당 Git을 참조하여 예제를 환경 구성부터 수행해보았습니다.

참조로 제가 예제를 수행한 운영체제는 Ubuntu 22.04 입니다.

 

GitHub - NVlabs/CenterPose: Single-Stage Keypoint-based Category-level Object Pose Estimation from an RGB Image (ICRA 2022)

Single-Stage Keypoint-based Category-level Object Pose Estimation from an RGB Image (ICRA 2022) - GitHub - NVlabs/CenterPose: Single-Stage Keypoint-based Category-level Object Pose Estimation from ...

github.com

 


Nvidia Driver 설치

 

먼저 Nvidia Driver를 체크해주었습니다.

Additional Drivers 앱을 열어 확인해보니 아래와 같이 Nvidia Driver가 없는 상태였습니다.

 

아래 레퍼런스를 참조하여 설치를 진행해주었습니다.

 

Ubuntu 22.04에 NVIDIA 그래픽 카드 드라이버 설치

Ubuntu 22.04에 NVIDIA 그래픽 카드 드라이버 설치하는 방법을 다룹니다. 2022. 12. 17 최초작성 다음 명령을 사용하여 사용중인 그래픽 카드 모델과 그래픽 드라이버를 확인할 수 있습니다. $ sudo lshw -c d

webnautes.tistory.com

 

제가 수행한 과정을 요약해보았습니다.

터미널을 열어 아래 명령을 입력합니다.

sudo ubuntu-drivers devices

 

설치 가능한 그래픽을 확인할 수 있습니다.

 

recommended 가 떠있는 최신버전으로 설치해주었습니다.

sudo apt install nvidia-driver-525

 

시간이 꽤 소요되며, 설치가 완료되고 재부팅해주었습니다.

sudo reboot

 

 

Cuda 설치 (Nvidia 드라이버 존재 상태에서)

 

저는 CUDA 11.5 가 설치되어 있었는데 11.8로 업그레이드를 하길 원했습니다.

그래서 설치 과정과 동일하게 업그레이드를 수행해주었습니다.

 

좋은 레퍼런스가 이미 있습니다.

 

Ubuntu 22.04에 CUDA 11.8 설치하는 방법

Ubuntu 22.04에 CUDA를 설치하는 방법을 다룹니다. 2022. 12. 2 최초작성 2022. 12. 17 2023. 12. 30 Ubuntu 22.04.3 LTS에서 발생한 문제 해결방법 추가 cudnn 버전 관련 수정 2024. 1. 6 사소한 변경, cuDNN 8.6으로 변경 현

webnautes.tistory.com

 

아마도 하나 잘못된 설명은 nvidia-smi 명령을 수행했을 때

우측 상단에 뜨는 CUDA version은 현재 설치된 버전이 아닌,

현재 존재하는 드라이버의 추천 버전을 나타내는 것으로 알고있습니다.

 

위 블로그를 따라서 천천히 수행하면 nvcc -V 를 입력했을 때

성공적으로 CUDA가 11.8로 업그레이드 되었음을 확인할 수 있습니다.

레퍼런스 글에서 마지막 부분의 bashrc 수정하는 것을 잊지 마시길 바랍니다.

 

 

cuDNN 설치

cuda를 업그레이드 해줬으니 그에 맞는 cuDNN 설치를 해주겠습니다.

CUDA 버전에 맞는 cuDNN은 아래 사이트를 참조하시기 바랍니다.

 

CUDA Deep Neural Network

cuDNN provides researchers and developers with high-performance GPU acceleration.

developer.nvidia.com

 

이것도 마찬가지로 레퍼런스 글을 따라갔습니다.

Nvidia Developer 회원가입이 필요합니다.

 

Archived cuDNN release를 눌러 11.8 버전에 맞는 11.x의 8.6.0 버전을 선택했습니다.

 

최종적으로 적절한 tar 파일을 설치하면, 다음 명령들을 수행합니다.

cd ~/Downloads

# 파일명은 다운 받으신 이름으로 수정하여야 합니다.
tar xvf cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz

# cuda 경로로 복사
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include 

sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64 

sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

 

다음 명령을 통해 맨 마지막 줄에 업그레이드한 CUDA version과 PASS 가 나타나면 성공입니다.

/usr/local/cuda-11.8/extras/demo_suite/deviceQuery

 

이제 완료되었습니다.

 


CenterPose 구동을 위한 가상환경 구성

 

그럼 anaconda 가상환경을 만들고 CenterPose 구동을 위해 나아가보겠습니다.

먼저 git clone 을 수행하겠습니다.

CenterPose_ROOT=~/CenterPose

git clone https://github.com/NVlabs/CenterPose.git $CenterPose_ROOT

 

python 3.6 의 가상환경을 만들고 CenterPose 가상환경을 활성화해줍니다.

conda create -n CenterPose python=3.6

conda activate CenterPose

 

저는 아래 명령을 수행했는데 opencv 빌드에서도 문제가 발생하고,

torch에서도 문제가 발생했습니다.

pip install -r requirements.txt

 

그래서 conda 가상환경에서 필요한 라이브러리를 하나씩 설치해주겠습니다.

conda install progress

conda install simplejson

conda install scipy

conda install -c conda-forge pyrr

pip install scikit-learn==0.22.2

conda install numba

pip install filterpy

#albumentations

#tqdm

#setuptools>=49.6.0

#frozendict

#tensorflow

#requests

 

가상환경에서 CUDA 11.8에 맞는 torch를 따로 빌드해주겠습니다.

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

 

꽤 오랜 시간이 걸려 설치가 완료되었고 다음 명령을 통해 테스트해보았습니다.

python3

import torch
torch.cuda.is_available()

True 가 나타나면 정상적으로 설치가 된 것입니다.

 

이번엔 opencv 4.5.5를 가상환경에 cmake build 해주겠습니다.

점점 OpenCV cmake 에 익숙해져 가는 것 같습니다.

 

먼저 필요한 라이브러리를 설치합니다.

conda install numpy

conda install -c conda-forge cmake

sudo sh -c "echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf.d/nvidia-tegra.conf"

sudo ldconfig

sudo apt-get install build-essential cmake git unzip pkg-config

sudo apt-get install libjpeg-dev libpng-dev libtiff-dev

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev

sudo apt-get install libgtk2.0-dev libcanberra-gtk*

sudo apt-get install python3-dev python3-numpy python3-pip

sudo apt-get install libxvidcore-dev libx264-dev libgtk-3-dev

sudo apt-get install libtbb2 libtbb-dev libdc1394-22-dev

sudo apt-get install libv4l-dev v4l-utils

sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

sudo apt-get install libvorbis-dev libxine2-dev

sudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev

sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev

sudo apt-get install libopenblas-dev libatlas-base-dev libblas-dev

sudo apt-get install liblapack-dev libeigen3-dev gfortran

sudo apt-get install libhdf5-dev protobuf-compiler

sudo apt-get install libprotobuf-dev libgoogle-glog-dev libgflags-dev

 

설치한 라이브러리 경로를 bashrc에 추가해줍니다.

 

터미널에서 다음 명령어로 .bashrc 파일을 엽니다:

sudo nano ~/.bashrc

 

파일의 끝에 다음 줄을 추가합니다:

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

 

파일을 저장하고 닫은 후, 변경 사항을 적용하기 위해 다음 명령을 실행합니다:

source ~/.bashrc

 

OpenCV GitHub 저장소에서 소스 코드를 클론합니다.

OPENCV_VERSION=4.5.5

git clone https://github.com/opencv/opencv.git -b ${OPENCV_VERSION}

git clone https://github.com/opencv/opencv_contrib.git -b ${OPENCV_VERSION}

cd opencv

 

CMake를 사용하여 OpenCV를 build 합니다.

CUDA_ARCH_BIN 값은 자신의 GPU에 맞는 값을 아래 링크에서 찾으셔야합니다.

 

CUDA GPUs - Compute Capability

Explore your GPU compute capability and CUDA-enabled products.

developer.nvidia.com

 

저는 Geforce RTX 2080 Ti 라서 7.5였습니다.

OPENCV_EXTRA_MODULES_PATHOPENCV_PYTHON_INSTALL_PATH

현재 까지의 과정이 동일하다면 똑같이 입력하시면 됩니다.

GENERATOR_NAME="Unix Makefiles"

# for Geforce RTX 2080 Ti
CUDA_ARCH_BIN="7.5"

 

cmake \
-G "${GENERATOR_NAME}" \
-B build \
-D CMAKE_INSTALL_PREFIX=~/anaconda3/envs/CenterPose \
-D BUILD_CUDA_STUBS=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_EXAMPLES=OFF \
-D BUILD_JASPER=OFF \
-D BUILD_JPEG=OFF \
-D BUILD_OPENEXR=OFF \
-D BUILD_PACKAGE=ON \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_PNG=OFF \
-D BUILD_SHARED_LIBS=ON \
-D BUILD_TBB=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_TIFF=OFF \
-D BUILD_WITH_DEBUG_INFO=ON \
-D BUILD_ZLIB=OFF \
-D BUILD_WEBP=OFF \
-D BUILD_opencv_apps=ON \
-D BUILD_opencv_calib3d=ON \
-D BUILD_opencv_core=ON \
-D BUILD_opencv_cudaarithm=ON \
-D BUILD_opencv_cudabgsegm=ON \
-D BUILD_opencv_cudacodec=OFF \
-D BUILD_opencv_cudafeatures2d=ON \
-D BUILD_opencv_cudafilters=ON \
-D BUILD_opencv_cudaimgproc=ON \
-D BUILD_opencv_cudalegacy=ON \
-D BUILD_opencv_cudaobjdetect=ON \
-D BUILD_opencv_cudaoptflow=ON \
-D BUILD_opencv_cudastereo=ON \
-D BUILD_opencv_cudawarping=ON \
-D BUILD_opencv_cudev=ON \
-D BUILD_opencv_dnn=ON \
-D BUILD_opencv_features2d=ON \
-D BUILD_opencv_flann=ON \
-D BUILD_opencv_gapi=ON \
-D BUILD_opencv_highgui=ON \
-D BUILD_opencv_imgcodecs=ON \
-D BUILD_opencv_imgproc=ON \
-D BUILD_opencv_java=OFF \
-D BUILD_opencv_js=OFF \
-D BUILD_opencv_ml=ON \
-D BUILD_opencv_objdetect=ON \
-D BUILD_opencv_photo=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_stitching=ON \
-D BUILD_opencv_ts=ON \
-D BUILD_opencv_video=ON \
-D BUILD_opencv_videoio=ON \
-D BUILD_opencv_world=OFF \
-D CMAKE_BUILD_TYPE=Release \
-D CUDA_ARCH_BIN=${CUDA_ARCH_BIN} \
-D CUDA_ARCH_PTX="" \
-D OPENCV_DNN_CUDA=ON \
-D PYTHON_EXECUTABLE=~/anaconda3/envs/CenterPose/bin/python3.6 \
-D PYTHON_INCLUDE_DIR=~/anaconda3/envs/CenterPose/include/python3.6m \
-D PYTHON_LIBRARY=~/anaconda3/envs/CenterPose/lib/libpython3.6m.so \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
-D OPENCV_PYTHON_INSTALL_PATH=~/anaconda3/envs/CenterPose/lib/python3.6/site-packages \
-D WITH_1394=OFF \
-D WITH_CUBLAS=ON \
-D WITH_CUDA=ON \
-D WITH_CUFFT=ON \
-D WITH_CUDNN=ON \
-D WITH_EIGEN=ON \
-D WITH_FFMPEG=ON \
-D WITH_GDAL=OFF \
-D WITH_GPHOTO2=OFF \
-D WITH_GIGEAPI=OFF \
-D WITH_GSTREAMER=OFF \
-D WITH_GTK=OFF \
-D WITH_INTELPERC=OFF \
-D WITH_IPP=ON \
-D WITH_IPP_A=OFF \
-D WITH_JASPER=ON \
-D WITH_JPEG=ON \
-D WITH_LAPACK=ON \
-D WITH_LIBV4L=ON \
-D WITH_OPENCL=OFF \
-D WITH_OPENCLAMDBLAS=OFF \
-D WITH_OPENCLAMDFFT=OFF \
-D WITH_OPENCL_SVM=OFF \
-D WITH_OPENEXR=ON \
-D WITH_OPENGL=ON \
-D WITH_OPENJPEG=ON \
-D WITH_OPENMP=OFF \
-D WITH_OPENNI=OFF \
-D WITH_PNG=ON \
-D WITH_PTHREADS_PF=ON \
-D WITH_PVAPI=OFF \
-D WITH_QT=ON \
-D WITH_TBB=OFF \
-D WITH_TIFF=OFF \
-D WITH_UNICAP=OFF \
-D WITH_V4L=ON \
-D WITH_VTK=ON \
-D WITH_WEBP=ON \
-D WITH_XIMEA=OFF \
-D WITH_XINE=OFF \
.

 

이제 OpenCV를 make 해줍니다.

cd build

make -j$(nproc)

sudo make install

 

Python을 실행하고 OpenCV가 올바르게 설치되었는지 확인합니다.

import cv2
print(cv2.__version__)

 

 

이제 github 명령을 따라가보겠습니다.

conda install -c conda-forge eigenpy

 

저희는 Pytorch를 상위 버전으로 별도로 빌드했기 때문에 DCNv2 를 적절하게 고쳐야 컴파일이 됩니다.

또 여기서 한참 헤맸네요.

 

Pytorch 버전에 맞게 아래 git 의 branch 를 참조하여 DCNv2를 새로 clone 시킵니다.

 

GitHub - lbin/DCNv2: Deformable Convolutional Networks v2 with Pytorch

Deformable Convolutional Networks v2 with Pytorch. Contribute to lbin/DCNv2 development by creating an account on GitHub.

github.com

 

저는 pytorch 1.10이 설치되었기 때문에 1.9 branch를 받았습니다.

cd ~/CenterPose/src/lib/models/networks

rm -rf DCNv2

git clone -b pytorch_1.9 https://github.com/lbin/DCNv2.git

 

이제 컴파일 해줍니다.

cd DCNv2

./make.sh

 

컴파일 에러가 났다면 Pytorch와 DCNv2 의 버전 차이 때문일 것입니다.

환경에 맞는 DCNv2를 위 경로에 맞게 설치해주고 컴파일 해보시기 바랍니다.

 

그리고 이제 CenterPose 와 models 디렉토리에 CenterPose와 CenterPoseTrack 디렉토리를 만들어줍니다.

 

그리고 아래 링크에서 pre-trained 된 .pth 파일들을 다운받아 옮겨줍니다.

아래 .pth 파일을 모두 다운 받아 CenterPose 디렉토리로 옮겨줍니다.

CenterPose - Google Drive

 

아래 .pth 파일을 모두 다운 받아 CenterPoseTrack 디렉토리로 옮겨줍니다.

CenterPoseTrack - Google Drive

 

총 9개의 카테고리의 pre-trained 모델이 존재합니다.

bike, book, bottle, camera, cereal_box, chair, cup, laptop, and shoe

 

웹캠을 통해 신발을 보여주어 demo 파일로 작동시켜보겠습니다.

cd ~/CenterPose/src

python3 demo.py --demo webcam --arch dlav1_34 --load_model ../models/CenterPose/shoe_v1_140.pth

첫 번째 실행은 Creating model % 가 오르면서 작동까지 한 4분 정도 걸렸습니다.

그 뒤로는 바로 작동합니다.

 

드디어 성공적인 결과가 나타났습니다.

 

CenterPoseTrack 명령어 입니다.

cd ~/CenterPose/src

python3 demo.py --demo webcam --arch dla_34 --load_model ../models/CenterPoseTrack/shoe_15.pth --tracking_task

 

두 모드를 비교해보았습니다.

NVIDIA GTX 1080Ti GPU 기준으로

CenterPose 는 15fps,

CenterPoseTrack 은 10fps 정도가 나온다고 하는데

 

저는 RTX 2080Ti 에서 둘 다 15fps 정도가 획득되었습니다.

CenterPose와 CenterPoseTrack의 차이는 다음 문서에서 확인할 수 있습니다.

CenterPoseTrack (ICRA 2022)

 

CenterPoseTrack (ICRA 2022)

Abstract: We propose a single-stage, category-level 6-DoF pose estimation algorithm that simultaneously detects and tracks instances of objects within a known category. Our method takes as input the previous and current frame from a monocular RGB video, as

sites.google.com

 

Kalman Filter 와 Bayesian Filter를 사용해서 다음 프레임에서의 위치를 예측하여

CenterPose의 안정성을 더욱 높이는 것 같습니다.

 

동영상 첨부가 번거로워 여기 하진 않겠지만,

실제로도 분석을 해보면 CenterPoseTrack은

프레임 간에 3D Object Bounding Box가 좀 더 부드럽게 움직입니다. 

 

촬영한 동영상 소스를 이용해서도 분석해보았습니다.

제가 촬영한 shoes.mov 라는 파일을 ~/CenterPose/src 디렉토리에 저장하고

다음 명령을 통해 ~/CenterPose/demo/shoes 디렉토리에 결과가 저장됩니다.

먼저 CenterPose 입니다.

python3 demo.py --demo shoes.mov  --arch dlav1_34 --load_model ../models/CenterPose/shoe_v1_140.pth --debug 4

 

png로 저장이 되어서 python 코드를 작성해서 .mp4로 만들었습니다.

아래 python 파일을 본인의 소스 동영상과 결과에 맞게 수정해서 사용하시면 됩니다.

 

이 py파일을 ~/CenterPose/src 디렉토리에 생성하고 다음 명령을 수행했습니다.

python3 result_video_creator.py

 

동영상은 하나 획득하고, demo 디렉토리에 존재하는 shoes 디렉토리 전체를 삭제해주었습니다.

동영상은 linux 컴퓨터에서는 재생이 되지 않아서 따로 옮겨서 확인했습니다.

 

다음은 CenterPoseTracking 입니다.

python3 demo.py --demo shoes.mov --arch dla_34 --load_model ../models/CenterPoseTrack/shoe_15.pth --debug 4

마찬가지로 위 과정을 반복하면 동영상 결과가 나타납니다.

 

해당 결과 동영상입니다.

 

 

아래와 같은 CenterPose의 3 Group Network에 대한 각 결과와 최종 결과도 확인할 수 있습니다.

 

 

그럼 다음 번에는 다른 Object Pose Estimation 프로세스인

MegaPose와 BundleSDF를 수행하는 글을 작성하겠습니다.

 

728x90
반응형