Naver AI Tech 7기/LEVEL1

Week4 주간 학습정리 - [CV 이론]

지혜의 시작 2024. 8. 30. 14:57
728x90

 

추후 할 것 : 강의에 나오는 많은 논문 중에 재밌어 보이는 (관심이 가는) 논문 정해서 깊게 공부 후 블로그에 정리하기 

 

개념/code 학습 중 생긴 이슈 및 해결 방법에 대해 기록하자

개념 Issue & Solution

1. PyTorch에서 이미지 Shape

PyTorch에서 이미지 텐서는 (C, H, W) 형식으로 나타남.

  • C: 채널 수 (예: RGB 이미지의 경우 3)
  • H: 높이 (Height)
  • W: 너비 (Width)

이와 반대로, PIL 이미지나 대부분의 넘파이 배열에서는 이미지 데이터가 (H, W, C) 형식으로 저장됨.

 

PyTorch는 텐서에서

(C, H, W)

순서를 사용하고, TensorFlow와 Keras는

(H, W, C)

순서를 사용.

 

2. PyTorch에서 사용하는 표준적인 이미지 데이터 형식

[B, in_chans, H, W]와 같은 텐서 형태는 PyTorch에서 사용하는 표준적인 이미지 데이터 형식.

  • B: 배치 크기 (Batch size) - 한 번에 처리할 이미지의 수
  • in_chans: 채널 수 (Number of input channels) - 일반적으로 RGB 이미지는 3개의 채널을 가지며, 흑백 이미지는 1개의 채널을 가짐
  • H: 높이 (Height) - 이미지의 세로 크기
  • W: 너비 (Width) - 이미지의 가로 크기

PyTorch는 데이터의 순서가 [B, C, H, W] (Batch, Channel, Height, Width)인 형식을 사용. 이는 PyTorch가 데이터를 처리할 때 가장 효율적인 방식으로 설계되었기 때문.

 

TensorFlow/Keras: [B, H, W, C] 형식을 주로 사용. 여기서 채널(C)이 마지막에 위치.

이 차이 때문에, 다른 프레임워크 간에 모델이나 데이터셋을 변환할 때는 텐서의 차원을 변경(transpose 또는 permute 연산)하는 과정이 필요할 수 있음~~

 

 

Code Issue & Solution

1. pyplot의 imshow

matplotlib.pyplot.imshow는 일반적으로 넘파이 배열을 입력으로 받아서 이미지를 표시.

하지만, torch.Tensor를 직접 imshow에 넘길 수 있으며, matplotlib는 이를 처리할 수 있음.

다만, torch.Tensor (C, H, W) 형식일 때, 이를 imshow에 사용하려면 (H, W, C) 형식으로 변환해야 함.

 

이 변환은 permute를 사용하여 수행할 수 있음.

permute(1, 2, 0): 텐서를 (C, H, W)  (H, W, C) 형식으로 변환. (imshow가 기대하는 형식)

 

 

imshow 사용: plt.imshow는 PyTorch 텐서와 호환되며, 넘파이 배열로의 변환 없이 직접 텐서를 사용할 수 있음!!

 

2. x = x.flatten(2) 

 

flatten 함수의 역할

  • flatten 함수는 텐서의 특정 차원을 시작으로 그 이후의 모든 차원을 합쳐서 하나의 차원으로 만들어줌.
  • flatten(2)는 텐서의 2번째 차원(인덱스로는 2번)을 시작으로 그 이후의 모든 차원을 합쳐 하나의 차원으로 만드는 것.
  • 즉, grid_size x grid_size 차원을 합쳐서 num_patches라는 새로운 차원으로 변경.

 

x.flatten(2)의 결과

  • 원래 텐서의 형태: [B, embed_dim, grid_size, grid_size]
  • flatten(2)의 적용 결과: [B, embed_dim, grid_size * grid_size]
  • grid_size * grid_size는 num_patches에 해당.
  • 따라서 이 라인의 결과는 [B, embed_dim, num_patches] 형태의 텐서.

 

최종 형태 설명

  • x = x.flatten(2)은 텐서의 형태를 [B, embed_dim, grid_size, grid_size]에서 [B, embed_dim, num_patches]로 변경. 이 변경은 모델에서 이후의 레이어에서 입력으로 사용할 수 있도록 데이터를 준비하는 과정.

 

왜 필요한가?

  • 패치마다 임베딩 벡터가 있으므로, 각 패치의 임베딩을 일렬로 나열한 형태가 필요.
  • 따라서, grid_size x grid_size라는 2D 구조를 num_patches라는 1D 구조로 변경하여 각 패치를 순차적으로 처리할 수 있게 함.
  • 이 작업을 통해 모든 패치를 하나의 차원에 모아, 나중에 이를 활용하여 각 패치에 대한 처리를 일관되게 수행할 수 있음.

 

Retrospect

 

 

단순 개발자가 아닌 problem solver가 되자!


단순히 이론만 쌓는 것에 급급하기 보다는 AI 업계 흐름과 세상 문제에 집중하자!

 

남과 비교하지 말고 나의 부족한 부분을 매일 채워 나가자!

 

 

 

 

728x90