Beschleunigen Sie das Laden von Python-Bildern

Bei der Bildverarbeitung und dem bildbasierten Deep Learning tritt häufig der Prozess des Lesens eines Bildes auf.

Wenn es sich um Hunderte von Blättern handelt, dauert es einige Minuten, um es zu lesen, wenn es auf der Skala von Zehntausenden liegt, und wenn es nur einmal ist, wenn es für Experimente mehrmals gelesen wird, ist es sogar noch schneller.

Hier werden wir mehrere Bibliotheken vergleichen und Ihnen zeigen, wie Sie die Ladezeit reduzieren können.

Fazit

Ausführungsumgebung

Vergleich der Lesegeschwindigkeit

Die verwendete Bibliothek und die Zeit, die zum Laden eines Bildes (Erfassen von Daten als numpy.array) benötigt wurde, sind wie folgt.

Bibliothek Ladezeit
OpenCV 4.23 ms
matplotlib 4.37 ms
keras.preprocessing 3.49 ms
skimage 2.56 ms
PIL 2.63 ms
numpy 333 µs
pickle(protocol=1) 597 µs
pickle(protocol=2) 599 µs
pickle(protocol=3) 112 µs
pickle(protocol=4) 118 µs
_pickle(protocol=4) 117 µs

Das gelesene Bild ist eine 512 x 512 PNG-Datei.

Was Numpy und Pickle betrifft, wurden die als ".npy" und ".pickle" gespeicherten Bilder im Voraus geladen, daher ist dies kein fairer Vergleich. ** Es ist eine Tabelle, in der diese Geschwindigkeit ausgegeben wird, wenn Sie das Bild im Voraus konvertieren **, und es kann nicht geschlossen werden, dass Numpy und Pickle im Allgemeinen schnell sind.

pickle kann Protokoll angeben bei pickle.dump, ** Je neuer das Protokoll, desto schneller das Lesen ** Das stimmt, also werden Bilddaten für jedes Protokoll gespeichert.

Es gibt auch eine schnelle Bibliothek wie accimage, aber ich habe sie nicht verwendet, weil sie nicht mit macOS kompatibel war.

Es gibt auch eine Option hdf5, die jedoch nicht geprüft wurde.

Der verwendete Code lautet wie folgt. (Mit Jupyter Notebook)

import cv2
import matplotlib.pyplot as plt
import pickle
import numpy as np
from keras.preprocessing import image
from PIL import Image
from skimage import io
import _pickle

def imread1(path):
    return cv2.imread(path)

def imread2(path):
    return plt.imread(path)

def imread3(path):
    img = image.load_img(path)
    return image.img_to_array(img)

def imread4(path):
    return io.imread(path)

def imread5(path):
    img = Image.open(path)
    return np.asarray(img)

def numpy_load(path):
    return np.load(path)

def pickle_load(path):
    with open(path, mode='rb') as f:
        return pickle.load(f)
    
def _pickle_load(path):
    with open(path, mode='rb') as f:
        return _pickle.load(f)

%timeit img = imread1(img_path)
%timeit img = imread2(img_path)
%timeit img = imread3(img_path)
%timeit img = imread4(img_path)
%timeit img = imread5(img_path)
%timeit img = numpy_load(npy_path)
%timeit img = pickle_load(pickle_path_1)
%timeit img = pickle_load(pickle_path_2)
%timeit img = pickle_load(pickle_path_3)
%timeit img = pickle_load(pickle_path_4)
%timeit img = _pickle_load(pickle_path_4)

Datengrößenvergleich

Die Größe eines 512x512 .png-Bildes, das mit Numpy und Pickle gespeichert wurde, ist wie folgt.

Bibliothek Datentyp Größe
Originale Daten - 236 KB
numpy np.uint8 820 KB
pickle(protocol=1) np.uint8 820 KB
pickle(protocol=2) np.uint8 820 KB
pickle(protocol=3) np.uint8 787 KB
pickle(protocol=4) np.uint8 787 KB
numpy np.float32 3.1 MB
pickle(protocol=1) np.float32 4.9 MB
pickle(protocol=2) np.float32 4.8 MB
pickle(protocol=3) np.float32 3.1 MB
pickle(protocol=4) np.float32 3.1 MB

Es wurde festgestellt, dass sogar np.uint8 mehr als das Dreifache der Kapazität der Originaldaten belegt.

Wenn Sie über genügend Speicherplatz verfügen und die Lesegeschwindigkeit so weit wie möglich erhöhen möchten, ist es besser, sie einmal mit npy oder pickle zu konvertieren, damit sie leicht gelesen werden kann.

Recommended Posts

Beschleunigen Sie das Laden von Python-Bildern
Bildpixel-Manipulation in Python
Python-Grundlagen ①
Grundlagen von Python ①
[Python] Beschleunigt das Laden von Zeitreihen-CSV
Kopie von Python
Entfernen Sie DICOM-Bilder in Python
Einführung von Python
DICOM-Bilder mit Python Part 2 entfernen
Anonymer Upload von Bildern mit der Imgur-API (mit Python)
[Python] Operation der Aufzählung
Vereinheitlichung der Python-Umgebung
Kopie der Python-Einstellungen
Grundlagen der Python-Scraping-Grundlagen
[Python] Verhalten von Argmax
Verwendung von Python-Einheimischen ()
der Zen von Python
Installieren von Python 3.3 rc1
# 4 [Python] Grundlagen der Funktionen
Dynamisches Laden von Modulen
Grundkenntnisse in Python
Nüchterne Trivia von Python3
Zusammenfassung der Python-Argumente
Grundlagen von Python: Ausgabe
Installation von matplotlib (Python 3.3.2)
Anwendung von Python 3 vars
Verschiedene Verarbeitung von Python
Versuchen Sie, die Bildkonvertierung mit OpenCV mit Python zu projizieren
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Speichern Sie Bilder mit Python3-Anforderungen
Angrenzende Bilder mit Python Teil 1
Base64-Codierung von Bildern in Python 3
Auf dem Weg zum Ruhestand von Python2
Zusammenfassung der Python-Dateivorgänge
Zusammenfassung der Python3-Listenoperationen
[Python] Laden von selbst erstellten mehrstufigen Modulen
Python - Schneller Start der Protokollierung
Empfehlung der binpacking Bibliothek von Python
[Python] Wert des Funktionsobjekts (?)
Python --Überprüfen Sie den Wertetyp
[Python] Der Ursprung des Namens der Python-Funktion
Statische Analyse von Python-Programmen
Objektäquivalenzbeurteilung in Python
Einführung in Aktivitäten mit Python
Optimale Platzierung mehrerer Bilder
Python> Umgang mit 2D-Arrays
Installieren Sie mehrere Versionen von Python
Upgrade von Python Anaconda
Umgang mit Python auf Mac
Python: Grundlagen der Verwendung von Scikit-Learn ①
2.x, 3.x Serienzeichencode von Python
Vergleich von 4 Arten von Python-Webframeworks
Einfache FPS-Messung von Python
Überprüfen Sie die OpenSSL-Version von Python 2.6
Schnellerer Python-Release-Zyklus!
Python-Implementierung des Partikelfilters
Nachbearbeitung von Python (NG)
Veröffentlichen Sie regelmäßig Bilder von Papillon auf Python + AWS Lambda + Slack