Este repositorio proporciona código para realizar la detección de bordes utilizando la generación automática de máscaras (AMG) del modelo Segment Anything (SAM) [1]. Dado que el código utilizado en el documento no está actualmente disponible para el público, esta implementación se basa en las descripciones proporcionadas en el documento.
La imagen de la izquierda está tomada de BSDS. El medio es el borde de la verdad fundamental. La imagen de la derecha es el resultado de aplicar la detección de bordes.
Este repositorio está diseñado para ejecutarse en un entorno Docker. Si no está familiarizado con Docker, configure un entorno con torch==1.11.0
e instale los paquetes enumerados en docker/requirements.txt en consecuencia.
Cree una imagen de Docker de la siguiente manera:
docker build -t ${USER} /samed docker
Si es posible, se debe evitar la ejecución como root. Por ejemplo, consulte el documento de Docker para configurar correctamente la opción -u
.
Si no le importa ejecutar como root, puede ejecutar el contenedor Docker de la siguiente manera:
docker run --rm -it --name samed_container
--gpus device=0
-v $PWD :/working
${USER} /samed bash
descargue el conjunto de datos BSDS500 [2] del sitio oficial.
Si no puede descargarlo, los siguientes repositorios espejo pueden resultarle útiles.
Luego prepare la siguiente estructura de directorios:
data/BSDS500/
├── groundTruth
│ └── test
│ ├── 100007.mat
│ ├── 100039.mat
│ ...
│
└── images
├── test
│ ├── 100007.jpg
│ ├── 100039.jpg
│ ...
│
├── train
└── val
descargue el conjunto de datos de prueba NYUDv2 [3] de EDTER. Luego prepare la siguiente estructura de directorios:
data/NYUDv2/
├── groundTruth
│ └── test
│ ├── img_5001.mat
│ ├── img_5002.mat
│ ...
│
└── images
├── test
│ ├── img_5001.png
│ ├── img_5002.png
│ ...
│
├── train
└── val
Cree un directorio para descargar el modelo de la siguiente manera:
mkdir model
Descargue el modelo SAM de la siguiente manera:
wget -P model https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
En el artículo original [1], se utilizó Canny Edge NMS [4] para Edge NMS. Sin embargo, en nuestro entorno, no produjo los bordes reportados en el artículo. Por lo tanto, utilizamos temporalmente el modelo de bosques estructurados de OpenCV [5] para NMS de borde.
Descargue el modelo de Bosques Estructurados de la siguiente manera:
wget -P model https://cdn.rawgit.com/opencv/opencv_extra/3.3.0/testdata/cv/ximgproc/model.yml.gz
Para generar la imagen de arriba, haga lo siguiente:
python example.py
El resultado de salida se genera en output/example
.
Predice los bordes de la siguiente manera:
python pipeline.py --dataset BSDS500 --data_split test
Se pueden pasar otros argumentos para inicializar SamAutomaticMaskAndProbabilityGenerator
de la siguiente manera.
-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
Consulte [6] para obtener más detalles sobre el relleno de ceros en los límites.
El resultado de salida se genera en output_${dataset}/exp${exp_num}/${data_split}
.
Usamos py-bsds500 para la detección de bordes. Algunos errores se corrigieron y se trasladaron al directorio py-bsds500
. Compile el módulo de extensión con:
cd py-bsds500
python setup.py build_ext --inplace
Luego evalúe ODS, OIS y AP de la siguiente manera:
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
Tenga en cuenta que, siguiendo trabajos anteriores, la tolerancia de localización se establece en 0,0075 para BSDS500 y 0,011 para NYUDv2.
El código de este repositorio utiliza principalmente código de los siguientes repositorios. Gracias.
[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. Segmentar cualquier cosa. ICCV 2023.
[2] Pablo Arbeláez, Michael Maire, Charless C. Fowlkes y Jitendra Malik. Detección de contornos y segmentación jerárquica de imágenes. Traducción IEEE. Patrón Anal. Mach. Intel 2011.
[3] Nathan Silberman, Derek Hoiem, Pushmeet Kohli y Rob Fergus. Segmentación interior y soporte de inferencia a partir de imágenes RGBD. ECVC 2012.
[4] John F. Canny. Un enfoque computacional para la detección de bordes. Traducción IEEE. Patrón Anal. Mach. Intel 1986.
[5] Piotr Dollar y C. Lawrence Zitnick. Detección rápida de bordes mediante bosques estructurados. Traducción IEEE. Patrón Anal. Mach. Intel 2015.
[6] Hiroaki Yamagiwa, Yusuke Takase, Hiroyuki Kambe y Ryosuke Nakamoto. Detección de bordes de disparo cero con SCESAME: conjunto basado en agrupaciones espectrales para la estimación de modelos de cualquier segmento. Taller WACV 2024.
La siguiente es una lista de estudios sobre SAM y detección de bordes. Avíseme si desea agregar nuevas investigaciones.
Puede que tarde en responder, pero todos son bienvenidos a contribuir.