pkl 파일 열어서 정보 확인하는 법
kitti_infos_val.pkl 읽어와서 어떤 내용이 들어있는지 출력해봄
https://lungfish.tistory.com/entry/Python-%ED%94%BC%ED%81%B4-pickle-%ED%8C%8C%EC%9D%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0-%EB%B0%8F-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0
read_pkl.py
---------------------------------------------------------------------------------------------------------------------------------------
import pickle
from pprint import pprint
with open('kitti/kitti_infos_val.pkl', 'rb') as f:
data = pickle.load(f)
# 설명 딕셔너리 정의
explanations = {
'point_cloud': '포인트클라우드 정보',
'num_features': '포인트 당 feature 개수 (보통 x, y, z, intensity)',
'lidar_idx': '라이더 데이터 인덱스 (파일명 등)',
'image': '이미지 정보',
'image_idx': '이미지 인덱스 (png 파일명)',
'image_shape': '이미지 해상도 (height, width)',
'calib': '캘리브레이션 행렬 정보',
'P2': '카메라 투영 행렬 (LiDAR → 이미지)',
'R0_rect': '정렬 행렬 (Rectification)',
'Tr_velo_to_cam': 'LiDAR → 카메라 좌표계 변환 행렬',
}
# 리스트 기반 설명 출력
if isinstance(data, list):
sample = data[0]
for key, value in sample.items():
print(f"[{key}] {explanations.get(key, '')}:")
if isinstance(value, dict):
for sub_key, sub_val in value.items():
explain = explanations.get(sub_key, '')
print(f" - {sub_key}: {sub_val} # {explain}")
else:
print(f" {value}")
---------------------------------------------------------------------------------------------------------------------------------------
위를 확인해보면 포인트 클라우드에 관한 정보와 변환 행렬에 관한 정보, 이미지 정보와 GT 관련 정보가 있는 걸 확인할 수 있음
kitti dataset으로 정보파일을 만들었을 때 나오는 pkl 파일들, dbinfos는 뭔지?
---------------------------------------------------------------------------------------------------------------------------------------
info_path = 'kitti/kitti_dbinfos_train.pkl'
lidar_root = 'kitti/training/velodyne'
with open(info_path, 'rb') as f:
infos = pickle.load(f)
print(type(infos))
print(infos.keys())
---------------------------------------------------------------------------------------------------------------------------------------
자료형 확인 시 딕셔너리여서 keys() 사용하여 키값 확인함
이중 Car 키에 해당하는 value 값을 뽑아봄
print(infos['Car'])
'name': np.str_('Car'), # 클래스 이름
'path': 'gt_database/007479_Car_6.bin', # point cloud 인덱스
'image_idx': '007479', # 이미지 번호
'gt_idx': 6, # gt 박스의 인덱스
'box3d_lidar': array([ 39.83298492, -10.58649063, -0.94091094, 2.96 , 1.65 , 1.44 , -3.44079633]),
# x, y, z, dx, dy, dz, heading
'num_points_in_gt': 0, # GT 박스 내 포인트 개수
'difficulty': np.int32(2), # KITTI 난이도
'bbox': array([786.59, 180.7 , 820.4 , 208.38], dtype=float32), # 2D 바운딩 박스 (image에 그리는 정보. KITTI)
'score': np.float64(-1.0) # score 추론용이 아니라 그냥 초기값 넣어준 것 (-1)
여기에 있는 정보는 각 GT 객체에 관한 정보임
OPEN3D를 활용 시각화
pkl_visualization.py
---------------------------------------------------------------------------------------------------------------------------------------
import pickle
import os
import numpy as np
import open3d as o3d
info_path = 'kitti/kitti_infos_val.pkl'
lidar_root = 'kitti/training/velodyne'
with open(info_path, 'rb') as f:
infos = pickle.load(f)
print(type(infos))
print(len(infos))
lidar_idx = sample['point_cloud']['lidar_idx']
bin_path = os.path.join(lidar_root, f"{lidar_idx}.bin")
if not os.path.exists(bin_path):
raise FileNotFoundError(f"{bin_path} 파일 없음!")
pcd_np = np.fromfile(bin_path, dtype=np.float32).reshape(-1, 4)[:, :3] # 변환해서 좌표계 맞춰줌
annos = sample['annos']
gt_bbox = np.array(annos['gt_boxes_lidar'])
names = np.array(annos['name'])
vis = o3d.visualization.Visualizer() # 창 생성
vis.create_window(window_name="GT Viewer")
opt = vis.get_render_option()
opt.point_size = 1.0
opt.background_color = np.zeros(3)
pts = o3d.geometry.PointCloud() # 포인트 클라우드 생성
pts.points = o3d.utility.Vector3dVector(pcd_np)
pts.colors = o3d.utility.Vector3dVector(np.ones((len(pcd_np), 3)))
vis.add_geometry(pts)
for i in range(len(gt_bbox)): # 반복문 돌면서 gt_box 수만큼 돌음
box3d = o3d.geometry.OrientedBoundingBox() # 바운딩 박스 생성자
box3d.center = np.array(gt_bbox[i][0:3]) # x, y, z
box3d.extent = np.array(gt_bbox[i][3:6]) # l, w, h
rot = o3d.geometry.get_rotation_matrix_from_axis_angle([0, 0, gt_bbox[i][6]]) # 회전 정보 yaw
box3d.R = rot # 직접 대입
box3d.color = [0, 1, 0] # 컬러
vis.add_geometry(box3d) # 바운딩 박스 추가
vis.run()
vis.destroy_window()
---------------------------------------------------------------------------------------------------------------------------------------
첫댓글 dbinfos파일안에 있는 정보는 infos파일안에 있는건데 왜 따로 저장해둔건지요? 어디에 사용하려고?
infos 파일: 한 프레임 당의 여러 정보를 담고 있음 > 모델 학습이나 평가할 때 사용하는 목적
dbinfos 파일: GT-Sampling을 객체 단위로 정리해둠 > 증강 할 때 사용하는 목적
infos 파일에 있는 GT 정보로 증강 처리하기엔 GT 정보 외의 다른 정보들(calib, annos 등)이 많아서 dbinfos를 따로 생성해서 증강 처리에 사용하는 것 같습니다.. 정보 파일(.yaml)에서도 gt_sampling을 위해 dbinfos를 가져옵니다