본문 바로가기

연구/pytorch

[img 시각화] tensor로 변환된 이미지를 cv2.imshow 하기

반응형

1. tensor 로 변환된 이미지는 [C,H,W] 형태를 가지고 있으나 cv2.imshow 하려면 numpy형태로 바꾸어야한다.

numpy 형태는 [H,W,C] 형태를 말한다.

 

2. 원본이미지가 numpy에서 tensor로 변환되는 과정에서 normalize도 하게되는데 이때 이미지를 시각화하기 위해서는 /255. 로 normalize 됐는지, 

transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])

이 코드처럼 IMAGENET 형식으로 normalize 됐는지를 알아야한다. 알고나면 denormalize 작업을 다음과 같이 하면 된다.

# /255. 로 normalize 된 경우
image = image * 255.0

# IMAGENET 형식으로 normalize 된 경우
IMAGENET_MEAN, IMAGENET_STD = np.array([0.485, 0.456, 0.406]), np.array([0.229, 0.224, 0.225])
image = np.clip(255.0 * (image * IMAGENET_STD + IMAGENET_MEAN), 0, 255)

 

3. 이 상태에서 바로 vis 하면 이미지가 전체적으로 파랗게 보이는데 이는 RGB 채널 순서를 잘못 정렬했기 때문이다. 이는

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

코드로 해결할 수 있다.

 

 

4. 정리하면 다음과 같은 코드가 될것이다.

img = data['img'] # Tensor형태의 이미지. [C, H, W]
img = img.detach().cpu().numpy() # tensor -> numpy
img = np.transpose(img, (1, 2, 0)) # [C,H,W] -> [H,W,C]
img = denormalize(img) # *255 or IMAGENET denorm 방법
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # RGB 채널
img = img.astype(np.uint8).copy() # np.float32 -> np.uint8

cv2.imshow('w', img)
cv2.waitKey(0)

 

반응형