Ce référentiel fournit du code pour effectuer la détection des contours à l'aide de la génération automatique de masques (AMG) du modèle Segment Anything (SAM) [1]. Étant donné que le code utilisé dans le document n'est actuellement pas accessible au public, cette implémentation est basée sur les descriptions fournies dans le document.
L'image de gauche est tirée du BSDS. Le milieu est le bord de la vérité terrain. L'image de droite est le résultat de l'application de la détection des contours.
Ce référentiel est destiné à être exécuté dans un environnement Docker. Si vous n'êtes pas familier avec Docker, veuillez configurer un environnement avec torch==1.11.0
et installer les packages répertoriés dans docker/requirements.txt en conséquence.
Veuillez créer une image Docker comme suit :
docker build -t ${USER} /samed docker
L'exécution en tant que root doit être évitée si possible. Par exemple, reportez-vous au document Docker pour définir correctement l'option -u
.
Si cela ne vous dérange pas d'exécuter en tant que root, vous pouvez exécuter le conteneur Docker comme suit :
docker run --rm -it --name samed_container
--gpus device=0
-v $PWD :/working
${USER} /samed bash
téléchargez l'ensemble de données BSDS500 [2] depuis le site officiel.
Si vous ne parvenez pas à le télécharger, les référentiels miroir suivants peuvent être utiles.
Préparez ensuite la structure de répertoires suivante :
data/BSDS500/
├── groundTruth
│ └── test
│ ├── 100007.mat
│ ├── 100039.mat
│ ...
│
└── images
├── test
│ ├── 100007.jpg
│ ├── 100039.jpg
│ ...
│
├── train
└── val
téléchargez l'ensemble de données de test NYUDv2 [3] depuis EDTER. Préparez ensuite la structure de répertoires suivante :
data/NYUDv2/
├── groundTruth
│ └── test
│ ├── img_5001.mat
│ ├── img_5002.mat
│ ...
│
└── images
├── test
│ ├── img_5001.png
│ ├── img_5002.png
│ ...
│
├── train
└── val
Créez un répertoire pour télécharger le modèle comme suit :
mkdir model
Téléchargez le modèle SAM comme suit :
wget -P model https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
Dans l'article original [1], Canny Edge NMS [4] a été utilisé pour Edge NMS. Cependant, dans notre environnement, cela n’a pas produit les bords rapportés dans le document. Par conséquent, nous avons temporairement utilisé le modèle Structured Forests [5] d'OpenCV pour Edge NMS.
Téléchargez le modèle de forêts structurées comme suit :
wget -P model https://cdn.rawgit.com/opencv/opencv_extra/3.3.0/testdata/cv/ximgproc/model.yml.gz
Pour générer l'image ci-dessus, procédez comme suit :
python example.py
Le résultat de sortie est généré dans output/example
.
Prédisez les arêtes comme suit :
python pipeline.py --dataset BSDS500 --data_split test
D'autres arguments pour initialiser SamAutomaticMaskAndProbabilityGenerator
peuvent être transmis comme suit.
-h, --help show this help message and exit
--dataset DATASET BSDS500 or NYUDv2
--data_split DATA_SPLIT
train, val, or test
--points_per_side POINTS_PER_SIDE
Number of points per side.
--points_per_batch POINTS_PER_BATCH
Number of points per batch
--pred_iou_thresh PRED_IOU_THRESH
Prediction IOU threshold
--stability_score_thresh STABILITY_SCORE_THRESH
Stability score threshold
--stability_score_offset STABILITY_SCORE_OFFSET
Stability score offset
--box_nms_thresh BOX_NMS_THRESH
NMS threshold for box suppression
--crop_n_layers CROP_N_LAYERS
Number of layers to crop
--crop_nms_thresh CROP_NMS_THRESH
NMS threshold for cropping
--crop_overlap_ratio CROP_OVERLAP_RATIO
Overlap ratio for cropping
--crop_n_points_downscale_factor CROP_N_POINTS_DOWNSCALE_FACTOR
Downscale factor for number of points in crop
--min_mask_region_area MIN_MASK_REGION_AREA
Minimum mask region area
--output_mode OUTPUT_MODE
Output mode of the mask generator
--nms_threshold NMS_THRESHOLD
NMS threshold
--bzp BZP boundary zero padding
--pred_iou_thresh_filtering
filter by pred_iou_thresh
--stability_score_thresh_filtering
filter by stability_score_thresh
--kernel_size KERNEL_SIZE
kernel size
Voir [6] pour plus de détails sur le remplissage des limites par zéro.
Le résultat de sortie est généré dans output_${dataset}/exp${exp_num}/${data_split}
.
Nous utilisons py-bsds500 pour la détection des contours. Certains bugs ont été corrigés et portés vers le répertoire py-bsds500
. Compilez le module d'extension avec :
cd py-bsds500
python setup.py build_ext --inplace
Évaluez ensuite ODS, OIS et AP comme suit :
cd py-bsds500/
python evaluate_parallel.py ../data/BSDS500 ../output/BSDS500/exp ${exp} / test --max_dist 0.0075
python evaluate_parallel.py ../data/NYUDv2 ../output/NYUDv2/exp ${exp} / test --max_dist 0.011
A noter que suite aux travaux précédents, la tolérance de localisation est fixée à 0,0075 pour BSDS500 et 0,011 pour NYUDv2.
Le code de ce référentiel utilise principalement le code des référentiels suivants. Merci.
[1] Alexander Kirillov, Eric Mintun, Nikhila Ravi, Hanzi Mao, Chloe Rolland, Laura Gustafson, Tete Xiao, Spencer Whitehead, Alexander C. Berg, Wan-Yen Lo, Piotr Dollar, Ross Girshick. Segmentez n'importe quoi. ICCV 2023.
[2] Pablo Arbelaez, Michael Maire, Charless C. Fowlkes et Jitendra Malik. Détection de contours et segmentation hiérarchique des images. IEEETrans. Modèle Anal. Mach. Intell 2011.
[3] Nathan Silberman, Derek Hoiem, Pushmeet Kohli et Rob Fergus. Segmentation intérieure et prise en charge de l'inférence à partir d'images RGBD. ECVC 2012.
[4] John F. Canny. Une approche informatique de la détection des contours. IEEETrans. Modèle Anal. Mach. Intell 1986.
[5] Piotr Dollar et C. Lawrence Zitnick. Détection rapide des contours à l’aide de forêts structurées. IEEETrans. Modèle Anal. Mach. Intell 2015.
[6] Hiroaki Yamagiwa, Yusuke Takase, Hiroyuki Kambe et Ryosuke Nakamoto. Détection de bord zéro avec SCESAME : ensemble basé sur le clustering spectral pour l'estimation de modèle de segment n'importe quoi. Atelier WACV 2024.
Ce qui suit est une liste d'études sur le SAM et la détection des contours. Veuillez me faire savoir si vous souhaitez ajouter de nouvelles recherches.
Je serai peut-être lent à répondre, mais tout le monde est invité à contribuer.