
Black-box input-stage purification defense that neutralizes backdoor attacks on object detectors via corruption, diffusion reconstruction, and DBSCAN consensus voting.
The first input-stage black-box purification defense tailored for object detectors against backdoor attacks.
ODPure is the first input-stage, black-box purification framework tailored for defending object detectors against backdoor attacks. It operationalizes a novel Corruption-Reconstruction-Selection (CRS) paradigm that:
ODPure effectively neutralizes diverse backdoor attacks (reducing Attack Success Rate to as low as 0.0%) while preserving clean detection utility, achieving superior defense-utility trade-offs over existing defenses.
# Core dependencies
torch>=1.13.0
torchvision>=0.14.0
numpy>=1.21.0
Pillow>=9.0.0
opencv-python>=4.5.0
# Diffusion models
diffusers>=0.14.0
transformers>=4.25.0
accelerate>=0.20.0
# Evaluation
scikit-learn>=1.2.0 # For DBSCAN clustering
scipy>=1.9.0
# Data processing
pyyaml>=6.0
tqdm>=4.64.0
# Create conda environment
conda create -n odpure python=3.9 -y
conda activate odpure
# Install PyTorch with CUDA
conda install pytorch torchvision pytorch-cuda=11.7 -c pytorch -c nvidia
# Install other dependencies
pip install -r requirements.txt
Before running the Reconstruction module, you need to download the pretrained model weights:
| Model | Description | Download |
|---|---|---|
| DiffBIR v2.1 | Main restoration model | HuggingFace |
| Stable Diffusion | Latent diffusion priors | HuggingFace |
| LLaVA | Vision-language captioner | HuggingFace |
| RAM | Recognition-Aware Model | GitHub Release |
mkdir -p Method/Reconstruction/weights
Download and place the weights following the instructions in the respective model repositories.
Update the config files in Method/Reconstruction/configs/ to point to your downloaded weights.
ODPure/
βββ attack_script/ # Backdoor attack implementations
β βββ COCO_chessboard_29x29_OMA.py # Object Misclassification (Chessboard)
β βββ COCO_chessboard_29x29_ODA.py # Object Disappearance Attack (Chessboard)
β βββ COCO_chessboard_9x9_OGA.py # Object Generation Attack (Chessboard)
β βββ COCO_poke_15x15_OMA.py # OMA (PokΓ© Ball)
β βββ COCO_poke_15x15_ODA.py # ODA (PokΓ© Ball)
β βββ COCO_poke_15x15_OGA.py # OGA (PokΓ© Ball)
β βββ COCO_white_15x15_OMA.py # OMA (Solid White)
β βββ COCO_white_15x15_ODA.py # ODA (Solid White)
β βββ COCO_white_15x15_OGA.py # OGA (Solid White)
β
βββ Method/ # Core defense methodology
β βββ corruptions/ # Image corruption module
β β βββ imagecorruption.py # Corruption functions
β β βββ multiprocess_imagecorruption.py # Parallel processing
β β
β βββ Reconstruction/ # Diffusion-based restoration
β β βββ inference.py # Main inference script
β β βββ diffbir/ # DiffBIR model implementation
β β βββ llava/ # LLaVA captioner
β β βββ ram/ # Recognition-Aware Model
β β βββ configs/ # Model configurations
β β βββ weights/ # Model weights (download separately)
β β
β βββ dbscan_vote_new.py # DBSCAN clustering & voting
β
βββ evaluation/ # Evaluation metrics
β βββ OMA_ASR_new.py # OMA Attack Success Rate
β βββ OMA_mAP.py # OMA Mean Average Precision
β βββ ODA_ASR_new.py # ODA Attack Success Rate
β βββ ODA_mAP.py # ODA Mean Average Precision
β βββ OGA_ASR_new.py # OGA Attack Success Rate
β βββ OGA_mAP.py # OGA Mean Average Precision
β βββ val_OMA.py # YOLO validation for OMA
β βββ val_ODA.py # YOLO validation for ODA
β βββ val_OGA.py # YOLO validation for OGA
β
βββ data_format_conversion/ # Data format utilities
β βββ voc2yolo.py # VOC to YOLO format conversion
β βββ cocotoyolo.py # COCO to YOLO format conversion
β βββ select_coco_val_attack_information.py
β
βββ ablation_study/ # Ablation experiments
β βββ multiprocess_imagecorruption.py
β βββ random_select_corruption.py
β βββ select_specific_corruption.py
β
βββ run_pipeline.sh # One-shot CRS pipeline runner
βββ README.md # This file
The recommended entry point is run_pipeline.sh, which cascades the three CRS stages:
# Defaults: GPU=0, INPUT=inputs/demo/bid, OUTPUT=results/v2.1_demo_bid, ATTACK=ODA
bash run_pipeline.sh
# Custom arguments: GPU_ID INPUT_DIR OUTPUT_DIR ATTACK
bash run_pipeline.sh 0 inputs/coco_oda results/oda ODA
bash run_pipeline.sh 1 inputs/coco_oma results/oma OMA
bash run_pipeline.sh 2 inputs/coco_oga results/oga OGA
The script performs:
Final purified detections are written to <OUTPUT_DIR>/final/.
Use this if you want to inspect / replace intermediate steps.
python Method/corruptions/multiprocess_imagecorruption.py \
--input_dir /path/to/input/images \
--output_dir /path/to/corrupted/images \
--num_corruptions 45 \
--num_workers 8
python Method/Reconstruction/inference.py \
--task denoise \
--upscale 2 \
--version v2.1 \
--captioner llava \
--cfg_scale 6 \
--noise_aug 1 \
--input /path/to/corrupted/images \
--output /path/to/restored/images \
--batch_size 32 \
--device cuda
python Method/dbscan_vote_new.py \
--folder_purs /path/to/restored/detections \
--temp /path/to/temp \
--output_path /path/to/final/detections \
--eps 0.5 \
--min_samples 10
conda activate odpure
# Run on poisoned inputs (before defense)
python evaluation/val_ODA.py \
--weights runs/train/exp/weights/last.pt \
--data data/ODA_poison.yaml \
--img 640 --iou-thres 0.65 --conf-thres 0.5 \
--save-txt --save-conf \
--project results/poisoned_val_txt