Depth Estimation with Monodepth2 using ROS

Monodepth2를 이용해 얻은 real-time depthmap을 ROS로 publish 하기!

Featured image

Get Real-time Depth Map from a Camera and Application to ROS

Author : 이 구

reference: https://github.com/nianticlabs/monodepth2

Environment Setting

OS: Ubuntu 18.04 Camera: Logitech BRIO
pytorch: 1.2.0
CUDA: 10.0
cudnn: 7.6.5
opencv: 4.3.0
GPU: RTX 2080Ti
ROS: melodic

Why?

Usage

하나의 카메라를 사용하여 실시간으로 depth map을 뽑을 수 있다.

without ros opencv

python3 depth_video.py --model_name [mono+stereo_640x192] --width [width] --height [height] 

with ros

python ROS_monodepth.py --model_name [mono+stereo_640x192] --width [width] --height [height] 

Execution Result

cv2를 이용하여 읽은 이미지를 이용하여 depth 추정 후, cv2로 출력 (depth_video.py)

</img>

ROS Image topic으로 받은 원본 이미지를 이용하여 depth를 추정한 후, ROS Image topic으로 publish (ROS_monodepth.py)

</img>

해상도에 따른 성능 변화

resolution | fps
————|—–
720 x 480 | 약 36 fps
1080 x 720 | 약 23 fps
1920 x 1080 | 약 8 fps

Improvement

기존의 ROS node graph

기존에 사용한 방식의 ros node graph는 아래와 같다.

</img>

기존의 방식에서 이미지 토픽을 몇 번 Publish 하게되는지 확인해보자.
/usb_cam에서 /detector_manager/usb_cam/image_raw topic을 한번, /detector_manager에서 /DetectedImgyolov3/image_raw topic을 한번, 마지막으로 /DetectedImg에서 /YOLO_RESULT topic을 한번 publish 하게 된다.

usb_cam을 통해 받은 이미지를, monodepth2로 depth map을 얻기 위해,/usb_cam/image_raw에서 /DepthMap으로 Image topic을 한번 더 받아오게 된다. 아직 구현하지는 못했지만, 이미지의 최종 정보에 DepthMap을 사용하여 추정한 거리 정보를 포함시킬 것이기 때문에, 최소 한번 이상의 추가적인 publish가 필요할 것이다.

이 점을 고려하면, 이미지 한 장이 노드 사이를 5번 이상 이동하게 되는 것이다. 이때, 동시에 처리하는 데이터의 양이 늘어날수록(bandwidth가 높아질수록), ROS 자체의 delay가 심해진다.
이로인해, 전체적인 시스템을 수정하게 되었다.

수정된 ROS node graph

</img>

새롭게 수정된 방식에서는, /usb_cam에서 /detector_manager/usb_cam/image_raw topic을 한번, /detector_manager에서 /PostProcessing으로 /yolov3/image_raw topic을 한번 publish 한 후, 한 노드 안에서 detect 결과의 시각화와 depth map 추정이 동시에 이루어지게 된다.

TO DO

  1. ROS Image topic을 받은 후, Depth 정보를 Image로 Publish (20.07.11)
  2. ROS를 사용하는 경우 심한 delay 발생… (20.07.13)
  3. DepthMap과 Bbox를 이용하여 인식된 객체의 거리 추정하기 (20.07.14)
  4. DepthMap estimation 결과를 출력하는 과정에서 normalization 없애기 (20.07.14)
  5. 인식된 객체의 실제 위치와 DepthMap의 Bbox pixel값 평균 비교하기 (20.07.16)