🚀 Tidak Ada Waktu untuk Melatih!
Segmentasi Instance Berbasis Referensi Tanpa Pelatihan
State-of-the-art (Makalah dengan Kode)
_SOTA 1-shot_ | -21CBCE?style=flat&logo=paperswithcode)
🚨 Pembaruan (22 Juli 2025): Instruksi untuk dataset kustom telah ditambahkan!
🔔 Pembaruan (16 Juli 2025): Kode telah diperbarui dengan instruksi!
📋 Daftar Isi
- 🎯 Sorotan
- 📜 Abstrak
- 🧠 Arsitektur
- 🛠️ Instruksi Instalasi
- 1. Kloning repository
- 2. Buat lingkungan conda
- 3. Instal SAM2 dan DinoV2
- 4. Unduh dataset
- 5. Unduh checkpoint SAM2 dan DinoV2
- 📊 Kode inferensi: Reproduksi hasil SOTA 30-shot pada Few-shot COCO
- 0. Buat reference set
- 1. Isi memori dengan referensi
- 2. Proses lanjutan memory bank
- 3. Inferensi pada gambar target
- Hasil
- 🔍 Dataset kustom
- 0. Siapkan dataset kustom ⛵🐦
- 0.1 Jika hanya anotasi bbox yang tersedia
- 0.2 Konversi anotasi coco ke file pickle
- 1. Isi memori dengan referensi
- 2. Pasca-proses memory bank
- 📚 Sitasi
🎯 Sorotan
- 💡 Tanpa Pelatihan: Tanpa fine-tuning, tanpa rekayasa prompt—cukup gambar referensi saja.
- 🖼️ Berbasis Referensi: Segmentasi objek baru hanya dengan beberapa contoh.
- 🔥 Performa SOTA: Mengungguli pendekatan tanpa pelatihan sebelumnya di COCO, PASCAL VOC, dan Cross-Domain FSOD.
📜 Abstrak
The performance of image segmentation models has historically been constrained by the high cost of collecting large-scale annotated data. The Segment Anything Model (SAM) alleviates this original problem through a promptable, semantics-agnostic, segmentation paradigm and yet still requires manual visual-prompts or complex domain-dependent prompt-generation rules to process a new image. Towards reducing this new burden, our work investigates the task of object segmentation when provided with, alternatively, only a small set of reference images. Our key insight is to leverage strong semantic priors, as learned by foundation models, to identify corresponding regions between a reference and a target image. We find that correspondences enable automatic generation of instance-level segmentation masks for downstream tasks and instantiate our ideas via a multi-stage, training-free method incorporating (1) memory bank construction; (2) representation aggregation and (3) semantic-aware feature matching. Our experiments show significant improvements on segmentation metrics, leading to state-of-the-art performance on COCO FSOD (36.8% nAP), PASCAL VOC Few-Shot (71.2% nAP50) and outperforming existing training-free approaches on the Cross-Domain FSOD benchmark (22.4% nAP).
🧠 Architecture
🛠️ Installation instructions
1. Clone the repository
git clone https://github.com/miquel-espinosa/no-time-to-train.git
cd no-time-to-train
2. Membuat lingkungan conda
Kita akan membuat lingkungan conda dengan paket-paket yang diperlukan.
conda env create -f environment.yml
conda activate no-time-to-train
3. Instal SAM2 dan DinoV2
Kita akan menginstal SAM2 dan DinoV2 dari sumbernya.
pip install -e .
cd dinov2
pip install -e .
cd ..
4. Unduh dataset
Silakan unduh dataset COCO dan letakkan di data/coco
5. Unduh checkpoint SAM2 dan DinoV2
Kami akan mengunduh checkpoint SAM2 yang persis digunakan dalam makalah. (Namun, perlu dicatat bahwa checkpoint SAM2.1 sudah tersedia dan mungkin memberikan performa yang lebih baik.)
mkdir -p checkpoints/dinov2
cd checkpoints
wget https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_large.pt
cd dinov2
wget https://dl.fbaipublicfiles.com/dinov2/dinov2_vitl14/dinov2_vitl14_pretrain.pth
cd ../..
📊 Kode Inferensi
⚠️ Penafian: Ini adalah kode penelitian — harap maklum jika ada sedikit kekacauan!
Mereproduksi hasil SOTA 30-shot pada Few-shot COCO
Definisikan variabel yang diperlukan dan buat folder untuk hasil:
CONFIG=./no_time_to_train/new_exps/coco_fewshot_10shot_Sam2L.yaml
CLASS_SPLIT="few_shot_classes"
RESULTS_DIR=work_dirs/few_shot_results
SHOTS=30
SEED=33
GPUS=4mkdir -p $RESULTS_DIR
FILENAME=few_shot_${SHOTS}shot_seed${SEED}.pkl
#### 0. Buat set referensipython no_time_to_train/dataset/few_shot_sampling.py \
--n-shot $SHOTS \
--out-path ${RESULTS_DIR}/${FILENAME} \
--seed $SEED \
--dataset $CLASS_SPLIT
#### 1. Isi memori dengan referensipython run_lightening.py test --config $CONFIG \
--model.test_mode fill_memory \
--out_path ${RESULTS_DIR}/memory.ckpt \
--model.init_args.model_cfg.memory_bank_cfg.length $SHOTS \
--model.init_args.dataset_cfgs.fill_memory.memory_pkl ${RESULTS_DIR}/${FILENAME} \
--model.init_args.dataset_cfgs.fill_memory.memory_length $SHOTS \
--model.init_args.dataset_cfgs.fill_memory.class_split $CLASS_SPLIT \
--trainer.logger.save_dir ${RESULTS_DIR}/ \
--trainer.devices $GPUS
#### 2. Memori bank pasca-prosespython run_lightening.py test --config $CONFIG \
--model.test_mode postprocess_memory \
--model.init_args.model_cfg.memory_bank_cfg.length $SHOTS \
--ckpt_path ${RESULTS_DIR}/memory.ckpt \
--out_path ${RESULTS_DIR}/memory_postprocessed.ckpt \
--trainer.devices 1
#### 3. Inferensi pada gambar targetpython run_lightening.py test --config $CONFIG \
--ckpt_path ${RESULTS_DIR}/memory_postprocessed.ckpt \
--model.init_args.test_mode test \
--model.init_args.model_cfg.memory_bank_cfg.length $SHOTS \
--model.init_args.model_cfg.dataset_name $CLASS_SPLIT \
--model.init_args.dataset_cfgs.test.class_split $CLASS_SPLIT \
--trainer.logger.save_dir ${RESULTS_DIR}/ \
--trainer.devices $GPUS
Jika Anda ingin melihat hasil inferensi secara online (saat sedang dihitung), tambahkan argumen: --model.init_args.model_cfg.test.online_vis True
Untuk menyesuaikan parameter ambang skor score_thr, tambahkan argumen (misalnya, memvisualisasikan semua instance dengan skor lebih tinggi dari 0.4):
--model.init_args.model_cfg.test.vis_thr 0.4
Gambar sekarang akan disimpan di results_analysis/few_shot_classes/. Gambar di sebelah kiri menunjukkan ground truth, gambar di sebelah kanan menunjukkan instance tersegmentasi yang ditemukan oleh metode tanpa pelatihan kami.Perhatikan bahwa dalam contoh ini kami menggunakan split few_shot_classes, sehingga, kita hanya akan melihat instance tersegmentasi dari kelas-kelas dalam split ini (bukan semua kelas di COCO).
#### Hasil
Setelah menjalankan semua gambar dalam set validasi, Anda seharusnya mendapatkan:
BBOX RESULTS:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.368SEGM RESULTS:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.342
🔍 Dataset kustom
Kami menyediakan instruksi untuk menjalankan pipeline kami pada dataset kustom. Format anotasi selalu menggunakan format COCO.
TLDR; Untuk langsung melihat cara menjalankan pipeline lengkap pada dataset kustom, temukanscripts/matching_cdfsod_pipeline.shbersama dengan contoh skrip dataset CD-FSOD (misalscripts/dior_fish.sh)
0. Siapkan dataset kustom ⛵🐦
Bayangkan kita ingin mendeteksi perahu⛵ dan burung🐦 dalam dataset kustom. Untuk menggunakan metode kami, kita akan membutuhkan:
- Minimal 1 gambar referensi yang sudah dianotasi untuk setiap kelas (yaitu 1 gambar referensi untuk perahu dan 1 gambar referensi untuk burung)
- Beberapa gambar target untuk menemukan instance dari kelas yang diinginkan.
mkdir -p data/my_custom_dataset
python scripts/make_custom_dataset.py
Ini akan membuat dataset khusus dengan struktur folder sebagai berikut:
data/my_custom_dataset/
├── annotations/
│ ├── custom_references.json
│ ├── custom_targets.json
│ └── references_visualisations/
│ ├── bird_1.jpg
│ └── boat_1.jpg
└── images/
├── 429819.jpg
├── 101435.jpg
└── (all target and reference images)
Visualisasi gambar referensi (1-shot):| Gambar Referensi 1-shot untuk BURUNG 🐦 | Gambar Referensi 1-shot untuk PERAHU ⛵ |
|:---------------------------------------:|:--------------------------------------:|
| |
|
0.1 Jika hanya anotasi bbox yang tersedia
Kami juga menyediakan skrip untuk menghasilkan mask segmentasi tingkat instansi dengan menggunakan SAM2. Ini berguna jika Anda hanya memiliki anotasi bounding box untuk gambar referensi.
# Download sam_h checkpoint. Feel free to use more recent checkpoints (note: code might need to be adapted)
wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth -O checkpoints/sam_vit_h_4b8939.pth
Run automatic instance segmentation from ground truth bounding boxes.
python no_time_to_train/dataset/sam_bbox_to_segm_batch.py \
--input_json data/my_custom_dataset/annotations/custom_references.json \
--image_dir data/my_custom_dataset/images \
--sam_checkpoint checkpoints/sam_vit_h_4b8939.pth \
--model_type vit_h \
--device cuda \
--batch_size 8 \
--visualize
Gambar referensi dengan masker segmentasi tingkat instansi (dihasilkan oleh SAM2 dari kotak pembatas gt, 1-shot):Visualisasi dari masker segmentasi yang dihasilkan disimpan di data/my_custom_dataset/annotations/custom_references_with_SAM_segm/references_visualisations/.
| Gambar Referensi 1-shot untuk BURUNG 🐦 (disegmentasi otomatis dengan SAM) | Gambar Referensi 1-shot untuk PERAHU ⛵ (disegmentasi otomatis dengan SAM) |
|:---------------------------------:|:----------------------------------:|
| |
|
0.2 Konversi anotasi coco ke file pickle
python no_time_to_train/dataset/coco_to_pkl.py \
data/my_custom_dataset/annotations/custom_references_with_segm.json \
data/my_custom_dataset/annotations/custom_references_with_segm.pkl \
1
1. Mengisi memori dengan referensi
Pertama, definisikan variabel yang diperlukan dan buat folder untuk hasil. Untuk visualisasi label yang benar, nama kelas harus diurutkan berdasarkan id kategori seperti yang muncul di file json. Misalnya, bird memiliki id kategori 16, boat memiliki id kategori 9. Jadi, CAT_NAMES=boat,bird.
DATASET_NAME=my_custom_dataset
DATASET_PATH=data/my_custom_dataset
CAT_NAMES=boat,bird
CATEGORY_NUM=2
SHOT=1
YAML_PATH=no_time_to_train/pl_configs/matching_cdfsod_template.yaml
PATH_TO_SAVE_CKPTS=./tmp_ckpts/my_custom_dataset
mkdir -p $PATH_TO_SAVE_CKPTS
Jalankan langkah 1:python run_lightening.py test --config $YAML_PATH \
--model.test_mode fill_memory \
--out_path $PATH_TO_SAVE_CKPTS/$DATASET_NAME\_$SHOT\_refs_memory.pth \
--model.init_args.dataset_cfgs.fill_memory.root $DATASET_PATH/images \
--model.init_args.dataset_cfgs.fill_memory.json_file $DATASET_PATH/annotations/custom_references_with_segm.json \
--model.init_args.dataset_cfgs.fill_memory.memory_pkl $DATASET_PATH/annotations/custom_references_with_segm.pkl \
--model.init_args.dataset_cfgs.fill_memory.memory_length $SHOT \
--model.init_args.dataset_cfgs.fill_memory.cat_names $CAT_NAMES \
--model.init_args.model_cfg.dataset_name $DATASET_NAME \
--model.init_args.model_cfg.memory_bank_cfg.length $SHOT \
--model.init_args.model_cfg.memory_bank_cfg.category_num $CATEGORY_NUM \
--trainer.devices 1
2. Bank memori pasca-proses
python run_lightening.py test --config $YAML_PATH \
--model.test_mode postprocess_memory \
--ckpt_path $PATH_TO_SAVE_CKPTS/$DATASET_NAME\_$SHOT\_refs_memory.pth \
--out_path $PATH_TO_SAVE_CKPTS/$DATASET_NAME\_$SHOT\_refs_memory_postprocessed.pth \
--model.init_args.model_cfg.dataset_name $DATASET_NAME \
--model.init_args.model_cfg.memory_bank_cfg.length $SHOT \
--model.init_args.model_cfg.memory_bank_cfg.category_num $CATEGORY_NUM \
--trainer.devices 1
3. Inferensi pada gambar target
Jika ONLINE_VIS disetel ke True, hasil prediksi akan disimpan di results_analysis/my_custom_dataset/ dan ditampilkan saat diproses. PERHATIKAN bahwa menjalankan dengan visualisasi online jauh lebih lambat.
Silakan ubah ambang skor VIS_THR untuk melihat lebih banyak atau lebih sedikit instance yang tersegmentasi.
ONLINE_VIS=True
VIS_THR=0.4
python run_lightening.py test --config $YAML_PATH \
--model.test_mode test \
--ckpt_path $PATH_TO_SAVE_CKPTS/$DATASET_NAME\_$SHOT\_refs_memory_postprocessed.pth \
--model.init_args.model_cfg.dataset_name $DATASET_NAME \
--model.init_args.model_cfg.memory_bank_cfg.length $SHOT \
--model.init_args.model_cfg.memory_bank_cfg.category_num $CATEGORY_NUM \
--model.init_args.model_cfg.test.imgs_path $DATASET_PATH/images \
--model.init_args.model_cfg.test.online_vis $ONLINE_VIS \
--model.init_args.model_cfg.test.vis_thr $VIS_THR \
--model.init_args.dataset_cfgs.test.root $DATASET_PATH/images \
--model.init_args.dataset_cfgs.test.json_file $DATASET_PATH/annotations/custom_targets.json \
--model.init_args.dataset_cfgs.test.cat_names $CAT_NAMES \
--trainer.devices 1
Hasil
Metode pengukuran kinerja (dengan parameter yang sama persis seperti perintah di atas) seharusnya:
BBOX RESULTS:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.478SEGM RESULTS:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.458
Hasil visual disimpan di results_analysis/my_custom_dataset/. Perlu dicatat bahwa metode kami bekerja untuk false negative, yaitu gambar yang tidak mengandung instance dari kelas yang diinginkan.Klik gambar untuk memperbesar ⬇️
| Gambar target dengan perahu ⛵ (kiri GT, kanan prediksi) | Gambar target dengan burung 🐦 (kiri GT, kanan prediksi) |
|:----------------------:|:----------------------:|
| |
|
| Gambar target dengan perahu dan burung ⛵🐦 (kiri GT, kanan prediksi) | Gambar target tanpa perahu atau burung 🚫 (kiri GT, kanan prediksi) |
|:---------------------------------:|:----------------------------------:|
| |
|
📚 Sitasi
Jika Anda menggunakan karya ini, mohon kutip kami:
@article{espinosa2025notimetotrain,
title={No time to train! Training-Free Reference-Based Instance Segmentation},
author={Miguel Espinosa and Chenhongyi Yang and Linus Ericsson and Steven McDonagh and Elliot J. Crowley},
journal={arXiv preprint arXiv:2507.02798},
year={2025},
primaryclass={cs.CV}
}--- Tranlated By Open Ai Tx | Last indexed: 2025-09-06 ---