Python 이미지 읽기 및 쓰기 방법 비교

1 실험 표준
훈련에 사용된 프레임워크는 Pytorch이기 때문에 다음과 같은 실험 기준을 읽을 수 있습니다.
1. 읽기 해상도가 1920x1080인 그림 5장(png 형식 1장, jpg 형식 4장)을 그룹에 저장합니다.
2. 읽은 그룹을 차원 순서 CxHxW의 Pytorch 장량으로 변환하여 메모리에 저장합니다. 이 중 세 채널의 순서는 RGB입니다.
3. 각 방법이 상기 조작에 소모된 시간을 기록한다.png 형식의 그림 크기 차이가 많지 않기 때문에 질량에 미세한 차이가 있는 jpg 형식의 10배이기 때문에 데이터 집합은 보통 png으로 저장하지 않고 이 두 형식의 읽기 시간 차이를 비교하지 않는다.
쓰기 실험 기준은 다음과 같습니다.
1. 1920x1080의 5개 이미지에 대응하는Pytorch 장량을 대응하는 방법으로 사용할 수 있는 데이터 형식 그룹으로 변환합니다.
2、jpg 형식으로 다섯 장의 그림을 저장합니다.
3. 각 방법으로 그림을 저장하는 데 걸리는 시간을 기록한다.
2 실험 상황
2.1  cv2
GPU가 있기 때문에 cv2에서 그림을 읽는 방법은 두 가지가 있습니다.
1. 먼저 그림을numpy수조로 읽고 GPU에 저장된pytorch장량으로 변환합니다.
2. GPU에 저장된pytorch 장량을 초기화하고 모든 그림을 이 장량에 직접 복사합니다.
첫 번째 실험 코드는 다음과 같습니다.

import os, torch
import cv2 as cv 
import numpy as np 
from time import time 
 
read_path = 'D:test'
write_path = 'D:test\\write\\'
 
# cv2  1
start_t = time()
imgs = np.zeros([5, 1080, 1920, 3])
for img, i in zip(os.listdir(read_path), range(5)): 
 img = cv.imread(filename=os.path.join(read_path, img))
 imgs[i] = img 
imgs = torch.tensor(imgs).to('cuda')[...,[2,1,0]].permute([0,3,1,2])/255 
print('cv2  1:', time() - start_t) 
# cv2 
start_t = time()
imgs = (imgs.permute([0,2,3,1])[...,[2,1,0]]*255).cpu().numpy()
for i in range(imgs.shape[0]): 
 cv.imwrite(write_path + str(i) + '.jpg', imgs[i])
print('cv2  :', time() - start_t)
실험 결과:
cv2 읽기 시간 1:0.39693760871887207
cv2 저장 시간: 0.3560612201690674
두 번째 실험 코드는 다음과 같습니다.

import os, torch
import cv2 as cv 
import numpy as np 
from time import time 
 
read_path = 'D:test'
write_path = 'D:test\\write\\'
 
 
# cv2  2
start_t = time()
imgs = torch.zeros([5, 1080, 1920, 3], device='cuda')
for img, i in zip(os.listdir(read_path), range(5)): 
 img = torch.tensor(cv.imread(filename=os.path.join(read_path, img)), device='cuda')
 imgs[i] = img  
imgs = imgs[...,[2,1,0]].permute([0,3,1,2])/255 
print('cv2  2:', time() - start_t) 
# cv2 
start_t = time()
imgs = (imgs.permute([0,2,3,1])[...,[2,1,0]]*255).cpu().numpy()
for i in range(imgs.shape[0]): 
 cv.imwrite(write_path + str(i) + '.jpg', imgs[i])
print('cv2  :', time() - start_t)
실험 결과:
cv2 읽기 시간 2:0.23636841773986816
cv2 저장 시간: 0.3066873550415039
2.2  matplotlib
두 가지 읽기 방식과 마찬가지로 첫 번째 코드는 다음과 같습니다.

import os, torch 
import numpy as np
import matplotlib.pyplot as plt 
from time import time 
 
read_path = 'D:test'
write_path = 'D:test\\write\\'
 
# matplotlib   1
start_t = time()
imgs = np.zeros([5, 1080, 1920, 3])
for img, i in zip(os.listdir(read_path), range(5)): 
 img = plt.imread(os.path.join(read_path, img)) 
 imgs[i] = img  
