JPEG XL

Info

rules 57
github 35276
reddit 647

JPEG XL

tools 4225
website 1655
adoption 20712
image-compression-forum 0

General chat

welcome 3810
introduce-yourself 291
color 1414
photography 3435
other-codecs 23765
on-topic 24923
off-topic 22701

Voice Channels

General 2147

Archived

bot-spam 4380

benchmarks

Fox Wizard
2024-04-07 02:14:40
Gotta do it then <:KittyLaugh:1126563616343216268>
2024-04-07 02:14:47
For the extra pizza points of course
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 02:15:26
I wish I knew from what server come your cat/fox emojis <:PepeHands:808829977608323112>
Fox Wizard
2024-04-07 02:15:51
My own private emoji dumps <:Rays3:686219917120634881>
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 02:16:04
0.o
Fox Wizard
2024-04-07 02:16:31
And there's... many of them XD
fab
2024-04-07 02:25:05
Do some lossy on the jon Sneyers site
2024-04-07 02:39:40
RANDOMYL to do some aomedia damage leaded by a single autistic Man to Google
2024-04-07 02:40:05
I worked on s9 avif
2024-04-07 03:38:46
Finished the benchmarks
2024-04-07 03:38:48
Low bpp 0,130bpp
TheBigBadBoy - ๐™ธ๐š›
Fox Wizard Now it's smaller <:KekDog:884736660376535040>
2024-04-07 06:50:47
okay I think I found it you did go further than just `-b 13` since there's no upper limit <:KekDog:805390049033191445>
Fox Wizard
TheBigBadBoy - ๐™ธ๐š› okay I think I found it you did go further than just `-b 13` since there's no upper limit <:KekDog:805390049033191445>
2024-04-07 06:56:59
Does that make a difference?
2024-04-07 06:57:15
Tried 13 and 23 and the output was excactly the same <:KekDog:884736660376535040>
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 06:57:54
AH
2024-04-07 06:58:13
sometimes it makes a diff
Fox Wizard
2024-04-07 06:59:08
Nice. However, that's not what I did <:KittyUwU:1147753612529913938>
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 07:00:48
well then I didn't found anything tried all combinations of `-i` `-i -1` never used `-j` bc that'll break the JPG and `-t` does not change anything of course Either you used `-j`, or a `jpegtran` that's better than mozjpeg's one <:KekDog:805390049033191445>
fab
fab
2024-04-07 07:00:54
<@1051137277813870592> remember also this person who has lead to test jxls
Fox Wizard
TheBigBadBoy - ๐™ธ๐š› well then I didn't found anything tried all combinations of `-i` `-i -1` never used `-j` bc that'll break the JPG and `-t` does not change anything of course Either you used `-j`, or a `jpegtran` that's better than mozjpeg's one <:KekDog:805390049033191445>
2024-04-07 07:01:54
If you really want to know... then you know what to do <:KittyPizza:1147750033018605680>
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 08:26:53
I give up ๐Ÿ˜ญ this is the smallest I could reach `1129211` bytes with `-j` lol
2024-04-07 08:27:12
6 hours of burning my CPU to not find how you did this
2024-04-07 08:27:40
tried even with regular jpegtran
Fox Wizard
2024-04-07 08:28:34
Soooo, pizza time? <:FoxPizza:785013250914779176>
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 08:35:00
i guess so <:PepeHands:808829977608323112>
Fox Wizard
2024-04-07 08:36:30
Pizza when? <:foxstare:1213161230114758756>
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 08:37:43
when you come to my place <:KekDog:805390049033191445>
Fox Wizard
2024-04-07 08:38:20
Damn, so no pizza soon then <:KekDog:884736660376535040>
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 08:39:11
that lets me some time to retry to compress the file <:KekDog:805390049033191445>
2024-04-07 08:40:29
let's read the perl script in depth Ig
Fox Wizard
2024-04-07 08:41:23
Poor CPU <:RaysShock:686219918030798921>
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 08:44:13
since you said you used only jpegultrascan the only thing that is possible is that you used another jpegtran
Fox Wizard
2024-04-07 08:45:19
I won't spoil my secrets and will keep watching you become the number 1 cause of global warming <:KittyUwU:1147753612529913938>
TheBigBadBoy - ๐™ธ๐š›
2024-04-07 08:52:09
says the guy optimizing hundreds of file to gain every single byte <:KekDog:805390049033191445>
Fox Wizard
2024-04-07 08:53:15
Shhhhhhh
2024-04-07 08:53:37
~~Not like you do the same thing or anything <:KekDog:884736660376535040>~~
fab
fab
2024-04-08 12:41:12
Heres way more concentrated and with Noisy
Traneptora a good idea in general is to ignore fab because he just says random things without context or elaboration
2024-04-08 12:42:11
Yes
also why libjxl want svt-av1, lol
2024-04-08 12:42:58
How is svt av1, do you work on svt also or in the psy101 aomenc?
damian101
fab How is svt av1, do you work on svt also or in the psy101 aomenc?
2024-04-08 12:43:43
only psy101 for now
gb82
only psy101 for now
2024-04-10 10:50:53
*for now* we'll get em eventually ;)
jonnyawsom3
2024-04-15 07:43:11
I've been compressing since the sun rose, and now it's 9PM, but it's finally done... Tried compressing 25 textures out of a Blend file, a few 8K textures along with smaller sizes ``` Lossless Texture Encoding Test PNG 102 MB ECT --all-filters -9 89 MB WebP -lossless -q 100 -m 6 70 MB JXL -d 0 -e 1 98 MB JXL -d 0 -e 3 75 MB JXL -d 0 -e 5 71 MB JXL -d 0 -e 7 61 MB JXL -d 0 -e 9 57 MB JXL -d 0 -e 9 -g 3 -E 3 -I 100 56 MB JXL -d 0 -e 10 55 MB ``` So if Blender adds support, I can cut the storage in half
2024-04-15 07:45:55
Interestingly, WebP had the exact same memory use and time spent on the 8K normal map, but JXL got 10 MB lower 49 MB PNG, 39 MB WebP, 29 MB JXL
veluca
2024-04-15 08:10:44
have you tried `-e 7`? ๐Ÿ™‚
Orum
I've been compressing since the sun rose, and now it's 9PM, but it's finally done... Tried compressing 25 textures out of a Blend file, a few 8K textures along with smaller sizes ``` Lossless Texture Encoding Test PNG 102 MB ECT --all-filters -9 89 MB WebP -lossless -q 100 -m 6 70 MB JXL -d 0 -e 1 98 MB JXL -d 0 -e 3 75 MB JXL -d 0 -e 5 71 MB JXL -d 0 -e 7 61 MB JXL -d 0 -e 9 57 MB JXL -d 0 -e 9 -g 3 -E 3 -I 100 56 MB JXL -d 0 -e 10 55 MB ``` So if Blender adds support, I can cut the storage in half
2024-04-15 08:11:41
Blender already has webp support though? ๐Ÿค”
jonnyawsom3
2024-04-15 08:12:01
Yeah, which is why I tested it too
Orum
2024-04-15 08:12:21
also, remember that `-q 100 -m 6` isn't always the smallest
Yeah, which is why I tested it too
2024-04-15 08:13:24
it was more that "cutting it in half" is only vs PNG, and if you already used webp, JXL won't give you that sort of gain (typically)
Oleksii Matiash
2024-04-15 08:13:43
For webp I'm using -z 9, isn't it like "smallest lossless"?
Orum
2024-04-15 08:13:50
no
2024-04-15 08:14:40
I've tested all `-z` levels on thousands of images, and it's not unusual for the highest level to *not* give the smallest results
jonnyawsom3
Orum it was more that "cutting it in half" is only vs PNG, and if you already used webp, JXL won't give you that sort of gain (typically)
2024-04-15 08:15:09
Ah yeah, although I've never encountered a blend file using WebP so far, so might as well get the extra 20% with JXL, not to mention once there's some better flags/heuristics found
Oleksii Matiash
Orum I've tested all `-z` levels on thousands of images, and it's not unusual for the highest level to *not* give the smallest results
2024-04-15 08:15:35
Ok, thank you, I will test another levels on my type of images
Orum
Ah yeah, although I've never encountered a blend file using WebP so far, so might as well get the extra 20% with JXL, not to mention once there's some better flags/heuristics found
2024-04-15 08:16:15
mine do <:AngryCry:805396146322145301>
2024-04-15 08:16:44
I have some massive textures in them, so every bit of savings really helps
jonnyawsom3
2024-04-15 08:17:13
With a 7 year old CPU and 16 GB of RAM, I kept the test suite small so I could still do other things once in a while, the `-e 10` run took an hour and a half on the normal map alone with half of my RAM
2024-04-15 08:18:50
I asked a friend for help with `-e 10 -g 3 -E 3 -I 100`, and it ran 3x faster than my normal `-e 10` but with double the RAM usage (Double the threads, higher clock and SSE4 along with double AVX2 speed)
2024-04-15 08:20:19
Was half tempted to have monad run his suite of parameters on a normal map to find the best settings, since it's quite different to a regular color image
Orum mine do <:AngryCry:805396146322145301>
2024-04-15 08:21:24
One annoying thing I realised is that the 'find external files' thing cares about extentions, so I had to install an addon to override that
Orum
2024-04-15 08:22:48
normal maps are usually the smallest of textures, though roughness maps can be quite small too at times
jonnyawsom3
2024-04-15 08:23:08
This was an 8K 50 MB PNG to start with
Orum
One annoying thing I realised is that the 'find external files' thing cares about extentions, so I had to install an addon to override that
2024-04-15 08:23:35
these are blend files created by other people?
jonnyawsom3
2024-04-15 08:23:49
Yeah
Orum
2024-04-15 08:23:54
ah, okay
jonnyawsom3
Orum normal maps are usually the smallest of textures, though roughness maps can be quite small too at times
2024-04-15 08:24:12
I assume you're thinking of tiled normal maps that repeat over the entire surface?
Orum
2024-04-15 08:24:21
no
2024-04-15 08:24:56
roughness and normals are two different things
jonnyawsom3
2024-04-15 08:25:28
I know, I've just never seen a 'small' normal map that isn't tiled
Orum
2024-04-15 08:25:50
normal maps are rarely tiled on objects
2024-04-15 08:26:05
the only place I see them tiled is on things like terrain
jonnyawsom3
2024-04-15 08:26:49
One example is scales on a reptile's body, but yeah, it depends on what kinds of model you work with most
Orum
2024-04-15 08:27:46
sure but then they're probably just putting multiple scales within a single render map (which is still not the same thing as 'tiling')
jonnyawsom3
2024-04-15 08:29:08
Multiple scales with a seamless edge so it can be repeated without noticing
2024-04-15 08:30:48
But anyway, texture big, WebP small, JXL smaller
fab
2024-04-15 08:40:11
<@179701849576833024> Opinion Meta rtc
jonnyawsom3
veluca have you tried `-e 7`? ๐Ÿ™‚
2024-04-16 11:02:00
Edited it into the list
veluca
Edited it into the list
2024-04-16 11:04:29
Not bad
jonnyawsom3
2024-04-16 11:05:04
16 seconds instead of WebP's 160
2024-04-16 11:05:36
Although I imagine using more conservative WebP options would make it closer too
2024-04-16 11:07:17
One thing I noticed is that `-g 3 -E 3 -I 100` improved the colored textures, but made the normal maps worse, and the reverse for using defaults instead. I should probably try to find a middleground, or just have <@263300458888691714> run a set of textures through his gauntlet to find the most optimal settings for 3D models
2024-04-16 11:27:57
Huh... I would've thought decreasing group size would increase multithreading, but it actually made the encode a third slower
2024-04-16 12:04:06
Also added 1, 3,5 and 'Max 9' to the list
monad
One thing I noticed is that `-g 3 -E 3 -I 100` improved the colored textures, but made the normal maps worse, and the reverse for using defaults instead. I should probably try to find a middleground, or just have <@263300458888691714> run a set of textures through his gauntlet to find the most optimal settings for 3D models
2024-04-16 04:06:13
Send me some representative files, if you like. I don't mind timing as long as they're ~1 Mpx or less, otherwise I can see about parallel encodes to optimize density alone.
eddie.zato
eddie.zato Another round <:CatSmile:805382488293244929>
2024-04-17 07:59:50
I have to apologize. I guess the last round wasn't really fair for jpegli. I didn't use `djpegli` to decode jpegli jpgs in my test. Although this shows us how quickly jpegli jpgs can break if they are constantly decoded by "regular" jpeg decoders like the one in `imagemagick`.
2024-04-17 08:00:11
So, another round with proper use of the `djpegli` decoder:
Orum
eddie.zato I have to apologize. I guess the last round wasn't really fair for jpegli. I didn't use `djpegli` to decode jpegli jpgs in my test. Although this shows us how quickly jpegli jpgs can break if they are constantly decoded by "regular" jpeg decoders like the one in `imagemagick`.
2024-04-17 08:03:18
well that's very concerning
2024-04-17 08:03:49
are the other decode libs not complying with the spec?
Tirr
2024-04-17 08:14:09
iirc the jpeg 1 spec doesn't really define how much precision decoders should provide
_wb_
2024-04-17 08:21:18
It does, but it allows pretty imprecise decoders and still calls them conforming. JPEG conformance is defined in a funky way: a decoder has to produce sample values such that when you apply the DCT on them and quantize the coeffs, the result is in the same quantization bucket or off-by-one, or something like that, if I recall correctly.
Tirr
2024-04-17 08:24:29
that's very... permissive
spider-mario
eddie.zato So, another round with proper use of the `djpegli` decoder:
2024-04-17 08:38:40
much better indeed; perhaps `djpegli --bitdepth=16` would be interesting as well (or maybe that was already it?), but Iโ€™m not sure the improvement would be that much
Orum
2024-04-17 08:39:30
while we're on the topic of cjpegli, is there a reason it doesn't accept JXL input? ๐Ÿค”
_wb_
2024-04-17 08:40:06
later, in ISO/IEC 18477-1 (JPEG XT) the de-facto subset of ISO/IEC 10918 (JPEG) was defined (i.e. JFIF + payload that is baseline/progressive 8-bit mode with huffman), and ISO/IEC 18477-4 (conformance testing of JPEG XT) defines a better conformance test for that than the original ISO/IEC 10918-2
Orum while we're on the topic of cjpegli, is there a reason it doesn't accept JXL input? ๐Ÿค”
2024-04-17 08:40:59
it doesn't? for me it does
Orum
2024-04-17 08:43:12
oh, I didn't test it... then the help is wrong: ``` INPUT the input can be PNG, APNG, GIF, EXR, PPM, PFM, or PGX```
_wb_
2024-04-17 08:50:45
Maybe open an issue for this. We should probably make some function in extras/codec.h that returns a string of supported input/output codecs (which ones those are depends on compile-time options) and use that in help screens of the various tools.
Orum
2024-04-17 08:51:11
Will do. Open it on the libjxl GH?
2024-04-17 08:53:22
as it's part of libjxl, seems like that's the place to do it
eddie.zato
spider-mario much better indeed; perhaps `djpegli --bitdepth=16` would be interesting as well (or maybe that was already it?), but Iโ€™m not sure the improvement would be that much
2024-04-17 08:53:57
Yep, already with `--bitdepth=16`
jonnyawsom3
eddie.zato So, another round with proper use of the `djpegli` decoder:
2024-04-17 09:19:57
Don't suppose you could include the original image in the line-up too for future? They have different forms of degradation but it's hard to tell what's most graceful
2024-04-17 09:20:16
Weirdly the first frame of the video seems to be missing a keyframe too... Odd
2024-04-17 09:20:45
Almost reminds me of WebP2's polygonal encoding
Orum
2024-04-17 09:22:50
webp2 is dead though, and probably for the better
eddie.zato
Don't suppose you could include the original image in the line-up too for future? They have different forms of degradation but it's hard to tell what's most graceful
2024-04-17 09:23:54
First and last or all 900 frames? <:CatSmile:805382488293244929>
jonnyawsom3
2024-04-17 09:27:02
All 900, just so you can pause at any time and take a closer look at the artefacts
eddie.zato
Weirdly the first frame of the video seems to be missing a keyframe too... Odd
2024-04-17 09:30:36
Yeah, something weird happened with ffmpeg-vp9... Unfortunately, I've already deleted all the frames and the original photo.
jonnyawsom3
2024-04-17 09:34:34
Ah well, half the fun is playing with settings until something works
fab
2024-04-17 07:41:59
Finished full benchmarking on Midori 11.3.0
Almost reminds me of WebP2's polygonal encoding
2024-04-17 07:42:52
I compared with mozjpeg and only one image at a single time
2024-04-17 07:43:38
That's unvalid as hall of shame site had different type of treatment
2024-04-17 07:45:35
Q100 works well the problem is low bitrate q43.2 q36.44 q21.3-34.77
2024-04-17 07:45:47
Those are awful
2024-04-17 07:46:36
But with new release will it forensicaklty Improvee
jonnyawsom3
2024-04-19 12:44:02
Decided to try and fit this 28 MB HDR (7z for discord's limit) into a PNG or JXL, but the PNG is 34 MB and the JXL is 69 MB. Lossy it hits 1 MB but surely something must be going wrong to hit 69 bpp on a 32 bit input. I can even 7z the JXL down to half it's size
monad
2024-04-19 02:17:54
well what was your process
2024-04-19 02:18:33
magick convert gives an 18 MB jxl
jonnyawsom3
2024-04-19 09:51:01
I used ffmpeg to make it into a 32 bit PFM and then cjxl with -d 0
monad
2024-04-19 10:41:13
gives me a 23 MB jxl which identifies as 32-bit (the magick-produced file identified as 16-bit)
jonnyawsom3
2024-04-19 11:23:16
Any settings other than `-d 0`?
monad
2024-04-19 11:23:24
nope
jonnyawsom3
2024-04-19 11:31:32
Ah, it's a regression since 0.10.2
2024-04-19 11:31:49
``` C:\Users\jonat\Downloads>cjxl drachenfels_cellar_4k.pfm drachenfels_cellar_4k.jxl -d 0 JPEG XL encoder v0.10.2 e148959 [AVX2,SSE2] Encoding [Modular, lossless, effort: 7] Compressed to 22960.8 kB (21.897 bpp). 4096 x 2048, 1.771 MP/s [1.77, 1.77], , 1 reps, 16 threads. C:\Users\jonat\Downloads>cjxl drachenfels_cellar_4k.pfm drachenfels_cellar_4k.jxl -d 0 JPEG XL encoder v0.10.2 59637dc [AVX2,SSE2] Encoding [Modular, lossless, effort: 7] Compressed to 72278.1 kB (68.930 bpp). 4096 x 2048, 6.406 MP/s [6.41, 6.41], , 1 reps, 16 threads. ```
monad
2024-04-19 12:18:50
```100663319 d.pfm 29273625 d.hdr 24688539 d.pfm.7z 22960752 d.e7.jxl 22937905 d.hdr.7z 22605021 d.e7.jxl.7z 22505088 d.e7.jxl.zpaq 21813103 d.hdr.zpaq 21092318 d.pfm.zpaq 18532019 d.e10E3I100g3.jxl 18531699 d.e10E3I100g3.jxl.zpaq 18521955 d.e10E3I100g3.jxl.7z 18519649 d.e10E3I100g3.jxl.paq8px207```
yoochan
2024-04-19 12:21:24
the man-which-individually-zipped-compressed-image-just-for-the-sake-of-satisfaction.
Orum
2024-04-19 12:28:24
>d.e10E3I100g3.jxl this was probably a good stopping point <:KekDog:805390049033191445>
jonnyawsom3
2024-04-19 01:53:03
Nah, just wait until the server with 2TB of RAM exclusively for running e11 encodes
Ah, it's a regression since 0.10.2
2024-04-19 05:07:58
https://github.com/libjxl/libjxl/issues/3511
monad
Was half tempted to have monad run his suite of parameters on a normal map to find the best settings, since it's quite different to a regular color image
2024-04-20 12:41:01
FWIW ... on this set there is no difference between ideal settings
2024-04-20 12:48:29
Note the settings I try are curated for my usual content. I did notice different behavior on a different set of pairs, but those were 16 bpc, 1 Mpx and I'm not bothered to go through the effort reducing them and reencoding rn. Also on some other normals I noticed the kNoWP path was favorable.
jonnyawsom3
2024-04-20 01:21:22
Ah, thanks. Yeah, it seems to be a unique case where the variance between each image dulls any effect of different settings
Meow
2024-04-20 03:48:44
-d 0 took only 194 seconds
CrushedAsian255
2024-04-28 07:43:04
MacOS does not like big JXL files, it seems to not take full advantage of tiling and such
yoochan
2024-04-29 01:11:18
I did some extensive tests with lossy encoding, tried different distances from 0.010 to 1.000 by steps of 0.001 and computed the butteraugli score. For effort 8 in grey (vs effort 4 in red) I get a strange behavior: the butteraugli score seems capped at 0.28...
2024-04-29 01:11:42
does it correspond to an hard value in the code ?
2024-04-29 01:23:25
expressed in ssimulacra score there is no such step
_wb_
2024-04-29 02:07:18
Interesting, is this an image with or without alpha?
yoochan
2024-04-29 02:08:13
without I guess... It is the image 15 of the kodak benchmark, I'll try if other images do the same (but tests take some time to run :D)
2024-04-29 02:10:02
Initially, I was looking for a sweet spot in the speed / quality tradeoff, whatever the speed
2024-04-29 02:14:39
without ! file gives `../benchmark/kodak/15.png: PNG image data, 768 x 512, 8-bit/color RGB, non-interlaced`
_wb_
2024-04-29 02:20:21
I can reproduce this
2024-04-29 02:20:23
benchmark_xl v0.10.2 5f57c4a8 [NEON] 12 total threads, 4 tasks, 4 threads, 2 inner threads ``` ./kodim15.png Encoding kPixels Bytes BPP E MP/s D MP/s Max norm SSIMULACRA2 PSNR pnorm BPP*pnorm QABPP Bugs ----------------------------------------------------------------------------------------------------------------------------------------- jxl:8:d0.2 393 226328 4.6046549 1.141 73.234 0.34626903 93.82546540 52.84 0.15089569 0.694822594129 4.605 0 jxl:8:d0.1 393 342656 6.9713542 1.100 56.113 0.26659861 94.69318716 57.28 0.09944881 0.693292871168 6.971 0 jxl:8:d0.05 393 529921 10.7812703 1.089 40.734 0.27091136 95.08974557 61.33 0.08716123 0.939708730372 10.781 0 jxl:8:d0.01 393 981279 19.9641724 1.157 38.276 0.26865784 95.13987048 66.10 0.08554240 1.707783313250 19.964 0 Aggregate: 393 448126 9.1171452 1.121 50.311 0.28630212 94.68559785 59.18 0.10284787 0.937678965029 9.117 0 ```
2024-04-29 02:21:56
Looks like gaborish is the culprit: ``` ./kodim15.png Encoding kPixels Bytes BPP E MP/s D MP/s Max norm SSIMULACRA2 PSNR pnorm BPP*pnorm QABPP Bugs ---------------------------------------------------------------------------------------------------------------------------------------------- jxl:8:d0.2:gab0 393 223467 4.5464478 1.065 70.787 0.33846688 93.79991486 52.36 0.15223970 0.692149862797 4.546 0 jxl:8:d0.1:gab0 393 316773 6.4447632 1.077 53.574 0.20741303 94.85464509 57.01 0.08714694 0.561641385480 6.445 0 jxl:8:d0.05:gab0 393 432217 8.7934774 1.049 52.066 0.11433402 95.31268252 61.85 0.04471525 0.393202544791 8.793 0 jxl:8:d0.01:gab0 393 766964 15.6039225 1.054 40.671 0.02204305 95.56940241 74.61 0.00838248 0.130799566316 15.604 0 Aggregate: 393 391390 7.9628475 1.061 53.234 0.11533200 94.88174267 60.92 0.04722284 0.376028243275 7.963 0 ```
yoochan
2024-04-29 02:24:29
gaborish again ๐Ÿ˜… It was not on purpose ๐Ÿ˜„
_wb_
2024-04-29 02:25:25
<@532010383041363969> I think we should either make dec_gaborish(enc_gaborish) approximate the identity function (at least as distancee goes to 0), or disable gaborish by default at low distance. It doesn't make sense to do a gaborish that introduces more error than the compression itself.
username
_wb_ <@532010383041363969> I think we should either make dec_gaborish(enc_gaborish) approximate the identity function (at least as distancee goes to 0), or disable gaborish by default at low distance. It doesn't make sense to do a gaborish that introduces more error than the compression itself.
2024-04-29 02:33:12
related: https://discord.com/channels/794206087879852103/804324493420920833/1092894594578010192
2024-04-29 02:34:20
^ what I linked to may be an older post but I just tested and the same still happens in newer builds of libjxl
2024-04-29 02:34:47
I really should have made an issue post on the libjxl repo back then about gaborish negatively affecting higher quality levels
w
2024-04-29 03:09:07
just get rid of gaborish
2024-04-29 03:09:13
it's false advertising
2024-04-29 03:09:20
like the whole generation loss thing aswell
_wb_
2024-04-29 03:29:02
gaborish is quite useful at typical quality settings, but at the moment the encoder side is not doing the inverse of the decoder side (because apparently doing something different is somewhat better according to butteraugli), which is bad for generation loss and puts an artificial limit on the precision.
2024-04-29 03:29:23
and at d << 1 there is no use for gaborish imo
2024-04-29 03:30:05
it's useful when DCT would introduce very mild blocking
2024-04-29 03:30:40
at very low qualities, it's not that useful since it cannot get rid of severe blocking
2024-04-29 03:31:00
and at very high qualities it's also not that useful since there won't be any blocking anyway
eddie.zato
2024-04-30 08:58:00
avifenc replaced default cjxl
2024-04-30 09:00:30
Frames here https://dropmefiles.com/92nqF
_wb_
2024-04-30 09:03:15
are you decoding to 8-bit RGB or 16-bit RGB?
eddie.zato
2024-04-30 09:05:50
``` magick -depth 16 png48: djpegli --bitdepth=16 avifdec -d 16 djxl --bits_per_sample=16 ```
_wb_
2024-04-30 09:20:29
is this 4:4:4 avif?
2024-04-30 09:23:30
jpegli is holding up quite well here, jxl is a bit disappointing imo. I think we should tune the encoder heuristics for generation loss, until now we've done all tuning for a single generation and that doesn't allow catching subtle accumulation of errors...
eddie.zato
2024-04-30 09:44:00
I only used the `--target-size` parameter, but according to `avifenc -h` the default is 444.
_wb_
2024-04-30 09:48:06
when using 420 it will degenerate a lot quicker, but they wisely made 444 the default so it's only fair to use that
spider-mario
_wb_ jpegli is holding up quite well here, jxl is a bit disappointing imo. I think we should tune the encoder heuristics for generation loss, until now we've done all tuning for a single generation and that doesn't allow catching subtle accumulation of errors...
2024-04-30 10:02:53
I wonder what the impact would be on single-generation quality
_wb_
2024-04-30 10:18:50
of course I don't want to sacrifice single-generation quality for multi-generation quality โ€” I'm hoping multi-gen quality can be improved without affecting single-gen much
2024-04-30 11:10:57
Maybe we can start with this: https://github.com/libjxl/libjxl/pull/3547
spider-mario
_wb_ of course I don't want to sacrifice single-generation quality for multi-generation quality โ€” I'm hoping multi-gen quality can be improved without affecting single-gen much
2024-04-30 11:41:42
I think I was maybe wondering whether it might not even improve it
2024-04-30 11:42:01
by now, we know that looking at quality at low bitrates is irrelevant to quality at high bitrates
2024-04-30 11:42:18
but do we also know it to be the case between one- and multi-generation?
2024-04-30 11:43:01
where we would plausibly be applying _the same_ artifacts several times?
_wb_
2024-04-30 11:44:23
intuitively I would expect that if the result after N generations improves, it means the first generation is also better.
2024-04-30 11:46:22
though some of the multi-generation error might be caused by invisible errors bleeding into visible errors only after many iterations, and optimizing _only_ for the Nth generation might miss some opportunities for perceptual optimization.
jonnyawsom3
2024-05-01 08:24:09
Was just running some random tests on an image that seemed unreasonably large, and then thought to run ECT first related to this issue https://github.com/libjxl/libjxl/issues/3415 Original 30 MB PNG ```JPEG XL encoder v0.10.2 60dfa1b [AVX2,SSE2] Encoding [Modular, lossless, effort: 7] Compressed to 10948.8 kB including container (3.931 bpp). 6293 x 3541, 4.296 MP/s [4.30, 4.30], , 1 reps, 16 threads. PageFaultCount: 621943 PeakWorkingSetSize: 414.8 MiB QuotaPeakPagedPoolUsage: 35.19 KiB QuotaPeakNonPagedPoolUsage: 16.99 KiB PeakPagefileUsage: 457 MiB Creation time 2024/05/01 19:37:29.048 Exit time 2024/05/01 19:37:34.746 Wall time: 0 days, 00:00:05.698 (5.70 seconds) User time: 0 days, 00:00:04.046 (4.05 seconds) Kernel time: 0 days, 00:01:06.312 (66.31 seconds)``` ECT 15 MB PNG ```JPEG XL encoder v0.10.2 60dfa1b [AVX2,SSE2] Encoding [Modular, lossless, effort: 7] Compressed to 10930.5 kB including container (3.924 bpp). 6293 x 3541, 4.981 MP/s [4.98, 4.98], , 1 reps, 16 threads. PageFaultCount: 497987 PeakWorkingSetSize: 311.3 MiB QuotaPeakPagedPoolUsage: 35.19 KiB QuotaPeakNonPagedPoolUsage: 16.73 KiB PeakPagefileUsage: 351.9 MiB Creation time 2024/05/01 20:03:25.041 Exit time 2024/05/01 20:03:29.900 Wall time: 0 days, 00:00:04.858 (4.86 seconds) User time: 0 days, 00:00:03.531 (3.53 seconds) Kernel time: 0 days, 00:00:54.625 (54.62 seconds)``` So it not only reduces size slightly, but also increases speed and has a fairly drastic impact on memory usage, I'd assume mostly from removing an unused alpha channel
2024-05-01 08:27:39
-d 0 for lossless but all default for everyting else
monad
2024-05-02 02:55:43
maybe learning matplotlib
yoochan
2024-05-02 09:31:53
the only difference between the first and second graph is the kind of picture ?
monad
2024-05-02 05:51:29
same encode params on different image sets (photo vs ui)
2024-05-07 06:47:28
_wb_
2024-05-07 10:47:55
Made a proposal to improve precision and generation loss at the very low distances (up to d0.5) โ€” I think it's most important to get it right in that quality range, since that is relevant for authoring workflows. Improving generation loss at higher distances is harder but only relevant for things like memes. https://github.com/libjxl/libjxl/pull/3563
afed
2024-05-07 10:51:24
at some other distances, like closer to 1.0 it doesn't give any improvement, just up to 0.5?
_wb_ Made a proposal to improve precision and generation loss at the very low distances (up to d0.5) โ€” I think it's most important to get it right in that quality range, since that is relevant for authoring workflows. Improving generation loss at higher distances is harder but only relevant for things like memes. https://github.com/libjxl/libjxl/pull/3563
2024-05-07 11:02:36
i mean exactly 0.5 is just some average number or is the gains mostly just up to 0.5? maybe make benchmarks like up to 0.8-0.9 and perhaps these changes would be useful at larger distances? or at least make gaborish weaker
_wb_
2024-05-07 11:05:03
Above d0.5 the gains from gaborish become bigger, so just disabling it would still improve multi-gen but at the cost of single-gen...
2024-05-07 11:06:36
I tried making the amount of Gaborish proportional to distance but it's tricky, just scaling the kernels (for both enc and dec) didn't really seem to improve things.
2024-05-07 11:09:03
I also tried retuning the enc Gaborish weights for generation loss but couldn't get real improvements. I suspect 5x5 is just not big enough to make it more accurately approximate the inverse of dec Gaborish.
afed
2024-05-07 11:24:54
maybe also change the description for recommended quality/distance, like for editing/authoring workflows ```-d DISTANCE, --distance=DISTANCE Target visual distance in JND units, lower = higher quality. 0.0 = mathematically lossless. Default for already-lossy input (JPEG/GIF). 1.0 = visually lossless. Default for other input. Recommended range: 0.5 .. 3.0. Allowed range: 0.0 ... 25.0. Mutually exclusive with --quality. -q QUALITY, --quality=QUALITY Quality setting, higher value = higher quality. This is internally mapped to --distance. 100 = mathematically lossless. 90 = visually lossless. Quality values roughly match libjpeg quality. Recommended range: 68 .. 96. Allowed range: 0 .. 100. Mutually exclusive with --distance.```
2024-05-07 11:30:14
q95 it's d0.5 or q96? https://canary.discord.com/channels/794206087879852103/794206170445119489/1116377019928805426
_wb_
2024-05-07 11:56:51
d0.5 is something around q95.55
2024-05-07 11:58:19
so if you use q96+ then generation loss will be greatly reduced by that PR, at q95 or lower nothing changes
yoochan
2024-05-07 11:59:12
would be interesting to have some stat on which quality is used by users of Photoshop or gimp to save as jxl
2024-05-07 12:01:35
the gimp version I have don''t even ask for quality...
novomesk
yoochan the gimp version I have don''t even ask for quality...
2024-05-07 12:05:32
So it is d = 0
yoochan
novomesk So it is d = 0
2024-05-07 12:06:04
is it a knowledge or a guess ?
lonjil
2024-05-07 12:07:21
``` % jxlinfo doc/Untitled.jxl JPEG XL image, 2560x1440, (possibly) lossless, 8-bit RGB Color space: 672-byte ICC profile, CMM type: "lcms", color space: "RGB ", rendering intent: 0 ```
yoochan
2024-05-07 12:08:25
educated guess then ๐Ÿ˜„ does someone tested photoshop or lightroom to see ?
novomesk
yoochan is it a knowledge or a guess ?
2024-05-07 12:09:57
It's memory
_wb_
2024-05-07 12:11:02
photoshop doesn't have jxl export yet afaik, only import
yoochan
2024-05-07 12:12:37
not yet ๐Ÿ™‚
_wb_
2024-05-07 12:15:25
when saving images from adobe camera raw, the scale seems to be roughly as follows (based on just the filesizes I'm getting, no idea what actual encode settings they use): 1 (lowest): something like d4.5 3 (low): something like d3.5 6 (medium): something like d1.75 9 (high): around d0.85 10: around d0.65 11: around d0.4 12 (very high): around d0.1 (I tested on one HDR image, no idea if they use the same scale for SDR images)
spider-mario
_wb_ photoshop doesn't have jxl export yet afaik, only import
2024-05-07 12:15:52
Lightroom does, iirc (will check again when I get home)
2024-05-08 11:30:16
(forgot to check)
2024-05-08 11:30:47
Iโ€™ll set up a reminder this time
yoochan
2024-05-08 11:56:02
๐Ÿ˜…
Oleksii Matiash
spider-mario Lightroom does, iirc (will check again when I get home)
2024-05-08 12:54:44
It does
yoochan
2024-05-08 03:06:39
70 is the default quality proposed or the last used?
Oleksii Matiash
yoochan 70 is the default quality proposed or the last used?
2024-05-08 04:14:54
Proposed, owner of this Lr does not use jxl at all, so nobody touched it before me, and neither I
yoochan
2024-05-08 04:21:39
It seems low... For a photophile tool
_wb_
2024-05-08 07:17:39
The scale is likely different
Oleksii Matiash
2024-05-09 06:32:52
Well, quick test shows that Lr's Q70 approximately equals to d1.5. Also it seems that Lr uses effort 4. Edit (fab mode on): d1.5 in terms of libjxl 0.9.2, for 0.10.2 it is d1.4. Edit2: assumption based on file size only, I did not compare quality
yoochan It seems low... For a photophile tool
2024-05-09 06:36:23
Lr is not a photophile tool, it is mainstream very rough and imprecise tool, just popular because Adobe is "default choice" when someone is not an *photophile* and just wants to apply some preset, then make some easy adjustments, and publish. But for serious raw processing it is.. err..
2024-05-09 06:54:37
Btw, using any "non-srgb" profile something strange happens with cjxl (tried AdobeRGB): Lr jxl -> djxl produces png with correct profile, Lr png -> cjxl -> djxl produces png without profile. If open these jxl files in Ps (ACR, actually) then Lr jxl opens correctly, and cjxl jxl opens with like gamma 3.0 (second is the correct one, first - wrong)
2024-05-09 06:57:14
Also sometime Lr is doing something very strange, and starts producing files with size of d ~ 0.04, while slider is still on q 70
2024-05-09 07:01:01
Also, just curious, why such "jump" in file size between d 1.47 and 1.48 (I'm not fabbing, just tried to determine distance used by Lr)?
_wb_
2024-05-09 01:19:38
that's a weird jump in size indeed
2024-05-09 01:23:52
I get a similar discontinuity on another image: ``` bash-3.2$ cjxl 001.png 001.png.jxl -e 4 -d 1.47406095 JPEG XL encoder v0.10.2 0.10.2 [NEON] Encoding [VarDCT, d1.474, effort: 4] Compressed to 153.6 kB (1.133 bpp). 1276 x 850, 11.290 MP/s [11.29, 11.29], , 1 reps, 12 threads. bash-3.2$ cjxl 001.png 001.png.jxl -e 4 -d 1.47406096 JPEG XL encoder v0.10.2 0.10.2 [NEON] Encoding [VarDCT, d1.474, effort: 4] Compressed to 135.7 kB (1.001 bpp). 1276 x 850, 39.422 MP/s [39.42, 39.42], , 1 reps, 12 threads. ```
2024-05-09 01:25:27
seems to be something specific to effort 4, at other efforts I don't see such discontinuity
2024-05-09 01:29:57
there could be an underlying encoder bug โ€” seems like this happens for all images (a discontinuity in size/quality when going from d1.47406095 to d1.47406096 at effort 4)
2024-05-09 01:30:43
``` Encoding kPixels Bytes BPP E MP/s D MP/s Max norm SSIMULACRA2 PSNR pnorm BPP*pnorm QABPP Bugs ----------------------------------------------------------------------------------------------------------------------------------------------- jxl:d1.47406095:4 53140 9991512 1.5041668 10.839 17.775 2.03326460 82.25755149 40.27 0.82721810 1.244273974514 3.043 0 jxl:d1.47406096:4 53140 8872981 1.3357781 11.983 16.511 2.28357451 80.24075946 39.39 0.92258484 1.232368654393 3.046 0 Aggregate: 53140 9415652 1.4174742 11.396 17.131 2.15478797 81.24289756 39.83 0.87360110 1.238307007034 3.045 0 ```
2024-05-09 01:32:15
at effort 3 it also happens. Starting at e5 the discontinuity disappears.
KKT
2024-05-11 09:14:38
Newby question for benchmark_xl. Couldn't find any info on this (if there is up-to-date info please point me to it). When you're using other codecs like `--codec jxl:wombat:d1,jxl:tortoise:d1,webp,jpeg`, is there a way to control what webp and jpeg are outputting? I was testing a bunch of files and getting things like: `Encoding kPixels Bytes BPP E MP/s D MP/s Max norm SSIMULACRA2 PSNR pnorm BPP*pnorm QABPP Bugs --------------------------------------------------------------------------------------------------------------------------------------------- jxl:wombat:d1 710 134383 1.5128110 1.825 39.245 1.60255078 83.51023260 38.76 0.73965539 1.118958803113 2.424 0 jxl:tortoise:d1 710 144164 1.6229202 0.367 37.316 1.35725912 84.41896693 39.34 0.67479117 1.095132212951 2.203 0 webp 710 167404 1.8845435 2.505 69.623 14.05078436 67.21178694 40.43 4.84898826 9.138129361767 26.479 0 jpeg 710 906697 10.2071035 38.716 77.593 0.73615628 93.14825430 54.46 0.30377413 3.100653981873 10.207 0 Aggregate: 710 232867 2.6214865 2.839 53.035 2.17789175 81.50795034 42.81 0.92597697 2.427436143726 6.164 0` Would be great if the SSIM scores were closer. Or can you actually target a SSIM score? Edit: just realized jpeg:q## works.
afed
2024-05-11 09:22:20
`jpeg:qXX`, etc. as I recall
KKT
2024-05-11 09:22:41
Thanks. Can you target a SSIM score?
afed
2024-05-11 09:25:27
don't think so, just the distance for jxl/jpegli, which is roughly butteraugli score
KKT
2024-05-11 09:36:39
Wait, is the JPEG I'm benchmarking actually jpegli?
lonjil
2024-05-11 09:37:47
i don't think so
afed
2024-05-11 09:38:19
`enc-jpegli` for jpegli
KKT
2024-05-11 10:33:05
Thanks
monad
KKT Newby question for benchmark_xl. Couldn't find any info on this (if there is up-to-date info please point me to it). When you're using other codecs like `--codec jxl:wombat:d1,jxl:tortoise:d1,webp,jpeg`, is there a way to control what webp and jpeg are outputting? I was testing a bunch of files and getting things like: `Encoding kPixels Bytes BPP E MP/s D MP/s Max norm SSIMULACRA2 PSNR pnorm BPP*pnorm QABPP Bugs --------------------------------------------------------------------------------------------------------------------------------------------- jxl:wombat:d1 710 134383 1.5128110 1.825 39.245 1.60255078 83.51023260 38.76 0.73965539 1.118958803113 2.424 0 jxl:tortoise:d1 710 144164 1.6229202 0.367 37.316 1.35725912 84.41896693 39.34 0.67479117 1.095132212951 2.203 0 webp 710 167404 1.8845435 2.505 69.623 14.05078436 67.21178694 40.43 4.84898826 9.138129361767 26.479 0 jpeg 710 906697 10.2071035 38.716 77.593 0.73615628 93.14825430 54.46 0.30377413 3.100653981873 10.207 0 Aggregate: 710 232867 2.6214865 2.839 53.035 2.17789175 81.50795034 42.81 0.92597697 2.427436143726 6.164 0` Would be great if the SSIM scores were closer. Or can you actually target a SSIM score? Edit: just realized jpeg:q## works.
2024-05-11 10:58:33
webp has `m` and `q`
_wb_
2024-05-12 02:51:39
jpeg also is yuv444 by default. It's all undocumented afaik, I usually read the code to know the options
KKT
2024-05-12 07:22:46
Hehe. Figured that might be the case. This page doesn't give many details: https://github.com/libjxl/libjxl/blob/main/doc/benchmarking.md
Jyrki Alakuijala
_wb_ The scale is likely different
2024-05-13 09:27:55
Photoshop Save As 00: IJG 46 Photoshop Save As 01: IJG 52 Photoshop Save As 02: IJG 63 Photoshop Save As 03: IJG 66 Photoshop Save As 04: IJG 71 Photoshop Save As 05: IJG 75 Photoshop Save As 06: IJG 81 (!!!) Photoshop Save As 07: IJG 78 Photoshop Save As 08: IJG 84 Photoshop Save As 09: IJG 88 Photoshop Save As 10: IJG 92 Photoshop Save As 11: IJG 96 Photoshop Save As 12: IJG 98 from https://photo.stackexchange.com/questions/57226/how-does-the-usual-jpeg-0-100-quality-settings-translate-into-photoshops-0-12-q also photoshop "save for web quality 50" is quality 82 in IJG
_wb_
2024-05-13 10:04:12
that's from 9 years ago though, meanwhile they have probably made changes to their scale
2024-05-13 10:09:50
but yes, Adobe quality scales are quite different from those of libjpeg/imagemagick/gimp/etc, and they generally put most of their settings in the "useful range" (e.g. libjpeg q > 60) rather than having half of their settings correspond to libjpeg q < 50. This makes sense but it also causes confusion because many naive people think "quality 80" has some universal meaning ("20% of the pixels are lost" or something, I dunno) across all codecs and software.
KKT
2024-05-13 11:16:11
So was running some tests on a large number of images, and it looks like `benchmark_xl --print_details_csv` drops the SSIMULACRA2 score. Any magic incantation to get it back into the output?
2024-05-13 11:54:27
`--print_details` without the `csv` does output it.
yoochan
2024-05-14 06:07:05
is this magical enough ? ๐Ÿ˜„
_wb_
2024-05-14 07:14:25
I guess the csv writing was added before ssimulacra2 was added. Maybe open a github issue about it, should be easy to fix that.
monad
2024-05-14 10:45:08
```!? colors (mean) images Mpx (mean) | colors/px (mean) | share | share | | tag 84 100.00% 0.15 100.00% 23853 0.12 all 10 11.90% 0.41 32.12% 55003 0.13 digital_painting 5 5.95% 0.35 13.70% 48576 0.14 edit 6 7.14% 0.01 0.42% 2344 0.29 logo 6 7.14% 0.10 4.75% 13025 0.16 mixed 20 23.81% 0.25 40.16% 52412 0.24 photo 32 38.10% 0.02 5.78% 21 0.00 pixel_art 8 9.52% 0.31 19.97% 94811 0.37 watermark 8 9.52% 0.17 10.77% 18878 0.13 content_other 72 85.71% 0.16 91.87% 27424 0.12 visibly_opaque 12 14.29% 0.09 8.13% 2427 0.15 visibly_transparent 41 48.81% 0.26 83.03% 48139 0.21 DirectClass_sRGB 6 7.14% 0.07 3.10% 4818 0.29 DirectClass_sRGB_Alpha 1 1.19% 0.24 1.91% 246 0.00 PseudoClass_Gray 30 35.71% 0.03 6.93% 20 0.00 PseudoClass_sRGB 6 7.14% 0.11 5.02% 35 0.00 PseudoClass_sRGB_Alpha Pareto front for bpp and CPU time |Pareto front for bpp and real time bpp (mean) Mpx/s CPU (mean) ||included in 'all' B | mins unique mins Mpx/s real (mean) best of 7318280 3.485172 100.00% ยทยทยทยท 0.00022882000 0.003897477 CRยท all 7320231 3.488666 65.48% 40.48% 0.002835134 0.0268040 CRA cjxl_0.10.2-m_d0e11 7325717 3.488910 57.14% 34.52% 0.00024972189 0.004579500 ยทยทA cjxl_0.10.2_d0e11 7660342 3.675485 2.38% ยทยทยทยท 0.214605 0.231191 CRยท cjxl_0.10.2_d0e10```
2024-05-14 10:55:27
derived from
2024-05-14 10:56:51
code
KKT
yoochan is this magical enough ? ๐Ÿ˜„
2024-05-14 06:54:52
Yeah, I brute forced it with some cleanup in good old BBEdit.
monad
2024-05-15 09:05:39
optionally using resampling with pixel art
We've been trying to decide on new default settings, so knowing the best effort or parameters for size/speed across a wide test suite would be perfect for that
2024-05-16 04:37:36
BTW, I'm finding you can tweak settings of lower efforts to get much better compute/density ratio.
2024-05-16 04:39:54
How to read the 'relative bpp'/'relative real' columns, those are the relationship to the value for the next less dense milestone.
2024-05-16 04:42:32
So d0e7E4g3 is 10x faster than d0e10 for 99.91% the bpp.
2024-05-16 04:44:55
e6E4g3 is 3x as fast as e8 for 99.62% the bpp.
2024-05-16 04:46:45
2024-05-16 04:49:30
This depends on content. For some content, there is not much improvement for low efforts, but e9 and e10 are easier to beat.
KKT
2024-05-16 05:02:50
Testing a DNG file from my iPhone 13 Pro. 12 bits. Converted to PNG->JXL 3 times with 12 bits, 10 bits and default bit depths. Was a bit surprised to see they were all exactly the same size. But maybe there is only 10 bits worth of data in there? `jxlinfo IMG_2042_12bpp.jxl IMG_2042_10bpp.jxl IMG_2042.jxl JPEG XL file format container (ISO/IEC 18181-2) JPEG XL image, 3024x4032, lossy, 12-bit RGB intensity_target: 10000.000000 nits min_nits: 0.000000 relative_to_max_display: 0 linear_below: 0.000000 Color space: RGB, D65, Rec.2100 primaries, PQ transfer function, rendering intent: Perceptual Size: 1,358,415 bytes JPEG XL file format container (ISO/IEC 18181-2) JPEG XL image, 3024x4032, lossy, 10-bit RGB intensity_target: 10000.000000 nits min_nits: 0.000000 relative_to_max_display: 0 linear_below: 0.000000 Color space: RGB, D65, Rec.2100 primaries, PQ transfer function, rendering intent: Perceptual Size: 1,358,415 bytes JPEG XL file format container (ISO/IEC 18181-2) JPEG XL image, 3024x4032, lossy, 16-bit RGB intensity_target: 10000.000000 nits min_nits: 0.000000 relative_to_max_display: 0 linear_below: 0.000000 Color space: RGB, D65, Rec.2100 primaries, PQ transfer function, rendering intent: Perceptual Size: 1,358,416 bytes`
yoochan
monad How to read the 'relative bpp'/'relative real' columns, those are the relationship to the value for the next less dense milestone.
2024-05-16 05:14:27
Interesting!
monad
KKT Testing a DNG file from my iPhone 13 Pro. 12 bits. Converted to PNG->JXL 3 times with 12 bits, 10 bits and default bit depths. Was a bit surprised to see they were all exactly the same size. But maybe there is only 10 bits worth of data in there? `jxlinfo IMG_2042_12bpp.jxl IMG_2042_10bpp.jxl IMG_2042.jxl JPEG XL file format container (ISO/IEC 18181-2) JPEG XL image, 3024x4032, lossy, 12-bit RGB intensity_target: 10000.000000 nits min_nits: 0.000000 relative_to_max_display: 0 linear_below: 0.000000 Color space: RGB, D65, Rec.2100 primaries, PQ transfer function, rendering intent: Perceptual Size: 1,358,415 bytes JPEG XL file format container (ISO/IEC 18181-2) JPEG XL image, 3024x4032, lossy, 10-bit RGB intensity_target: 10000.000000 nits min_nits: 0.000000 relative_to_max_display: 0 linear_below: 0.000000 Color space: RGB, D65, Rec.2100 primaries, PQ transfer function, rendering intent: Perceptual Size: 1,358,415 bytes JPEG XL file format container (ISO/IEC 18181-2) JPEG XL image, 3024x4032, lossy, 16-bit RGB intensity_target: 10000.000000 nits min_nits: 0.000000 relative_to_max_display: 0 linear_below: 0.000000 Color space: RGB, D65, Rec.2100 primaries, PQ transfer function, rendering intent: Perceptual Size: 1,358,416 bytes`
2024-05-16 05:35:50
I read this as asserting signaled bitdepth in the codestream just informs the decoder https://discord.com/channels/794206087879852103/804324493420920833/1228977409915883581
2024-05-16 05:37:34
for VarDCT
_wb_
KKT Testing a DNG file from my iPhone 13 Pro. 12 bits. Converted to PNG->JXL 3 times with 12 bits, 10 bits and default bit depths. Was a bit surprised to see they were all exactly the same size. But maybe there is only 10 bits worth of data in there? `jxlinfo IMG_2042_12bpp.jxl IMG_2042_10bpp.jxl IMG_2042.jxl JPEG XL file format container (ISO/IEC 18181-2) JPEG XL image, 3024x4032, lossy, 12-bit RGB intensity_target: 10000.000000 nits min_nits: 0.000000 relative_to_max_display: 0 linear_below: 0.000000 Color space: RGB, D65, Rec.2100 primaries, PQ transfer function, rendering intent: Perceptual Size: 1,358,415 bytes JPEG XL file format container (ISO/IEC 18181-2) JPEG XL image, 3024x4032, lossy, 10-bit RGB intensity_target: 10000.000000 nits min_nits: 0.000000 relative_to_max_display: 0 linear_below: 0.000000 Color space: RGB, D65, Rec.2100 primaries, PQ transfer function, rendering intent: Perceptual Size: 1,358,415 bytes JPEG XL file format container (ISO/IEC 18181-2) JPEG XL image, 3024x4032, lossy, 16-bit RGB intensity_target: 10000.000000 nits min_nits: 0.000000 relative_to_max_display: 0 linear_below: 0.000000 Color space: RGB, D65, Rec.2100 primaries, PQ transfer function, rendering intent: Perceptual Size: 1,358,416 bytes`
2024-05-16 07:36:36
In lossy mode, bit depth is just "FYI" metadata. The encoder always takes the full precision of the input image buffer as input, converts it to XYB, and encodes things with a precision that only depends on the quality setting (given with --distance or --quality, doesn't matter, it's just different scales that all map to distance internally)
2024-05-16 07:38:35
So the bit depth is basically just a suggestion for a bit depth to use to represent the decoded image.
KKT
2024-05-16 03:45:13
Oh interesting, wouldn't have been my guess.
_wb_
2024-05-16 08:22:17
The actual precision of lossy jxl images cannot really be expressed as a bit depth, especially not an RGB bit depth. The spec allows basically arbitrary precision (in libjxl it is in practice capped by the use of float32 internally, but still that's a pretty high precision), so e.g. slow gradients can be done super accurately in jxl, while other formats tend to struggle with that due to having a relatively low internal precision.
2024-05-16 08:29:03
Especially video codecs need to make a compromise there: it needs to be implementable in hardware, preferably not using too much SRAM and only using fixed point arithmetic, and also the decoding process needs to be fully specified (no wiggle room for implementations to trade precision for speed) since otherwise errors can accumulate, so they typically end up having a relatively low internal precision. Which is fine for their use case, which is video delivery.
jonnyawsom3
2024-05-16 08:41:49
For a moment I wondered if the 32float regression I found could effect VarDCT at all, but I don't think it does pallete if I recall
_wb_
2024-05-17 05:09:55
No, it's not related. VarDCT only uses Modular to encode integers.
monad
monad This depends on content. For some content, there is not much improvement for low efforts, but e9 and e10 are easier to beat.
2024-05-17 02:57:44
<https://loathra.com/jxl/bench/20240517.html>
yoochan
2024-05-17 07:25:57
Amazing job!
_wb_
2024-05-21 10:57:24
The folks at MSU tried out ssimulacra2 as a metric for video (just frame by frame, not taking into account temporal information)
afed
2024-05-21 12:44:18
not bad actually, given that especially at higher bitrates there may be a very wide fluctuation of what people will choose and appeal can be favoured over everything else, so even no-reference metrics can get very high scores
Quackdoc
2024-05-21 12:56:41
I've been defaulting to ssimu2 for pretty much everything lately :D
damian101
2024-05-21 03:25:59
I requested ssimulacra2 scores for the next video codec competition from the MSU guys a couple months ago <:woag:1070464147805970432>
Orum
2024-05-21 03:28:00
isn't MSU that ๐Ÿ‡ท๐Ÿ‡บ group that charges to see their results?
afed
2024-05-21 03:30:19
only the most detailed information, which is mainly interesting for large companies and MOS and such benchmarks in general are very costly, so I don't see a problem that the detailed results aren't free basic is publicly available
afed not bad actually, given that especially at higher bitrates there may be a very wide fluctuation of what people will choose and appeal can be favoured over everything else, so even no-reference metrics can get very high scores
2024-05-21 03:31:42
like here, all metrics are poorly correlated with mos, because ~0.5 is basically the same as a coin toss
2024-05-21 03:33:11
when the quality for some content is high enough, people can't properly rank what's best
HCrikki
2024-05-21 03:35:50
visual compareasons are problematic at all but high compression levels. even subjective appreciations can be affected by sight, the display panel used and lighting conditions
2024-05-21 03:37:58
i myself commonly diff outputs against the originals then multiply for a whole set so as to make what were unperceptible deviations much more noticeable, especially for noise
damian101
afed like here, all metrics are poorly correlated with mos, because ~0.5 is basically the same as a coin toss
2024-05-21 03:43:21
I don't think 0.5 can mean decorrelated, otherwise most of those metrics would be negatively correlated with perceived quality, which I find hard to believe.
afed
I don't think 0.5 can mean decorrelated, otherwise most of those metrics would be negatively correlated with perceived quality, which I find hard to believe.
2024-05-21 03:51:22
i mostly mean that almost all metrics are 0.5 and below, so it's a very difficult case for a correct MOS comparison, some results may be true when the difference is obvious, but some may not, like even for Y and YUV VMAF for the same version there's a huge gap, which is usually not the case in practice
damian101
afed i mostly mean that almost all metrics are 0.5 and below, so it's a very difficult case for a correct MOS comparison, some results may be true when the difference is obvious, but some may not, like even for Y and YUV VMAF for the same version there's a huge gap, which is usually not the case in practice
2024-05-21 03:55:00
VMAF doesn't even consider chroma, how can YUV VMAF be different than Y VMAF?
afed
2024-05-21 03:57:31
just all the channels are merged into a single one, from what I understand
Orum
2024-05-21 04:25:36
I imagine they convert U and V to grayscale channels and run it on that, even though that's a pretty bad way of doing it
afed
2024-05-21 04:35:03
there's some channel mixing ratio that gives a better results and not just for vmaf but usually just Y is enough for vmaf
2024-05-21 04:42:23
like
_wb_
2024-05-21 07:15:22
So that's weighing Y 10/12 and U,V 1/12 each then, in that top one, I guess
afed
2024-05-22 11:39:17
2024-05-22 11:46:20
2024-05-22 11:49:25
_wb_
2024-05-22 12:45:42
It's a rather color blind way of dealing with color, imo, to just apply a grayscale metric to chroma components. SSIM as it was originally defined doesn't make sense on chroma, since it applies a kind of gamma corrrection, treating errors in the darks differently from errors in the brights (errors in darks are considered worse than errors in the brights). When applied to Cb and Cr components, that means it will consider errors in yellows and greens worse than errors in blues or in reds, which doesn't make any sense.
yoochan
2024-05-24 11:07:58
I did a small test (with the image 15 of the kodak set) in which I benchmarked the size and score of lossy jxl at high quality (for every distances from 0 to 2 by step of 0.001) and in both cases, for butteraugli, and the effect is even stronger for ssimulacra2), the highest efforts don't give the higher ratio size vs score... strange isn't it ?
2024-05-24 11:09:40
2024-05-24 11:11:19
for butteraugli e9 seems to perform a bit better than e10, and for ssimulacra2 e4 seems to be better
_wb_
2024-05-24 01:53:51
ssimu2 > 90 is very high quality, probably the effect is caused by low efforts not doing gaborish โ€” when https://github.com/libjxl/libjxl/pull/3563 gets merged, higher efforts should also not do gaborish for these very high qualities
2024-05-24 01:59:57
I think effort 8+ might be producing slightly worse results than e6/e7. We usually don't test those high efforts as thoroughly as the default effort, and I think it may be trying too hard to optimize for butteraugli at those high efforts.
yoochan
2024-05-24 02:00:03
true ! I have to pull wait for it to be merged !
afed
_wb_ I think effort 8+ might be producing slightly worse results than e6/e7. We usually don't test those high efforts as thoroughly as the default effort, and I think it may be trying too hard to optimize for butteraugli at those high efforts.
2024-05-24 02:05:41
yeah, like I already said, at very high qualities some tools need to be re-tuned (for higher efforts) or maybe even disabled if not giving any improvements
monad
yoochan I did a small test (with the image 15 of the kodak set) in which I benchmarked the size and score of lossy jxl at high quality (for every distances from 0 to 2 by step of 0.001) and in both cases, for butteraugli, and the effect is even stronger for ssimulacra2), the highest efforts don't give the higher ratio size vs score... strange isn't it ?
2024-05-24 02:44:40
Is there robust reason to believe these results strange for this particular image? Are they outside expectation given measured correlation between the metrics and subjective assessment?
_wb_
2024-05-24 02:47:38
the data from CID22 that I used to tune/validate ssimulacra2 had an average human score of 88 for the original (people don't all give the max score to any image, even if the image is literally identical to the one they're comparing against), and there's always some amount of noise and uncertainty in human scores
2024-05-24 02:51:27
ssimu2 had a mean abs error of 5 or so w.r.t. the human scores, so you can add an implicit ยฑ5 to ssimu2 scores
2024-05-24 02:52:37
the human scores themselves had average 90% confidence intervals with a width of 4.4, so even those have to be interpreted with an implicit ยฑ2.2
monad
2024-05-24 03:00:56
If I understand correctly, we should not trust that ssimu2 can differentiate so precisely that we should be surprised about the demonstrated performance at high quality on this image.
_wb_
2024-05-24 03:03:20
it's not even clear to me what visual quality really means for very high qualities (i.e. enough below 1 JND so that literally no human can tell the difference)
2024-05-24 03:08:42
that said: ssimulacra2 is a classical metric (no funky AI stuff), a score of 100 is guaranteed to be mathematically lossless, and nothing in the math can introduce non-monotonic behavior or other weirdness. It may be weighing things incorrectly (e.g. assigning too much importance to one component over the other, or one scale over the other), but it only uses positive weights, i.e. more error always means lower score.
yoochan
2024-05-24 04:15:45
Thanks for the details!
_wb_
afed yeah, like I already said, at very high qualities some tools need to be re-tuned (for higher efforts) or maybe even disabled if not giving any improvements
2024-05-24 04:35:40
So far, most of the encoder tuning has been done for the d1-d3 range for photographic images, and recently some non-photo too. Also the focus has been on perceptual encoding, i.e. for images in visible light, viewed by humans. For some images that doesn't make sense (e.g. scientific / medical images) and we should instead do something that is just trying to minimize sample error without making assumptions on how the samples will be rendered (<@179701849576833024> recently added an option for that and made a start of an implementation). For the very high and very low quality (well outside the d1-d3 range that is the most useful range in practice and the one we've been focusing on mostly), probably there is room for improvement.
afed
_wb_ So far, most of the encoder tuning has been done for the d1-d3 range for photographic images, and recently some non-photo too. Also the focus has been on perceptual encoding, i.e. for images in visible light, viewed by humans. For some images that doesn't make sense (e.g. scientific / medical images) and we should instead do something that is just trying to minimize sample error without making assumptions on how the samples will be rendered (<@179701849576833024> recently added an option for that and made a start of an implementation). For the very high and very low quality (well outside the d1-d3 range that is the most useful range in practice and the one we've been focusing on mostly), probably there is room for improvement.
2024-05-24 04:52:30
higher quality should be much easier to tune because it's not a bit starving case and most of the tools that are needed to compensate distortions or hide artefacts are actually not that important or even harmful so it's mostly methods that improve lossless or close to lossless and very low quality will requires much more complex changes and research
KKT
2024-06-01 11:13:15
I'm testing progressive decodes and getting some surprising results. It looks like JPEG is besting JPEG XL it terms of getting a decent image up first. Left image is JPEG from mozjpeg with -progressive on (although it made no difference). Right is cjxl -e9 -p -d matched to the SSIMU2 score of the jpeg.
Orum
2024-06-01 11:43:52
try with `--faster_decoding=4` Anyway, at matched quality levels that doesn't surprise me (at least in scenarios that are not throughput-limited). But what interests me is when you have a hard bitrate cap, want visually lossless (or near visually lossless) quality, and then want the fastest transfer + decode time.
Quackdoc
KKT I'm testing progressive decodes and getting some surprising results. It looks like JPEG is besting JPEG XL it terms of getting a decent image up first. Left image is JPEG from mozjpeg with -progressive on (although it made no difference). Right is cjxl -e9 -p -d matched to the SSIMU2 score of the jpeg.
2024-06-02 12:01:27
can you send the image itself? I wonder if this is an artifact of https://github.com/libjxl/libjxl/issues/3296 i've found libjxl to not be ideal when doing progressive decoding
2024-06-02 12:02:31
also when doing encoding, instead of doing `-p` I normally use now `--progressive_dc=1` for lossy images since i've found it to generally be smaller
jonnyawsom3
2024-06-02 12:33:37
It's more a decision of the decoder than a limit of the format to decide when to show a group, the Oxide examples clearly show this https://discord.com/channels/794206087879852103/1065165415598272582/1176213246437494935
KKT
2024-06-02 03:49:19
Original:
2024-06-02 03:50:21
Thought it might be the image so tried it with a different, much bigger one. Pretty much the same results:
2024-06-02 03:50:57
I'll try `--progressive_dc=1` and `--faster_decoding=4` out
monad
2024-06-02 05:32:04
allowing more patches benefits density ``` B ssimu2 dssim alien 150845 84.94961437 0.00031486 alien_more 143620 85.97630715 0.00030562 perlin 170514 85.34212669 0.00030758 perlin_more 143936 85.75967001 0.00026263 pfp 522960 81.83891840 0.00042752 pfp_more 442135 83.15266273 0.00035611```
2024-06-02 05:32:56
also, e8-9 doesn't like patches ``` colors (mean) images Mpx (mean) | colors/px (mean) | share | share | | tag 24 100.00% 0.52 100.00% 3400 0.01 all 6 25.00% 0.22 10.54% 694 0.00 game 6 25.00% 0.30 14.25% 139 0.00 reduced_palette 24 100.00% 0.52 100.00% 3400 0.01 text 9 37.50% 0.78 55.74% 4296 0.00 ui 24 100.00% 0.52 100.00% 3400 0.01 visibly_opaque 15 62.50% 0.66 79.29% 5004 0.01 DirectClass_sRGB 2 8.33% 0.29 4.69% 2816 0.01 DirectClass_sRGB_Alpha 1 4.17% 0.45 3.60% 26 0.00 PseudoClass_Gray 6 25.00% 0.26 12.41% 148 0.00 PseudoClass_sRGB 1 4.17% 0.37 2.97% 5193 0.01 source_gnome_screenshot->exiftool 23 95.83% 0.53 97.03% 3323 0.01 source_imagemagick->exiftool Mpx/s real (mean) | Pareto front for bpp and real time B bpp (mean)| | best of 1497634 1.036160 4.291 R cjxl_0.10.2-p_d1e7 1709641 1.189026 5.240 R cjxl_0.10.2_d1e7 3206825 2.203859 0.81073 ยท cjxl_0.10.2-p_d1e9 3207420 2.205582 1.2093 ยท cjxl_0.10.2-p_d1e8 3435532 2.394660 1.2079 ยท cjxl_0.10.2_d1e8 3444868 2.398201 0.79728 ยท cjxl_0.10.2_d1e9```
2024-06-02 05:34:37
actually, the highest efforts probably just suck for VarDCT in general
_wb_
2024-06-02 05:35:26
Libjxl currently doesn't show DC frames progressively, it only shows them when it reaches the AC frame. So in terms of bytes for first image, cjxl -p is currently actually less progressive in practice than default encoding.
monad
2024-06-02 08:52:15
```images Mpx (mean) images Mpx (mean) | share | share tag | share | share tag 798 100.00% 1.30 100.00% all 685 85.84% 1.37 89.91% visibly_opaque 65 8.15% 2.73 17.05% 3d 113 14.16% 0.93 10.09% visibly_transparent 45 5.64% 1.55 6.71% algorithmic 6 0.75% 0.37 0.21% DirectClass_Gray_Alpha 73 9.15% 1.89 13.27% digital_painting 495 62.03% 1.48 70.18% DirectClass_sRGB 84 10.53% 2.24 18.06% game 173 21.68% 1.21 20.13% DirectClass_sRGB_Alpha 56 7.02% 0.21 1.15% logo 30 3.76% 1.63 4.70% PseudoClass_Gray 83 10.40% 1.15 9.14% lossy 87 10.90% 0.54 4.55% PseudoClass_sRGB 51 6.39% 1.75 8.57% machine_learning 7 0.88% 0.33 0.22% PseudoClass_sRGB_Alpha 96 12.03% 0.84 7.71% photo 83 10.40% 0.35 2.82% source_app->exiftool 73 9.15% 0.23 1.59% pixel_art 41 5.14% 0.27 1.05% source_gimp 68 8.52% 0.30 1.94% texture 525 65.79% 1.44 72.86% source_imagemagick->exiftool 58 7.27% 1.28 7.16% ui 89 11.15% 1.44 12.35% source_other 60 7.52% 1.52 8.76% watermark 60 7.52% 1.89 10.92% source_web->exiftool 159 19.92% 1.68 25.74% content_other Mpx/s real (mean) | Pareto front for bpp and CPU time unique mins | |Pareto front for bpp and real time B bpp (mean) mins | Mpx/s CPU (mean)|| best of 855533978 6.54794670 100.00% ยทยทยทยท 17.251 22.095 CR cjxl_0.10.1_d0e1 zune_0.5.0 860429631 6.59029791 21.68% 21.30% 40.784 47.864 CR cjxl_0.10.1_d0e1 913975002 7.04326593 78.70% 78.32% 31.526 43.323 ยทยท zune_0.5.0```
2024-06-02 08:52:28
zune includes write time
2024-06-02 09:09:18
monad allowing more patches benefits density ``` B ssimu2 dssim alien 150845 84.94961437 0.00031486 alien_more 143620 85.97630715 0.00030562 perlin 170514 85.34212669 0.00030758 perlin_more 143936 85.75967001 0.00026263 pfp 522960 81.83891840 0.00042752 pfp_more 442135 83.15266273 0.00035611```
2024-06-04 07:31:19
``` B ssimu2 dssim alien 150845 84.94961437 0.00031486 alien_morer 136976 86.69735563 0.00028835 perlin 170514 85.34212669 0.00030758 perlin_morer 142841 86.32329967 0.00023073 pfp 522960 81.83891840 0.00042752 pfp_morer 409098 83.23960189 0.00033600```
monad also, e8-9 doesn't like patches ``` colors (mean) images Mpx (mean) | colors/px (mean) | share | share | | tag 24 100.00% 0.52 100.00% 3400 0.01 all 6 25.00% 0.22 10.54% 694 0.00 game 6 25.00% 0.30 14.25% 139 0.00 reduced_palette 24 100.00% 0.52 100.00% 3400 0.01 text 9 37.50% 0.78 55.74% 4296 0.00 ui 24 100.00% 0.52 100.00% 3400 0.01 visibly_opaque 15 62.50% 0.66 79.29% 5004 0.01 DirectClass_sRGB 2 8.33% 0.29 4.69% 2816 0.01 DirectClass_sRGB_Alpha 1 4.17% 0.45 3.60% 26 0.00 PseudoClass_Gray 6 25.00% 0.26 12.41% 148 0.00 PseudoClass_sRGB 1 4.17% 0.37 2.97% 5193 0.01 source_gnome_screenshot->exiftool 23 95.83% 0.53 97.03% 3323 0.01 source_imagemagick->exiftool Mpx/s real (mean) | Pareto front for bpp and real time B bpp (mean)| | best of 1497634 1.036160 4.291 R cjxl_0.10.2-p_d1e7 1709641 1.189026 5.240 R cjxl_0.10.2_d1e7 3206825 2.203859 0.81073 ยท cjxl_0.10.2-p_d1e9 3207420 2.205582 1.2093 ยท cjxl_0.10.2-p_d1e8 3435532 2.394660 1.2079 ยท cjxl_0.10.2_d1e8 3444868 2.398201 0.79728 ยท cjxl_0.10.2_d1e9```
2024-06-04 07:35:45
``` Mpx/s real (mean) | Pareto front for bpp and real time B bpp (mean) mins unique mins | best of 1407207 0.9413538 91.67% 87.50% 1.3825 R cjxl_0.10.2-p4_d1e7 1709641 1.189026 12.50% 8.33% 5.240 R cjxl_0.10.2_d1e7```
2024-06-05 12:52:48
``` Mpx/s real B bpp | best of 32806 0.313131 0.5812 cwebp_1.3.2_z9 32837 0.313427 0.7170 cjxl_0.10.2-p5_d1e7num_threads0 34140 0.325864 13 cwebp_1.3.2_z8 39239 0.374534 0.3846 cjxl_0.10.1_d0e10P0I0g3modular_palette_colors10000patches0num_threads0 104147 0.994077 0.2568 cjxl_0.10.2-p5_d0e9num_threads0 133964 1.27868 0.2525 cjxl_0.10.1_d0e9num_threads0 341087 3.25566 1.68 cjxl_0.10.2-p5_d0e7num_threads0 409098 3.90482 2.33 cjxl_0.10.2-p4_d1e7 479706 4.57877 2.25 cjxl_0.10.1_d0e7num_threads0 522960 4.99162 3.25 cjxl_0.10.2_d1e7num_threads0```
jonnyawsom3
monad allowing more patches benefits density ``` B ssimu2 dssim alien 150845 84.94961437 0.00031486 alien_more 143620 85.97630715 0.00030562 perlin 170514 85.34212669 0.00030758 perlin_more 143936 85.75967001 0.00026263 pfp 522960 81.83891840 0.00042752 pfp_more 442135 83.15266273 0.00035611```
2024-06-05 03:09:32
In what way did you "allow more patches" by the way?
monad
2024-06-05 03:49:19
first just tweaking patch heuristics, like marking more screenshot areas and increasing patch size, then looking for more patch occurrences not detected by the text-like heuristics. but the last version also tries to find a tile layout across the entire image
2024-06-05 04:00:45
so in the last image where basically everything is caught, probably none of those patches were exactly found by text-like heuristics. while in the previous image all of the patches were found by text-like heuristics (somewhat relaxed)
2024-06-05 04:09:15
there is somewhat a loss in density for text compared to p4. I would have to investigate in a disciplined way to figure out why. but even disregarding the timings (I didn't optimize at all), I am not sure the results are super convincing compared to other lossless tools
_wb_
monad first just tweaking patch heuristics, like marking more screenshot areas and increasing patch size, then looking for more patch occurrences not detected by the text-like heuristics. but the last version also tries to find a tile layout across the entire image
2024-06-05 09:40:02
feel free to make a pull request if you have tweaks for the patch heuristics ๐Ÿ™‚
monad
2024-06-06 09:15:20
Okay, so I managed to beat WebP on that image. d0e7num_threads0 13778 B @ 4 Mpx/s
CrushedAsian255
2024-06-11 12:18:22
Just wondering how much better is JXL compared to JPEG XR?
spider-mario
2024-06-11 01:13:07
I donโ€™t recall JPEG XR being any good at all, so probably โ€œplentyโ€
_wb_
2024-06-11 01:19:23
JPEG XR is somewhere between JPEG and JPEG 2000 โ€” it was designed to be somewhere in between those two in terms of both functionality and compression performance, and also in terms of computational complexity (J2K was seen as "too complex", both computationally and in how much functionality it brings). For the typical quality range, there is not a huge difference between the compression performance of the best JPEG encoders (say, jpegli and mozjpeg) and that of JPEG 2000. So generally speaking, I think you can assume JPEG, JPEG XR and JPEG 2000 are all more or less the same, with the caveat that for JPEG things can get significantly worse if you use a 'bad' encoder (one that is optimizing for speed, not compression performance; e.g. default libjpeg-turbo or the hardware encoders in cameras), and also things break down at the lower bitrates (it becomes a blocky mess while J2K / JXR can still produce a less embarrassing image) and de facto JPEG lacks features such as alpha channels and high bit depth (it can in principle do these things according to the actual JPEG spec, but in practice applications implement only the JFIF/Exif subset which means 8-bit and no interpretation of components that would allow alpha).
spider-mario
2024-06-11 01:33:08
AFAICT, JPEG XR is quite a bit worse than even JPEGย โ€“ check out the banding in the sky at 2bpp here: https://afontenot.github.io/image-formats-comparison/#abandoned-factory&JPEGLI=l&JPEGXR=l
2024-06-11 01:34:38
or in the image โ€œBath from Alexandra Parkโ€
2024-06-11 01:36:00
or how much detail it removes from the lake in โ€œCecret Lakeโ€ at 2.5bpp
2024-06-11 01:38:44
Vallรฉe de Colca at almost 3bpp ๐Ÿ˜ฌ
_wb_
2024-06-11 01:44:13
Yes, though I cannot tell to what extent that is an inherent problem of the JXR bitstream or just a bad encoder. In practice any format is only as good as the best encoder, and JXR is pretty much abandonware โ€” an implementation was made available when Microsoft was pursuing standardization, but it's not the nicest tool to use (e.g. it's quite idiosyncratic about its input and output formats) and it has not seen any improvements or even maintenance in many years now.
dogelition
2024-06-11 02:57:46
JXR does seem to be pretty good at lossless half float compression (e.g. Windows HDR screenshots), I did a quick comparison against JXL with a few screenshots I had lying around (lossless transcoding via libjxl, default settings on effort etc.): ``` 30493053 -> 27807169 bytes, -8.81% 16173522 -> 11866731 bytes, -26.63% 34901826 -> 24896383 bytes, -28.67% 24749140 -> 21437036 bytes, -13.38% 29241593 -> 27512549 bytes, -5.91% 30205570 -> 30416320 bytes, 0.70% Best: -28.67% Worst: 0.70% Mean: -13.78% ``` Interesting that one image actually compresses worse as JXL ๐Ÿค”
_wb_
2024-06-11 04:07:59
Ah, interesting, I haven't looked at lossless JXR. I didn't know it does a decent job at lossless...
2024-06-11 04:11:50
We should probably at some point tweak jxl's lossless encoding for float/half-float. Probably some of our encoder heuristics are not so great for this case, there might be room for improvement (things have mostly been tested with png input images so far).
2024-06-21 04:34:21
https://docs.google.com/presentation/d/1z0BCT2Ql_z_jiPODxYCZi0G_PCt9KB_QeE3hJesgb_8/edit?usp=sharing โ€” some WIP slides to report on some benchmarking we've been doing (well, mostly <@604964375924834314> )
yoochan
2024-06-21 08:16:15
interesting ! not all graphs are easy to interpret... but it's not my job ๐Ÿ˜„ nice work
afed
2024-06-22 01:49:32
interesting, e3 is worse than e2 on this large photos for some reason, patches? ```F26 Multithread 87.280s, 4.650s, 171,419,206 JXL e4 16 Thread 16.799s, 4.959s, 184,393,550 HALIC Multithread 0.703s, 0.984s, 187,375,364 JXL e2 16 Thread 6.159s, 2.312s, 195,672,678 JXL e3 16 Thread 8.607s, 4.661s, 205,789,465 F23 Multithread 2.701s, 1.828s, 211,589,542 JXL e1 16 Thread 2.053s, 2.109s, 216,187,168``` <https://encode.su/threads/4141-Simple-Lossless-Image-Codec-(-SLI)/page2>
jonnyawsom3
2024-06-22 04:36:15
Since 0.10 patches shouldn't be enabled at all until e10, and before e5 would enable patches in lossless
_wb_
2024-06-23 06:57:46
It's not guaranteed that e3 actually compresses better than e2
2024-06-23 07:05:39
For nonphoto, usually e2 is better. For photo, usually e3 is better. But there are plenty of counterexamples.
monad
2024-06-24 06:00:58
it's photo though, so isn't it a quite surprising result? could it be related to PPM conversion process?
_wb_
2024-06-24 06:48:21
I saw the same thing with the multispectral satellite images from <@446428281630097408> , which are photographic (not typical but still) and e2 outperforms e3 on them.
monad
2024-06-24 07:12:31
hmm
Since 0.10 patches shouldn't be enabled at all until e10, and before e5 would enable patches in lossless
2024-06-24 07:20:02
true for images eligible for chunked encode, requiring at least one edge > 2048px. smaller images will still try patches
jonnyawsom3
2024-06-24 01:00:32
Even then, the results only go up to e4 and patches is enabled at e5, or at least used to be
_wb_
2024-06-24 01:45:00
I cannot seem to find the original images โ€” when I follow the link, I only see jpeg files and rw2 files, but no ppm files
2024-06-24 01:55:07
Anyway, e3 generally works better than e2 for photos, but it depends on the behavior at the pixel level โ€” there can be things like more or less sensor or photon noise, different debayering methods, all kinds of on-camera processing, and presumably in some cases e2 will be better and in other cases e3 is better.
๐‘›๐‘ฆ๐‘•๐‘ฃ๐‘ธ๐‘ฅ๐‘ฉ๐‘ฏ๐‘ฆ | ๆœ€ไธ่ชฟๅ’Œใฎไผๆ’ญ่€… | ็•ฐ่ญฐใฎๅ…ƒ็ด 
2024-07-17 06:51:26
maybe someone here can find these useful? Lossy sizes: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossy.size.tsv Lossy SSIM: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossy.ssim.tsv Lossless sizes: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossless.size.tsv
๐‘›๐‘ฆ๐‘•๐‘ฃ๐‘ธ๐‘ฅ๐‘ฉ๐‘ฏ๐‘ฆ | ๆœ€ไธ่ชฟๅ’Œใฎไผๆ’ญ่€… | ็•ฐ่ญฐใฎๅ…ƒ็ด  maybe someone here can find these useful? Lossy sizes: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossy.size.tsv Lossy SSIM: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossy.ssim.tsv Lossless sizes: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossless.size.tsv
2024-07-22 07:23:34
It's SSIMULACRA 2 now
_wb_
2024-07-22 12:51:12
there are some images like https://derpicdn.net/img/view/2024/2/16/3303519.png in the set that have alpha so obviously the scores for jpg will be very low for those
2024-07-22 01:02:29
https://docs.google.com/spreadsheets/d/1Wm_qwI_Ll1MrVcyKZcyIZr9aVWpTXYFdttdClTp2tH4/edit?usp=sharing
2024-07-22 01:03:15
just put the data in a sheet and made a little summary table
yoochan
2024-07-22 01:03:27
the categories (like g4sa) are standard denominations ?
Quackdoc
2024-07-22 01:07:14
eventually I need a script to make images for csv tables, full spreadsheet software kinda sucks
๐‘›๐‘ฆ๐‘•๐‘ฃ๐‘ธ๐‘ฅ๐‘ฉ๐‘ฏ๐‘ฆ | ๆœ€ไธ่ชฟๅ’Œใฎไผๆ’ญ่€… | ็•ฐ่ญฐใฎๅ…ƒ็ด 
yoochan the categories (like g4sa) are standard denominations ?
2024-07-22 02:14:21
https://github.com/PoneyClairDeLune/derpi-image-corpus/blob/main/corpus/README.md#still-images It's documented here
_wb_
2024-07-22 04:04:07
One thing to note is that ssimu2 was tuned and validated mostly with photographic images; most datasets with subjective scores have few or no non-photo images. Metrics should never be really trusted, but on nonphoto images that's probably even more true.
๐‘›๐‘ฆ๐‘•๐‘ฃ๐‘ธ๐‘ฅ๐‘ฉ๐‘ฏ๐‘ฆ | ๆœ€ไธ่ชฟๅ’Œใฎไผๆ’ญ่€… | ็•ฐ่ญฐใฎๅ…ƒ็ด 
2024-07-22 04:51:57
not sure if there would be a crowdsourced subjective scoring dataset for non-photographic images soon for use in perfecting the objective scores, but if that's of use maybe there are quite some people willing...
jonnyawsom3
2024-07-26 05:33:25
So... I saw a 200 MB PNG get uploaded by the graphic design guy for a game, opened it in Irfanview, disk size is almost equal to memory size. At first I assumed they had set the compression to 1 in whatever software they were using to export the PNG, then I zoomed in a notch... They applied a noise filter over the entire image, including the logo text at the bottom, making it near impossible to compress. So naturally, I'll leave the challenge to some of you <https://cdn.discordapp.com/attachments/1154514014563483759/1266220528893427855/ResoniteMarketing_A1PosterGeneric_01_v01.png?ex=66a45b43&is=66a309c3&hm=9f804960a30aa2a93c877ccfb4357be4b3c58d69dad2845a16e627037305827e&>
2024-07-26 05:34:29
Original, default ECT run, and JXL e9
2024-07-26 05:35:25
And now I realise the color count in the JXL is off by 800...
username
Original, default ECT run, and JXL e9
2024-07-26 05:52:40
I managed to get it smaller as a lossless WebP (135 MB). though I did drop the empty alpha, did you not drop it when doing the JXL?
jonnyawsom3
2024-07-26 05:57:08
Mine kept the alpha, I was running it after ECT so assumed it would already be stripped if it was empty
username
2024-07-26 05:59:38
wait a minute I just checked the alpha and it's not actually empty
2024-07-26 05:59:53
2024-07-26 06:00:28
2024-07-26 06:03:06
guess ill redo the lossless WebP then
2024-07-26 06:06:35
only ended up 2 MB bigger (137 MB total)
TheBigBadBoy - ๐™ธ๐š›
So... I saw a 200 MB PNG get uploaded by the graphic design guy for a game, opened it in Irfanview, disk size is almost equal to memory size. At first I assumed they had set the compression to 1 in whatever software they were using to export the PNG, then I zoomed in a notch... They applied a noise filter over the entire image, including the logo text at the bottom, making it near impossible to compress. So naturally, I'll leave the challenge to some of you <https://cdn.discordapp.com/attachments/1154514014563483759/1266220528893427855/ResoniteMarketing_A1PosterGeneric_01_v01.png?ex=66a45b43&is=66a309c3&hm=9f804960a30aa2a93c877ccfb4357be4b3c58d69dad2845a16e627037305827e&>
2024-07-26 06:14:13
is the challenge to compress better by removing the noise ?
jonnyawsom3
2024-07-26 06:29:37
I was going for lossless, but whatever you'd like really. I just want to see how people handle a nightmare image
Oleksii Matiash
And now I realise the color count in the JXL is off by 800...
2024-07-26 06:35:38
IrfanView is not accurate here at all, I don't know how it counts colors, but the difference is there (almost?) always
So... I saw a 200 MB PNG get uploaded by the graphic design guy for a game, opened it in Irfanview, disk size is almost equal to memory size. At first I assumed they had set the compression to 1 in whatever software they were using to export the PNG, then I zoomed in a notch... They applied a noise filter over the entire image, including the logo text at the bottom, making it near impossible to compress. So naturally, I'll leave the challenge to some of you <https://cdn.discordapp.com/attachments/1154514014563483759/1266220528893427855/ResoniteMarketing_A1PosterGeneric_01_v01.png?ex=66a45b43&is=66a309c3&hm=9f804960a30aa2a93c877ccfb4357be4b3c58d69dad2845a16e627037305827e&>
2024-07-26 06:38:53
We are in constant battle with our designers team, they just are not thinking about size and compressibility at all. It is ok for them, for example, to provide svg with 90% invisible shapes just because "it is invisible, what's the problem?"
Fox Wizard
Original, default ECT run, and JXL e9
2024-07-26 12:44:01
ECT -90099 --mt-deflate (165,667,468 bytes) ~~got bored and decided to waste some electricity <:KekDog:884736660376535040>~~
2024-07-26 12:44:20
Only 870.04KB (0.5349%) smaller than -9 --mt-deflate lmao
jonnyawsom3
2024-07-26 09:14:21
With WebP doing so well, ideally we could run effort 11 on a cropped area, then copy the parameters for the full image
Naksu
Fox Wizard ECT -90099 --mt-deflate (165,667,468 bytes) ~~got bored and decided to waste some electricity <:KekDog:884736660376535040>~~
2024-07-28 11:18:17
What does `-90099` change?
Fox Wizard
2024-07-28 11:18:53
Don't know exactly. But any slower and it'll be way too slow <:KekDog:884736660376535040>
jonnyawsom3
2024-07-28 11:21:47
> A different syntax may be used to achieve even more compression for deflate compression if time (and efficiency) is not a concern. > If the value is above 10000, the blocksplitting-compression cycle is repeated # / 10000 times. > If # % 10000 is above 9, level 9 is used and the number of iterations of deflate compression per block is set to # % 10000. > If # % 10000 is 9 or below, this number specifies the level.
2024-07-28 11:23:56
So it runs the block splitting 9 times with 9 deflate iterations, if I'm reading this right
2024-07-28 11:24:11
2024-07-28 11:24:33
Includes missing info from the command line help
TheBigBadBoy - ๐™ธ๐š›
> A different syntax may be used to achieve even more compression for deflate compression if time (and efficiency) is not a concern. > If the value is above 10000, the blocksplitting-compression cycle is repeated # / 10000 times. > If # % 10000 is above 9, level 9 is used and the number of iterations of deflate compression per block is set to # % 10000. > If # % 10000 is 9 or below, this number specifies the level.
2024-07-28 11:41:43
you surely meant block splitting 9 times, compression level 9 with 99 iterations
jonnyawsom3
2024-07-28 11:46:09
That would be 990099, I think
Naksu
2024-07-28 11:56:28
And what number would be likely to allow the strongest compression, regardless of the time required?
jonnyawsom3
2024-07-28 11:57:46
Theoretically, just press 9 until it no longer runs
Naksu
2024-07-28 11:59:04
2024-07-28 12:00:20
Will test for science, but I doubt it is a viable solution. <:KekDog:805390049033191445>
Fox Wizard
2024-07-28 12:00:36
-99999 ftw <:KittyUwU:1147753612529913938>
2024-07-28 12:00:50
And all filters b <:KekDog:884736660376535040>
jonnyawsom3
2024-07-28 12:02:39
The brute force evolutionary filtering
Naksu
2024-07-28 12:04:06
My motherboard will have melted before it's finished.
JendaLinda
2024-07-28 12:04:20
Would be a good test for recent Intel CPUs if they make it before exploding.
CrushedAsian255
2024-07-28 12:07:29
Who needs that prime checker thing when you can just optimise PNGs to heck and back
Oleksii Matiash
JendaLinda Would be a good test for recent Intel CPUs if they make it before exploding.
2024-07-28 12:49:18
Intel officially suggests reinstalling nvidia drivers 5-10 times to see if the cpu is affected or not ๐Ÿฅฒ
JendaLinda
2024-07-28 12:58:54
I know why I'm using architectures that are at least 5 years old.
๐‘›๐‘ฆ๐‘•๐‘ฃ๐‘ธ๐‘ฅ๐‘ฉ๐‘ฏ๐‘ฆ | ๆœ€ไธ่ชฟๅ’Œใฎไผๆ’ญ่€… | ็•ฐ่ญฐใฎๅ…ƒ็ด 
๐‘›๐‘ฆ๐‘•๐‘ฃ๐‘ธ๐‘ฅ๐‘ฉ๐‘ฏ๐‘ฆ | ๆœ€ไธ่ชฟๅ’Œใฎไผๆ’ญ่€… | ็•ฐ่ญฐใฎๅ…ƒ็ด  maybe someone here can find these useful? Lossy sizes: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossy.size.tsv Lossy SSIM: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossy.ssim.tsv Lossless sizes: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossless.size.tsv
2024-07-30 06:21:50
Added DSSIM as well, and changed the test cases. The tests are still running. Everything's not final yet, wanna give jpegli a try later. Lossy sizes: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossy.size.tsv Lossy SSIMU2: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossy.ssim.tsv Lossy DSSIM: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossy.dssim.tsv Lossless sizes: https://le-m.ltgc.cc/derpi-image-corpus/data/derpi.lossless.size.tsv
2024-07-30 06:24:13
~~may add "time" later just to see how horrible AVIF is~~
frep
TheBigBadBoy - ๐™ธ๐š› is the challenge to compress better by removing the noise ?
2024-08-05 10:20:01
"not only is it lossless..."
jonnyawsom3
2024-08-17 05:16:53
Noticed this <https://www.phoronix.com/review/amd-ryzen-9950x-9900x/12>
Oleksii Matiash
Noticed this <https://www.phoronix.com/review/amd-ryzen-9950x-9900x/12>
2024-08-17 07:39:37
On Windows it will be slower currently, probably ๐Ÿคฆโ€โ™‚๏ธ But it is a good sign, that jxl is used in tests
veluca
2024-08-17 08:08:29
and I think it's not using avx512 ๐Ÿ˜›
Quackdoc
2024-08-17 08:17:28
test scripts are here, https://github.com/phoronix-test-suite/phoronix-test-suite/tree/99c30505d730c2429ad2120346dc197cf3f1355c/ob-cache/test-profiles/pts/jpegxl-1.6.0 windows does download the static binary, on linux it compiles libjxl so it's not a great comparison to judge across, but there isn't really a *better* solution IMO since compiling on windows sucks
Oleksii Matiash
Quackdoc test scripts are here, https://github.com/phoronix-test-suite/phoronix-test-suite/tree/99c30505d730c2429ad2120346dc197cf3f1355c/ob-cache/test-profiles/pts/jpegxl-1.6.0 windows does download the static binary, on linux it compiles libjxl so it's not a great comparison to judge across, but there isn't really a *better* solution IMO since compiling on windows sucks
2024-08-17 08:18:04
I meant this https://www.youtube.com/watch?v=D1INvx9ca9M
Quackdoc
2024-08-17 08:18:52
I've only heard briefly about it, havnt learned much about it yet
monad
2024-08-20 07:14:06
https://loathra.com/jxl/bench/20240819.html
veluca
2024-08-20 08:02:13
send a PR? ๐Ÿ˜‰
_wb_
2024-08-20 08:24:39
Yes, please turn this into a PR! Also consider proposing changes to make e9/e10 more effective, it's very much possible that they too can be made faster and/or better.
veluca
2024-08-20 08:40:52
or make it `-e11` and `-e12`, that also works for me ๐Ÿ˜›
jonnyawsom3
2024-08-20 08:43:02
Or `-eeeeeeeeee`
CrushedAsian255
2024-08-20 08:47:15
```cjxl -e ฯ‰ Generates every possible valid JPEG XL bitstream to find the absolute smallest possible image file. Time complexity: "it will finish, eventually..." ```
spider-mario
2024-08-20 09:37:07
if we were to ever implement this, we should probably implement regular saving of the current search state to disk and support for resuming from the saved state
2024-08-20 09:37:54
so that a single power loss, or reboot for OS updates, etc. doesnโ€™t ruin the whole thing
2024-08-20 09:38:20
โ€œnoooooo this cjxl had been running for 37 yearsโ€
2024-08-20 09:38:28
โ€œIโ€™m sure it was close to being doneโ€
jonnyawsom3
2024-08-20 09:38:53
"Hmm, it's been running for a week already but I forgot to add an extra thread... Do I stop it now or is it nearly done?"
Quackdoc
2024-08-20 09:39:35
[av1_kekw](https://cdn.discordapp.com/emojis/758892021191934033.webp?size=48&quality=lossless&name=av1_kekw)
jonnyawsom3
2024-08-20 09:41:31
But being able to see what options e11/12/13/โˆž ended up choosing on a sample image, and reusing it on similar larger images was an idea that's already got an issue, maybe mixed with a general compression settings option for metadata
_wb_
spider-mario if we were to ever implement this, we should probably implement regular saving of the current search state to disk and support for resuming from the saved state
2024-08-20 09:44:38
That doesn't work if you do the search the Kolmogorov complexity way: just generate all bitstreams, in order of increasing length, until you find one that decodes to the image you want.
spider-mario
2024-08-20 09:46:07
why wouldnโ€™t it? we can just save every <n>th generated bitstream
_wb_
2024-08-20 09:47:02
Ah just to keep track of where you were, sure. But you won't have a valid bitstream until you're done.
spider-mario
2024-08-20 09:47:08
ah, right
2024-08-20 09:47:26
yeah, itโ€™s just so that stopping the program (one way or another) doesnโ€™t mean having to start again from scratch
_wb_
2024-08-20 09:49:08
In any case it would only theoretically work ๐Ÿ™‚
jonnyawsom3
2024-08-20 09:54:18
If a million JXL artists had a million browser tabs, eventually there would be your image
veluca
_wb_ Ah just to keep track of where you were, sure. But you won't have a valid bitstream until you're done.
2024-08-20 09:59:47
I mean you could be smart(er) and *only* generate valid bitstreams that correspond to reasonable images - after all, if you do lossless you can't really *choose* much except the decision tree, the distributions, the transforms and LZ77, no? so you could exhaustive search those instead of bitstreams ๐Ÿ˜›
_wb_
2024-08-20 10:15:56
Yes, that would turn it from a million lifetimes of the universe to only a thousand or so.
veluca
2024-08-20 10:37:42
I think with some genetic algorithms you can even do it in a sensible time
2024-08-20 10:37:47
I will not be writing it though
Oleksii Matiash
spider-mario if we were to ever implement this, we should probably implement regular saving of the current search state to disk and support for resuming from the saved state
2024-08-20 10:51:35
Some progress indicator for e11 would be very useful. Like 100 variants processed, 10^9 are waiting
๐‘›๐‘ฆ๐‘•๐‘ฃ๐‘ธ๐‘ฅ๐‘ฉ๐‘ฏ๐‘ฆ | ๆœ€ไธ่ชฟๅ’Œใฎไผๆ’ญ่€… | ็•ฐ่ญฐใฎๅ…ƒ็ด 
Or `-eeeeeeeeee`
2024-08-20 11:09:53
that will make certain people very happy XD
CrushedAsian255
Oleksii Matiash Some progress indicator for e11 would be very useful. Like 100 variants processed, 10^9 are waiting
2024-08-20 11:44:03
I think some kind of progress indicator would be helpful so I know just how many weeks it will take for my -e11 to encode
jonnyawsom3
2024-08-20 12:06:00
Then `-v` on cjxl would actually be useful too
CrushedAsian255
Then `-v` on cjxl would actually be useful too
2024-08-20 12:20:42
-v -v -v -v -h?
jonnyawsom3
2024-08-20 12:35:25
During encoding
CrushedAsian255
During encoding
2024-08-20 12:50:14
Fair point
2024-08-20 12:52:57
Does the API even expose progress?
2024-08-20 12:53:25
If not, that feels like something that would be important, like how would an application display to the end user the estimated transcode time
jonnyawsom3
2024-08-20 01:04:05
The issue is deciding what counts as "progress", is it finishing a group? Moving to the next heuristic?
Oleksii Matiash
The issue is deciding what counts as "progress", is it finishing a group? Moving to the next heuristic?
2024-08-20 06:54:47
The only thing that is important - more or less stable one "piece" time, and their number known from the start, so it can be used to calculate overall progress
CrushedAsian255
2024-08-26 11:34:30
finished writing my own little progressive loading tester
2024-08-26 11:39:30
40 kB/s
2024-08-26 11:41:30
`-d 2.5 -j 0 -p --progressive_dc=1 --progressive_ac`
TheBigBadBoy - ๐™ธ๐š›
monad https://loathra.com/jxl/bench/20240819.html
2024-08-27 01:07:27
did this finally got a PR ?
veluca
2024-08-27 01:18:30
not as far as I know
monad
TheBigBadBoy - ๐™ธ๐š› did this finally got a PR ?
2024-08-27 05:44:20
Look, that methodology is not very smart. First, I'm not a programmer, so I don't know the proper way to search such a big space to find a true optimum. Second, trying some monolithic array of settings on every image is still wasteful. I figure it would take 32-36 configurations to be comfortably denser than current e11, but some settings can be predicted to be useless based on content. (If you know the content up front, you can match e11 at about 1% the compute rather than 5%.)
2024-08-27 05:44:27
My goal was not really to improve e11, I am not interested in that. My goal was to convince people that it sucks. That said, yes, I am actually working on a small improvement that is slightly less dumb. I've assessed a few thousand more configurations over the last days and will implement a test which should allow density improvements over a 32 setting list while only trying 25 settings per image.
veluca
2024-08-27 06:06:52
I think `-e11` doesn't try to be smart ๐Ÿ˜› the code snippet you wrote there is perfectly fine as a PR IMO
2024-08-27 06:07:11
(or at least, it can be a very good starting point for it)
monad
2024-08-27 06:20:35
Okay. I will try my current idea, but I can offer the straightforward thing otherwise.
TheBigBadBoy - ๐™ธ๐š› did this finally got a PR ?
2024-08-29 12:11:08
I submitted something for you, dude.
2024-08-29 12:11:40
Time to berate me on my mistakes.
TheBigBadBoy - ๐™ธ๐š›
2024-08-29 12:13:06
<:Hypers:808826266060193874>
2024-08-29 12:13:20
thanks
Oleksii Matiash
2024-09-03 10:16:25
I have a question to, probably, <@794205442175402004> ? When I discovered jxl two years ago I immediately converted everything losslessly convertable to it, using -e 9, as I was unaware of more advanced settings. I don't know version of libjxl, but it was the latest compiled build available on January of 2023. Now I just became curious enough to recompress one of that (huge) files to see if there is any improvement. So I used command line: cjxl -d 0 -e 10 -E 3 -g 3 -I 100 TMP7.png TMP7.jxll . And when it finally finished it's work (User time, 0:01:17:56:937 ๐Ÿ˜… ), two interesting things appeared: it is smaller by 3 MB (out of 200 ๐Ÿ˜… ), and new file decodes much faster than the old one: ~1000 ms vs ~2500, while new one uses less cores, see screenshot: first peak is decoding old file, second - new. Could you guess, why it is so?
_wb_
2024-09-03 10:21:39
`-g 3` means internal group size 1024x1024 is used, instead of the default 256x256. That can be better for compression (fewer poorly predicted pixels on the first row and column of each group) but it also means less opportunity for parallel decode, since you can only use one core per megapixel instead of up to 16 cores per megapixel.
Oleksii Matiash
2024-09-03 10:24:13
File is ~50 MP, and I have 16C\32T CPU, is it still limiting factor? Also - even with this limitation you are talking about, new file is decoded 2.5 faster than the old one
w
2024-09-03 01:55:06
less core usage & faster i knew it
Oleksii Matiash
2024-09-03 02:14:48
Just tested, the same file, the same arguments with except of -g 3 (no -g at all) produces slightly larger file that decodes a bit slower - ~1000 ms vs ~1200
jonnyawsom3
2024-09-03 02:35:43
Curious how the other group sizes fare now, since I did have an image where -g 2 was 10x smaller than the others
Oleksii Matiash
Curious how the other group sizes fare now, since I did have an image where -g 2 was 10x smaller than the others
2024-09-03 02:38:52
Wait ~2 hours ๐Ÿ˜…
Curious how the other group sizes fare now, since I did have an image where -g 2 was 10x smaller than the others
2024-09-03 06:26:12
-g value is in name
jonnyawsom3
2024-09-03 06:32:53
There's -g 0 too, but seems like a fairly consistent 150-200 KB saved per level
Oleksii Matiash
2024-09-03 06:42:40
I can test -g 0, but only tomorrow
monad
2024-09-03 06:45:09
if the goal is density, g0, g1 are not worth trying in general
2024-09-03 06:46:34
smaller group size can also be super slow in some contexts
_wb_
2024-09-03 07:03:36
Larger group size is good for prediction and for lz77 if you have horizontal runs or repetitions. Smaller group size is good for having more finetuned local RCTs and smaller local palettes. Also smaller groups allows more enc/dec parallelism (but for a large enough image that doesn't matter that much, since even with g3 you can make use of one core per megapixel). Generally the default is not too bad but g3 will usually be a bit better. It can be worse too though.
Oleksii Matiash
Oleksii Matiash -g value is in name
2024-09-03 08:11:25
Loading speed: g1 - 1350 ms, g2 - 950, g3 - 1050
jonnyawsom3
_wb_ feel free to make a pull request if you have tweaks for the patch heuristics ๐Ÿ™‚
2024-09-04 04:00:34
Also <@263300458888691714>, now that you've dipped your toe in the water by 'fixing' e11 somewhat, I might as well bring this up too
monad
2024-09-04 04:23:17
jonnyawsom3
2024-09-04 04:29:25
Well this doesn't seem right... ```JPEG XL decoder v0.10.2 4451ce9 [AVX2,SSE2] Read 39126861 compressed bytes. Decoded to pixels. 8880 x 9376, 0.997 MP/s [1.00, 1.00], , 1 reps, 16 threads. PageFaultCount: 74412162 PeakWorkingSetSize: 2.564 GiB QuotaPeakPagedPoolUsage: 36.12 KiB QuotaPeakNonPagedPoolUsage: 14.2 KiB PeakPagefileUsage: 2.768 GiB Creation time 2024/09/04 17:26:02.958 Exit time 2024/09/04 17:27:26.636 Wall time: 0 days, 00:01:23.678 (83.68 seconds) User time: 0 days, 00:06:58.687 (418.69 seconds) Kernel time: 0 days, 00:12:20.562 (740.56 seconds)```
2024-09-04 04:35:50
40x decode slowdown on e10
monad
2024-09-04 04:36:00
Every single tile stored as a patch?
monad
2024-09-04 04:37:01
each emoji encoded as a patch, yeah
2024-09-04 04:38:14
that decode print out ain't from my image, yeah? 'cause that would be weird
jonnyawsom3
2024-09-04 04:39:41
No, just had it typed out already so didn't realise you had sent that file
2024-09-04 04:39:48
Did some patch encoding by hand or was that the new heuristics for finding tiles you made?
monad
2024-09-04 04:41:15
they're detected from a function specifically for finding general tile-like repetitions, rather than text-like
jonnyawsom3
2024-09-04 04:42:07
Does it still work decently on text, or is it more one or the other?
monad
2024-09-04 04:42:41
one or the other in this case
2024-09-04 04:43:18
technically you could combine results from both collections
jonnyawsom3
2024-09-04 04:43:38
Yeah ~~another addition for e11~~
Oleksii Matiash
2024-09-04 04:47:14
Another example where webp by far outperforms existing cjxl, however file from <@263300458888691714> outperforms webp by the same magnitude as webp does to existing cjxl
embed
2024-09-04 04:48:59
https://embed.moe/https://cdn.discordapp.com/attachments/803645746661425173/1280926166068232273/tiles_pfp.jxl?ex=66d9daf4&is=66d88974&hm=c51046723b8256de2e4c27b68539a1ba0a76359b914cd1bebd56846c21a1eae8&
_wb_
2024-09-04 04:49:44
Nice!
2024-09-04 04:52:16
Heuristics that try to detect a grid of repeating patches could be useful for more kinds of images than this rather contrived example. Text in a monospace font also behaves like that, e.g. screenshots of anything in textmode or in a terminal window.
monad
2024-09-04 04:54:07
well, contrived is a bit unfair, it's a legitimate image I had saved
_wb_
2024-09-04 04:56:06
Yeah I just mean this is not a particularly typical type of image
monad
2024-09-04 04:56:11
embed
2024-09-04 04:56:34
monad
2024-09-04 05:08:44
imo, it would mostly useful for game screenshots over the text-like heuristics. modern retro pixel style tends to be more messy, but traditional styles offer more exact repetition
jonnyawsom3
Oleksii Matiash Another example where webp by far outperforms existing cjxl, however file from <@263300458888691714> outperforms webp by the same magnitude as webp does to existing cjxl
2024-09-04 05:20:42
In reference to that e10 decode I posted before ``` WebP: 3.16 bpp Encode 200 Seconds 4424 MB RAM Decode 813 milliseconds 606 MB RAM JXL e10: 3.76 bpp Encode 3400 Seconds 8036 MB RAM Decode 102437 milliseconds 1781 MB RAM JXL e9: 4.40 bpp Encode 65 Seconds 840 MB RAM Decode 3125 milliseconds 619 MB RAM ``` Tried to measure Decode memory using ffplay since I have it on hand, e10 used up so much CPU my mouse actually stuttered for the first time in years, ended up just using Irfanview from the command line So still some work to do xP
2024-09-04 05:21:46
The actual command was `cjxl -d 0 -e 9 -I 1 -g 0 -E 3`
2024-09-04 05:25:18
This is the source file if anyone else wants to mess with it https://puu.sh/KefiO/0968286c2d.png
2024-09-04 05:25:56
Smallest group size helps with palette, high entropy so only 1% is needed for the MA tree from loose testing
monad imo, it would mostly useful for game screenshots over the text-like heuristics. modern retro pixel style tends to be more messy, but traditional styles offer more exact repetition
2024-09-04 05:35:45
Probably almost as good as the direct emulator integration that was talked about years ago, sampling sprites from the cartridge and essentially reconstructing the game scene on decode
2024-09-04 08:45:53
Note to self: Lossy Modular does not use chunked encoding like lossless does
CrushedAsian255
2024-09-04 08:46:28
Odd
jonnyawsom3
This is the source file if anyone else wants to mess with it https://puu.sh/KefiO/0968286c2d.png
2024-09-04 09:21:14
Also, turns out using ZSTD on a PPM is the highest compression I could reach, 29.9 MB
CrushedAsian255
2024-09-04 09:22:46
Have you tried XZ?
2024-09-04 09:23:02
Not the back doored version
Orum
2024-09-04 09:23:24
yeah I have some files where XZ is the best compression