Paper · 2022-05-30 · cs.CV
You Only Need 90K Parameters to Adapt Light: A Light Weight Transformer for Image Enhancement and Exposure Correction
IAT restores low-light and under- or over-exposed sRGB photos with about 90k parameters. A small convolutional local branch predicts per-pixel multiply and add maps, and attention queries predict a 3x3 colour matrix and a gamma for the whole image. Author-reported: PSNR 23.50 and SSIM 0.824 on LOL-V2-real, at about 0.004 s per image.
Vision Transformer (ViT) backbonesObject queries (learned query slots in transformer decoders)Depthwise separable convolutionimage-enhancementexposure-correctionlow-lightlightweight-modelisp-pipeline
arXivPDFCodeMarkdown16 min read
AI-compiled by claude-haiku-5-5 on 2026-10-18, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Photos taken in dark rooms come out too dark, and photos of bright scenes can come out washed out. Both look wrong to people, and they also make it harder for software that looks at the picture to recognise what is in it. A camera turns the raw sensor data into the final picture with a chain of colour and tone steps, and those steps are what goes wrong here.
The idea is to split the fix into two jobs. A small network adjusts the brightness of each pixel with a multiply and an add. A second, global part predicts a colour correction matrix and a gamma curve, which are the same kinds of settings a camera's image processor uses for colour and tone. A transformer-style attention block with a few learned query slots produces those global settings from the whole image.
The model is tiny, about 90 thousand parameters, and the authors report it runs in about 0.004 seconds per image. They also report that it helps standard detectors and segmenters work in poor light. All of these results are the authors' own, on public benchmarks.
TL;DR
- IAT restores sRGB images from low light and from under- or over-exposure. A local branch predicts per-pixel multiply and add maps, and a global branch predicts a 3x3 colour matrix and a gamma §3.1 §3.2 eq. 4.
- The local branch works at full resolution with depth-wise convolutions in place of self-attention, so it can take images of any size §3.2.
- The global branch uses 10 learned queries, one for gamma and nine for the colour matrix, attending to a low-resolution encoding of the image §3.2 fig. 3.
- About 0.09M parameters and about 0.004 s per image on the authors' setup, as reported in their tables tab. 1 tab. 2.
- Author-reported: LOL-V2-real PSNR 23.50 and SSIM 0.824 tab. 1; MIT-Adobe FiveK PSNR 25.32 and SSIM 0.920 tab. 2; exposure correction best averages on every metric the authors report tab. 3.
- Caveats: in the authors' own LOL-V1 table, MAXIM scores higher on PSNR and SSIM tab. 1. The released code also differs from the paper in several training details (see Paper vs code).
Problem
Real-world light is hard: low-light images carry limited photon counts and sensor noise, while sunlit scenes saturate the sensor, and shadows can make the contrast ratio 1000:1 or higher within one image §1 fig. 1. Such images degrade both human viewing and downstream tasks such as detection and segmentation §1.
Earlier learned methods often work on raw sensor data, which is not available in everyday use. Methods that work directly on sRGB images are typically large U-Net or transformer models. The paper cites 115.63M parameters for IPT and 14.14M for MAXIM as examples §2 tab. 1. The authors aim for a model small enough for mobile and edge devices §2.
Method
Formulation. The paper models the camera pipeline as a rendering function G applied after an unknown reconstruction F that maps the input back to raw data §3.1 eq. 1. It replaces this with two parts: a pixel-wise local component f, and a global ISP component g with a simplified form §3.1 eq. 2 eq. 3.
Local branch. A 3x3 convolution expands the RGB input to 16 channels §3.2. Two independent branches, one for the multiply map M and one for the add map A, each stack three Pixel-wise Enhancement Modules (PEM) at full resolution §3.2 §4 fig. 3. Each PEM encodes position with a 3x3 depth-wise convolution, then applies a pointwise, depth-wise, pointwise sequence and two 1x1 convolutions. It uses a light normalisation with a learnable per-channel scale and bias, plus a learnable channel-mixing matrix initialised to the identity, in place of layer normalisation §3.2 fig. 3. Layer Scale multiplies each block's output by a small constant. The paper does not give that constant's value §3.2. Each branch adds a residual skip from its input. A final 3x3 convolution gives M with a ReLU and A with a Tanh §3.2.
Global branch. Two convolutions act as a lightweight encoder that lowers the resolution and raises the channel count §3.2. A Global Prediction Module then uses learnable queries Q that attend to keys and values from the encoded features. The keys and values get a positional encoding from a depth-wise convolution, so the module handles different input sizes §3.2 fig. 3. Unlike DETR, the queries have no self-attention among themselves, and they start at zeros in the paper §3.2. A feed-forward network follows §3.2. Ten queries are used: nine give the entries of the 3x3 colour matrix W, and one gives gamma §3.2. The output is initialised so that W is the identity and gamma is one §3.2.
Combined model. The local maps are applied first, as an affine per-pixel change, then the colour matrix, then the gamma curve. A small epsilon keeps the base of the power non-negative §3.2 eq. 4. The paper's supplement gives the simplified ISP as a white-balance matrix, then a colour matrix, then gamma §7 eq. 5.
Training. The paper trains on a single RTX 3090 with batch size 8, the Adam optimiser, initial learning rate 2e-4 and weight decay 1e-4, with a cosine schedule and horizontal and vertical flips §4.1. The loss is L1 for MIT-Adobe FiveK and exposure correction §4.1 §4.2. For LOL, the paper uses smooth L1 plus a VGG perceptual loss §4.1. An optional raw-RGB supervision term adds an L1 loss on an intermediate representation, with weight 0.1 §7 eq. 7. It needs raw data synthesised with an invertible ISP §7.
High-level tasks. IAT can be placed in front of a detector or segmenter. The paper trains the whole pipeline end to end, minimising the downstream task loss through IAT §4.3 §8 eq. 8.
# IAT forward pass [§3.2] [eq. 4]
# Input: low-light or mis-exposed sRGB image in [0, 1] (B, 3, H, W)
# Output: corrected sRGB image (B, 3, H, W)
def iat_forward(image):
# Expand to 16 channels, full resolution [§3.2]
# [code: IAT_main.py#L46-L47]
local_features = leaky_relu(conv3x3(image)) # (B, 16, H, W)
# Two independent stacks of PEM blocks, each with a residual [§3.2] [§4]
multiply_map = relu(stack_m(local_features) + local_features)
add_map = tanh(stack_a(local_features) + local_features)
# Global colour matrix and gamma from the whole image [§3.2]
gamma, colour_matrix = global_prediction(image) # (B,), (B, 3, 3)
# Pixel-wise affine adjustment [§3.2] [eq. 4]
adjusted = image * multiply_map + add_map
# Apply the colour matrix to each pixel [eq. 4]
coloured = apply_colour(colour_matrix, adjusted)
# Floor the base at epsilon before the power [§3.2] [eq. 3]
# The code also clamps to 1.0; the paper does not [code: IAT_main.py#L109]
base = clamp(coloured, 1e-8, 1.0)
# Gamma correction [eq. 4]
return base ** gamma# Global prediction module [§3.2] [fig. 3]
# Input: image (B, 3, H, W)
# Output: gamma (B,), colour_matrix (B, 3, 3)
def global_prediction(image):
# Lightweight encoder at lower resolution [§3.2]
# [code: global_net.py#L64-L80]
features = encoder(image) # (B, C, H/4, W/4)
# Ten learned queries: index 0 for gamma, 1 to 9 for the matrix [§3.2]
# Paper initialises them to zeros; code uses ones [code: global_net.py#L17]
queries = learned_queries # (B, 10, C)
# Keys and values: features plus depth-wise positional term [§3.2]
keys_values = layer_norm(features + positional(features)) # (B, HW, C)
# Cross-attention only: no query-to-query step, no residual [§3.2]
# [code: global_net.py#L24-L37, #L56-L59]
queries = attend(queries, keys_values)
# Feed-forward block with residual [§3.2] [code: global_net.py#L60]
queries = queries + feed_forward(layer_norm(queries))
# Gamma starts at one [§3.2] [code: global_net.py#L86-L89, #L118]
gamma = linear_gamma(queries[:, 0]) + 1.0
# Matrix starts at the identity [§3.2] [code: global_net.py#L90, #L120]
offsets = linear_matrix(queries[:, 1:]) # (B, 9)
colour_matrix = reshape(offsets, (B, 3, 3)) + identity_3x3
return gamma, colour_matrixKey equations:
I_t = G(F(I_i)) eq. 1
I_t = g_t(f(I_i)) eq. 2
g_t(\cdot) = \big(\max\big(\textstyle\sum_{c_j} W_{c_i,c_j}(\cdot),\ \epsilon\big)\big)^{\gamma},\quad c_i, c_j \in \{r,g,b\} eq. 3
I_t = \Big(\max\Big(\textstyle\sum_{c_j} W_{c_i,c_j}\big(I_i \odot M + A\big),\ 0\Big)\Big)^{\gamma} eq. 4
G(\cdot) = \mathrm{Gamma}\big(W_{ccm}(W_{wb}(\cdot))\big) eq. 5, supplement
Here W is the product of the white-balance and colour-matrix transforms, and γ is the gamma exponent. Equation 3 is restated in the supplement as eq. 6.
L_{total} = L_{rgb} + \lambda\, L_{raw},\quad L_{rgb} = L_1\big(g_t(f(I_i)), I_t\big),\quad L_{raw} = L_1\big(f(I_i), I_{raw}\big),\quad \lambda = 0.1 eq. 7, supplement
\min_{i \in \mathbb{I},\, d \in \mathbb{D}} L_{obj}(\hat{t}, t),\qquad \hat{t} = \mathbb{D}\big(\mathbb{I}(I_{low})\big) eq. 8, joint training
Equation 8 is the paper's detector objective with the input passed through IAT, written here in words: the detector loss is minimised over both the IAT parameters and the detector parameters.
Hyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| Local branch PEM blocks | 3 per branch, two branches | §4 IAT_main.py | Stated in the paper; the code blocks use drop-path 0.01, 0.05, 0.1 |
| Channels in local branch | 16 | §4 IAT_main.py | |
| Global queries | 10 (9 for matrix, 1 for gamma) | §3.2 global_net.py | |
| Global encoder channels | not stated | global_net.py | Code uses 64 |
| Global attention heads | not stated | global_net.py | Code uses 4 |
| FFN expansion ratio | not stated | global_net.py | Code uses 4 |
| Layer Scale initial value | not stated | blocks.py | Code uses 1e-4 |
| Epsilon floor | 1e-8 | §3.2 IAT_main.py | Code also clamps to 1.0 |
| Raw-RGB loss weight λ | 0.1 | §7 | Not in the released training scripts |
| Optimiser | Adam (betas 0.9, 0.999; eps 1e-8) | train_lol_v1_patch.py | Paper does not state the optimiser's betas |
| Learning rate, initial | 2e-4 | §4.1 train_lol_v1_patch.py | |
| Weight decay | 1e-4 | §4.1 | Code differs; see Paper vs code |
| LR schedule | cosine | §4.1 train_lol_v1_patch.py | Code steps it per iteration; see Paper vs code |
| Batch size (low-level) | 8 | §4.1 train_lol_v1_patch.py | |
| LOL-V1 training | 256x256 patches, 200 epochs | §4.1 lol_v1_new.py | Code: 200 epochs in train_lol_v1_patch.py#L34 |
| LOL-V1 fine-tuning | 600x400, 100 epochs | §4.1 | Code default is 400 epochs, lr 1e-4 train_lol_v1_whole.py |
| LOL-V2-real training | 600x400, 200 epochs | §4.1 train_lol_v2.py | |
| LOL dataset split | V1: 485 train / 15 test; V2-real: 689 train / 100 test | §4.1 | |
| LOL loss | smooth L1 + VGG loss | §4.1 train_lol_v2.py | Code: VGG weight 0.04, vgg16.features[:16] |
| FiveK loss | L1, expert C ground truth | §4.1 | Batch size, epochs and lr for FiveK not stated |
| Exposure dataset split | 17,675 train, 750 val, 5,905 test | §4.2 | |
| Exposure crop | 512x512 patches | §4.2 | Code crops to half the resized image; see Paper vs code |
| Exposure test resize | max dimension 512 | §4.2 | Code resizes to 1200x900 |
| Exposure optimiser | Adam, lr 2e-4, wd 2e-4, 50 epochs | train_exposure.py | Paper states none of these |
| Exposure batch size | not stated | train_exposure.py | Code default 2 |
| EXDark detector | YOLOv3, 608x608, 25 epochs | §4.3 yolov3_IAT_lol.py | Code: SGD lr 1e-3, momentum 0.9, wd 5e-4 |
| EXDark batch size, SGD | batch 8, lr 1e-3, wd 1e-4 | §4.3 | Code wd is 5e-4 |
| TYOL detector | YOLOv3, 45 epochs | §4.3 | Config not checked |
| ACDC segmenter | DeepLabV3+, Cityscapes init, 20,000 iterations, batch 8 | §4.3 | Code configs differ; see Paper vs code |
| ACDC optimiser | SGD, lr 0.05, momentum 0.9, wd 5e-4 | §4.3 | Code schedule lr: 0.005 or 0.01 schedule_40k.py |
| Joint training | IAT + detector trained end to end | §4.3 §8 | Code loads LOL pre-trained IAT yolov3_IAT_lol.py |
| Parameter count (whole IAT) | 0.09M | tab. 1 tab. 2 | Paper reports ~90k; ablation gives 91.15K tab. 9 |
| Model file size | 417 KB (IAT main structure) | §8 | Stated as a comparison with YOLO-V3 (237 MB) |
Results
Author-reported. Hardware for timings is not stated in the paper. Times for baselines come from each method's own code platform, marked M (Matlab), T (TensorFlow) or P (PyTorch) in tab. 1.
Low-level enhancement, LOL tab. 1. Values are PSNR and SSIM on LOL-V1 and LOL-V2-real, plus efficiency. Best values are red and second-best are blue in the source.
| Method | LOL-V1 PSNR ↑ | LOL-V1 SSIM ↑ | LOL-V2-real PSNR ↑ | LOL-V2-real SSIM ↑ | FLOPs (G) ↓ | Params (M) ↓ | Time (s) ↓ |
|---|---|---|---|---|---|---|---|
| LIME* | 16.67 | 0.560 | 15.24 | 0.470 | - | - | 3.241 (M) |
| Zero-DCE* | 14.83 | 0.531 | 14.32 | 0.511 | 2.53 | 0.08 | 0.002 (P) |
| RetinexNet | 16.77 | 0.562 | 18.37 | 0.723 | 587.47 | 0.84 | 0.841 (T) |
| MBLLEN | 17.90 | 0.702 | 18.00 | 0.715 | 19.95 | 20.47 | 1.981 (T) |
| DRBN | 19.55 | 0.746 | 20.13 | 0.820 | 37.79 | 0.58 | 1.210 (P) |
| 3D-LUT | 16.35 | 0.585 | 17.59 | 0.721 | 7.67 | 0.6 | 0.006 (P) |
| KIND | 20.86 | 0.790 | 19.74 | 0.761 | 356.72 | 8.16 | 0e38 (T) |
| UFormer | 16.36 | 0.771 | 18.82 | 0.771 | 12.00 | 5.29 | 0.248 (P) |
| IPT | 16.27 | 0.504 | 19.80 | 0.813 | 2087.35 | 115.63 | 1.365 (P) |
| RCT | 22.67 | 0.788 | - | - | - | - | - |
| MAXIM | 23.43 | 0.863 | 22.86 | 0.818 | 216.00 | 14.14 | 0.602 (P) |
| IAT (local) | 20.20 | 0.782 | 20.30 | 0.789 | 1.31 | 0.02 | 0.002 (P) |
| IAT | 23.38 | 0.809 | 23.50 | 0.824 | 1.44 | 0.09 | 0.004 (P) |
The source table lists the KIND time as "0e38 (T)", which is most likely a typo for 0.038, but the paper does not say so. Treat that cell as unreadable.
Low-level enhancement, MIT-Adobe FiveK tab. 2. Expert C ground truth §4.1.
| Metric | White-Box | U-Net | DPE | DPED | D-UPE | D-LPF | 3D LUT | IAT |
|---|---|---|---|---|---|---|---|---|
| PSNR ↑ | 18.57 | 21.57 | 23.80 | 21.76 | 23.04 | 23.63 | 25.21 | 25.32 |
| SSIM ↑ | 0.701 | 0.843 | 0.880 | 0.871 | 0.893 | 0.875 | 0.922 | 0.920 |
| Params ↓ | - | 1.3M | 3.3M | - | 1.0M | 0.8M | 0.6M | 0.09M |
Exposure correction tab. 3. Test set has five experts' targets. Per-expert PSNR and SSIM are in the source; the averages and PI are shown here. PI is lower-is-better.
| Method | Avg PSNR ↑ | Avg SSIM ↑ | PI ↓ |
|---|---|---|---|
| HE | 16.58 | 0.682 | 2.405 |
| LIME | 12.15 | 0.618 | 2.432 |
| DPED (Sony) | 17.88 | 0.676 | 2.806 |
| DPE (S-FiveK) | 17.51 | 0.677 | 2.621 |
| RetinexNet | 11.63 | 0.607 | 3.105 |
| Deep-UPE | 14.25 | 0.640 | 2.405 |
| Zero-DCE | 12.60 | 0.549 | 2.865 |
| MSEC | 19.48 | 0.739 | 2.251 |
| IAT (local) | 16.91 | 0.783 | 2.401 |
| IAT | 20.34 | 0.844 | 2.249 |
IAT per-expert PSNR and SSIM, from the same table: Expert A 19.90 and 0.817; B 21.65 and 0.867; C 21.23 and 0.850; D 19.86 and 0.844; E 19.34 and 0.840. The paper's text also cites about 7M parameters for MSEC and 0.5 s per image §4.2. Neither number appears in the table.
High-level tasks tab. 4. Detector and segmenter are trained on enhanced data. EXDark mAP is for YOLOv3, ACDC mIoU is for DeepLabV3+, and TYOL mAP is for YOLOv3. Time is per image in seconds.
| Method | EXDark mAP ↑ | EXDark time ↓ | ACDC mIoU ↑ | ACDC time ↓ | TYOL mAP ↑ | TYOL time ↓ |
|---|---|---|---|---|---|---|
| Baseline (no enhancement) | 76.4 | 0.033 | 63.3 | 0.249 | 88.4 | 0.023 |
| MBLLEN | 76.3 | 0.086 | 63.0 | 0.332 | 95.3 | 0.105 |
| DeepLPF | 76.3 | 0.138 | 61.9 | 0.807 | 94.5 | 0.223 |
| Zero-DCE | 76.9 | 0.042 | 61.9 | 0.300 | 95.2 | 0.030 |
| IAT | 77.2 | 0.040 | 62.1 | 0.280 | 95.8 | 0.027 |
Joint training tab. 6. The table compares pre-enhancement with joint training, and the initial weights used for IAT.
| Setting | EXDark mAP ↑ | ACDC mIoU ↑ |
|---|---|---|
| Original (no enhancement) | 76.4 | 63.3 |
| Pre-enhancement, IAT (LOL) | 77.2 | 62.1 |
| Pre-enhancement, IAT (MIT5K) | 76.9 | 61.3 |
| Joint, IAT (random init) | 77.1 | 61.5 |
| Joint, IAT (MIT5K init) | 77.6 | 62.1 |
| Joint, IAT (LOL init) | 77.8 | 63.8 |
Ablations. Results on LOL-V2-real (PSNR, SSIM) and EXDark (mAP) tab. 7:
| Local | Layer Norm | ResMLP norm | Our norm | Global matrix | Global gamma | PSNR ↑ | SSIM ↑ | mAP ↑ |
|---|---|---|---|---|---|---|---|---|
| ✓ | ✓ | 18.80 | 0.762 | 75.8 | ||||
| ✓ | ✓ | 19.61 | 0.776 | 75.8 | ||||
| ✓ | ✓ | 20.01 | 0.786 | 76.3 | ||||
| ✓ | ✓ | ✓ | 21.95 | 0.811 | 76.5 | |||
| ✓ | ✓ | ✓ | 22.76 | 0.805 | 76.7 | |||
| ✓ | ✓ | ✓ | ✓ | 23.50 | 0.824 | 77.1 |
Number of PEM blocks for M and A, PSNR on LOL-V2-real tab. 8:
| M \ A | 2 | 3 | 4 |
|---|---|---|---|
| 2 | 22.10 | 22.85 | 22.34 |
| 3 | 22.24 | 23.50 | 22.67 |
| 4 | 22.42 | 23.00 | 23.48 |
Channel and block trade-off on LOL-V2-real tab. 9: 12 channels with 4 blocks gives 22.60 PSNR, 0.807 SSIM and 86.22K parameters. 24 channels with 2 blocks gives 22.70, 0.815 and 101.03K. The chosen 16 channels with 3 blocks gives 23.50, 0.824 and 91.15K.
Raw-RGB supervision tab. 5. With raw supervision, results change as follows, each as PSNR and SSIM per expert §7. Expert A 19.98 and 0.822 (without: 19.90 and 0.817); B 22.03 and 0.885 (21.65 and 0.867); C 21.16 and 0.843 (21.23 and 0.850); D 19.94 and 0.852 (19.86 and 0.844); E 19.48 and 0.841 (19.34 and 0.840).
Paper vs code
Code: cuiziteng/Illumination-Adaptive-Transformer at c76472265247f47cea57649af28b15018bb64cb1 (Apache-2.0, copyright University of Tokyo). The repository is linked from the paper's abstract §1.
- Query initialisation. The paper initialises global queries to zeros §3.2. The code initialises them to ones global_net.py.
- Colour clamp. The paper's Eq. 4 floors the base at 0 and the text states an epsilon of 1e-8 eq. 4 §3.2. The code clamps the base to [1e-8, 1.0] IAT_main.py. The upper clamp at 1.0 is not in the paper.
- Middle depth-wise kernel. The paper describes a 3x3 depth-wise position encoding followed by pointwise, depth-wise, pointwise §3.2. The code's middle depth-wise convolution is 5x5 blocks.py.
- Local-branch activation. The code applies LeakyReLU with slope 0.2 after the first convolution IAT_main.py. The paper does not mention it.
- Global encoder. The paper says two convolutions §3.2. The code uses two stride-2 convolutions with batch normalisation and GELU global_net.py.
- Exposure crops. The paper trains on 512x512 crops and resizes test images to a maximum dimension of 512 §4.2. The code resizes all exposure images to 1200x900 exposure.py, crops training images to half the resized height and width exposure.py, and transposes portrait images to landscape first exposure.py.
- LOL-V1 augmentation. The paper uses horizontal and vertical flips §4.1. The code takes a 256x256 random crop and picks one of nine variants, including rotations and flips. Two of the nine variants leave the crop unchanged lol_v1_new.py.
- LOL loss. The paper uses smooth L1 plus VGG for LOL §4.1. The LOL-V1 scripts use plain L1 train_lol_v1_patch.py. The LOL-V2 script uses smooth L1 plus 0.04 times a VGG16 feature loss train_lol_v2.py.
- Weight decay. The paper states 1e-4 §4.1. The code uses 4e-4 for LOL-V1 patch training train_lol_v1_patch.py, 5e-4 for LOL-V2 train_lol_v2.py, 1e-4 for LOL-V1 fine-tuning train_lol_v1_whole.py, and 2e-4 for exposure train_exposure.py.
- Fine-tuning length. The paper says 100 epochs of fine-tuning on 600x400 images §4.1. The code's default is 400 epochs train_lol_v1_whole.py.
- LR schedule step. The scripts create
CosineAnnealingLR(T_max=num_epochs)train_lol_v1_patch.py and callscheduler.step()inside the per-batch loop train_lol_v1_patch.py. The cosine therefore runs over iterations, not epochs. The paper says only "cosine" §4.1. - Exposure gamma. The code builds the model with
type='exp', which freezes the global gamma base train_exposure.py. The paper does not say so. A commented-out alternative gives the global branch a 0.1x learning rate train_exposure.py. - Raw-RGB supervision. The paper describes a raw loss using invertible-ISP data §7. No raw loss appears in the released training scripts, and the invertible-ISP weights are not in the repository.
- Detection weight decay. The paper states 1e-4 §4.3. The EXDark YOLOv3 config uses 5e-4 yolov3_IAT_lol.py.
- Segmentation schedule. The paper states 20,000 iterations, batch 8, lr 0.05 §4.3. The released configs use lr 0.005 [code: IAT_high/IAT_mmseg/configs/base/schedules/schedule_40k.py#L2] or 0.01 [schedule_160k.py#L2], and crops of 512x512 [code: configs/base/datasets/ACDC_night.py#L7] or 512x1024 with histogram equalisation ACDC_night_with_HE.py. Which setting produced tab. 4 was not checked.
Pitfalls
- Claims versus the authors' own tables. The text says IAT achieves SOTA "on both image quality and model efficiency" on LOL §4.1. In tab. 1, MAXIM scores higher on LOL-V1 PSNR (23.43 vs 23.38) and SSIM (0.863 vs 0.809). IAT's LOL-V2-real SSIM (0.824) is above MAXIM's (0.818).
- Average does not match. The average of the five IAT per-expert PSNR values is 20.40 (101.98 / 5), not the reported 20.34 tab. 3. The SSIM average (0.844) matches.
- Final ablation row. The full model's EXDark mAP is 77.1 in the ablation tab. 7 and 77.2 in the main table tab. 4.
- Block-count claim. The text says the same PEM count for M and A helps §9.2. In tab. 8, M=2 with A=3 (22.85) beats M=2 with A=2 (22.10). The 3-3 setting (23.50) and 4-4 (23.48) are close, and parameter counts for the grid are not given.
- Speed claim on EXDark. The text says IAT is best on accuracy and speed §4.3. The unenhanced baseline is faster (0.033 s vs 0.040 s) tab. 4. The speed lead is only over the enhancement methods.
- ACDC. IAT's ACDC mIoU (62.1) is below the unenhanced baseline (63.3) tab. 4. The paper's fix is joint training, and the gain depends on initialisation: LOL-initialised joint training gives 63.8, random init gives 61.5 tab. 6.
- Timing and FLOPs context. The paper does not state the hardware for the 0.004 s timing, the input size used for FLOPs, or whether timings include pre- or post-processing. Baseline times were measured on each method's own platform tab. 1.
- Supplement numbering. The source is one LaTeX file with the supplement after the references. Section, equation and table numbers beyond the main text (§7 onward, eqs. 5 to 8, tab. 5 onward) follow the source order. They were not checked against a compiled PDF; cite by title if the numbers differ.
- Numerically sensitive step. Gamma is applied to a base floored at 1e-8, and the code also clamps to 1.0. Without the floor, the power is undefined or unstable at zero. Without the upper clamp, values above one would be raised to a power that can push them beyond the display range.
- Dataset-size and augmentation details. The exposure training crop differs between paper and code (see Paper vs code 6), so results from either setup may not be directly comparable.
- Model file size. The "417 KB" figure refers to the main IAT structure without the detector §8. The paper's comparison is against YOLO-V3 at 237 MB.
Lineage
- Builds on: the convolution-based transformer blocks in the code are copied from UniFormer blocks.py. The paper draws on DETR-style learned queries §3.1, CaiT's Layer Scale §3.2 and ResMLP's normalisation, which is used as an ablation baseline §9.1.
- Compared against: low-level methods MAXIM, IPT, Uformer, 3D-LUT, DRBN, KIND, MBLLEN, RetinexNet, RCT, Zero-DCE and Deep-UPE, and for exposure correction MSEC and DPED tab. 1 tab. 2 tab. 3. Detection and segmentation baselines use the unenhanced data, MBLLEN, DeepLPF and Zero-DCE tab. 4.
Source and license
Adapted from “You Only Need 90K Parameters to Adapt Light: A Light Weight Transformer for Image Enhancement and Exposure Correction” by Ziteng Cui, Kunchang Li, Lin Gu, Shenghan Su, Peng Gao, Zhengkai Jiang, Yu Qiao, Tatsuya Harada (arXiv:2205.14871), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/cuiziteng/Illumination-Adaptive-Transformer at commit c76472265247 (Apache-2.0). Any quoted code is shown under that license.