Paper · 2021-05-20 · cs.CV
Anabranch Network for Camouflaged Object Segmentation
Anabranch Network (ANet) adds a camouflage classifier to a saliency FCN and multiplies its image-level probability into the pixel map, so the output is scaled by how likely camouflage is. Introduces CAMO, 1,250 annotated camouflage images. Author-reported on CAMO-COCO, ANet-SRM scores F-beta 0.826 and IoU 0.732, against 0.699 and 0.535 for the pre-trained SRM.
Salient object detectionSegmentation evaluation (scoring foreground, saliency and segmentation masks)Multi-task learningcamouflaged-object-segmentationtwo-stream-networksalient-object-detectioncaffe
arXivPDFCodeMarkdown11 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 soldiers are built to look like their background, so a standard saliency model, which looks for the thing that stands out, tends to miss them. Most segmentation models also assume the object they look for is always there.
The paper makes two contributions. The first is a new collection of images with camouflaged objects, each annotated pixel by pixel, which gives the field a benchmark it lacked. The second is a network with two parts. One part draws a map of where the object might be. The other part answers a yes-or-no question: is there camouflage in this picture at all? The yes-or-no answer scales the map, so the aim is that a picture without camouflage yields no segmentation.
The authors attach this design to four existing saliency networks and report higher scores than those networks alone, on their own test sets.
TL;DR
Le, Nguyen, Nie, Tran and Sugimoto introduce the CAMO dataset of camouflaged objects and the Anabranch Network (ANet). ANet pairs any fully convolutional segmenter with an image-level camouflage classifier, and multiplies the classifier's probability into the segmentation map §4.2. The results are author-reported, the test sets are small (250 images each), and the paper's own code release does not contain the network definitions needed to check the classifier.
Problem
Camouflaged objects hide their texture in the background, so features that help detect salient objects work against them §1 §2.2. Before this paper there was no public dataset with both training and test data for camouflaged object segmentation §2.1 §3.1. Existing saliency segmenters assume a salient object is always present, while a camouflaged object may be absent from an image §2.2 §4.1. Such a method must therefore first decide whether camouflage is present §4.1.
Method
Dataset. The CAMO dataset has 1,250 images, each with at least one camouflaged object, drawn from 3,000 collected images after removing low resolution and duplicates §3.2. It covers natural camouflage (animals) and artificial camouflage (people such as soldiers and body paint) §3.3 fig. 3. Three annotators labelled every image with a custom interactive tool §3.2. The images are annotated for six challenge attributes: object appearance, background clutter, shape complexity, small object (camouflaged area under 0.1 of the image), occlusion and distraction. About 8% of images have multiple objects §3.3 fig. 4.
CAMO-COCO adds 1,250 non-camouflaged images from MS-COCO, each with an all-zero mask §5.1 fig. 6. Each set is split 80/20 at random, giving 1,000 training and 250 test images per set §5.1 tab. 2.
Network. ANet has two streams that take the same image §4.2 fig. 5.
- Segmentation stream. Any end-to-end FCN that maps an image to a map. The authors use four saliency FCNs: DHS, DSS, SRM and WSS §5.3.
- Classification stream. Three fully connected layers on top of the FCN's convolutional features. The first two each have a ReLU and 50% dropout, and the last is a softmax over two classes (camouflaged or not), trained with cross-entropy §4.2 tab. 1. The hidden width conflicts between the text (4096) and the table (2048); see Pitfalls.
- Fusion. The classifier's probability, a single scalar, multiplies every pixel of the segmentation map §4.2.
Training. The paper trains in two steps. First the segmentation stream is fine-tuned on CAMO. Then the segmentation parameters are fixed and the classification stream is trained on CAMO-COCO §5.3. A joint variant sums the two losses eq. 2 and trains both streams on CAMO-COCO for 10k iterations. The authors report that joint training does not help consistently §5.5.2 tab. 6.
Evaluation. Three metrics: F-measure with β² = 0.3 eq. 1, intersection over union (IoU) and mean absolute error (MAE) §5.2. Two binarisation settings are used. Where every image is assumed to contain camouflage, the threshold is the map's mean plus its standard deviation. Where presence is not guaranteed, the threshold is 0.5. MAE uses the raw map §5.2. Comparison baselines are each FCN retrained on CAMO or CAMO-COCO with similar hyperparameters §5.3.
F_\beta = \frac{(1+\beta^2)\,\mathrm{Precision} \times \mathrm{Recall}}{\beta^2 \times \mathrm{Precision} + \mathrm{Recall}} eq. 1
\mathcal{L} = \mathcal{L}_{\rm seg}(\hat{y}_{\rm seg}, y_{\rm seg}) + \mathcal{L}_{\rm cls}(\hat{y}_{\rm cls}, y_{\rm cls}) eq. 2
Forward pass, as the text describes it:
# Anabranch network forward pass [§4.2] [fig. 5]
# Input: image (H, W, 3)
# Output: camouflage map (H, W), scaled by the classifier
def anet_forward(image):
# Segmentation stream: any FCN returning a map at image size [§4.2]
seg_map = segmentation_fcn(image) # (H, W)
# Classification stream: fully connected layers on FCN features [§4.2]
# Which conv layer is tapped, and how it is flattened: not stated
features = conv_features(image) # not stated
hidden_1 = dropout(relu(fc_1(features)), rate=0.5) # width 4096 or 2048
hidden_2 = dropout(relu(fc_2(hidden_1)), rate=0.5) # width 4096 or 2048
# Two-way softmax; index of the camouflaged class: not stated [tab. 1]
class_probs = softmax(fc_3(hidden_2)) # (2,)
camo_prob = class_probs[camouflaged_index] # scalar
# Fusion: multiply the scalar into every pixel of the map [§4.2]
return camo_prob * seg_mapTwo-step training, as run in the reported experiments:
# Two-step training [§5.3]
# Both steps: SGD, momentum 0.9, weight decay 0.0005, batch size 2 [§5.3]
def train_anet(segmentation_fcn, classifier, camo_set, camo_coco_set):
# Step 1: fine-tune the segmentation stream on CAMO only [§5.3]
# Learning rate 1e-4 for 10 epochs, stated as 5k iterations [§5.3]
fine_tune(segmentation_fcn, camo_set, lr=1e-4, iterations=5000)
# Step 2: fix the segmentation parameters [§5.3]
freeze(segmentation_fcn)
# Learning rate 1e-6 for 3 epochs, stated as 3k iterations [§5.3]
train(classifier, camo_coco_set, lr=1e-6, iterations=3000)Binarisation for scoring:
# Binarise a camouflage map before scoring [§5.2]
# MAE is computed on the raw map instead [§5.2]
def binarize(camo_map, always_present):
# Context 1: every image is assumed to contain camouflage [§5.2]
if always_present:
# Threshold = mean + standard deviation of the map [§5.2]
threshold = camo_map.mean() + camo_map.std()
# Context 2: presence is not guaranteed [§5.2]
else:
# Fixed threshold [§5.2]
threshold = 0.5
# Strict or non-strict comparison: not stated
return camo_map > thresholdHyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| Optimiser | SGD, momentum 0.9 | §5.3 | |
| Weight decay | 0.0005 | §5.3 | |
| Batch size | 2 | §5.3 | Same in both training steps |
| Segmentation stream LR | 1e-4 | §5.3 | Fine-tuned on CAMO |
| Segmentation stream length | 10 epochs (stated as 5k iterations) | §5.3 | |
| Classification stream LR | 1e-6 | §5.3 | Trained on CAMO-COCO, segmentation fixed |
| Classification stream length | 3 epochs (stated as 3k iterations) | §5.3 | |
| Joint training LR | 1e-4 seg, 1e-6 cls | §5.5.2 | On CAMO-COCO |
| Joint training length | 10 epochs (stated as 10k iterations) | §5.5.2 | |
| Joint loss | L_seg + L_cls, unweighted | eq. 2 | |
| Baseline FCN LR | 1e-4 | §5.3 | 10 epochs, others as ANet |
| Augmentation | Random horizontal flip | §5.3 | Rescale to FCN resolution; size not stated |
| Dropout | 50% after first two FC layers | §4.2 tab. 1 | |
| FC widths | 4096, 4096 (text) or 2048, 2048 (table) | §4.2 tab. 1 | Conflicting |
| Classifier loss | softmax with cross-entropy | §4.2 | |
| F-measure β² | 0.3 | §5.2 eq. 1 | Chosen to favour precision |
| Adaptive threshold | mean + std of map | §5.2 | |
| Fixed threshold | 0.5 | §5.2 | |
| Framework | Caffe, implemented in C/C++ | §5.3 | |
| Hardware | Core i7 3.6 GHz, 32 GB RAM, two GTX 1080 | §5.3 | |
| Weight initialisation | Pre-trained saliency models (MSRA, DUT-OMRON, DUTS) | §5.3 §5.4.1 | Per-FCN weights not named |
| LR schedule, warmup, classifier initialisation | not stated |
Results
Author-reported. Test sets: CAMO has 250 test images, CAMO-COCO has 500 (250 camouflaged, 250 not). Each block gives MAE (lower is better), then F-beta and IoU (higher is better) under the adaptive and the fixed threshold tab. 3.
| Method | CAMO MAE | CAMO F adapt | CAMO IoU adapt | CAMO F fixed | CAMO IoU fixed | COCO MAE | COCO F adapt | COCO IoU adapt | COCO F fixed | COCO IoU fixed |
|---|---|---|---|---|---|---|---|---|---|---|
| DHS (pre-trained) | 0.173 | 0.548 | 0.351 | 0.562 | 0.332 | 0.204 | 0.746 | 0.571 | 0.750 | 0.549 |
| DHS (FT CAMO) | 0.129 | 0.640 | 0.459 | 0.643 | 0.444 | 0.169 | 0.794 | 0.633 | 0.793 | 0.618 |
| DHS (FT CAMO-COCO) | 0.138 | 0.596 | 0.388 | 0.614 | 0.367 | 0.072 | 0.796 | 0.679 | 0.808 | 0.681 |
| ANet-DHS (baseline) | 0.130 | 0.626 | 0.437 | 0.631 | 0.423 | 0.072 | 0.812 | 0.712 | 0.814 | 0.705 |
| DSS (pre-trained) | 0.157 | 0.564 | 0.320 | 0.563 | 0.333 | 0.176 | 0.757 | 0.559 | 0.756 | 0.570 |
| DSS (FT CAMO) | 0.141 | 0.622 | 0.425 | 0.631 | 0.420 | 0.152 | 0.791 | 0.633 | 0.795 | 0.630 |
| DSS (FT CAMO-COCO) | 0.145 | 0.582 | 0.385 | 0.584 | 0.381 | 0.076 | 0.790 | 0.686 | 0.792 | 0.687 |
| ANet-DSS (baseline) | 0.132 | 0.587 | 0.404 | 0.607 | 0.390 | 0.067 | 0.795 | 0.701 | 0.804 | 0.694 |
| SRM (pre-trained) | 0.171 | 0.448 | 0.258 | 0.425 | 0.213 | 0.191 | 0.699 | 0.535 | 0.685 | 0.502 |
| SRM (FT CAMO) | 0.120 | 0.683 | 0.507 | 0.688 | 0.498 | 0.176 | 0.815 | 0.651 | 0.812 | 0.634 |
| SRM (FT CAMO-COCO) | 0.127 | 0.663 | 0.454 | 0.656 | 0.421 | 0.067 | 0.830 | 0.717 | 0.831 | 0.708 |
| ANet-SRM (baseline) | 0.126 | 0.654 | 0.475 | 0.662 | 0.466 | 0.069 | 0.826 | 0.732 | 0.830 | 0.727 |
| WSS (pre-trained) | 0.178 | 0.559 | 0.323 | 0.531 | 0.265 | 0.197 | 0.754 | 0.567 | 0.740 | 0.528 |
| WSS (FT CAMO) | 0.145 | 0.658 | 0.477 | 0.661 | 0.465 | 0.174 | 0.807 | 0.649 | 0.810 | 0.637 |
| WSS (FT CAMO-COCO) | 0.149 | 0.642 | 0.439 | 0.638 | 0.382 | 0.085 | 0.811 | 0.678 | 0.820 | 0.687 |
| ANet-WSS (baseline) | 0.140 | 0.661 | 0.459 | 0.643 | 0.407 | 0.078 | 0.826 | 0.710 | 0.820 | 0.697 |
FT = fine-tuned. Bold rows are ANet. The table's colour coding of first and second places is not reproduced here.
Classification accuracy on CAMO-COCO, % tab. 4:
| Method | Accuracy |
|---|---|
| SVM with bag-of-words and SIFT | 54.0 |
| AlexNet (fine-tuned) | 76.0 |
| VGG-16 (fine-tuned) | 88.6 |
| ANet-DHS classifier | 91.4 |
| ANet-DSS classifier | 89.2 |
| ANet-SRM classifier | 90.6 |
| ANet-WSS classifier | 89.6 |
Average wall-clock time per image, milliseconds tab. 5:
| FCN | Alone | With ANet |
|---|---|---|
| DHS | 63 | 73 |
| DSS | 76 | 79 |
| SRM | 81 | 86 |
| WSS | 61 | 65 |
Joint training, from tab. 6 (adaptive threshold for CAMO and CAMO-COCO shown; fixed-threshold columns are in the paper):
| Method | CAMO MAE | CAMO F | CAMO IoU | COCO MAE | COCO F | COCO IoU |
|---|---|---|---|---|---|---|
| ANet-DHS (baseline) | 0.130 | 0.626 | 0.437 | 0.072 | 0.812 | 0.712 |
| ANet-DHS (+ joint) | 0.201 | 0.509 | 0.314 | 0.109 | 0.749 | 0.628 |
| ANet-DSS (baseline) | 0.132 | 0.587 | 0.404 | 0.067 | 0.795 | 0.701 |
| ANet-DSS (+ joint) | 0.126 | 0.644 | 0.441 | 0.064 | 0.822 | 0.719 |
| ANet-SRM (baseline) | 0.126 | 0.654 | 0.475 | 0.069 | 0.826 | 0.732 |
| ANet-SRM (+ joint) | 0.123 | 0.680 | 0.481 | 0.063 | 0.839 | 0.733 |
| ANet-WSS (baseline) | 0.140 | 0.661 | 0.459 | 0.078 | 0.826 | 0.710 |
| ANet-WSS (+ joint) | 0.145 | 0.626 | 0.394 | 0.074 | 0.813 | 0.692 |
Headline reading (author-reported): among the baseline rows, ANet-SRM and ANet-WSS have the highest F-measure on CAMO-COCO (0.826), and ANet-SRM has the highest IoU (0.732) tab. 3. On CAMO, the paper says ANet is expected to be comparable with the FCN fine-tuned on CAMO, and on CAMO-COCO it can beat that FCN §5.4.2. The authors also report a t-test at the 90% level, which they say favours ANet on CAMO-COCO §5.4.2. Adding the classifier raises the per-image time by 3 to 10 ms in the table tab. 5.
Paper vs code
The repository is ltnghia/ANet, linked from the authors' project page
§1. Its owner handle matches the project page's ltnghia path, which
belongs to the first author. It contains a Caffe tree with
three custom data layers, but not the network definitions, solver files,
the fusion step, the classifier loss, or the dataset lists. Things the paper
describes that cannot be checked in the code:
- Classifier widths (text 4096, table 2048) §4.2 tab. 1.
- The fusion (multiplication) and how the classifier output enters it.
- Learning-rate schedule, iteration counts, and the input size.
What the data layers do camourflage_data2_layer.cpp:
- Each list line gives an image, a segmentation file, an integer label and an optional saliency file camourflage_data2_layer.cpp. The paper does not describe a saliency-map input. Whether it is used in the reported experiments is not stated.
- The image-level label is copied into the classifier output blob camourflage_data2_layer.cpp.
- Random horizontal flip happens with probability 0.5 when the transform enables mirroring data_transformer.cpp. This matches the paper's random flip §5.3.
- The layer refuses a mean file camourflage_data2_layer.cpp. The paper does not mention mean subtraction, so there is no conflict.
- The three data layers (
camourflage_data2,_data3,_data4) have the same logic and differ only in class names and one debugging block camourflage_data3_layer.cpp. Which layer each stream uses is not stated.
The README says "The code is used for academic purpose only", and the repository has no top-level LICENSE file. The bundled Caffe copy has its own LICENSE. No code is quoted in this card; all code references are pointers.
Pitfalls
- Classifier width conflict. Text says 4096 and 4096 hidden units; Table 1 says 2048 and 2048 §4.2 tab. 1. Neither is confirmed by the code here.
- Classifier input. The paper does not say which convolution layer feeds the classifier, how the feature map is reduced to a vector, or which softmax index is "camouflaged".
- Fusion point. The paper does not say whether the multiplication uses the segmentation map before or after its output activation, nor whether the classifier output is thresholded first §4.2.
- Empty ground truth. Images in CAMO-COCO have all-zero masks. F-measure and IoU are undefined when both the prediction and the mask are empty. The paper does not state a convention. A commented-out passage in the LaTeX source proposed setting one pixel in both maps; it is not in the published text, so do not assume it.
- Averaging. The paper does not say whether F-measure and IoU are computed per image and averaged or pooled over the dataset.
- Threshold details. The adaptive threshold uses the map's mean plus its standard deviation, but the map's value range (0 to 1 or 0 to 255) is not stated. The comparison operator is not stated.
- Statistical test. The t-test at the 90% level is named, but the test variant and pairing are not stated §5.4.2. The claim that ANet "significantly outperforms" rests on it.
- Small test sets. CAMO has 250 test images. Differences of a few hundredths of F-measure may be within noise, and the random split's seed is not stated §5.1.
- Split release. The paper says the CAMO-COCO split "will be available" §5.1. Reproduce with your own random 80/20 split and report it.
- Input size and crop. Images are rescaled to "the resolution of the specific FCN" §5.3. The sizes are not given in the text. No crop size is stated.
- Pre-trained weights. The paper cites MSRA, DUT-OMRON and DUTS as sources of the pre-trained saliency models §5.4, but does not say which checkpoint each FCN uses.
- Joint training is mixed. Joint training lowers DHS and WSS and raises DSS and SRM §5.5.2 tab. 6. The authors say joint training may not help and leave it for future work §5.5.2.
- Classifier uses frozen features. Step 2 trains the classifier while the segmentation parameters stay fixed §5.3, so the classifier's features come from a stream that is not updated.
- Dataset licence. This card's CC BY 4.0 licence covers the paper, not the CAMO images or annotations. The paper does not state a licence for them, and the images were collected from the Internet by keyword search §3.2. Check the dataset's own terms before redistributing images.
- Figure and table numbers are taken from LaTeX source order, not from the compiled PDF. Check them against the PDF before citing numbers in print.
Lineage
- Builds on: the saliency FCNs DHS, DSS, SRM and WSS, used unchanged as the segmentation stream §5.3. Two-stream networks are reviewed in §2.3, but the paper's streams differ in architecture and task.
- Compared against: each FCN fine-tuned on CAMO or CAMO-COCO tab. 3. For classification, SVM with bag-of-words, AlexNet and VGG-16 tab. 4.
- Superseded by: not stated.
Source and license
Adapted from “Anabranch Network for Camouflaged Object Segmentation” by Trung-Nghia Le, Tam V. Nguyen, Zhongliang Nie, Minh-Triet Tran, Akihiro Sugimoto (arXiv:2105.09451), 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/ltnghia/ANet at commit 0c433197a011 (not stated; README says 'The code is used for academic purpose only'). Any quoted code is shown under that license.