코딩 및 기타

ynet 작업 1

정지홍 2025. 11. 18. 15:18

resize 함수

 

preprocess_image_for_segmentation

  • 이 함수는 백본(ResNet)이나 Y-Net encoder바로 넣을 수 있는 형태로 맞춰주는것.
  • 입력값
    • images라는 딕셔너리
  • 출력값
    • 반환값은 없다.
    • 대신 images[ key ]가 전부 torch.FloatTensor( C , H , W )형태로 바뀜.
      • 일반 RGB이미지라면, C=3
      • segmentation이라면, C=classes ( one-hot 채널 수 )
  • line 64 ~ line70 
    • 해당 라인들은 정규화 파라미터 설정 부분이다...
    • 왜 필요한가?
      • Resnet과 같은 backboneImageNet데이터(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과 같다.
  • 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_valscene별trajectory를 모으고,
      total_len기준으로 window를 자르고,
      resize 배율을 곱해서 좌표 스케일을 맞춘다.
  • 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은 "정답 히트맵 만들기"이다.