Skip to content

역할 : 데이터 가공 및 Projection 후 gt_data 추출, 목적 : 이미지와 LiDAR 데이터가 들어있는 bagfile에서 이미지 데이터에 대한 monocular depth estimation을 진행한 후, LiDAR 데이터로 estimated depth를 평가하는 것.

License

Notifications You must be signed in to change notification settings

wangjinhoon/depth_estimation_project

 
 

Repository files navigation

Depth estimation Project

팀원 : 왕진훈, 전종원, 박한음

역할 : 데이터 가공 및 Projection 후 gt_data 추출

프로젝트 기간 : 2주

사용 언어 : Python

개발 환경 : Ubuntu18.04

사용 기술 스택 : MONODELSNet, PCL, OpenCV, ROS

프로젝트 목표

이미지와 LiDAR 데이터가 들어있는 bagfile에서 이미지 데이터에 대한 monocular depth estimation을 진행한 후, LiDAR 데이터로 estimated depth를 평가하는 것.

프로젝트 개요

image

  • rosbag파일로부터 image & LiDAR data 추츌.
  • 선정모델을 통해 추출된 image inference.
  • LiDAR data를 사용 가능한 gt data로 가공.
  • 가공된 gt data와 model inference값을 이용해 에러 계산.



선정모델

MONODELSNet: https://github.com/HMRC-AEL/MonoDEVSNet

특징

Real World data 비지도학습 + Virtual World data 지도학습을 통해 비지도학습만 있을 때 야기되는 문제점들을 극복.

선정이유

  • LiDAR 데이터를 GT로 사용

  • 성능향상 요소존재

    • Depth threshold 조정.
    • Backbone model 변경이 용이하도록 모듈화.
  • Input Image 크기와 상관 없이 적용가능.

  • KITTI Eigen 밴치마크에서 우수한 성능을 보임. (4등) image

  • 논문목적이 도로위에서의 traffic depth 추정을 목표로 함. (프로젝트와 방향성 유사)

  • fps 수치가 높음. → 실시간성 고려. (하드웨어 성능에 따라 변동 가능.)
    image



개선사항

전처리 & 후처리

  1. rosbag 파일에서 이미지&PCD파일 추출

    • pointcloud2topcl.py
    • get_frame.py
  2. LiDAR msg: image = 371: 1104 -> LiDAR 갯수에 맞게 image 3개당 1개 추출.

    • choose_img.py
  3. 추출한 PCD파일을 npz파일로 변환 & outlier 제거

    • pcd_to_bin.py
    • proj_lidar2cam.py(이미지에 라이다 projection)
    • create_gt_txt.py(outlier 제거포함)
    • txt_to_npz.py
  4. 이미지 캘리브레이션

    • calib_image.py
  5. 평가에 참여한 픽셀만 보여주는 히트맵 생성

    • image2cv.py

evaluation 코드 수정

  1. gt_data 받아오기
 gt_depth = self.gt_depths[iter_l]
                gt_height, gt_width = gt_depth.shape
                pred_disp = cv2.resize(pred_disp, (gt_width, gt_height), cv2.INTER_NEAREST)
                pred_depth = self.opt.syn_scaling_factor / pred_disp.copy()
  1. depth filter(0.1m < d < 120m) & Hitmap 생성코드 추가
gt_depth[gt_depth < self.opt.min_depth] = self.opt.min_depth
                gt_depth[gt_depth > self.opt.max_depth] = self.opt.max_depth
                pred_depth[pred_depth < self.opt.min_depth] = self.opt.min_depth
                pred_depth[pred_depth > self.opt.max_depth] = self.opt.max_depth

plat_gt_depth = gt_depth.reshape(-1)
plat_pred_depth = pred_depth.reshape(-1)

new_gt_depth, new_pred_depth = [], []
hitmap = np.zeros((gt_height, gt_width, 3), dtype=np.uint8)
for idx, item in enumerate(plat_gt_depth):
    if item > 0.1 and item < 80:
        new_gt_depth.append(item)
        new_pred_depth.append(plat_pred_depth[idx])
        hitmap[idx//gt_width, idx % gt_width] = [255,255,255]


img = Image.fromarray(hitmap, 'RGB')
img.save('mytest.png')
img.show()
  1. error 계산
errors_absolute.append(compute_errors(np.array(new_gt_depth), np.array(new_pred_depth)))
print('avg_FPS: {}' .format(1/avg_time))
        errors_absolute = np.array(errors_absolute).mean(0)
        print("/n")
        print("  " + ("{:>8} | " * 7).format("abs_rel", "sq_rel", "rmse", "rmse_log", "a1", "a2", "a3"))
        print(("&{: 8.4f}  " * 7).format(*errors_absolute.tolist()) + "\\\\")
        print('time taken for network model {}-{}: {}'.format(self.opt.models_fcn_name['encoder'], self.opt.num_layers, 1 / np.mean(time_for_each_frame)))



사용법

1. 모델 빌드

MONODELSNet git 참고 https://github.com/HMRC-AEL/MonoDEVSNet

2. bag파일에서 이미지와 라이다 데이터 추출.

  • pointcloud2topcl.py 내 bag파일 경로 & 토픽이름 설정.
    for topic, msg, t in rosbag.Bag('/demo.bag').read_messages():
    if topic == "/velodyne_points":
        pc_np, pc_pcl = convert_pc_msg_to_np(msg)
  • get_frame.py 실행 (이미지 저장)
    python get_frame.py --bag_file [bagfile경로] --output_dir [output dir경로] --image_topic [토픽이름]
    

3. gt값 가공

  • pcd_to_bin.py (save path, pcd file path 설정필요)
  • create_gt_txt.py (file path 설정필요)
folder_path = "/home/wjh/MonoDEVSNet/bin/"   # binfile path
save_path = "/home/wjh/MonoDEVSNet/gt"        # save file path
if not os.path.isdir(save_path):
   os.mkdir(save_path)

if not os.path.isdir(save_path):
   os.mkdir(save_path)


def start():
   n = 0
   file_list = os.listdir(folder_path)
   file_list = [str(i+1)+".bin" for i in  range(len(file_list))]
   img = f'/home/wjh/MonoDEVSNet/1.png'       # sample input image path 
   for j in file_list:
       n+=1
       binary = folder_path + j
       # calibration txt file path
       with open(f'/home/wjh/MonoDEVSNet/testing/calib/gn2.txt','r') as f:
  • txt_to_npz.py (txt 파일 path 설정 필요)

4. pretrained weight 다운로드

https://drive.google.com/drive/folders/1LZuBsG6XFjYnVwkELMENHjwfyRyRvjEs

5. evaluation 진행

  • evaluation.py 에 class evaluation init에 gt npz파일 수정.
gt_path = os.path.join(os.path.dirname(__file__), "splits", "eigen", "[gt npz파일 경로]")
  • 명령어 실행
python3 evaluation.py --dataset any --models_fcn_name encoder ResNet_18 --num_layers 18 --image_folder_path ../gt20_image/ --load_weights_folder ../MonoDELSNet_ResNet_18_HR/

6. 결과 확인

image


자세한 내용 Notion 링크

About

역할 : 데이터 가공 및 Projection 후 gt_data 추출, 목적 : 이미지와 LiDAR 데이터가 들어있는 bagfile에서 이미지 데이터에 대한 monocular depth estimation을 진행한 후, LiDAR 데이터로 estimated depth를 평가하는 것.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 97.8%
  • Shell 2.2%