Python 이미지 읽기 및 쓰기 방법 비교
훈련에 사용된 프레임워크는 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 이미지 읽기와 쓰기에 관한 더 많은 자료는 저희 다른 관련 글에 주목하세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.