Paper · 2021-02-20 · cs.CV
Concealed Object Detection
SINet-V2 finds camouflaged objects in two stages, as a predator would: a neighbor connection decoder locates a coarse region, then three group-reversal attention blocks refine it. Also introduces COD10K, 10,000 images with rich annotations. Author-reported: S-measure 0.815 on COD10K test, 0.820 on CAMO, 0.888 on CHAMELEON, beating 12 baselines.
Salient object detectionSegmentation evaluation (scoring foreground, saliency and segmentation masks)Multi-scale feature fusionconcealed-object-detectioncamouflaged-object-detectionreverse-attentionres2netpytorch
arXivPDFCodeMarkdown17 min read
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Some animals and objects are built to blend into their background, so well that a person needs a few seconds to spot them. Detectors trained on ordinary photos struggle with them, because the usual cues (a clear edge, a colour that stands out) are missing.
The paper borrows an idea from how predators hunt. First the predator searches for a rough area where prey might be. Then it looks closer and works out the exact outline. The network does the same: one part finds a rough blob, and a chain of refinement steps sharpens its outline, each step paying special attention to the parts the previous step had not yet covered.
The authors also release a new dataset of 10,000 images of concealed objects, labelled in more detail than earlier collections, and public code. The method beats twelve earlier networks on the test sets they used.
TL;DR
Fan, Ji, Cheng and Shao define concealed object detection (COD) as predicting a binary pixel mask for objects that blend into their surroundings §2. They build the COD10K dataset §3 and SINet-V2, a search-and-identification network built from a Res2Net-50 encoder, texture-enhanced modules, a neighbor connection decoder and group-reversal attention blocks §4. Results are author-reported and on the authors' own test split. The code is public under Apache-2.0, and the training schedule in code differs from the paper in several small ways (see Paper vs code).
Problem
Concealed objects share texture and colour with the background, so low-level edge cues and saliency cues mislead detectors §1 §2. Earlier COD datasets were small: CHAMELEON has 76 images and CAMO has 2,500 §2. The authors say the lack of a large benchmark has held back the field §1.
Method
Task. Each pixel receives a label, 1 for concealed object and 0 otherwise. COD is class-agnostic §2.
Dataset (COD10K). 10,000 images: 5,066 concealed, 3,000 background images collected as salient images from Flickr to reduce selection bias, and 1,934 non-concealed scenes §3.1. The concealed images fall into 69 sub-classes, with 9 non-concealed sub-classes §3.1. Annotations are hierarchical: category, bounding box, attributes and object or instance masks §3.2. The images carry seven challenge attributes (multiple objects, big object, small object, out-of-view, occlusion, shape complexity, indefinable boundaries) fig. 7. Object-level labels cover 5,069 objects and 5,930 instances §3.2. Each image was labelled to matting level, which the authors say takes about 60 minutes per image §3.2. The split is 6,000 for training and 4,000 for testing §3.3 tab. 1 (but see Pitfalls for a conflicting test count).
Network overview. SINet-V2 has two phases, search and identification, in a coarse-to-fine cascade §4.1 fig. 13.
- Feature extraction. Res2Net-50 gives five feature levels, with spatial resolution H/2^k for k = 1 to 5. Only the top three levels (k = 3, 4, 5) are used, because low-level features are expensive and add little §4.2.
- Texture enhanced module (TEM). Each level passes through a TEM. It has four residual branches with dilation rates 1, 3, 5 and 7. Each branch first reduces the channels to 32 with a 1×1 convolution, then uses an asymmetric pair of (2i−1)×1 and 1×(2i−1) kernels, and a dilated 3×3 convolution when i > 1. The four branches are concatenated and reduced to C = 32 channels by a 3×3 convolution, and a shortcut is added before a ReLU §4.2 fig. 13.
- Neighbor connection decoder (NCD). It fuses the three TEM outputs, each step upsampling the coarser level and multiplying it with the finer one §4.2 eq. 1. The output is a coarse map C6 at stride 8.
- Reverse guidance. For each stage k, the coarser prediction is resampled to level k, passed through a sigmoid, then reversed (1 − x). The reversed map marks the regions the coarser stage has not yet explained §4.3 eq. 2.
- Group-reversal attention (GRA). Each stage has three GRA blocks. A block splits the feature channels into groups and places the reversed guidance after each group. This is the group guidance operation (GGO) §4.3 eq. 3. A 3×3 convolution with batch normalisation then turns the result into a residual update of the features eq. 4. The guidance receives a single-channel residual update eq. 5. Group sizes are 32, 8 and 1 channels for the three blocks §4.3 §5.3.
- Output. Each stage outputs the refined guidance plus the upsampled coarser prediction eq. 6. The network produces four maps, C6, C5, C4 and C3, and supervises all four §4.4.1.
Loss. Each of the four maps (C6, C5, C4, C3) receives a loss against the ground truth. The loss is the sum of a weighted IoU loss and a weighted binary cross entropy. The weights increase on hard pixels, meaning pixels near boundaries §4.4.1. The paper defines the losses by reference to earlier work and gives no constants.
Training. Adam, batch size 36, learning rate 1e-4, divided by 10 every 50 epochs, for 100 epochs. Training takes about 4 hours on one TITAN RTX GPU §4.4.2. Training data is the combined CAMO and COD10K training sets, without extra data §5.1, footnote.
Inference. Each image is resized to 352×352. The network runs once with no post-processing, and the prediction is upsampled to the original size §4.4.2. The authors report about 45 fps on one GPU, excluding I/O §4.4.2.
# SINet-V2 forward pass [§4.1] [fig. 13]
# image: (B, 3, 352, 352); returns four logit maps (C6, C5, C4, C3)
def forward(image):
# Res2Net-50 features at strides 8, 16, 32 [§4.2]
feat_3, feat_4, feat_5 = res2net_levels(image)
# 1x1 reduce to C = 32 and four dilated branches [§4.2]
tem_3 = texture_enhanced(feat_3) # (B, 32, 44, 44)
tem_4 = texture_enhanced(feat_4) # (B, 32, 22, 22)
tem_5 = texture_enhanced(feat_5) # (B, 32, 11, 11)
# Coarse location map C6 from the neighbor connection decoder [eq. 1]
map_6 = neighbor_connection_decoder(tem_5, tem_4, tem_3)
# Stage 5: resample C6 by x1/4 to level 5 [§4.3] [eq. 2]
guidance_5 = downsample(map_6, factor=4)
map_5 = gra_stage(tem_5, guidance_5) + guidance_5
# Stage 4: resample C5 by x2 to level 4 [§4.3] [eq. 2]
guidance_4 = upsample(map_5, factor=2)
map_4 = gra_stage(tem_4, guidance_4) + guidance_4
# Stage 3: resample C4 by x2 to level 3 [§4.3] [eq. 2]
guidance_3 = upsample(map_4, factor=2)
map_3 = gra_stage(tem_3, guidance_3) + guidance_3
return map_6, map_5, map_4, map_3# One GRA stage: reverse once, then three GRA blocks [§4.3]
# features: (B, C, h, w); guidance: (B, 1, h, w) logits from the stage above
def gra_stage(features, guidance):
# Reverse guidance r_1 = 1 - sigmoid(guidance) [§4.3] [eq. 2]
reverse_1 = 1 - sigmoid(guidance)
residual = reverse_1
# Group sizes 32, 8, 1 channels for blocks 1, 2, 3 [§4.3] [§5.3]
for group_size in [32, 8, 1]:
# Interleave r_1 after each channel group [§4.3] [eq. 3]
mixed = group_guidance(features, reverse_1, group_size)
# Residual feature update: 3x3 conv + batch norm [§4.3] [eq. 4]
features = features + conv3x3_bn(mixed)
# Residual guidance: r_1 plus a single-channel update [eq. 5]
residual = reverse_1 + conv3x3_to_one(features)
# Refined residual prediction; the caller adds the upsampled coarser map
# [§4.3] [eq. 6]
return residual# Training schedule [§4.4.2]
# images are resized to 352 x 352 and augmented [code: utils/data_val.py#L115]
def train(model, loader):
# Adam with learning rate 1e-4 [§4.4.2]
optimizer = adam(model.parameters(), lr=1e-4)
for epoch in range(1, 101):
# Divide the learning rate by 10 every 50 epochs [§4.4.2]
lr = 1e-4 * 0.1 ** (epoch // 50)
for images, masks in loader: # batch size 36 [§4.4.2]
maps = model(images)
# Sum of IoU and BCE losses over all four maps [§4.4.1]
loss = sum(structure_loss(m, masks) for m in maps)
optimizer.step()
return modelHyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| Encoder | Res2Net-50, ImageNet-pretrained | §4.2 Network_Res2Net_GRA_NCD.py | Top three layers removed §4.2; weights from README README.md |
| Feature levels used | k = 3, 4, 5 (strides 8, 16, 32) | §4.2 | Level 1 and 2 are not used by the decoder |
| Channels C | 32 | §4.2 MyTrain_Val.py | |
| TEM branch dilations | 1, 3, 5, 7 | §4.2 | Branch i uses a (2i−1)×(2i−1) kernel |
| TEM first conv | 1×1 to 32 channels | §4.2 | |
| TEM output | 3×3 conv to C, shortcut, ReLU | §4.2 Network_Res2Net_GRA_NCD.py | Shortcut is 1×1 conv in code |
| GRA blocks per stage | 3, group sizes 32 / 8 / 1 | §4.3 §5.3 | Code: Network_Res2Net_GRA_NCD.py |
| GRA residual conv | 3×3 + batch norm | §4.3 | Code has 3×3 + ReLU, no BN Network_Res2Net_GRA_NCD.py |
| Reverse guidance | sigmoid then 1 − x, applied once per stage | §4.3 eq. 2 | |
| Up/downsampling factors | ×4 down (k = 5), ×2 up (k = 3, 4) | §4.3 eq. 2 | |
| Optimizer | Adam | §4.4.2 MyTrain_Val.py | Weight decay not stated |
| Learning rate | 1e-4 | §4.4.2 MyTrain_Val.py | |
| LR schedule | ÷10 every 50 epochs | §4.4.2 utils.py | Code uses 1-based epochs |
| Epochs | 100 | §4.4.2 | Code loop runs 99 epochs MyTrain_Val.py |
| Batch size | 36 | §4.4.2 MyTrain_Val.py | |
| Input size | 352 × 352 (train and test) | §4.4.2 MyTrain_Val.py | |
| Gradient clipping | element-wise ±0.5 | MyTrain_Val.py utils.py | Not in paper |
| Augmentation | flip, crop, rotation, colour, pepper noise | data_val.py | Not in paper; see Pitfalls |
| Loss | weighted IoU + weighted BCE, deep supervision on 4 maps | §4.4.1 MyTrain_Val.py | Weight constants only in code |
| Loss weight constants | kernel 31, factor 5 | MyTrain_Val.py | Not in paper |
| Model selection | lowest MAE on validation set | MyTrain_Val.py | Default val set is CAMO test MyTrain_Val.py |
| Training time | about 4 hours on TITAN RTX | §4.4.2 | |
| Inference speed | about 45 fps on one GPU, excluding I/O | §4.4.2 |
Results
Author-reported. Setup: three test sets (CHAMELEON 76 images, CAMO test, COD10K test), 12 baselines trained on the combined CAMO and COD10K training sets, no post-processing for SINet-V2 §5.1 §5.2. Metrics: S-measure (Sα, higher is better), mean E-measure (Eφ, higher), weighted F-measure (Fβʷ, higher) and mean absolute error (M, lower) §5.1.
Headline: SINet-V2 is best on every metric and every test set in tab. 2. On COD10K test it reaches Sα 0.815 against 0.789 for PraNet, the next best baseline in Sα tab. 2. The paper's own conference version (SINet_cvpr) is also listed.
Table 2: main results, tab. 2
| Model | CHAM Sα↑ | Eφ↑ | Fβʷ↑ | M↓ | CAMO Sα↑ | Eφ↑ | Fβʷ↑ | M↓ | COD10K Sα↑ | Eφ↑ | Fβʷ↑ | M↓ |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| FPN | 0.794 | 0.783 | 0.590 | 0.075 | 0.684 | 0.677 | 0.483 | 0.131 | 0.697 | 0.691 | 0.411 | 0.075 |
| MaskRCNN | 0.643 | 0.778 | 0.518 | 0.099 | 0.574 | 0.715 | 0.430 | 0.151 | 0.613 | 0.748 | 0.402 | 0.080 |
| PSPNet | 0.773 | 0.758 | 0.555 | 0.085 | 0.663 | 0.659 | 0.455 | 0.139 | 0.678 | 0.680 | 0.377 | 0.080 |
| UNet++ | 0.695 | 0.762 | 0.501 | 0.094 | 0.599 | 0.653 | 0.392 | 0.149 | 0.623 | 0.672 | 0.350 | 0.086 |
| PiCANet | 0.769 | 0.749 | 0.536 | 0.085 | 0.609 | 0.584 | 0.356 | 0.156 | 0.649 | 0.643 | 0.322 | 0.090 |
| MSRCNN | 0.637 | 0.686 | 0.443 | 0.091 | 0.617 | 0.669 | 0.454 | 0.133 | 0.641 | 0.706 | 0.419 | 0.073 |
| PFANet | 0.679 | 0.648 | 0.378 | 0.144 | 0.659 | 0.622 | 0.391 | 0.172 | 0.636 | 0.618 | 0.286 | 0.128 |
| CPD | 0.853 | 0.866 | 0.706 | 0.052 | 0.726 | 0.729 | 0.550 | 0.115 | 0.747 | 0.770 | 0.508 | 0.059 |
| HTC | 0.517 | 0.489 | 0.204 | 0.129 | 0.476 | 0.442 | 0.174 | 0.172 | 0.548 | 0.520 | 0.221 | 0.088 |
| ANet-SRM | - | - | - | - | 0.682 | 0.685 | 0.484 | 0.126 | - | - | - | - |
| EGNet | 0.848 | 0.870 | 0.702 | 0.050 | 0.732 | 0.768 | 0.583 | 0.104 | 0.737 | 0.779 | 0.509 | 0.056 |
| PraNet | 0.860 | 0.907 | 0.763 | 0.044 | 0.769 | 0.824 | 0.663 | 0.094 | 0.789 | 0.861 | 0.629 | 0.045 |
| SINet_cvpr (conference) | 0.869 | 0.891 | 0.740 | 0.044 | 0.751 | 0.771 | 0.606 | 0.100 | 0.771 | 0.806 | 0.551 | 0.051 |
| SINet-V2 (this paper) | 0.888 | 0.942 | 0.816 | 0.030 | 0.820 | 0.882 | 0.743 | 0.070 | 0.815 | 0.887 | 0.680 | 0.037 |
ANet-SRM was evaluated on CAMO only tab. 2.
Table 3: COD10K by super-class, tab. 3. Per the table caption, all methods are trained on the same data as the conference version. The image counts are as printed in the table. Each cell is Sα / Eφ / Fβʷ / M.
| Model | Amphibian (124) | Aquatic (474) | Flying (714) | Terrestrial (699) |
|---|---|---|---|---|
| FPN | 0.745 / 0.776 / 0.497 / 0.065 | 0.684 / 0.732 / 0.432 / 0.103 | 0.726 / 0.766 / 0.440 / 0.061 | 0.601 / 0.656 / 0.353 / 0.109 |
| MaskRCNN | 0.665 / 0.785 / 0.487 / 0.081 | 0.560 / 0.721 / 0.344 / 0.123 | 0.644 / 0.767 / 0.449 / 0.063 | 0.611 / 0.630 / 0.380 / 0.075 |
| PSPNet | 0.736 / 0.774 / 0.463 / 0.072 | 0.659 / 0.712 / 0.396 / 0.111 | 0.700 / 0.743 / 0.394 / 0.067 | 0.669 / 0.718 / 0.332 / 0.071 |
| UNet++ | 0.677 / 0.745 / 0.434 / 0.079 | 0.599 / 0.673 / 0.347 / 0.121 | 0.659 / 0.727 / 0.397 / 0.068 | 0.608 / 0.749 / 0.288 / 0.070 |
| PiCANet | 0.686 / 0.702 / 0.405 / 0.079 | 0.616 / 0.631 / 0.335 / 0.115 | 0.663 / 0.676 / 0.347 / 0.069 | 0.658 / 0.708 / 0.273 / 0.074 |
| MSRCNN | 0.722 / 0.786 / 0.555 / 0.055 | 0.614 / 0.686 / 0.398 / 0.107 | 0.675 / 0.744 / 0.466 / 0.058 | 0.594 / 0.661 / 0.361 / 0.081 |
| PFANet | 0.693 / 0.677 / 0.358 / 0.110 | 0.629 / 0.626 / 0.319 / 0.155 | 0.658 / 0.648 / 0.299 / 0.102 | 0.611 / 0.603 / 0.237 / 0.111 |
| CPD | 0.794 / 0.839 / 0.587 / 0.051 | 0.739 / 0.792 / 0.529 / 0.082 | 0.777 / 0.827 / 0.544 / 0.046 | 0.714 / 0.771 / 0.445 / 0.058 |
| HTC | 0.606 / 0.598 / 0.331 / 0.088 | 0.507 / 0.495 / 0.183 / 0.129 | 0.582 / 0.559 / 0.274 / 0.070 | 0.530 / 0.485 / 0.170 / 0.078 |
| EGNet | 0.785 / 0.854 / 0.606 / 0.047 | 0.725 / 0.793 / 0.528 / 0.080 | 0.766 / 0.826 / 0.543 / 0.044 | 0.700 / 0.775 / 0.445 / 0.053 |
| PraNet | 0.842 / 0.905 / 0.717 / 0.035 | 0.781 / 0.883 / 0.696 / 0.065 | 0.819 / 0.888 / 0.669 / 0.033 | 0.756 / 0.835 / 0.565 / 0.046 |
| SINet_cvpr (conference) | 0.827 / 0.866 / 0.654 / 0.042 | 0.758 / 0.803 / 0.570 / 0.073 | 0.798 / 0.828 / 0.580 / 0.040 | 0.743 / 0.778 / 0.491 / 0.050 |
| SINet-V2 (this paper) | 0.858 / 0.916 / 0.756 / 0.030 | 0.811 / 0.883 / 0.696 / 0.051 | 0.839 / 0.908 / 0.713 / 0.027 | 0.787 / 0.866 / 0.623 / 0.039 |
Per-sub-class results are in tab. 4 (S-measure only). They are not reproduced here. The authors name Grouse as the easiest sub-class and LeafySeaDragon as the hardest §5.2.
Generalisation, tab. 5. Structure-measure after cross-dataset training. The authors train SINet_cvpr, not SINet-V2, on 800 images and test on 200 §5.2. Their scores are not comparable with tab. 2.
| Trained on | Tested on CAMO | Tested on COD10K | Drop |
|---|---|---|---|
| CAMO | 0.803 (self) | 0.702 | 12.6% |
| COD10K | 0.742 | 0.700 (self) | −6.0% |
Ablation, tab. 6. Each row retrains with the same hyperparameters §5.3. PD is the partial decoder, NCD the neighbor connection decoder, Sy and Asy symmetric and asymmetric convolution in the TEM, Reverse the reverse pattern per GRA block, Group the group sizes per GRA block. Values are Sα / Eφ / Fβʷ / M.
| No. | PD | NCD | TEM | Reverse | Group | CHAMELEON | CAMO | COD10K |
|---|---|---|---|---|---|---|---|---|
| #1 | – | – | Asy | {1,0,0} | {32;8;1} | 0.884 / 0.940 / 0.811 / 0.033 | 0.812 / 0.869 / 0.730 / 0.073 | 0.812 / 0.884 / 0.679 / 0.039 |
| #2 | ✓ | – | Asy | {1,0,0} | {32;8;1} | 0.881 / 0.934 / 0.799 / 0.034 | 0.820 / 0.877 / 0.740 / 0.071 | 0.813 / 0.884 / 0.673 / 0.038 |
| #3 | – | ✓ | none | {1,0,0} | {32;8;1} | 0.887 / 0.934 / 0.813 / 0.033 | 0.811 / 0.867 / 0.731 / 0.074 | 0.815 / 0.888 / 0.680 / 0.036 |
| #4 | – | ✓ | Sy | {1,0,0} | {32;8;1} | 0.888 / 0.944 / 0.818 / 0.030 | 0.810 / 0.866 / 0.730 / 0.073 | 0.814 / 0.883 / 0.678 / 0.037 |
| #5 | – | ✓ | Asy | {0,0,0} | {32;8;1} | 0.886 / 0.942 / 0.814 / 0.031 | 0.814 / 0.873 / 0.739 / 0.073 | 0.814 / 0.887 / 0.682 / 0.037 |
| #6 | – | ✓ | Asy | {1,1,0} | {32;8;1} | 0.879 / 0.928 / 0.794 / 0.035 | 0.820 / 0.877 / 0.738 / 0.071 | 0.807 / 0.878 / 0.661 / 0.040 |
| #7 | – | ✓ | Asy | {1,1,1} | {32;8;1} | 0.886 / 0.939 / 0.812 / 0.031 | 0.817 / 0.875 / 0.736 / 0.073 | 0.810 / 0.884 / 0.670 / 0.037 |
| #8 | – | ✓ | Asy | {1,0,0} | {1;1;1} | 0.888 / 0.940 / 0.812 / 0.031 | 0.819 / 0.877 / 0.741 / 0.072 | 0.814 / 0.887 / 0.681 / 0.037 |
| #9 | – | ✓ | Asy | {1,0,0} | {8;8;8} | 0.886 / 0.943 / 0.814 / 0.032 | 0.816 / 0.872 / 0.738 / 0.074 | 0.815 / 0.886 / 0.682 / 0.037 |
| #10 | – | ✓ | Asy | {1,0,0} | {32;32;32} | 0.884 / 0.944 / 0.810 / 0.033 | 0.819 / 0.876 / 0.738 / 0.071 | 0.813 / 0.884 / 0.675 / 0.037 |
| #11 | – | ✓ | Asy | {1,0,0} | {1;8;32} | 0.883 / 0.940 / 0.812 / 0.032 | 0.811 / 0.869 / 0.734 / 0.073 | 0.815 / 0.887 / 0.679 / 0.036 |
| #OUR | – | ✓ | Asy | {1,0,0} | {32;8;1} | 0.888 / 0.942 / 0.816 / 0.030 | 0.820 / 0.882 / 0.743 / 0.070 | 0.815 / 0.887 / 0.680 / 0.037 |
What the ablation supports, as the authors state it §5.3: the NCD raises CAMO Eφ from 0.869 to 0.882 tab. 6, #1 and #OUR; the asymmetric TEM raises CAMO Eφ from 0.866 to 0.882 tab. 6, #4 and #OUR; reversing only the first block works best; and the progressive group sizes {32;8;1} generalise better than the uniform alternatives.
Qualitative results are described in words only §5.2 fig. 16. The authors claim better results than the conference version under different lighting, appearance changes and indefinable boundaries fig. 16.
Paper vs code
Code: GewelsJI/SINet-V2 at commit 5b9844c (HEAD when cloned). The repo
says it is the PyTorch implementation of the journal version README.md.
The GitHub owner is Ge-Peng Ji's account, listed as an author in the README
README.md. Licence: Apache-2.0 LICENSE.
- TEM shortcut. Paper: identity shortcut §4.2. Code: the shortcut is a 1×1 conv-bn projection Network_Res2Net_GRA_NCD.py added before the ReLU Network_Res2Net_GRA_NCD.py.
- TEM first branch. Paper: four branches, the first with kernel 1 and dilation 1 §4.2. Code: branch 0 is a single 1×1 conv-bn with no 3×3 conv Network_Res2Net_GRA_NCD.py. Branches 1 to 3 match the paper's asymmetric (1,3)/(3,1), (1,5)/(5,1), (1,7)/(7,1) pattern with dilated 3×3 convs Network_Res2Net_GRA_NCD.py.
- Activations.
BasicConv2ddefines a ReLU but its forward returns before it is applied Network_Res2Net_GRA_NCD.py. Only the TEM output applies ReLU Network_Res2Net_GRA_NCD.py. - GRA normalisation. Paper: 3×3 conv followed by batch norm §4.3. Code: 3×3 conv followed by ReLU, no batch norm Network_Res2Net_GRA_NCD.py.
- GRA guidance accumulation. Paper: r_{i+1} = r_1 + g[p_{i+1}], and the GGO uses r_1 in every block §4.3 eq. 3 eq. 5. Code: the guidance y is updated in place, y = y + score(x), and the next block uses the updated y Network_Res2Net_GRA_NCD.py Network_Res2Net_GRA_NCD.py. Only the first block's guidance is reversed, as the paper says Network_Res2Net_GRA_NCD.py.
- NCD beyond Eq. 1. Paper gives Eq. 1 for the fusion step and calls the
decoder a modified UNet-like one §4.2 eq. 1. Code adds concatenation and
convolution stages after the fusion, then a 3×3 conv and a 1×1 output conv
Network_Res2Net_GRA_NCD.py. The
NCD upsampling uses
align_corners=TrueNetwork_Res2Net_GRA_NCD.py, while the rest of the network uses the default Network_Res2Net_GRA_NCD.py. - Group sizes. Paper: group sizes 32, 8, 1 with m = C/g groups §4.3 §5.3. Code: GRA(channel, subchannel) uses channel // subchannel chunks, giving 1, 4 and 32 chunks, which matches Network_Res2Net_GRA_NCD.py.
- Loss. Paper: weighted IoU plus weighted BCE, weights unspecified §4.4.1. Code: weights 1 + 5·|avgpool31(G) − G|, per-image normalised, BCE on logits and IoU on sigmoid outputs MyTrain_Val.py. The four-map sum matches §4.4.1 MyTrain_Val.py.
- Epochs. Paper: 100 epochs §4.4.2. Code: range(1, 100), so 99 epochs at default settings MyTrain_Val.py.
- Learning-rate schedule. Paper: divide by 10 every 50 epochs §4.4.2. Code: factor 0.1^(epoch // 50) with epoch counted from 1, so epochs 1 to 49 use 1e-4 and epochs 50 to 99 use 1e-5 utils.py MyTrain_Val.py.
- Gradient clipping. Not in paper. Code clamps each gradient element to ±0.5 MyTrain_Val.py utils.py.
- Augmentation. Not in paper. Code applies horizontal flip, random crop, rotation, colour jitter and pepper noise data_val.py.
- Model selection. Paper: silent. Code: keeps the checkpoint with lowest MAE on
--val_root, defaulting to the CAMO test set MyTrain_Val.py MyTrain_Val.py. - Test-time map. Paper: "final prediction" without naming the map §4.4.2. Code: uses the finest map C3, applies sigmoid, and min-max rescales each map to [0, 1] before saving MyTesting.py.
- Ablation variants. Only the full network is in the repo Network_Res2Net_GRA_NCD.py. The variants in tab. 6 cannot be checked against code.
- Evaluation. Repo ships MATLAB scripts in
eval/main.m. They were not read in detail for this card.
No other discrepancies found after checking the encoder, the TEM branch convolutions, the reverse operation, the NCD equation and the four-map loss.
Pitfalls
- Conflicting test-set size. Section 3.3 and tab. 1 give 4,000 test images §3.3 tab. 1, but the COD10K test results section says 2,026 test images §5.2. The paper does not explain the gap.
- Conflicting super-class count. Section 3.1 lists 10 super-classes §3.1. Section 3.2 says five concealed super-classes §3.2, and Section 3.3 says five again §3.3. tab. 3 shows four. Its image counts sum to 2,011, not 2,026 tab. 3.
- Model selection on a reported test set. The code picks the best epoch by MAE on CAMO test by default, and CAMO test is one of the reported benchmarks MyTrain_Val.py MyTrain_Val.py. Use a separate validation split when reproducing, or report that the selection leaks.
- Label noise in augmentation. The training transform applies pepper noise to the ground-truth mask: about 0.15% of its pixels, at random positions, are set to 0 or 255 each time the sample is loaded data_val.py data_val.py. The paper does not mention it.
- Crop and rotation change labels. Random crop, rotation and flip are applied to image and mask together data_val.py, so masks stay aligned. Rotation fills corners with zeros data_val.py.
- Weight constants are in code only. The IoU and BCE weighting uses a 31-pixel average pool and factor 5 MyTrain_Val.py. The paper gives no constants.
- Upsampling modes differ. The NCD uses align-corners bilinear and the rest of the network does not Network_Res2Net_GRA_NCD.py Network_Res2Net_GRA_NCD.py. Reproduce both.
- Resize ignores aspect ratio. Inputs are forced to 352 × 352 with no letterboxing, in training and at test time data_val.py data_val.py. Objects are distorted in non-square images.
- Generalisation numbers are not SINet-V2. tab. 5 uses the conference model and a small 800/200 split §5.2. Do not compare it with tab. 2.
- Reverse guidance is implemented as a running sum. Following the code instead of the paper changes the guidance each GRA block sees [see Paper vs code].
- Speed and cost. The 45 fps figure is on a single GPU and excludes I/O §4.4.2. Training takes about 4 hours on one TITAN RTX GPU §4.4.2. Ablation rows use the same schedule.
- Results are author-reported with no variance. The tables give one number per cell, with no spread across runs. Small gaps in the ablation, such as #1 vs #OUR on CHAMELEON Eφ (0.940 vs 0.942), are not tested for significance.
Lineage
- Builds on: the authors' CVPR 2020 SINet, cited as
fan2020camouflaged§1. SINet-V2 adds the NCD and GRA blocks and extends the dataset and benchmark §1. No card for the conference version. - Compared against: twelve baselines §5.1, including ANet-SRM, whose card is Anabranch Network and whose results here are CAMO-only tab. 2.
- Superseded by: none recorded in this wiki.
Source and license
Adapted from “Concealed Object Detection” by Deng-Ping Fan, Ge-Peng Ji, Ming-Ming Cheng, Ling Shao (arXiv:2102.10274), 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/GewelsJI/SINet-V2 at commit 5b9844c94d10 (Apache-2.0). Any quoted code is shown under that license.