Этот репозиторий предоставляет код для обнаружения границ с использованием автоматической генерации маски (AMG) модели Segment Anything (SAM) [1]. Поскольку код, используемый в статье, в настоящее время недоступен для общественности, эта реализация основана на описаниях, представленных в статье.
Изображение слева взято из BSDS. Середина — это край истины. Изображение справа — результат применения обнаружения краев.
Этот репозиторий предназначен для запуска в среде Docker. Если вы не знакомы с Docker, настройте среду с torch==1.11.0
и установите соответствующие пакеты, перечисленные в docker/requirements.txt.
Создайте образ Docker следующим образом:
docker build -t ${USER} /samed docker
По возможности следует избегать выполнения от имени пользователя root. Например, обратитесь к документу Docker, чтобы правильно установить параметр -u
.
Если вы не против работать от имени пользователя root, вы можете запустить контейнер Docker следующим образом:
docker run --rm -it --name samed_container
--gpus device=0
-v $PWD :/working
${USER} /samed bash
загрузите набор данных BSDS500 [2] с официального сайта.
Если вы не можете его загрузить, вам могут пригодиться следующие зеркальные репозитории.
Затем подготовьте следующую структуру каталогов:
data/BSDS500/
├── groundTruth
│ └── test
│ ├── 100007.mat
│ ├── 100039.mat
│ ...
│
└── images
├── test
│ ├── 100007.jpg
│ ├── 100039.jpg
│ ...
│
├── train
└── val
загрузите набор тестовых данных NYUDv2 [3] из EDTER. Затем подготовьте следующую структуру каталогов:
data/NYUDv2/
├── groundTruth
│ └── test
│ ├── img_5001.mat
│ ├── img_5002.mat
│ ...
│
└── images
├── test
│ ├── img_5001.png
│ ├── img_5002.png
│ ...
│
├── train
└── val
Создайте каталог для загрузки модели следующим образом:
mkdir model
Загрузите модель SAM следующим образом:
wget -P model https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
В оригинальной статье [1] для ребер NMS использовалась Canny Edge NMS [4]. Однако в наших условиях он не дал таких краев, о которых сообщается в статье. Поэтому мы временно использовали модель структурированных лесов OpenCV [5] для Edge NMS.
Загрузите модель структурированных лесов следующим образом:
wget -P model https://cdn.rawgit.com/opencv/opencv_extra/3.3.0/testdata/cv/ximgproc/model.yml.gz
Чтобы создать изображение выше, сделайте следующее:
python example.py
Результат вывода генерируется в output/example
.
Прогнозируйте края следующим образом:
python pipeline.py --dataset BSDS500 --data_split test
Другие аргументы для инициализации SamAutomaticMaskAndProbabilityGenerator
можно передать следующим образом.
-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
См. [6] для получения более подробной информации о заполнении границ нулями.
Результат вывода генерируется в output_${dataset}/exp${exp_num}/${data_split}
.
Мы используем py-bsds500 для обнаружения границ. Некоторые ошибки исправлены и перенесены в каталог py-bsds500
. Скомпилируйте модуль расширения с помощью:
cd py-bsds500
python setup.py build_ext --inplace
Затем оцените ODS, OIS и AP следующим образом:
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
Обратите внимание, что после предыдущих работ допуск локализации установлен на 0,0075 для BSDS500 и 0,011 для NYUDv2.
Код в этом репозитории в основном использует код из следующих репозиториев. Спасибо.
[1] Александр Кириллов, Эрик Минтун, Нихила Рави, Ханзи Мао, Хлоя Роллан, Лаура Густафсон, Тете Сяо, Спенсер Уайтхед, Александр С. Берг, Ван-Йен Ло, Петр Доллар, Росс Гиршик. Сегментируйте что угодно. ICCV 2023.
[2] Пабло Арбелаес, Майкл Мэр, Чарльз К. Фаулкс и Джитендра Малик. Обнаружение контуров и иерархическая сегментация изображений. IEEE Транс. Паттерн Анал. Мах. Интел 2011.
[3] Натан Зильберман, Дерек Хойем, Пушмит Кохли и Роб Фергюс. Сегментация внутри помещений и поддержка выводов на основе изображений RGBD. ЕСКВ 2012.
[4] Джон Ф. Кэнни. Вычислительный подход к обнаружению краев. IEEE Транс. Паттерн Анал. Мах. Интел 1986.
[5] Петр Доллар и К. Лоуренс Зитник. Быстрое обнаружение границ с использованием структурированных лесов. IEEE Транс. Паттерн Анал. Мах. Интел 2015.
[6] Хироаки Ямагива, Юсуке Такасэ, Хироюки Камбе и Рёсуке Накамото. Обнаружение краев с нулевым выстрелом с помощью SCESAME: ансамбль на основе спектральной кластеризации для оценки модели сегментации чего угодно. Семинар WACV 2024.
Ниже приводится список исследований по SAM и обнаружению границ. Пожалуйста, дайте мне знать, если вы хотите добавить новые исследования.
Возможно, я не спешу отвечать, но каждый может внести свой вклад.