Skip to content

Commit 7b922c8

Browse files
authored
Add support for JPEG-XL (file extension: jxl) (#1413)
* Add support for JPEG-XL (file extension: jxl)
1 parent 6647a41 commit 7b922c8

40 files changed

+259
-24
lines changed

INSTALL.md

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ poetry install
4141
poetry install -C install/rocm
4242
```
4343

44+
**Note:** When you want to use JPEG XL images, you have to install the optional `jxl` dependency by running `poetry install --with jxl`.
45+
4446
#### NVIDIA Hopper / Blackwell follow-up steps
4547

4648
Optionally, Hopper (or newer) equipment can make use of FlashAttention3 for improved inference and training performance when making use of `torch.compile`

helpers/image_manipulation/load.py

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
from io import BytesIO
77
from typing import Union, IO, Any
8+
try:
9+
import pillow_jxl
10+
except ModuleNotFoundError:
11+
pass
812
from PIL import Image, PngImagePlugin
913

1014
logger = logging.getLogger(__name__)

helpers/image_manipulation/training_sample.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
try:
2+
import pillow_jxl
3+
except ModuleNotFoundError:
4+
pass
15
from PIL import Image
26
from PIL.ImageOps import exif_transpose
37
from helpers.multiaspect.image import MultiaspectImage, resize_helpers

helpers/models/sdxl/pipeline.py

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
# limitations under the License.
1414

1515
import inspect
16+
try:
17+
import pillow_jxl
18+
except ModuleNotFoundError:
19+
pass
1620
import PIL
1721
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
1822
from diffusers.callbacks import PipelineCallback, MultiPipelineCallbacks

helpers/training/__init__.py

+10-14
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,18 @@
2222
# Hopper! Or blackwell+.
2323
quantised_precision_levels.append("fp8-torchao")
2424

25+
try:
26+
import pillow_jxl
27+
except ModuleNotFoundError:
28+
pass
29+
from PIL import Image
30+
31+
supported_extensions = Image.registered_extensions()
2532
image_file_extensions = set(
26-
[
27-
"jpg",
28-
"jpeg",
29-
"png",
30-
"webp",
31-
"bmp",
32-
"tiff",
33-
"tif",
34-
"mp4",
35-
"avi",
36-
"gif",
37-
"mov",
38-
"webm",
39-
]
33+
ext.lower().lstrip(".") for ext, img_format in supported_extensions.items()
34+
if img_format in Image.OPEN
4035
)
36+
4137
video_file_extensions = set(["mp4", "avi", "gif", "mov", "webm"])
4238

4339
lycoris_defaults = {

helpers/training/validation.py

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
from helpers.training.wrappers import unwrap_model
1010
from helpers.models.common import VideoModelFoundation, ImageModelFoundation
1111
from helpers.models.common import ModelFoundation
12+
try:
13+
import pillow_jxl
14+
except ModuleNotFoundError:
15+
pass
1216
from PIL import Image
1317
from helpers.training.state_tracker import StateTracker
1418
from helpers.models.common import PredictionTypes, PipelineTypes

inference_comparison.py

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
from diffusers import AutoPipelineForText2Image
66
from torch import manual_seed, float16
77
import os
8+
try:
9+
import pillow_jxl
10+
except ModuleNotFoundError:
11+
pass
812
from PIL import Image, ImageDraw, ImageFont
913
from helpers.prompts import prompts
1014

install/apple/pyproject.toml

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ prodigy-plus-schedule-free = "^1.9.0"
5151
imageio-ffmpeg = "^0.6.0"
5252
imageio = {extras = ["pyav"], version = "^2.37.0"}
5353

54+
[tool.poetry.group.jxl.dependencies]
55+
pillow-jxl-plugin = "^1.3.1"
5456

5557
[build-system]
5658
requires = ["poetry-core"]

install/rocm/pyproject.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ huggingface-hub = "^0.29.1"
5050
imageio-ffmpeg = "^0.6.0"
5151
imageio = {extras = ["pyav"], version = "^2.37.0"}
5252

53+
[tool.poetry.group.jxl.dependencies]
54+
pillow-jxl-plugin = "^1.3.1"
5355

5456
[build-system]
5557
requires = ["poetry-core"]
@@ -58,4 +60,4 @@ build-backend = "poetry.core.masonry.api"
5860
[[tool.poetry.source]]
5961
#priority = "explicit"
6062
name = "pytorch-rocm"
61-
url = "https://download.pytorch.org/whl/test/rocm6.3"
63+
url = "https://download.pytorch.org/whl/test/rocm6.3"

poetry.lock

+97-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ huggingface-hub = "^0.30.2"
5858
imageio-ffmpeg = "^0.6.0"
5959
imageio = {extras = ["pyav"], version = "^2.37.0"}
6060

61-
61+
[tool.poetry.group.jxl.dependencies]
62+
pillow-jxl-plugin = "^1.3.1"
6263

6364
[build-system]
6465
requires = ["poetry-core", "setuptools", "wheel", "torch"]

tests/test_dataset.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import unittest
22
import pandas as pd
33
from unittest.mock import patch, Mock, MagicMock
4+
try:
5+
import pillow_jxl
6+
except ModuleNotFoundError:
7+
pass
48
from PIL import Image
59
from pathlib import Path
610
from helpers.multiaspect.dataset import MultiAspectDataset

tests/test_image.py

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
logger.setLevel(os.environ.get("SIMPLETUNER_LOG_LEVEL", logging.INFO))
55
from unittest.mock import patch
66
from unittest.mock import Mock, MagicMock
7+
try:
8+
import pillow_jxl
9+
except ModuleNotFoundError:
10+
pass
711
from PIL import Image
812
from io import BytesIO
913
from helpers.multiaspect.image import MultiaspectImage

tests/test_sampler.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import unittest, os, logging
22
from math import ceil
3+
try:
4+
import pillow_jxl
5+
except ModuleNotFoundError:
6+
pass
37
from PIL import Image
48
from unittest import skip
59
from unittest.mock import Mock, MagicMock, patch

0 commit comments

Comments
 (0)