Paper · 2020-06-02 · cs.LG, stat.ML
SaliencyMix: A Saliency Guided Data Augmentation Strategy for Better Regularization
SaliencyMix cuts a patch centred on the most salient pixel of one training image, pastes it at the same spot on another image and mixes labels by patch area. Author-reported: 2.76% top-1 error on CIFAR-10 and 16.56% on CIFAR-100 for WideResNet-28-10 with traditional augmentation; 21.26% and 20.09% top-1 error on ImageNet for ResNet-50 and ResNet-101.
Data augmentationAdversarial robustnessdata-augmentationregularizationimage-classificationobject-detection
arXivPDFCodeMarkdown15 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
Image classifiers learn from training pictures, and a common trick is to make new training pictures by cutting a patch out of one picture and pasting it onto another, then mixing their labels in proportion to the patch size. The earlier version of this trick picked the patch at random. That patch could land on background, and the mixed label would then tell the model that the background belongs to the object.
SaliencyMix first finds the spot in the source picture that draws the eye, the most salient pixel, and cuts the patch around it. The patch is more likely to contain part of the object, so the label mix is more honest. The authors report better accuracy on CIFAR and ImageNet and some gain in robustness to adversarial noise. The cost is a saliency computation on every mixed batch, which adds a little training time.
TL;DR
SaliencyMix is a data augmentation for CNN training. It pastes a patch from one training image onto another at the same location, with the patch chosen around the most salient pixel of the source image, and mixes the two labels by the patch area. The paper reports top-1 error on CIFAR, ImageNet and object detection, all author-reported. The released code differs from the paper in the saliency box, the batch handling and the ImageNet dataset (see Paper vs code).
Problem
Regional dropout removes image regions and so discards informative pixels §1. CutMix pastes a random patch and mixes labels by patch size §1 §2.1. If the random patch falls on background, the mixed label still gives the source class weight, so the model can learn background features for that class §1 fig. 1. The paper assumes the classifier is sensitive to texture §1. Nothing is said about how often a random patch misses the object.
Method
SaliencyMix mixes one source patch into one target image. Both come from the training set §3. For a pair of images:
- Compute a saliency map of the source image, I_vs = f(I_s), with f an OpenCV saliency detector eq. 1 §3.1 §3.3.
- Take the pixel with the maximum saliency value eq. 2 §3.1.
- Choose a patch whose size is set by the combination ratio λ, drawn from Uniform(0, 1) §3.1. The patch is centred on the peak pixel if that is possible, otherwise the peak is kept inside the patch §3.1.
- Build a binary mask M that is 1 on the patch and 0 elsewhere. The augmented image is I_a = M ⊙ I_s + M' ⊙ I_t, with M' the complement of M eq. 3 §3.2.
- Mix the labels by the ratio: y_a = λ y_t + (1 − λ) y_s eq. 4 §3.2.
The default scheme pastes the patch at the corresponding location in the target ("Salient to Corresponding"). The paper compares four other schemes in which the source is salient or non-salient and the target location is salient, non-salient or the same as the source §3.4 fig. 3(c–d). Among the five schemes, Salient to Corresponding gives the lowest classification error in the paper's experiments §3.4.
The paper compares four saliency detectors on CIFAR-10 with ResNet-18 and
Tiny-ImageNet with ResNet-50. The OpenCV method cited as [OpenCV_VS] performs
best, so it is used throughout §3.3 fig. 3(a–b). The paper calls it "fast
self-tuning background subtraction" §3.3. The bibliography entry is
Montabone and Soto (2010), a visual saliency method for human detection
[bib: OpenCV_VS]. The released code uses OpenCV's
StaticSaliencyFineGrained saliencymix.py.
Paper-level pseudocode, following §3.1 and §3.2. The paper gives no algorithm box and no formula for the patch side lengths, so those lines are marked.
# SaliencyMix for one (source, target) pair, reconstructed from §3.1-§3.2
# Input: source (C, H, W) with label y_s; target (C, H, W) with label y_t
# Output: augmented image (C, H, W) and mixed label y_a
def saliency_mix(source, y_s, target, y_t):
# Sample the combination ratio λ from Uniform(0, 1) [§3.1]
ratio = uniform(0, 1)
# Saliency map of the source image [§3.1] [eq. 1]
saliency = detector(source) # (H, W), gray-scale
# Pixel with the maximum saliency value [§3.1] [eq. 2]
row, col = argmax(saliency)
# Patch size set by λ; the exact side lengths are not stated [§3.1]
patch_h, patch_w = patch_size(ratio, H, W)
# Centre the patch on the peak if possible; otherwise keep the
# peak inside the patch [§3.1]
box = place_patch(row, col, patch_h, patch_w, H, W)
# Binary mask M: 1 on the patch, 0 elsewhere [§3.2]
mask = box_mask(box, H, W)
# Paste the source patch at the same location in the target
# (default scheme) [§3.2] [eq. 3] [§3.4]
augmented = mask * source + (1 - mask) * target
# Mix the labels by λ [§3.2] [eq. 4]
y_a = ratio * y_t + (1 - ratio) * y_s
return augmented, y_aKey equations, as written in the paper:
I_{vs} = f(I_s) eq. 1
i,j = \operatorname{argmax}(I_{vs}) eq. 2
I_a = M \odot I_s + M' \odot I_t eq. 3
y_a = \lambda\, y_t + (1-\lambda)\, y_s eq. 4
Hyperparameters
Values for the CIFAR and ImageNet experiments are from the text, with the code
value next to them where the code sets one. "not stated" means the paper and
the cited code say nothing. The code column is from the repository at
code_commit.
| Name | Value | Where | Notes |
|---|---|---|---|
| CIFAR training epochs | 200 | §4.1.1 | code default 200 saliencymix.py |
| CIFAR batch size | 256 | §4.1.1 | code default and README 128 saliencymix.py README.md; see Pitfalls |
| CIFAR optimiser | SGD, momentum 0.9, Nesterov | §4.1.1 | saliencymix.py |
| CIFAR weight decay | 5e-4 | §4.1.1 | saliencymix.py |
| CIFAR initial learning rate | 0.1 | §4.1.1 | saliencymix.py |
| CIFAR LR schedule | ×0.2 after epochs 60, 120, 160 | §4.1.1 | saliencymix.py |
| WRN-28-10 dropout | drop probability 0.3 in conv layers | §4.1.1 | saliencymix.py |
| CIFAR normalisation | per-channel mean and standard deviation | §4.1.1 | values not stated in the paper; code uses mean (125.3, 123.0, 113.9) and std (63.0, 62.1, 66.7) saliencymix.py |
| CIFAR traditional augmentation | zero-padding, random crop, horizontal flip | §4.1.1 | pad 4 and crop 32 saliencymix.py |
| λ distribution | Uniform(0, 1) | §3.1 | code uses Beta(β, β) with β = 1.0, which is uniform saliencymix.py |
| SaliencyMix application probability | not stated | §3 | code default 0.5 saliencymix.py; CIFAR README 0.5; ImageNet README 1.0 README.md |
| Saliency detector | OpenCV method, cited as [OpenCV_VS] | §3.3 | code: cv2.saliency.StaticSaliencyFineGrained saliencymix.py |
| ImageNet training epochs | 300 | §4.1.2 | README 300 README.md; code default 90 train.py |
| ImageNet batch size | 256 | §4.1.2 | README 256 README.md; code default 128 train.py |
| ImageNet initial learning rate | 0.1 | §4.1.2 | train.py |
| ImageNet LR schedule | ×0.1 at epochs 75, 150, 225 | §4.1.2 | train.py |
| ImageNet momentum, Nesterov | not stated in the paper | (none) | code: 0.9, Nesterov train.py train.py |
| ImageNet weight decay | not stated in the paper | (none) | code default 1e-4 train.py |
| ImageNet training augmentation | resizing, cropping, flipping, jitter | §4.1.2 | RandomResizedCrop 224, flip, colour jitter 0.4, PCA lighting 0.1 train.py; numbers not stated in the paper |
| ImageNet mean and standard deviation | not stated in the paper | (none) | code mean (0.485, 0.456, 0.406), std (0.229, 0.224, 0.225) train.py |
| Detection detector | Faster R-CNN, ResNet-50 backbone, initialised from the SaliencyMix model | §4.2 | fine-tuned on Pascal VOC 2007 and 2012, tested on VOC 2007 |
| Detection batch size | 8 | §4.2 | |
| Detection learning rate | 4e-3 | §4.2 | ×0.1 at 33K iterations |
| Detection iterations | 41K | §4.2 | optimiser and other settings: "follow the fine-tuning strategy of the original method" §4.2; not stated here |
| Hardware | four NVIDIA GeForce RTX 2080 Ti | §4 | |
| Repeats | five runs (CIFAR, averaged) | tab. 1 | three runs for detection tab. 3; ImageNet reports the best run per method §4.1.2 |
| Adversarial attack | FGSM, ImageNet-pretrained ResNet-50 | §4.4 | attack strength (ε) not stated |
Results
Author-reported. Setup: CIFAR-10 and CIFAR-100 (50,000 training and 10,000 test images each) with ResNet-18, ResNet-50 and WideResNet-28-10, 200 epochs, baselines as listed §4.1.1 tab. 1. ImageNet with ResNet-50 and ResNet-101, 300 epochs, best run per method §4.1.2 tab. 2. Detection: Faster R-CNN with ResNet-50 on Pascal VOC §4.2 tab. 3. Adversarial robustness: FGSM on ImageNet validation §4.4 tab. 4. Training time: ResNet-18 on CIFAR-10, 200 epochs §4.5 tab. 5. Hardware: four RTX 2080 Ti §4.
CIFAR, top-1 error (%), mean ± std over five runs tab. 1. "+" means traditional augmentation is also used.
| Method | CIFAR-10 | CIFAR-10+ | CIFAR-100 | CIFAR-100+ |
|---|---|---|---|---|
| ResNet-18 (baseline) | 10.63 ± 0.26 | 4.72 ± 0.21 | 36.68 ± 0.57 | 22.46 ± 0.31 |
| ResNet-18 + Cutout | 9.31 ± 0.18 | 3.99 ± 0.13 | 34.98 ± 0.29 | 21.96 ± 0.24 |
| ResNet-18 + CutMix | 9.44 ± 0.34 | 3.78 ± 0.12 | 34.42 ± 0.27 | 19.42 ± 0.23 |
| ResNet-18 + SaliencyMix | 7.59 ± 0.22 | 3.65 ± 0.10 | 28.73 ± 0.13 | 19.29 ± 0.21 |
| ResNet-50 (baseline) | 12.14 ± 0.95 | 4.98 ± 0.14 | 36.48 ± 0.50 | 21.58 ± 0.43 |
| ResNet-50 + Cutout | 8.84 ± 0.77 | 3.86 ± 0.25 | 32.97 ± 0.74 | 21.38 ± 0.69 |
| ResNet-50 + CutMix | 9.16 ± 0.38 | 3.61 ± 0.13 | 31.65 ± 0.61 | 18.72 ± 0.23 |
| ResNet-50 + SaliencyMix | 6.81 ± 0.30 | 3.46 ± 0.08 | 24.89 ± 0.39 | 18.57 ± 0.29 |
| WideResNet-28-10 (baseline) | 6.97 ± 0.22 | 3.87 ± 0.08 | 26.06 ± 0.22 | 18.80 ± 0.08 |
| WideResNet-28-10 + Cutout | 5.54 ± 0.08 | 3.08 ± 0.16 | 23.94 ± 0.15 | 18.41 ± 0.27 |
| WideResNet-28-10 + AutoAugment | – | 2.60 ± 0.10 | – | 17.10 ± 0.30 |
| WideResNet-28-10 + PuzzleMix (200 epochs) | – | – | – | 16.23 |
| WideResNet-28-10 + CutMix | 5.18 ± 0.20 | 2.87 ± 0.16 | 23.21 ± 0.20 | 16.66 ± 0.20 |
| WideResNet-28-10 + SaliencyMix | 4.04 ± 0.13 | 2.76 ± 0.07 | 19.45 ± 0.32 | 16.56 ± 0.17 |
Bold marks the best value in each column, as in the source table. The paper's text says it reduces CIFAR-10 error over CutMix by 1.85, 2.35 and 1.14 points for ResNet-18, ResNet-50 and WideResNet-28-10 without traditional augmentation, and by 5.69, 6.76 and 3.76 points on CIFAR-100 §4.1.1. These match the table.
ImageNet, error (%), best run per method tab. 2.
| Method | Top-1 error | Top-5 error |
|---|---|---|
| ResNet-50 (baseline) | 23.68 | 7.05 |
| ResNet-50 + Cutout | 22.93 | 6.66 |
| ResNet-50 + StochasticDepth | 22.46 | 6.27 |
| ResNet-50 + Mixup | 22.58 | 6.40 |
| ResNet-50 + Manifold Mixup | 22.50 | 6.21 |
| ResNet-50 + AutoAugment | 22.40 | 6.20 |
| ResNet-50 + DropBlock | 21.87 | 5.98 |
| ResNet-50 + CutMix | 21.40 | 5.92 |
| ResNet-50 + PuzzleMix | 21.24 | 5.71 |
| ResNet-50 + SaliencyMix | 21.26 | 5.76 |
| ResNet-101 (baseline) | 21.87 | 6.29 |
| ResNet-101 + Cutout | 20.72 | 5.51 |
| ResNet-101 + Mixup | 20.52 | 5.28 |
| ResNet-101 + CutMix | 20.17 | 5.24 |
| ResNet-101 + SaliencyMix | 20.09 | 5.15 |
Transfer to Pascal VOC object detection, Faster R-CNN ResNet-50, mAP on VOC 2007 test (mean of three runs) tab. 3. Gain over baseline in brackets.
| Backbone pre-training | ImageNet top-1 error | Detection mAP |
|---|---|---|
| ResNet-50 (baseline) | 23.68 | 76.71 (+0.00) |
| Cutout-trained | 22.93 | 77.17 (+0.46) |
| Mixup-trained | 22.58 | 77.98 (+1.27) |
| CutMix-trained | 21.40 | 78.31 (+1.60) |
| SaliencyMix-trained | 21.26 | 78.48 (+1.77) |
Adversarial robustness, top-1 accuracy (%) on FGSM-perturbed ImageNet validation, ResNet-50 tab. 4. The paper says this is +1.96 over CutMix §4.4.
| Baseline | Cutout | Mixup | CutMix | SaliencyMix |
|---|---|---|---|---|
| 8.2 | 11.5 | 24.4 | 31.0 | 32.96 |
Training time, ResNet-18 on CIFAR-10, 200 epochs, hours tab. 5. Paper says the extra time is due to saliency map generation and is negligible against the gain §4.5.
| Baseline | Cutout | Mixup | CutMix | SaliencyMix |
|---|---|---|---|---|
| 0.83 | 0.84 | 0.87 | 0.89 | 0.91 |
Qualitatively, the class activation maps of a ResNet-50 trained with SaliencyMix focus more on the target object than those trained with other augmentations §4.3 fig. 4. This is a visual comparison, with no metric.
Paper vs code
Code: SaliencyMix/SaliencyMix at
commit 9ee02b87974efab1ee7a5229408a58a0e0bbf825, linked from the abstract.
The repository has no LICENSE file, so no code is quoted here, only cited by
path and line. The code contains two training scripts: SaliencyMix_CIFAR/
(PyTorch) and SaliencyMix-ImageNet/ (PyTorch). The CIFAR script is based on
Cutout, and the ImageNet script on CutMix-PyTorch [README.md].
Differences between paper and code:
- Saliency is computed once per batch, not per image. The paper describes a per-pair operation §3.1. The code computes one box from the first permuted partner image and pastes that same box from every partner image saliencymix.py; ImageNet is the same train.py.
- Application is per batch. The paper does not say whether SaliencyMix is
applied per sample or per batch. The code draws one uniform number per batch
against
salmix_probsaliencymix.py. - Box side and clipping. The paper says the patch size follows λ and the peak is centred "if possible", otherwise kept inside the patch §3.1. The code sets a box side of sqrt(1 − λ) of the image side [code: SaliencyMix_CIFAR/saliencymix.py#L195-L197], centres it on the peak and clips it to the image saliencymix.py. Clipping only truncates the box, so near the border the patch is smaller. It does not shift the box to keep the peak inside.
- λ is recomputed from the clipped area. The label weight in the code is 1 minus the actual pasted area over the image area [code: SaliencyMix_CIFAR/saliencymix.py#L243], not the sampled λ as in eq. 4. The ImageNet code does the same train.py.
- Loss form. The code computes the mixed loss as λ · CE(pred, y_t) + (1 − λ) · CE(pred, y_s) saliencymix.py. This is the same as cross-entropy against the mixed label of eq. 4, because cross-entropy is linear in the target.
- Saliency input. The saliency detector receives the normalised image tensor, converted to a NumPy array saliencymix.py. The paper does not say what the detector receives. The output is multiplied by 255 and cast to uint8 saliencymix.py.
- Batch size. The paper says 256 for CIFAR §4.1.1. The CIFAR code default and README use 128 saliencymix.py [code: SaliencyMix_CIFAR/README.md].
- ImageNet data. The paper reports ImageNet-1k, 1000 classes §4.1.2. The
ImageNet script reads
~/dataset/tiny-imagenetand sets 200 classes [code: SaliencyMix-ImageNet/train.py#L79-L80] train.py. The released script does not reproduce the ImageNet-1k setting without changes. - Probability. The paper gives no application probability. The CIFAR default is 0.5 saliencymix.py. The ImageNet README command uses 1.0 README.md.
- Epochs and defaults. The ImageNet script defaults to 90 epochs and batch 128 train.py. The README command uses 300 epochs and batch 256 README.md. The LR schedule for 300 epochs matches the paper train.py.
No discrepancies were found in CIFAR optimiser, weight decay, LR schedule, epochs or WideResNet dropout; these match §4.1.1 saliencymix.py.
The paper names the saliency method in two ways. The text says "fast
self-tuning background subtraction" §3.3. The bibliography cites Montabone
and Soto (2010) for [OpenCV_VS] [bib]. The code uses OpenCV's
StaticSaliencyFineGrained saliencymix.py.
I could not confirm from the sources here that these are the same method.
Code-level pseudocode, as the released code runs it, not the paper's per-image rule:
# Released training step, CIFAR script
# [code: SaliencyMix_CIFAR/saliencymix.py#L234-L248]
# Input: images (B, C, H, W), normalised; labels (B,)
# Output: loss for one optimisation step
def training_step(images, labels, beta, salmix_prob):
# Apply SaliencyMix to the whole batch with probability salmix_prob
# [code: SaliencyMix_CIFAR/saliencymix.py#L235]
if uniform(0, 1) < salmix_prob:
ratio = beta_sample(beta, beta) # beta = 1.0 gives Uniform(0, 1)
partners = random_permutation(B)
# One box from the saliency peak of the first partner image only
# [code: SaliencyMix_CIFAR/saliencymix.py#L241]
box = saliency_box(images[partners[0]], ratio)
# The same box is pasted from every partner image
# [code: SaliencyMix_CIFAR/saliencymix.py#L242]
images[:, :, box] = images[partners, :, box]
# Recompute λ from the clipped box area
# [code: SaliencyMix_CIFAR/saliencymix.py#L243]
ratio = 1 - box_area(box) / (H * W)
pred = model(images)
loss = (ratio * cross_entropy(pred, labels)
+ (1 - ratio) * cross_entropy(pred, labels[partners]))
else:
loss = cross_entropy(model(images), labels)
return loss# Box for the batch-level step above
# [code: SaliencyMix_CIFAR/saliencymix.py#L191-L215]
# Input: image (C, H, W), normalised; ratio in (0, 1)
# Output: clipped box (row range, column range)
def saliency_box(image, ratio):
# Side of the box as a fraction of the image side
# [code: SaliencyMix_CIFAR/saliencymix.py#L195-L197]
scale = sqrt(1 - ratio)
side_h = int(H * scale)
side_w = int(W * scale)
# Fine-grained static saliency map, scaled to 0-255 uint8
# [code: SaliencyMix_CIFAR/saliencymix.py#L202-L204]
saliency = static_saliency(image) * 255
# Pixel with the largest saliency value
# [code: SaliencyMix_CIFAR/saliencymix.py#L206-L208]
row, col = argmax(saliency)
# Centre the box on the peak and clip it to the image
# [code: SaliencyMix_CIFAR/saliencymix.py#L210-L213]
return clip_box(row, col, side_h, side_w, H, W)Pitfalls
- Patch size is not formalised. The paper says the patch covers a share of the image set by λ, but gives no side-length formula §3.1. The code uses side sqrt(1 − λ), so area fraction 1 − λ before clipping [code: SaliencyMix_CIFAR/saliencymix.py#L195-L197]. An implementation should follow the code, and it should say so.
- Label weight drifts at borders. Because the code recomputes λ from the clipped area saliencymix.py, the label weight can differ from the sampled λ when the box is cut by the image edge. Eq. 4 does not show this.
- Peak placement differs. The paper's "keep the peak inside the patch" case is not in the code. The code only clips [code: SaliencyMix_CIFAR/saliencymix.py#L210-L213]. Near the image edge, the patch is smaller than λ suggests.
- The saliency pass runs on the CPU, once per batch. The code moves the image to the CPU and to NumPy, then runs OpenCV for one image per mixed batch saliencymix.py. The paper reports this as a small time cost §4.5 tab. 5. The time was measured on CIFAR-10 with ResNet-18 only. Each mixed step pays the copy and the detector call.
- OpenCV contrib is required. The README asks for
opencv-contrib-python4.2.0.32 README.md. Thesaliencymodule is in the contrib package. The paper does not name the OpenCV version. - Saliency input and scale are unstated. The paper does not say whether the detector sees raw pixels or normalised values. The code gives the normalised tensor saliencymix.py. Results may depend on this, and the paper does not test it.
- Application probability is unstated. The paper gives no probability. The CIFAR code uses 0.5 and the ImageNet README 1.0 README.md. The two settings give different augmentation rates.
- Mixing is per batch in code, per pair in the paper. A batch either gets SaliencyMix on every sample or on none, and every sample in the batch shares one box and one saliency peak (code-level pseudocode above).
- Batch size for CIFAR is inconsistent. The paper says 256 §4.1.1, the code and README use 128 saliencymix.py.
- ImageNet numbers need the full ImageNet-1k pipeline. The released ImageNet script trains on a 200-class tiny-ImageNet path [code: SaliencyMix-ImageNet/train.py#L79-L80] train.py. The 21.26% and 20.09% results are on 1000 classes §4.1.2. Matching them needs more than this script.
- ImageNet numbers are best runs, not means. The paper reports "the best performance of each method" for ImageNet §4.1.2 tab. 2, while CIFAR numbers are means over five runs tab. 1. Do not compare them as if they were the same kind of number.
- Text claims do not match the tables. The paper says SaliencyMix gives "the best known top-1 error" of 2.76% on CIFAR-10 §1 §4.1.1. Table 1 shows AutoAugment at 2.60% on WideResNet-28-10 CIFAR-10+ tab. 1. The text says it "outperforms all other methods except PuzzleMix" §4.1.1.
- ImageNet ranking claim. The text says SaliencyMix "outperforms all other methods in comparison" §4.1.2. Table 2 shows PuzzleMix better on both top-1 (21.24 vs 21.26) and top-5 (5.71 vs 5.76) for ResNet-50 tab. 2.
- Rounded differences. The text gives top-1 reductions of 1.66, 1.31 and 0.14 for ResNet-50 over Cutout, Mixup and CutMix §4.1.2. From Table 2 the differences are 1.67, 1.32 and 0.14 tab. 2.
- Typo in §3.3. The text says the comparison is on "CIFAR10 and ImageNet", while the experiment uses Tiny-ImageNet §3.3 fig. 3.
- Attack strength not stated. The FGSM ε is not given, so the robustness numbers tab. 4 cannot be reproduced from the paper alone.
- Detection recipe is only partly stated. The detection section says to follow the original Faster R-CNN fine-tuning recipe §4.2. Optimiser, momentum, input size and anchor settings are not stated in the paper.
Lineage
- Builds on: CutMix (random patch cut and paste with label mixing), cited as [cutmix] in §2.1. Also Cutout and MixUp §2.1. No wiki card for these exists yet, so they are not linked.
- Compared against: CutMix, Cutout, MixUp, AutoAugment, PuzzleMix, Stochastic Depth, Manifold Mixup, DropBlock tab. 2 tab. 1.
- Related: Saliency detection, specifically the OpenCV method cited as [OpenCV_VS] §3.3. The text also mentions PuzzleMix as an optimisation-based mixing method §2.1.
- Superseded by: not known from content already in this wiki.
Source and license
Adapted from “SaliencyMix: A Saliency Guided Data Augmentation Strategy for Better Regularization” by A. F. M. Shahab Uddin, Mst. Sirazam Monira, Wheemyung Shin, TaeChoong Chung, Sung-Ho Bae (arXiv:2006.01791), 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/SaliencyMix/SaliencyMix at commit 9ee02b87974e (none (no LICENSE file in repository)). Any quoted code is shown under that license.