PyTorchで画像を読み込む速度を比較
- 2021/10/10
- Update: 2021/10/10
- PyTorch
- #PyTorch #OpenCV #Pillow #Torchvision
こんにちは.今回はPyTorchで画像を読み込んでTensorに変換するまでの速度を,様々なライブラリで比較してみました.
使用するライブラリ
- opencv-python: 4.5.3.56
- Pillow(PIL): 8.3.2
- Pillow-SIMD: 7.0.0.post3
- torchvision.io(PIL): 0.10.1
- torchvision.io(accimage): 0.10.1
- scikit-image: 0.18.3
それぞれのインストール方法は省略する.
Pillow-SIMDはPillowの高速版であるが,最近は更新されておらず,7.0.0で更新が止まっている.
accimageはtorchvisionのバックエンドに指定できるライブラリで,condaでインストールできる.
実験
ソースコードは以下
こちらを参考にした,
import time
from contextlib import contextmanager
import cv2
from PIL import Image
import skimage.io
import torchvision
import torchvision.transforms.functional as TF
from torchvision.io import read_image
@contextmanager
def timer(name):
t0 = time.time()
yield
print(f"[{name}] done in {(time.time() - t0)*1000:.03f} ms")
N_ITERS = 100
for FILENAME in ["./image.jpg","./image.png"]:
print(FILENAME)
with timer("PIL"):
for i in range(N_ITERS):
img = Image.open(FILENAME).convert("RGB")
img = TF.to_tensor(img)
with timer("OpenCV"):
for i in range(N_ITERS):
img = cv2.imread(FILENAME)[:, :, ::-1].copy()
img = TF.to_tensor(img)
with timer("default_torchvision"):
for i in range(N_ITERS):
img = read_image(FILENAME)
with timer("accimage_torchvision"):
torchvision.set_image_backend("accimage")
for i in range(N_ITERS):
img = read_image(FILENAME)
with timer("skimage"):
for i in range(N_ITERS):
img = skimage.io.imread(FILENAME)
img = TF.to_tensor(img)
一応Githubにもソースを公開する.
GitHub - mjun0812/Pytorch-Image-Load-Speed
Contribute to mjun0812/Pytorch-Image-Load-Speed development by creating an account on GitHub.
https://github.com/mjun0812/Pytorch-Image-Load-Speed
画像はよく使われるマンドリルの画像を用いている.
画像形式 | ライブラリ | 速度(ms) |
---|---|---|
jpg | opencv-python | 673.799 |
Pillow(PIL) | 772.203 | |
Pillow-SIMD | 648.018 | |
torchvision.io(PIL) | 301.993 | |
torchvision.io(PIL-SIMD) | 278.904 | |
torchvision.io(accimage) | 274.502 | |
scikit-image | 794.349 | |
scikit-image(PIL-SIMD) | 545.362 | |
png | opencv-python | 1066.164 |
Pillow(PIL) | 1752.472 | |
Pillow-SIMD | 1085.250 | |
torchvision.io(PIL) | 877.775 | |
torchvision.io(PIL-SIMD) | 867.422 | |
torchvision.io(accimage) | 847.297 | |
scikit-image | 1878.370 | |
scikit-image(PIL-SIMD) | 1108.291 |
最も早いのはtorchvision.io.read_image
となった.
Pillow-SIMDでの高速化は,scikit-imageにも影響を与えている.内部的に使われているのであろう.
ただ,torchvisionにはPillow-SIMDの効果は見られなかった.
この際,画像のロード速度もついでに比較.
Tensorに変更しないこともあると思うので.
Tensorが出力として出てくるtorchvision.io.read_image
は,numpy()
でndarrayに変換するまでを計測する.
画像形式 | ライブラリ | 速度(ms) |
---|---|---|
jpg | opencv-python | 457.877 |
Pillow(PIL) | 772.203 | |
Pillow-SIMD | 648.018 | |
torchvision.io | 273.161 | |
scikit-image | 794.349 | |
scikit-image(PIL-SIMD) | 545.362 | |
png | opencv-python | 962.926 |
Pillow(PIL) | 1752.472 | |
Pillow-SIMD | 1085.250 | |
torchvision.io | 795.085 | |
scikit-image | 1878.370 | |
scikit-image(PIL-SIMD) | 1108.291 |
なんとこちらもtorchvision.io
が一番早い結果となった.
注意
Pillow-SIMDは古いPillowをベースとしているため,以下の警告が出る.
UserWarning: Your installed pillow version is < 7.1.0. Several security issues (CVE-2020-11538, CVE-2020-10379, CVE-2020-10994, CVE-2020-10177) have been fixed in pillow 7.1.0 or higher. We recommend to upgrade this library.
セキュリティ上のリスクが有るようなので,使わない方が無難だろう.