자율주행AI챌린지 이후 PV-RCNN++ 성능 개선 목표로 잡음
리더보드 50점 이상까지 해볼 예정 (기간: ~ 11.14 까지)
개선방법1
개선방법5 + ROI_RER_IMAGE 개수 조정 + FG_RATIO 조정
개선방법2
개선방법5 + GRID_SIZE 변경
개선방법3
개선방법5 + Noise Augmentation 적용
이전에 적용했던 Noise 증강 방법이 생각보다 효과가 안 좋았어서 새롭게 적용하려고 함
https://cafe.daum.net/SmartRobot/RoVa/2380
augmentation_utils.py
def add_radial_noise_points(data_dict=None, config=None):
if data_dict is None or 'points' not in data_dict:
return data_dict
if config is None:
config = {}
points = data_dict['points']
num_original_points = points.shape[0]
# 설정값 불러오기
num_noise_points = int(config.get('NUM_NOISE_POINTS', 10000))
max_range = float(config.get('MAX_RANGE', 20.0)) # 기본값 20m로 유지
density_falloff = config.get('DENSITY_FALLOFF', 'linear')
stddev_xy_base = float(config.get('STDDEV_XY_BASE', 0.5))
stddev_xy_scale_factor = float(config.get('STDDEV_XY_SCALE_FACTOR', 0.1))
stddev_z_base = float(config.get('STDDEV_Z_BASE', 5.0)) # Z 높이 퍼짐 기본값 (예시)
stddev_z_scale_factor = float(config.get('STDDEV_Z_SCALE_FACTOR', 0.2)) # Z 높이 증가율 (예시)
intensity_min, intensity_max = config.get('INTENSITY_RANGE', [0.0, 0.1])
if num_noise_points <= 0 or max_range <= 0:
return data_dict
# --- Rejection Sampling으로 거리에 따라 밀도 감소하는 반지름 샘플링 ---
accepted_radii = []
# 목표 개수보다 더 많이 시도하여 효율 높임
# 너무 크면 메모리 문제, 너무 작으면 목표 개수 미달 가능성
candidate_multiplier = 5
num_candidates = num_noise_points * candidate_multiplier
# 1. 반지름 후보를 균일하게 대량 샘플링
r_candidates = np.random.uniform(0, max_range, num_candidates)
# 2. 수락 확률 계산
if density_falloff == 'linear':
p_accept = 1.0 - (r_candidates / max_range)
else: # 기본 linear
p_accept = 1.0 - (r_candidates / max_range)
# 3. 수락 여부 결정 (벡터화된 연산)
accept_mask = np.random.rand(num_candidates) < p_accept
accepted_radii = r_candidates[accept_mask]
# 4. 목표 개수만큼만 최종 선택 (무작위로)
if len(accepted_radii) > num_noise_points:
noise_radii = np.random.choice(accepted_radii, num_noise_points, replace=False)
else:
noise_radii = accepted_radii # 목표 미달 시 생성된 만큼만 사용
actual_num_noise = len(noise_radii)
if actual_num_noise == 0:
return data_dict # 노이즈 포인트 생성 실패
# --- 밀도 조절 샘플링 끝 ---
# --- 노이즈 포인트 좌표 생성 (이전과 동일) ---
noise_angles = np.random.uniform(0, 2 * np.pi, actual_num_noise)
noise_stddev_xy = stddev_xy_base + noise_radii * stddev_xy_scale_factor
base_x = noise_radii * np.cos(noise_angles)
base_y = noise_radii * np.sin(noise_angles)
noise_x = base_x + np.random.normal(0, noise_stddev_xy, actual_num_noise)
noise_y = base_y + np.random.normal(0, noise_stddev_xy, actual_num_noise)
noise_stddev_z = stddev_z_base + noise_radii * stddev_z_scale_factor
noise_z = np.random.normal(0, noise_stddev_z, actual_num_noise)
noise_z = np.maximum(noise_z, 0.0) # 지면 뚫기 방지
noise_intensity = np.random.uniform(intensity_min, intensity_max, actual_num_noise)
num_features = points.shape[1]
noise_points = np.zeros((actual_num_noise, num_features), dtype=points.dtype)
noise_points[:, 0] = noise_x
noise_points[:, 1] = noise_y
noise_points[:, 2] = noise_z
if num_features > 3:
noise_points[:, 3] = noise_intensity
combined_points = np.vstack((points, noise_points))
data_dict['points'] = combined_points
return data_dict
시각화 후 비교
test dataset은 수집차량 일정 거리 떨어진 후에 분산하는 형식인데
적용된 증강은 수집차량의 중심부터 분산을 하는 것도 차이가 있음
파인튜닝하지 않고 기존에 점수가 잘나왔던 설정에 증강만 추가하여 학습
이후로 수렴 확인 후 점수 제출
리더보드 점수
노이즈 증강을 구현할 때 정확히 test dataset에 들어간 증강이 무엇인지 파악하지 못해서 오히려 점수가 떨어진 것 같음....
개선방법4
개선방법5
그냥 설정에 학습률만 낮춰서 계속 돌려봄
이전에 수렴을 하지 않았어서 완전히 수렴할 때까지 돌려보려고 함
일단은 30epoch까지 돌려본 결과
무검출 오류 뜸...!
확인해보니까 설정파일에 잘못된 값을 넣고 그대로 돌렸는데 훈련 중에는 오류 안떠서 몰랐음...
다시 돌리는 중 내일 중으로 결과 나와서 업로드 할 예정
돌리면서 대회 관련 PPT 작성
현재 진행 상황 영상
이후 시각화 한 영상 (4분할 형식) 작성 예정
| 원본 영상 | Voxel-RCNN 추론 영상
|
PV-RCNN++ 추론 영상
| VoxelNeXt 추론 영상 |
첫댓글 동영상 만들때는 4개를 따로 동영상으로 만든후 obs studio 로 합성할것
연속촬영된 영상있는 포인트 클라우드를 찾을것 훈련데이터와 비슷해야 추론이 잘될것임-> etri or Waymo
넵