MJUN Tech Note

PyTorchで画像を読み込む速度を比較

こんにちは.今回は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.
GitHub - mjun0812/Pytorch-Image-Load-Speed favicon https://github.com/mjun0812/Pytorch-Image-Load-Speed
GitHub - mjun0812/Pytorch-Image-Load-Speed

画像はよく使われるマンドリルの画像を用いている.

画像形式ライブラリ速度(ms)
jpgopencv-python673.799
Pillow(PIL)772.203
Pillow-SIMD648.018
torchvision.io(PIL)301.993
torchvision.io(PIL-SIMD)278.904
torchvision.io(accimage)274.502
scikit-image794.349
scikit-image(PIL-SIMD)545.362
pngopencv-python1066.164
Pillow(PIL)1752.472
Pillow-SIMD1085.250
torchvision.io(PIL)877.775
torchvision.io(PIL-SIMD)867.422
torchvision.io(accimage)847.297
scikit-image1878.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)
jpgopencv-python457.877
Pillow(PIL)772.203
Pillow-SIMD648.018
torchvision.io273.161
scikit-image794.349
scikit-image(PIL-SIMD)545.362
pngopencv-python962.926
Pillow(PIL)1752.472
Pillow-SIMD1085.250
torchvision.io795.085
scikit-image1878.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.

セキュリティ上のリスクが有るようなので,使わない方が無難だろう.