Este repositório fornece código para realizar a detecção de bordas usando a geração automática de máscara (AMG) do Segment Anything Model (SAM) [1]. Como o código utilizado no artigo não está atualmente disponível ao público, esta implementação é baseada nas descrições fornecidas no artigo.
A imagem à esquerda foi retirada do BSDS. O meio é o limite da verdade básica. A imagem à direita é o resultado da aplicação da detecção de bordas.
Este repositório deve ser executado em um ambiente Docker. Se você não estiver familiarizado com o Docker, configure um ambiente com torch==1.11.0
e instale os pacotes listados em docker/requirements.txt de acordo.
Crie uma imagem Docker da seguinte maneira:
docker build -t ${USER} /samed docker
A execução como root deve ser evitada, se possível. Por exemplo, consulte o documento do docker para definir corretamente a opção -u
.
Se não se importar em executar como root, você pode executar o contêiner Docker da seguinte maneira:
docker run --rm -it --name samed_container
--gpus device=0
-v $PWD :/working
${USER} /samed bash
baixe o conjunto de dados BSDS500 [2] do site oficial.
Se você não conseguir baixá-lo, os seguintes repositórios espelho podem ser úteis.
Em seguida, prepare a seguinte estrutura de diretórios:
data/BSDS500/
├── groundTruth
│ └── test
│ ├── 100007.mat
│ ├── 100039.mat
│ ...
│
└── images
├── test
│ ├── 100007.jpg
│ ├── 100039.jpg
│ ...
│
├── train
└── val
baixe o conjunto de dados de teste NYUDv2 [3] do EDTER. Em seguida, prepare a seguinte estrutura de diretórios:
data/NYUDv2/
├── groundTruth
│ └── test
│ ├── img_5001.mat
│ ├── img_5002.mat
│ ...
│
└── images
├── test
│ ├── img_5001.png
│ ├── img_5002.png
│ ...
│
├── train
└── val
Crie um diretório para baixar o modelo da seguinte forma:
mkdir model
Baixe o modelo SAM da seguinte forma:
wget -P model https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
No artigo original [1], Canny edge NMS [4] foi usado para edge NMS. Porém, em nosso ambiente, não produziu as bordas relatadas no artigo. Portanto, usamos temporariamente o modelo Structured Forests [5] do OpenCV para edge NMS.
Baixe o modelo de Florestas Estruturadas da seguinte forma:
wget -P model https://cdn.rawgit.com/opencv/opencv_extra/3.3.0/testdata/cv/ximgproc/model.yml.gz
Para gerar a imagem acima, faça o seguinte:
python example.py
O resultado de saída é gerado em output/example
.
Preveja arestas da seguinte maneira:
python pipeline.py --dataset BSDS500 --data_split test
Outros argumentos para inicializar SamAutomaticMaskAndProbabilityGenerator
podem ser passados da seguinte maneira.
-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 obter mais detalhes sobre preenchimento de zero de limite.
O resultado de saída é gerado em output_${dataset}/exp${exp_num}/${data_split}
.
Usamos py-bsds500 para detecção de bordas. Alguns bugs foram corrigidos e portados para o diretório py-bsds500
. Compile o módulo de extensão com:
cd py-bsds500
python setup.py build_ext --inplace
Em seguida, avalie ODS, OIS e AP da seguinte forma:
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
Observe que seguindo trabalhos anteriores, a tolerância de localização é definida como 0,0075 para BSDS500 e 0,011 para NYUDv2.
O código neste repositório usa principalmente código dos repositórios a seguir. Obrigado.
[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. Segmente qualquer coisa. ICCV 2023.
[2] Pablo Arbelaez, Michael Maire, Charless C. Fowlkes e Jitendra Malik. Detecção de contorno e segmentação hierárquica de imagens. IEEE Trans. Padrão Anal. Mach. Intel 2011.
[3] Nathan Silberman, Derek Hoiem, Pushmeet Kohli e Rob Fergus. Segmentação interna e inferência de suporte a partir de imagens RGBD. ECCV 2012.
[4]John F. Canny. Uma abordagem computacional para detecção de bordas. IEEE Trans. Padrão Anal. Mach. Intel 1986.
[5] Piotr Dollar e C. Lawrence Zitnick. Detecção rápida de bordas usando florestas estruturadas. IEEE Trans. Padrão Anal. Mach. Intel 2015.
[6] Hiroaki Yamagiwa, Yusuke Takase, Hiroyuki Kambe e Ryosuke Nakamoto. Detecção de borda zero-shot com SCESAME: conjunto baseado em cluster espectral para estimativa de modelo de qualquer segmento. Workshop WACV 2024.
A seguir está uma lista de estudos sobre SAM e detecção de bordas. Por favor, deixe-me saber se você gostaria de adicionar novas pesquisas.
Posso demorar para responder, mas todos são bem-vindos para contribuir.