2. Pillow(PIL) Vs CV(2)

1. type


img_cv = cv2.imread(image_list [1])
type(img_cv)
----------------------------------------------------
numpy.ndarray




img_PIL = Image.open(image_list [1])
type(img_PIL)
----------------------------------------------------
PIL.JpegImagePlugin.JpegImageFile

2. 부가설명

다음 사진은 보통 image를 model에 넣어주기 위해 tensor로 바꿔주는 ToTensor Class이다.

여기서 보면 F.to_tensor라는 함수를 사용한다.

이거 하나는 알고 가자.
Loss function을 만들다가 알게 되었는데 Torch는 기본적으로 C나 C++로 coding되었다.?
(정확이는 섞어 사용한거 같긴하다.)
그리고 분명 같은 기능을 하는데 class와 function 두개를 제공한다. 왜 굳이 두개를 제공하는지 몰랐는데 source code를 보다보니 알게 되었다.
이유는 다음과 같다.

function을 여러개 조합하여 class를 만든것이다.
즉, 진짜 기본적인 것은 function 어느정도 무게가 있는것은 class 이렇게 보면 될거 같다.
물론 ToTensor는 그냥 function하나 이긴하다.

그래서 .to_tensor을 보았다. 다음과 같다.

source code도 볼 수 있다.

보니까 PIL 또는 numpy를 Tensor로 바꿔준다.

다음 마찬가지의 방법으로 transforms.Resize 을 보니 input으로는 PIL Image or Tensor 이고 output으로는 PIL Image or Tensor이다.
음 numpy로 계산할줄 알았는데 아니다.

3. numpy까지의 속도 측정

start_time = time.time()

for i in tqdm(image_list):
    x = cv2.imread(i)

end_time = time.time()
    
print('time: %.4f min' %((end_time-start_time)/60))



start_time = time.time()

for i in tqdm(image_list):
    x = Image.open(i)
    y = np.array(x)
end_time = time.time()
    
print('time: %.4f min' %((end_time-start_time)/60))



start_time = time.time()

for i in tqdm(image_list):
    x = cv2.imread(i)

end_time = time.time()
    
print('time: %.4f min' %((end_time-start_time)/60))



start_time = time.time()

for i in tqdm(image_list):
    x = Image.open(i)
    y = np.array(x)
end_time = time.time()
    
print('time: %.4f min' %((end_time-start_time)/60))


----------------------------------------------------------------------------
100%|█████████████████████████████████████████████████████████████████████████████| 25331/25331 [04:45<00:00, 88.71it/s]
time: 4.7594 min
100%|█████████████████████████████████████████████████████████████████████████████| 25331/25331 [06:46<00:00, 62.32it/s]
time: 6.7746 min
100%|█████████████████████████████████████████████████████████████████████████████| 25331/25331 [04:45<00:00, 88.75it/s]
time: 4.7569 min
100%|█████████████████████████████████████████████████████████████████████████████| 25331/25331 [06:47<00:00, 62.18it/s]
time: 6.7892 min

4. tensor까지의 속도 측정

start_time = time.time()

for i in tqdm(image_list):
    x = cv2.imread(i)
    x = torchvision.transforms.functional.to_tensor(x)
end_time = time.time()
    
print('time: %.4f min' %((end_time-start_time)/60))



start_time = time.time()

for i in tqdm(image_list):
    x = Image.open(i)
    x = torchvision.transforms.functional.to_tensor(x)
end_time = time.time()
    
print('time: %.4f min' %((end_time-start_time)/60))



start_time = time.time()

for i in tqdm(image_list):
    x = cv2.imread(i)
    x = torchvision.transforms.functional.to_tensor(x)
end_time = time.time()
    
print('time: %.4f min' %((end_time-start_time)/60))



start_time = time.time()

for i in tqdm(image_list):
    x = Image.open(i)
    x = torchvision.transforms.functional.to_tensor(x)
end_time = time.time()
    
print('time: %.4f min' %((end_time-start_time)/60))


----------------------------------------------------------------------------
100%|█████████████████████████████████████████████████████████████████████████████| 25331/25331 [10:15<00:00, 41.15it/s]
time: 10.2607 min
100%|█████████████████████████████████████████████████████████████████████████████| 25331/25331 [11:31<00:00, 36.63it/s]
time: 11.5246 min
100%|█████████████████████████████████████████████████████████████████████████████| 25331/25331 [08:57<00:00, 47.12it/s]
time: 8.9595 min
100%|█████████████████████████████████████████████████████████████████████████████| 25331/25331 [12:03<00:00, 35.03it/s]
time: 12.0526 min



전혀 예상치 못한 문제가 발생했는데
cv2는 target마저도 3개의 channel로 읽어버리네;;
cv2.imread(list1, cv2.IMREAD_GRAYSCALE)이렇게 해주면 된다.

또한 PIL은 RGB
CV2는 BGR

좋은 웹페이지 즐겨찾기