안녕하세요 Pulluper입니다. 😁
이번에는 이미지를 python에서 불러오는 여러 library의 비교를 통해 정리를 해 보겠습니다. 각 library의 자료형이나, size의 구성 shape 등을 다루는데, 헷갈리는 부분이 있어서 정리를 해 보겠습니다. 대상은 PIL, cv2, pytorch입니다.
1) PIL
이 library는 python imaging library의 약자입니다.
- 설치방법
pip install image
- 이미지 load / visualization
from PIL import Image
# 0. set root
root = './figures'
image_path = os.path.join(root, '000001.jpg')
# 1. load PIL image
img_pil = Image.open(image_path)
# 2. visualize PIL image
img_pil.show()
PIL image.show() 를 하면 다음과 같이 이미지가 띄워집니다. 우리가 이미지를 더블 클릭 했을때처럼 기본 연결프로그럄으로 이미지를 띄워줍니다.
- PIL image 속성
print(img_pil.size)
print(img_pil.mode)
print(img_pil.bits)
는 다음과 같은 결과를 보입니다.
(353, 500)
RGB
8
즉, PIL 은 size : (w, h) / dtype : uint8, / format : RGB 임을 알 수 있습니다.
2) CV2
이 library는 opencv이며, 다양한 computer vision의 알고리즘들이 잘 구현된 library입니다. https://opencv.org/ 에서 더 많은 정보를 얻을 수 있습니다.
- 설치방법
pip install opencv-python
- 이미지 load / visualization
import cv2
# load cv2 image
img_cv2 = cv2.imread(image_path)
# visualize cv2 image
cv2.imshow('img_cv2', img_cv2)
cv2.waitKey(0)
cv2는 구성이 numpy의 ndarray 이고, cv2.imshow() 는 다음과 같이 새 창을 띄워서 이미지를 보여줍니다. cv2.waitKey(0)는 이미지를 계속 띄우라는 명령어 입니다.
- cv2 image 속성
print(img_cv2.shape)
print(img_cv2.dtype)
이것의 결과는 다음과 같습니다.
(500, 353, 3)
uint8
자 여기서 보면 cv2 의 shape는 (h, w, c) 입니다. 그리고 cv2는 특이하게 rgb 이미지format이 아니라 bgr입니다. 그리고 기본 data type은 uint8 입니다.
3) Pytorch
사실 pytorch가 위의 두 library처럼 이미지 처리에 특화된 library가 아니지만, 우리가 image data를 이용할 때, PIL 또는 cv2와 연동해서 tensor 로 변경 할 필요가 있습니다.
- PIL을 이용해서 tensor로 변경하기
from PIL import Image
import torchvision.transforms.functional as F
img_pil = Image.open(image_path)
img_tensor = F.to_tensor(img_pil)
pil image를 불러온 다음, torchvision의 functional 에서 to_tensor() 함수를 이용해서 tensor로 변경 해 줍니다.
- tensor 속성
print(img_tensor.size())
print(img_tensor.shape)
print(img_tensor.dtype)
다음 코드의 결과는 다음과 같습니다.
torch.Size([3, 500, 353])
torch.Size([3, 500, 353])
torch.float32
이말인 즉슨, tensor의 shape은 (c, h, w) 이고, dtype 은 float32 (0~1)이라는 것 입니다.
- tensor visualization
import matplotlib.pyplot as plt
plt.figure('input')
plt.imshow(img_tensor.permute(1, 2, 0))
plt.show()
저는 tensor를 visualization 할 때는 보통 matplotlib를 사용합니다. 이때 위 코드에서 permute를 통해서 (c, h, w) 의 shape를 (h, w, c) 로 변경해 주는 부분이 필요합니다.
정리
PIL | cv2 | tensor(pytorch) | |
function for size/shape | .size | .shape | .size() / .shape |
shape / size | (w, h) | (h, w, c) | (c, h, w) |
dtype | uint8 | uint8 | float32 |
range | 0 - 255 | 0 - 255 | 0 - 1 |
format | RGB | BGR | RGB |
작업을 하다보면 코드마다 사용한 library 가 달라서 어떤 처리를 위하여 이 정보가 필요한 수도 있습니다. 😂 (저는 종종 있었습니다.)
Quiz 위에서 다룬 정보를 이용하면 다음 작업들을 할 수 있게 됩니다. 한번 도전해보세요~😎😎😎
1. How to convert PIL to cv2
2. How to convert cv2 to tensor
3. How to convert PIL to tensor
4. 특정 부분을 바꾸기 (cv2 사용)
5. PIL to tensor, cv2 to tensor 같게 만들기
감사합니다.
의견과 토론은 항상 환영합니다.
'Pytorch' 카테고리의 다른 글
[Pytorch] 분류(classification)문제 에서 label 변환 (one-hot vs class) (0) | 2022.12.04 |
---|---|
[Pytorch] pytorch 에서 np.where 처럼 index 가져오기 (0) | 2022.08.17 |
[Pytorch] Distributed package 를 이용한 분산학습으로 Multi-GPU 효율적으로 사용하기 (4) | 2022.06.15 |
[Python] python model config 하기 - configuration (argparse, ymal) 이용 (0) | 2021.09.14 |
[Pytorch] window cuda v9.0, pytorch1.2.0 에서 cuda v10.1, pytorch 1.5.0 설치하기 (6) | 2020.06.17 |
댓글