Object Pose Optimization 방식 중 하나인 CenterPose 예제 구동을 위해 환경 구성 및 구현을 수행하는 글입니다.
CenterPose는 Category에 존재하는 Monocular RGB Input Source 만으로도
Object의 3D Object Bounding Box를 Output으로 도출할 수 있습니다.
2022년 ICRA에 등재된 논문이고 해당 논문에 대한 소개는 아래 글을 참조하시기 바랍니다.
이러한 Object Pose Estimation에 관한 연구는 최근 Robotics 의 발전에 따라 꾸준히 발전해나가고 있습니다.
Object 의 Pose를 알면 어디를 잡아야 유리한지 로봇이 학습을 할 수 있겠죠.
비록 2022년 논문이라 더더욱 최신 기술이 많이 나왔지만,
(하루가 다르게 세상이 바뀌는 듯 합니다. 정말 너무너무 빠른 것 같습니다.)
간단하게 RGB camera 만으로도 학습된 category 가 존재하는 물체에 대해
Pose Estimation이 가능하다는 장점이 있어 해당 Git을 참조하여 예제를 환경 구성부터 수행해보았습니다.
참조로 제가 예제를 수행한 운영체제는 Ubuntu 22.04 입니다.
Nvidia Driver 설치
먼저 Nvidia Driver를 체크해주었습니다.
Additional Drivers 앱을 열어 확인해보니 아래와 같이 Nvidia Driver가 없는 상태였습니다.
아래 레퍼런스를 참조하여 설치를 진행해주었습니다.
제가 수행한 과정을 요약해보았습니다.
터미널을 열어 아래 명령을 입력합니다.
sudo ubuntu-drivers devices
설치 가능한 그래픽을 확인할 수 있습니다.
recommended 가 떠있는 최신버전으로 설치해주었습니다.
sudo apt install nvidia-driver-525
시간이 꽤 소요되며, 설치가 완료되고 재부팅해주었습니다.
sudo reboot
Cuda 설치 (Nvidia 드라이버 존재 상태에서)
저는 CUDA 11.5 가 설치되어 있었는데 11.8로 업그레이드를 하길 원했습니다.
그래서 설치 과정과 동일하게 업그레이드를 수행해주었습니다.
좋은 레퍼런스가 이미 있습니다.
아마도 하나 잘못된 설명은 nvidia-smi
명령을 수행했을 때
우측 상단에 뜨는 CUDA version은 현재 설치된 버전이 아닌,
현재 존재하는 드라이버의 추천 버전을 나타내는 것으로 알고있습니다.
위 블로그를 따라서 천천히 수행하면 nvcc -V 를 입력했을 때
성공적으로 CUDA가 11.8로 업그레이드 되었음을 확인할 수 있습니다.
레퍼런스 글에서 마지막 부분의 bashrc 수정하는 것을 잊지 마시길 바랍니다.
cuDNN 설치
cuda를 업그레이드 해줬으니 그에 맞는 cuDNN 설치를 해주겠습니다.
CUDA 버전에 맞는 cuDNN은 아래 사이트를 참조하시기 바랍니다.
이것도 마찬가지로 레퍼런스 글을 따라갔습니다.
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에 맞는 값을 아래 링크에서 찾으셔야합니다.
저는 Geforce RTX 2080 Ti 라서 7.5였습니다.
OPENCV_EXTRA_MODULES_PATH
와 OPENCV_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 시킵니다.
저는 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 디렉토리로 옮겨줍니다.
아래 .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의 차이는 다음 문서에서 확인할 수 있습니다.
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를 수행하는 글을 작성하겠습니다.