欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python圖像讀寫方法對比

 更新時間:2020年11月16日 08:42:45   作者:頎周  
這篇文章主要介紹了Python圖像讀寫方法對比的相關資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

1  實驗標準

  因為訓練使用的框架是Pytorch,因此讀取的實驗標準如下:

  1、讀取分辨率都為1920x1080的5張圖片(png格式一張,jpg格式四張)并保存到數組。

  2、將讀取的數組轉換為維度順序為CxHxW的Pytorch張量,并保存到顯存中(我使用GPU訓練),其中三個通道的順序為RGB。

  3、記錄各個方法在以上操作中所耗費的時間。因為png格式的圖片大小差不多是質量有微小差異的jpg格式的10倍,所以數據集通常不會用png來保存,就不比較這兩種格式的讀取時間差異了。

  寫入的實驗標準如下:

  1、將5張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.2044532299041748
matplotlib 保存時間: 0.4737534523010254

  需要注意的是,matplotlib讀取png格式圖片獲取的數組的數值是在[0,1][0,1]范圍內的浮點數,而jpg格式圖片卻是在[0,255][0,255]范圍內的整數。所以如果數據集內圖片格式不一致,要注意先轉換為一致再讀取,否則數據集的預處理就麻煩了。

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.15358829498291016
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, # 是否進行規(guī)范化,通常輸出圖像用tanh,所以要用規(guī)范化 
         range = (-1,1))  # 規(guī)范化的范圍

以上就是Python圖像讀寫方法對比的詳細內容,更多關于python 圖像讀寫的資料請關注腳本之家其它相關文章!

相關文章

  • 利用nohup來開啟python文件的方法

    利用nohup來開啟python文件的方法

    今天小編就為大家分享一篇利用nohup來開啟python文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python實現簡易的學生信息管理系統(tǒng)

    python實現簡易的學生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python實現簡易的學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 基于Google的Python編碼規(guī)范標準

    基于Google的Python編碼規(guī)范標準

    這篇文章主要介紹了基于Google的Python編碼規(guī)范標準,其中包含了分號,行長度,括號,縮進,空行,空格等基本符號的使用規(guī)則,有需要的朋友可以參考下
    2021-08-08
  • python使用numpy生成18種特殊數組

    python使用numpy生成18種特殊數組

    這篇文章主要介紹了python使用numpy生成18種特殊數組的方法,文章通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的參考價值,需要的朋友可以參考下
    2023-09-09
  • python中namedtuple函數的用法解析

    python中namedtuple函數的用法解析

    這篇文章主要介紹了python中namedtuple函數的用法解析,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08
  • Python安裝tar.gz格式文件方法詳解

    Python安裝tar.gz格式文件方法詳解

    這篇文章主要介紹了Python安裝tar.gz格式文件方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Python進階教程之創(chuàng)建本地PyPI倉庫

    Python進階教程之創(chuàng)建本地PyPI倉庫

    pypi是一個python包的倉庫,里面有很多別人寫好的python庫,你可以通過easy_install或者pip進行安裝,下面這篇文章主要給大家介紹了關于Python進階教程之創(chuàng)建本地PyPI倉庫的相關資料,需要的朋友可以參考下
    2021-10-10
  • Python利用hashlib實現文件MD5碼的批量存儲

    Python利用hashlib實現文件MD5碼的批量存儲

    這篇文章主要為大家詳細介紹了如何用Python和hashlib實現文件MD5碼的批量存儲功能,文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下
    2023-05-05
  • 利用Python對哥德巴赫猜想進行檢驗和推理

    利用Python對哥德巴赫猜想進行檢驗和推理

    數學是一個奇妙的東西,對此,也衍生出了許多的悖論與猜想。這篇文章會對哥德巴赫猜想用編程語言進行檢驗和推理,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-12-12
  • Python實現i人事自動打卡的示例代碼

    Python實現i人事自動打卡的示例代碼

    這篇文章主要介紹了Python實現i人事自動打卡的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01

最新評論