我有6000張300*300像素的圖片,當我在Python中讀取這些圖片時遇到了時間問題。 我需要將所有的圖片收集到一個串列中,這樣我就可以在我的模型中使用它們。 所以我寫了一個for回圈,讀取每張圖片,并將其追加到X中,作為一個打擊代碼:
train_img=sorted(list(paths.list_images("path"/span>))
X=[]
y=[]
for img in train_img:
X.append(cv2.imread(img))
y.append(img.split(os.path.sep)[6] )
但是它非常慢!每次我想處理這些資料時,我都要花很多時間來收集一個串列中的所有圖片!
所以,你能不能給我一些建議?
那么,你能針對我的問題給我一些意見或建議嗎? 還有,是否有一個包可以比Open-CV更快地讀取影像?
uj5u.com熱心網友回復:
這里有一個很好的基準,介紹了閱讀的不同方法。根據它,pyvips和PIL是值得考慮的好選擇。
例如,
from PIL import Image
import numpy as np
...
im = np.asarray(Image.open(f))
...
另外,正如評論中建議的那樣,考慮用其他格式來存盤影像可能是有用的。我想TIFF或BMP可能是可行的。
uj5u.com熱心網友回復:
保存和加載壓縮的影像格式總是比讀取未壓縮的格式花費更多時間。
你沒有說你是否使用JPEG或PNG,它們是壓縮的,或BMP,它是未壓縮的。TIFF可以是壓縮的或未壓縮的(它可以容納JPEG資料)。
你應該將你的資料轉換為未壓縮的格式。這將占用更多的磁盤空間。一些特定格式的BMP或TIFF甚至可以被 "記憶體映射",因此不需要太多的RAM,無論大小如何。
我不建議 "腌制 "你的資料。這只是影像資料,而不是任意的/一般的資料。它應該以一種典型的影像檔案格式來存盤。
你選擇的庫:
你選擇的庫:
- OpenCV,它使用各種開放的庫進行影像檔案的I/O 。
- Python Imaging Library 或 Pillow
tifffile,可以做記憶體映射的技巧 。
還可以看看pyvips,它似乎是libvips的一個包裝。我沒有使用它,但另一個答案指出了它。
uj5u.com熱心網友回復:
該任務可能是I/O系結。嘗試concurrent.futures,以并行/異步的方式讀取影像。如果檔案存盤在網路共享等慢速媒體上,請使用大量的執行緒(例如32個),否則就少用(~CPU數)。
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=32) as executor。
X = list(executor.map(cv2.imread, train_img) )
考慮dask或dask-image以獲得更復雜的使用案例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311676.html
標籤:
下一篇:變形/華普坐標
