Dieses Repository stellt Code für die Kantenerkennung mithilfe der automatischen Maskengenerierung (AMG) des Segment Anything Model (SAM) [1] bereit. Da der im Dokument verwendete Code derzeit nicht öffentlich zugänglich ist, basiert diese Implementierung auf den Beschreibungen im Dokument.
Das Bild links stammt aus dem BSDS. Die Mitte ist die Ground-Truth-Kante. Das Bild rechts ist das Ergebnis der Kantenerkennung.
Dieses Repository soll in einer Docker-Umgebung ausgeführt werden. Wenn Sie mit Docker nicht vertraut sind, richten Sie bitte eine Umgebung mit torch==1.11.0
ein und installieren Sie die in docker/requirements.txt aufgeführten Pakete entsprechend.
Bitte erstellen Sie ein Docker-Image wie folgt:
docker build -t ${USER} /samed docker
Eine Ausführung als Root sollte nach Möglichkeit vermieden werden. Sehen Sie sich beispielsweise das Docker-Dokument an, um die Option -u
richtig festzulegen.
Wenn es Ihnen nichts ausmacht, als Root zu laufen, können Sie den Docker-Container wie folgt ausführen:
docker run --rm -it --name samed_container
--gpus device=0
-v $PWD :/working
${USER} /samed bash
Laden Sie den BSDS500-Datensatz [2] von der offiziellen Website herunter.
Wenn Sie es nicht herunterladen können, können die folgenden Spiegel-Repositorys hilfreich sein.
Bereiten Sie dann die folgende Verzeichnisstruktur vor:
data/BSDS500/
├── groundTruth
│ └── test
│ ├── 100007.mat
│ ├── 100039.mat
│ ...
│
└── images
├── test
│ ├── 100007.jpg
│ ├── 100039.jpg
│ ...
│
├── train
└── val
Laden Sie den NYUDv2 [3]-Testdatensatz von EDTER herunter. Bereiten Sie dann die folgende Verzeichnisstruktur vor:
data/NYUDv2/
├── groundTruth
│ └── test
│ ├── img_5001.mat
│ ├── img_5002.mat
│ ...
│
└── images
├── test
│ ├── img_5001.png
│ ├── img_5002.png
│ ...
│
├── train
└── val
Erstellen Sie wie folgt ein Verzeichnis zum Herunterladen des Modells:
mkdir model
Laden Sie das SAM-Modell wie folgt herunter:
wget -P model https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
Im Originalpapier [1] wurde Canny Edge NMS [4] für Edge NMS verwendet. In unserer Umgebung wurden jedoch nicht die im Papier beschriebenen Kanten erzeugt. Daher haben wir vorübergehend das Structured Forests-Modell [5] von OpenCV für Edge-NMS verwendet.
Laden Sie das Structured Forests-Modell wie folgt herunter:
wget -P model https://cdn.rawgit.com/opencv/opencv_extra/3.3.0/testdata/cv/ximgproc/model.yml.gz
Um das obige Bild zu generieren, gehen Sie wie folgt vor:
python example.py
Das Ausgabeergebnis wird in output/example
generiert.
Prognostizieren Sie Kanten wie folgt:
python pipeline.py --dataset BSDS500 --data_split test
Weitere Argumente zum Initialisieren von SamAutomaticMaskAndProbabilityGenerator
können wie folgt übergeben werden.
-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
Weitere Informationen zum Randnullpunktauffüllen finden Sie in [6].
Das Ausgabeergebnis wird in output_${dataset}/exp${exp_num}/${data_split}
generiert.
Wir verwenden py-bsds500 zur Kantenerkennung. Einige Fehler wurden behoben und in das Verzeichnis py-bsds500
portiert. Kompilieren Sie das Erweiterungsmodul mit:
cd py-bsds500
python setup.py build_ext --inplace
Bewerten Sie dann ODS, OIS und AP wie folgt:
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
Beachten Sie, dass nach früheren Arbeiten die Lokalisierungstoleranz für BSDS500 auf 0,0075 und für NYUDv2 auf 0,011 festgelegt ist.
Der Code in diesem Repository verwendet hauptsächlich Code aus den folgenden Repositorys. Danke schön.
[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. Segmentieren Sie alles. ICCV 2023.
[2] Pablo Arbelaez, Michael Maire, Charless C. Fowlkes und Jitendra Malik. Konturerkennung und hierarchische Bildsegmentierung. IEEE Trans. Muster Anal. Mach. Intel 2011.
[3] Nathan Silberman, Derek Hoiem, Pushmeet Kohli und Rob Fergus. Innensegmentierung und Unterstützung der Inferenz aus RGBD-Bildern. ECCV 2012.
[4] John F. Canny. Ein rechnerischer Ansatz zur Kantenerkennung. IEEE Trans. Muster Anal. Mach. Intel 1986.
[5] Piotr Dollar und C. Lawrence Zitnick. Schnelle Kantenerkennung mithilfe strukturierter Wälder. IEEE Trans. Muster Anal. Mach. Intel 2015.
[6] Hiroaki Yamagiwa, Yusuke Takase, Hiroyuki Kambe und Ryosuke Nakamoto. Zero-Shot-Kantenerkennung mit SCESAME: Spektrales Clustering-basiertes Ensemble für die Segment-Anything-Modellschätzung. WACV-Workshop 2024.
Im Folgenden finden Sie eine Liste von Studien zu SAM und Kantenerkennung. Bitte lassen Sie mich wissen, wenn Sie neue Forschungsergebnisse hinzufügen möchten.
Es kann sein, dass ich langsam antworte, aber jeder ist willkommen, etwas beizutragen.