코딩 및 기타
ynet 작업 1
정지홍
2025. 11. 18. 15:18


- 이 함수는 백본(ResNet)이나 Y-Net encoder에 바로 넣을 수 있는 형태로 맞춰주는것.
- 입력값
- images라는 딕셔너리
- 출력값
- 반환값은 없다.
- 대신 images[ key ]가 전부 torch.FloatTensor( C , H , W )형태로 바뀜.
- 일반 RGB이미지라면, C=3
- segmentation이라면, C=classes ( one-hot 채널 수 )
- line 64 ~ line70
- 해당 라인들은 정규화 파라미터 설정 부분이다...
- 왜 필요한가?
- Resnet과 같은 backbone은 ImageNet데이터(0~1 스케일)를 mean/std로 정규화한 상태를 기준으로 학습됨...
이로 인해서, 학습때와 다른 분포의 입력을 넣으면 성능이 확 떨어질 수 있음. - 그래서.... 만약에 encoder_weight is None이라면 ( line 64 65 66 )
- ==> "사전학습 가중치 사용 안함" + " 그냥 raw image 넣겠다"를 의미.
- 그래서... 만약 else문에 빠진다면... ( line 67 68 69 )
- ==> " 나는 ImageNet으로 pretrain된 모델을 쓴다"를 의미... 일반적으로 쓰는 mean,std는 line 69 70과 같다.
- Resnet과 같은 backbone은 ImageNet데이터(0~1 스케일)를 mean/std로 정규화한 상태를 기준으로 학습됨...
- line 72부터~~~
- 여기서 list( images.items() )를 사용해서, 처음 상태의 (key , value)들을 list로 복사해두고, 그걸 기준으로 순회.
- seg_mask=True라면....
- line 77 78은 seg_mask가 float형일수 있으니, int로 캐스팅.
- line 79는 one-hot 변환 ...
- => np.stack( [ ( im == v ).astype(np.float32) for v in range (classes) ] , axis=-1 )
- 만약에 classes가 6이라면....
v = 0 , 1, 2, 3, 4, 5에 대해서 반복.....( im== v ) → HxW boolean mask ( True / False )
- seg_mask=False라면...
- RGB 이미지 전처리이다.
- line 83을 통해서, 데이터 타입을 float으로 변경한다. ( 즉, 정수 이미지를 실수 텐서로 변경 )
- line 86에서 arr가 1보다 크다면, 정규화가 되지 않았다는 것을 의미... 그래서 line 87에서 255.0으로 나눈다.
- line 88로 정규화를 한다.

- line 12 : torch.load
- 이 함수는 pytorch에서 저장해둔 객체를 다시 메모리로 불러오는 함수이다.
- 즉, 가중치 딕셔너리를 메모리로 불러옴.
- line 15 : load_state_dict( state )
- state안에 존재하는 가중치들을 ynet_vis.model이라는 신경망에 집어 넣어라
- line 17 : model.device( )
- 모델을 gpu/cpu로 할지 결정하고, model이라는 참조변수를 선언
- line 18 : model.eval()
- 모델을 추론 모드로 설정한다.
- 이와 반대되는 것은 model.train()이다.
- line 23 : obs_len
- line 24 : pred_len
- line 25 : total_len = obs_len + pred_len
- line 27 : val_dataset = SceneDataset( df_val , resize=0.25 , total_len=20 )
- df_val을 scene별로 trajectory를 모으고,
total_len기준으로 window를 자르고,
resize 배율을 곱해서 좌표 스케일을 맞춘다.
- df_val을 scene별로 trajectory를 모으고,
- line 29 : val_loader = DataLoader( val_dataset , batch_size=1 , shuffle=False , collate_fn=scene_collate )
- val_dataset에서 batch_size단위로 묶어서 넘겨주는 반복기(iterable) 역할이다.
- 즉, “반복적으로 데이터를 뱉어내는 객체”이다.
- line 58 : resize( vis_images , factor=params['resize'] , seg_mask=False )
- 이미지 딕셔너리를 한번에 resize해주는 함수...
- 그리고 seg_mask에 따라서 interpolation방식을 다르게 사용...
- seg_mask=True라면.. cv2.INTER_NEAREST 적용
- seg_mask=False라면,, cv2.INTER_AREA적용
- line 62 : pad( seg_images , division_factor=ynet_vis.division_factor )
- “Y-Net이 요구하는 해상도에 맞게 세그멘테이션 이미지를 패딩해라”이다.
- line 63 : preprocess_image_for_segmentation( seg_images , seg_mask=seg_mask )
- line 69 : create_dist_mat으로 커다란 거리 템플릿을 하나 만든다... 즉, "입력용(과거/waypoint) 채널을 만든다"
- line 70 : create_gaussian_heatmap_template은 "정답 히트맵 만들기"이다.