imgs = torch.tensor(imgs).to('cuda').permute([0,3,1,2])/255 
print('matplotlib  1:', time() - start_t) 
# matplotlib  
start_t = time()
imgs = (imgs.permute([0,2,3,1])).cpu().numpy()
for i in range(imgs.shape[0]): 
 plt.imsave(write_path + str(i) + '.jpg', imgs[i])
print('matplotlib  :', time() - start_t)
실험 결과:
matplotlib 읽기 시간 1:0.45380306243896484
matplotlib 저장 시간: 0.768944263458252
두 번째 방법 실험 코드:

import os, torch 
import numpy as np
import matplotlib.pyplot as plt 
from time import time 
 
read_path = 'D:test'
write_path = 'D:test\\write\\'
 
# matplotlib   2
start_t = time()
imgs = torch.zeros([5, 1080, 1920, 3], device='cuda')
for img, i in zip(os.listdir(read_path), range(5)): 
 img = torch.tensor(plt.imread(os.path.join(read_path, img)), device='cuda')
 imgs[i] = img  
imgs = imgs.permute([0,3,1,2])/255 
print('matplotlib  2:', time() - start_t) 
# matplotlib  
start_t = time()
imgs = (imgs.permute([0,2,3,1])).cpu().numpy()
for i in range(imgs.shape[0]): 
 plt.imsave(write_path + str(i) + '.jpg', imgs[i])
print('matplotlib  :', time() - start_t)
실험 결과:
matplotlib 읽기 시간 2:0.204532299041748
matplotlib 저장 시간: 0.4737534523010254
주의해야 할 것은 matplotlib가 png 형식의 그림을 읽고 얻은 수조의 수치는 [0,1][0,1] 범위 내의 부동점수이고 jpg 형식의 그림은 [0255][0255] 범위 내의 정수이다.따라서 데이터 집합 안의 그림 형식이 일치하지 않으면 먼저 일치하는 것으로 바꾸고 읽어야 한다. 그렇지 않으면 데이터 집합의 사전 처리가 번거롭다.
2.3  PIL
PIL의 읽기와 쓰기는pytorch장량이나numpy수조를 직접 사용할 수 없으며, 먼저 Image 형식으로 변환해야 하기 때문에 매우 번거롭고, 시간의 복잡도에서도 틀림없이 하위권을 차지하기 때문에 실험하지 않을 것이다.
2.4  torchvision
torchvision은 pytorch에서 그림을 직접 저장하는 기능을 제공하고 위에서 가장 빠른 matplotlib를 읽는 방법과 결합하여 코드는 다음과 같다.

import os, torch 
import matplotlib.pyplot as plt 
from time import time 
from torchvision import utils 

read_path = 'D:test'
write_path = 'D:test\\write\\'
 
# matplotlib   2
start_t = time()
imgs = torch.zeros([5, 1080, 1920, 3], device='cuda')
for img, i in zip(os.listdir(read_path), range(5)): 
 img = torch.tensor(plt.imread(os.path.join(read_path, img)), device='cuda')
 imgs[i] = img  
imgs = imgs.permute([0,3,1,2])/255 
print('matplotlib  2:', time() - start_t) 
# torchvision  
start_t = time() 
for i in range(imgs.shape[0]):  
 utils.save_image(imgs[i], write_path + str(i) + '.jpg')
print('torchvision  :', time() - start_t)
실험 결과:
matplotlib 읽기 시간 2:0.153588294982016
torchvision 저장 시간: 0.14760661125183105
이 두 가지가 가장 빠른 읽기와 쓰기 방법이라는 것을 알 수 있다.또한 그림의 읽기와 쓰기가 훈련 과정에 최대한 영향을 주지 않도록 해야 한다. 우리는 이 두 과정과 훈련을 병행할 수 있다.또한utils.save_image는 여러 장의 그림을 한 장으로 결합하여 저장할 수 있으며 구체적인 사용 방법은 다음과 같다.

utils.save_image(tensor = imgs,   #   shape = [n, C, H, W]
         fp = 'test.jpg',  #  
         nrow = 5,     #  , 
         padding = 1,    #  , 
         normalize = True, #  , tanh,  
         range = (-1,1))  #  
이상은Python 이미지 읽기와 쓰기 방법에 대한 상세한 내용입니다.python 이미지 읽기와 쓰기에 관한 더 많은 자료는 저희 다른 관련 글에 주목하세요!

좋은 웹페이지 즐겨찾기