Repositori ini menyediakan kode untuk melakukan deteksi tepi menggunakan Automatic Mask Generation (AMG) dari Segment Anything Model (SAM) [1]. Karena kode yang digunakan dalam makalah ini saat ini tidak tersedia untuk umum, penerapan ini didasarkan pada deskripsi yang diberikan dalam makalah.
Gambar sebelah kiri diambil dari BSDS. Bagian tengah adalah tepi kebenaran dasar. Gambar di sebelah kanan adalah hasil penerapan deteksi tepi.
Repositori ini dimaksudkan untuk dijalankan di lingkungan Docker. Jika Anda belum familiar dengan Docker, harap siapkan lingkungan dengan torch==1.11.0
dan instal paket yang terdaftar di docker/requirements.txt.
Silakan buat gambar Docker sebagai berikut:
docker build -t ${USER} /samed docker
Eksekusi sebagai root harus dihindari jika memungkinkan. Misalnya, lihat dokumen buruh pelabuhan untuk mengatur opsi -u
dengan benar.
Jika Anda tidak keberatan menjalankannya sebagai root, Anda dapat menjalankan container Docker sebagai berikut:
docker run --rm -it --name samed_container
--gpus device=0
-v $PWD :/working
${USER} /samed bash
unduh kumpulan data BSDS500 [2] dari situs resmi.
Jika Anda tidak dapat mengunduhnya, repositori mirror berikut mungkin bisa membantu.
Kemudian siapkan struktur direktori berikut:
data/BSDS500/
├── groundTruth
│ └── test
│ ├── 100007.mat
│ ├── 100039.mat
│ ...
│
└── images
├── test
│ ├── 100007.jpg
│ ├── 100039.jpg
│ ...
│
├── train
└── val
unduh kumpulan data uji NYUDv2 [3] dari EDTER. Kemudian siapkan struktur direktori berikut:
data/NYUDv2/
├── groundTruth
│ └── test
│ ├── img_5001.mat
│ ├── img_5002.mat
│ ...
│
└── images
├── test
│ ├── img_5001.png
│ ├── img_5002.png
│ ...
│
├── train
└── val
Buat direktori untuk mengunduh model sebagai berikut:
mkdir model
Unduh model SAM sebagai berikut:
wget -P model https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
Dalam makalah asli [1], Canny edge NMS [4] digunakan untuk edge NMS. Namun, di lingkungan kita, hal itu tidak menghasilkan hal-hal seperti yang dilaporkan di koran. Oleh karena itu, kami untuk sementara menggunakan model Hutan Terstruktur OpenCV [5] untuk edge NMS.
Unduh model Hutan Terstruktur sebagai berikut:
wget -P model https://cdn.rawgit.com/opencv/opencv_extra/3.3.0/testdata/cv/ximgproc/model.yml.gz
Untuk menghasilkan gambar di atas, lakukan hal berikut:
python example.py
Hasil keluaran dihasilkan di output/example
.
Prediksi tepian sebagai berikut:
python pipeline.py --dataset BSDS500 --data_split test
Argumen lain untuk menginisialisasi SamAutomaticMaskAndProbabilityGenerator
dapat disampaikan sebagai berikut.
-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
Lihat [6] untuk rincian lebih lanjut tentang padding batas nol.
Hasil keluaran dihasilkan di output_${dataset}/exp${exp_num}/${data_split}
.
Kami menggunakan py-bsds500 untuk deteksi tepi. Beberapa bug telah diperbaiki dan dipindahkan ke direktori py-bsds500
. Kompilasi modul ekstensi dengan:
cd py-bsds500
python setup.py build_ext --inplace
Kemudian evaluasi ODS, OIS, dan AP sebagai berikut:
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
Perhatikan bahwa mengikuti pekerjaan sebelumnya, toleransi pelokalan diatur ke 0,0075 untuk BSDS500 dan 0,011 untuk NYUDv2.
Kode dalam repositori ini sebagian besar menggunakan kode dari repositori berikut. Terima kasih.
[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. Segmentasikan Apa Saja. ICCV 2023.
[2] Pablo Arbelaez, Michael Maire, Charless C. Fowlkes, dan Jitendra Malik. Deteksi kontur dan segmentasi gambar hierarki. IEEE Trans. Pola Dubur. Mach. Intel 2011.
[3] Nathan Silberman, Derek Hoiem, Pushmeet Kohli, dan Rob Fergus. Segmentasi dalam ruangan dan mendukung inferensi dari gambar RGBD. ECCV 2012.
[4] John F. Canny. Pendekatan komputasi untuk deteksi tepi. IEEE Trans. Pola Dubur. Mach. Intel 1986.
[5] Piotr Dollar dan C. Lawrence Zitnick. Deteksi tepi cepat menggunakan hutan terstruktur. IEEE Trans. Pola Dubur. Mach. Intel 2015.
[6] Hiroaki Yamagiwa, Yusuke Takase, Hiroyuki Kambe, dan Ryosuke Nakamoto. Deteksi Tepi Zero-Shot Dengan SCESAME: Ensemble Berbasis Pengelompokan Spektral untuk Estimasi Model Segmen Apa Pun. Lokakarya WACV 2024.
Berikut ini adalah daftar penelitian tentang SAM dan deteksi tepi. Tolong beri tahu saya jika Anda ingin menambahkan penelitian baru.
Saya mungkin lambat merespons, namun semua orang boleh berkontribusi.