🚀 Eğitime Zaman Yok!
Eğitimsiz Referans Tabanlı Nesne Segmentasyonu
En Son Teknoloji (Papers with Code)
_SOTA 1-shot_ | -21CBCE?style=flat&logo=paperswithcode)
🚨 Güncelleme (22 Temmuz 2025): Özel veri kümeleri için talimatlar eklendi!
🔔 Güncelleme (16 Temmuz 2025): Kod, talimatlarla birlikte güncellendi!
📋 İçindekiler
- 🎯 Öne Çıkanlar
- 📜 Özet
- 🧠 Mimari
- 🛠️ Kurulum talimatları
- 1. Depoyu klonlayın
- 2. Conda ortamı oluşturun
- 3. SAM2 ve DinoV2'yi kurun
- 4. Veri kümelerini indirin
- 5. SAM2 ve DinoV2 kontrol noktalarını indirin
- 📊 Çıkarım kodu: Few-shot COCO'da 30-shot SOTA sonuçlarını çoğaltın
- 0. Referans seti oluşturun
- 1. Belleği referanslarla doldurun
- 2. Bellek bankasını son işlemden geçirin
- 3. Hedef görüntülerde çıkarım yapın
- Sonuçlar
- 🔍 Özel veri seti
- 0. Özel bir veri seti hazırlayın ⛵🐦
- 0.1 Sadece bbox anotasyonları varsa
- 0.2 COCO anotasyonlarını pickle dosyasına dönüştürün
- 1. Belleği referanslarla doldurun
- 2. Bellek bankasını sonradan işleyin
- 📚 Atıf
🎯 Öne Çıkanlar
- 💡 Eğitimsiz: İnce ayar yok, prompt mühendisliği yok—sadece bir referans görüntüsü.
- 🖼️ Referans Tabanlı: Yeni nesneleri sadece birkaç örnek ile segmentleyin.
- 🔥 SOTA Performansı: Önceki eğitimsiz yaklaşımlara göre COCO, PASCAL VOC ve Cross-Domain FSOD'da daha iyi sonuçlar.
📜 Özet
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. Conda ortamı oluşturun
Gerekli paketlerle bir conda ortamı oluşturacağız.
conda env create -f environment.yml
conda activate no-time-to-train
3. SAM2 ve DinoV2'yi Kurun
SAM2 ve DinoV2'yi kaynaktan kuracağız.
pip install -e .
cd dinov2
pip install -e .
cd ..
4. Veri setlerini indirin
Lütfen COCO veri setini indirin ve data/coco klasörüne yerleştirin
5. SAM2 ve DinoV2 kontrol noktalarını indirin
Makaledekiyle tam olarak aynı SAM2 kontrol noktalarını indireceğiz. (Ancak, SAM2.1 kontrol noktalarının zaten mevcut olduğunu ve daha iyi performans gösterebileceğini unutmayın.)
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 ../..
📊 Çıkarım kodu
⚠️ Uyarı: Bu bir araştırma kodudur — biraz karmaşa bekleyin!
Few-shot COCO'da 30-shot SOTA sonuçlarını çoğaltma
Kullanışlı değişkenleri tanımlayın ve sonuçlar için bir klasör oluşturun:
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. Referans seti oluşturunpython no_time_to_train/dataset/few_shot_sampling.py \
--n-shot $SHOTS \
--out-path ${RESULTS_DIR}/${FILENAME} \
--seed $SEED \
--dataset $CLASS_SPLIT
#### 1. Belleği referanslarla doldurunpython 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. Bellek bankasını sonradan işlemepython 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. Hedef görüntülerde çıkarım yapmapython 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
Eğer çıkarım sonuçlarını çevrimiçi olarak (hesaplandıkça) görmek isterseniz, şu argümanı ekleyin: --model.init_args.model_cfg.test.online_vis True
Puan eşiği score_thr parametresini ayarlamak için, argümanı ekleyin (örneğin, skoru 0.4'ten yüksek olan tüm örnekleri görselleştirmek için):
--model.init_args.model_cfg.test.vis_thr 0.4
Görseller artık results_analysis/few_shot_classes/ klasörüne kaydedilecektir. Soldaki görsel gerçek durumu, sağdaki görsel ise eğitim gerektirmeyen yöntemimizle bulunan bölünmüş örnekleri göstermektedir.Bu örnekte few_shot_classes bölümünü kullandığımızı unutmayın, bu nedenle yalnızca bu bölümdeki sınıfların bölünmüş örneklerini görmeyi beklemeliyiz (COCO’daki tüm sınıfları değil).
#### Sonuçlar
Doğrulama setindeki tüm görselleri çalıştırdıktan sonra şunları elde etmelisiniz:
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
🔍 Özel veri seti
Kendi veri setinizde boru hattımızı çalıştırmak için talimatları sağlıyoruz. Açıklama formatı her zaman COCO formatındadır.
Özetle; Özel veri setlerinde tam boru hattının nasıl çalıştırılacağını doğrudan görmek içinscripts/matching_cdfsod_pipeline.shdosyasına ve CD-FSOD veri setlerinin örnek betiklerine (örn.scripts/dior_fish.sh) bakabilirsiniz.
0. Özel bir veri seti hazırlama ⛵🐦
Diyelim ki özel bir veri setinde tekne⛵ ve kuş🐦 tespiti yapmak istiyoruz. Yöntemimizi kullanmak için şunlara ihtiyacımız olacak:
- Her sınıf için en az 1 etiketlenmiş referans görseli (yani tekne için 1 referans görseli ve kuş için 1 referans görseli)
- İstediğimiz sınıfların örneklerini bulmak için birden fazla hedef görsel.
mkdir -p data/my_custom_dataset
python scripts/make_custom_dataset.py
Bu, aşağıdaki klasör yapısına sahip özel bir veri kümesi oluşturacaktır:
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)
Referans görsellerin görselleştirilmesi (1-atış):| KUŞ 🐦 için 1-atış Referans Görseli | TEKNE ⛵ için 1-atış Referans Görseli |
|:----------------------------------:|:------------------------------------:|
| |
|
0.1 Sadece bbox anotasyonları mevcutsa
Yalnızca referans görseller için sınırlayıcı kutu (bbox) anotasyonlarınız varsa, SAM2 kullanarak örnek düzeyinde segmentasyon maskeleri oluşturmak için de bir betik sağlıyoruz. Bu, yalnızca sınırlayıcı kutu anotasyonları mevcutsa faydalıdır.
# 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
Örnek düzeyinde segmentasyon maskeleriyle referans görüntüler (gt bounding box'lardan SAM2 ile oluşturuldu, 1-shot):Oluşturulan segmentasyon maskelerinin görselleştirmeleri data/my_custom_dataset/annotations/custom_references_with_SAM_segm/references_visualisations/ dizininde kaydedilmiştir.
| KUŞ 🐦 için 1-shot Referans Görüntüsü (SAM ile otomatik segmentasyonlu) | TEKNE ⛵ için 1-shot Referans Görüntüsü (SAM ile otomatik segmentasyonlu) |
|:---------------------------------:|:----------------------------------:|
| |
|
0.2 Coco açıklamalarını pickle dosyasına dönüştür
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. Belleği referanslarla doldurun
Öncelikle, kullanışlı değişkenler tanımlayın ve sonuçlar için bir klasör oluşturun. Etiketlerin doğru görselleştirilmesi için, sınıf isimleri json dosyasında göründüğü gibi kategori kimliğine göre sıralanmalıdır. Örneğin, bird kategori kimliği 16, boat ise kategori kimliği 9'dur. Bu nedenle, 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
Adım 1'i çalıştırın: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. Bellek bankasını sonradan işleme
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. Hedef görüntülerde çıkarım
Eğer ONLINE_VIS True olarak ayarlanırsa, tahmin sonuçları results_analysis/my_custom_dataset/ dizinine kaydedilecek ve hesaplandıkça görüntülenecektir. ONLINE görselleştirme ile çalışmak çok daha yavaştır, DİKKAT EDİN.
Daha fazla ya da daha az segmentlenmiş örnek görmek için skor eşiği olan VIS_THR değerini değiştirmekten çekinmeyin.
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
Sonuçlar
Performans metrikleri (yukarıdaki komutlarla tamamen aynı parametrelerle) şu şekilde olmalıdır:
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
Görsel sonuçlar results_analysis/my_custom_dataset/ dizininde kaydedilir. Yöntemimizin yanlış negatifler için çalıştığını unutmayın, yani istenen sınıfların hiçbir örneğini içermeyen görsellerde de çalışır.Resimleri büyütmek için tıklayın ⬇️
| Hedef görüntüde tekneler ⛵ (sol GT, sağ tahminler) | Hedef görüntüde kuşlar 🐦 (sol GT, sağ tahminler) |
|:----------------------:|:----------------------:|
| |
|
| Hedef görüntüde tekneler ve kuşlar ⛵🐦 (sol GT, sağ tahminler) | Hedef görüntüde tekne veya kuş yok 🚫 (sol GT, sağ tahminler) |
|:---------------------------------:|:----------------------------------:|
| |
|
📚 Atıf
Bu çalışmayı kullanırsanız, lütfen bize atıfta bulunun:
@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 ---