
Défense de purification en entrée en boîte noire qui neutralise les attaques par porte dérobée sur les détecteurs d'objets via corruption, reconstruction par diffusion et vote consensuel DBSCAN.
La première défense de purification en boîte noire au stade de l'entrée, conçue pour les détecteurs d'objets contre les attaques par porte dérobée.
ODPure est le premier framework de purification en boîte noire au stade de l'entrée, conçu pour défendre les détecteurs d'objets contre les attaques par porte dérobée. Il met en œuvre un nouveau paradigme Corruption-Reconstruction-Sélection (CRS) qui :
ODPure neutralise efficacement diverses attaques par porte dérobée (réduisant le taux de succès de l'attaque jusqu'à 0,0 %) tout en préservant l'utilité de détection propre, offrant des compromis défense-utilité supérieurs aux défenses existantes.
# 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
Avant d'exécuter le module de Reconstruction, vous devez télécharger les poids du modèle pré-entraîné :
| Modèle | Description | Téléchargement |
|---|---|---|
| DiffBIR v2.1 | Modèle de restauration principal | HuggingFace |
| Stable Diffusion | Priors de diffusion latente | HuggingFace |
| LLaVA | Légendeur vision-langage | HuggingFace |
| RAM | Modèle de reconnaissance consciente | GitHub Release |
mkdir -p Method/Reconstruction/weights
Téléchargez et placez les poids en suivant les instructions des dépôts de modèles respectifs.
Mettez à jour les fichiers de configuration dans Method/Reconstruction/configs/ pour pointer vers vos poids téléchargés.
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
Le point d'entrée recommandé est run_pipeline.sh, qui enchaîne les trois étapes CRS :
# 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
Le script effectue :
Les détections purifiées finales sont écrites dans <OUTPUT_DIR>/final/.
Utilisez cette option si vous souhaitez inspecter / remplacer les étapes intermédiaires.
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
# Run on clean inputs
python evaluation/val_ODA.py \
--weights runs/train/exp/weights/last.pt \
--data data/ODA_clean.yaml \
--img 640 --iou-thres 0.65 --conf-thres 0.5 \
--save-txt --save-conf \
--project results/clean_val_txt
# Run on purified inputs (after defense via ODPure)
python evaluation/val_ODA.py \
--weights runs/train/exp/weights/last.pt \
--data data/ODA_purified.yaml \
--img 640 --iou-thres 0.65 --conf-thres 0.5 \
--save-txt --save-conf \
--project results/pur_val_txt
python evaluation/OMA_ASR_new.py
Configurez les chemins dans le script :
gt_folder = "/path/to/ground_truth"
benign_folder = "/path/to/clean_val_txt"
attack_folder = "/path/to/pur_val_txt"
target_class = "0" # person class
python evaluation/ODA_ASR_new.py
python evaluation/OGA_ASR_new.py
python evaluation/ODA_mAP.py
python evaluation/OGA_mAP.py
python evaluation/OMA_mAP.py
| Paramètre | Valeur | Description |
|---|---|---|
num_corruptions | 15 types × 3 sévérités = 45 variantes | Diversité de corruption |
corruption_severity | 1, 2, 3 | Niveaux d'intensité de corruption |
DBSCAN eps | 0.5 | Rayon de regroupement |
DBSCAN min_samples | 10 | Seuil de consensus |
cfg_scale | 6.0 | Guidage sans classificateur |
noise_aug | 1 | Niveau d'augmentation du bruit |
ODPure utilise 15 fonctions de corruption diverses réparties en 4 catégories :
from Method.corruptions.imagecorruption import *
# Apply specific corruption
corrupted_img = gaussian_noise(image, severity=2)
corrupted_img = glass_blur(image, severity=1)
corrupted_img = jpeg_compression(image, severity=3)
# Process on specific GPU
CUDA_VISIBLE_DEVICES=0 python Method/Reconstruction/inference.py \
--task denoise --input inputs/demo --output results/demo
# Batch processing with multiple GPUs
CUDA_VISIBLE_DEVICES=0,1,2,3 python Method/Reconstruction/inference.py \
--task denoise --batch_size 64 --input inputs/batch --output results/batch
# Train backdoored model
CUDA_VISIBLE_DEVICES="0,1" python train.py \
--data data/custom.yaml \
--epochs 200 \
--weights checkpoints/yolov5s.pt \
--img 640 \
--batch-size 128
# Evaluate with defense
python evaluation/val_ODA.py \
--weights runs/train/exp/weights/last.pt \
--data data/val.yaml \
--img 640 \
--iou-thres 0.65 \
--conf-thres 0.5 \
--save-txt --save-conf
| Attaque | Jeu de données (Modèle) | mAP propre | Avant défense (mAP/ASR) | Après défense (mAP/ASR) |
|---|---|---|---|---|
| OMA | VOC (YOLO) | 76.4% | 8.2% / 87.7% | 80.5% / 2.0% |
| OMA | VOC (F-RCNN) | 79.3% | 44.9% / 94.6% | 78.1% / 17.4% |
| OMA | COCO (YOLO) | 52.8% | 0.4% / 94.6% | 52.0% / 1.5% |
| OMA | COCO (F-RCNN) | 49.7% | 6.3% / 91.9% | 47.0% / 16.3% |
| ODA | VOC (YOLO) | 72.0% | 71.6% / 96.5% | 76.7% / 20.8% |
| ODA | VOC (F-RCNN) | 77.6% | 76.4% / 69.3% | 75.4% / 18.9% |
| ODA | COCO (YOLO) | 54.0% | 52.4% / 99.9% | 54.1% / 25.4% |
| ODA | COCO (F-RCNN) | 50.9% | 50.3% / 81.7% | 51.4% / 28.0% |
| OGA | VOC (YOLO) | 80.4% | 78.0% / 65.1% | 82.2% / 0.0% |
| OGA | VOC (F-RCNN) | 83.2% | 81.2% / 98.4% | 80.9% / 0.0% |
| OGA | COCO (YOLO) | 53.0% | 52.8% / 99.8% | 54.4% / 0.0% |
| OGA | COCO (F-RCNN) | 48.9% | 49.1% / 95.4% | 49.5% / 0.0% |
| Déclencheur | Attaque | mAP propre | ASR avant | ASR après |
|---|---|---|---|---|
| Poké Ball | OMA | 77.3% | 95.5% | 19.8% |
| Poké Ball | ODA | 75.3% | 98.5% | 35.1% |
| Poké Ball | OGA | 79.8% | 96.8% | 15.4% |
| Blanc uni | OMA | 75.5% | 82.0% | 52.9% |
| Blanc uni | ODA | 71.8% | 71.1% | 44.0% |
| Blanc uni | OGA | 80.2% | 73.7% | 37.0% |
| Type d'attaque | Description | Comportement |
|---|---|---|
| OMA | Attaque de mauvaise classification d'objets | Force les objets cibles à être mal classifiés |
| ODA | Attaque de disparition d'objets | Fait disparaître les objets cibles de la détection |
| OGA | Attaque de génération d'objets | Induit des objets fantômes hallucinés |
Si vous trouvez ce travail utile dans vos recherches, veuillez citer :
@article{odpure2026,
title={ODPure: Backdoor Purification for Object Detection via Ensemble Corruption Consensus},
author={},
journal={},
year={2026}
}
Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.
Pour toute question ou collaboration, veuillez ouvrir une issue sur GitHub.
ODPure - Protéger les systèmes de détection d'objets contre les attaques par porte dérobée tout en maintenant une perception continue.