Web Analytics

no-time-to-train

⭐ 228 stars Turkish by miquel-espinosa

🌐 Dil

🚀 Eğitime Zaman Yok!

Eğitimsiz Referans Tabanlı Nesne Segmentasyonu

GitHub Website arXiv

En Son Teknoloji (Papers with Code) _SOTA 1-shot_ | PWC-21CBCE?style=flat&logo=paperswithcode)

_SOTA 10-shot_ | PWC-21CBCE?style=flat&logo=paperswithcode)

_SOTA 30-shot_ | PWC-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

Bağlantı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).

cdfsod-results-final-comic-sans-min

🧠 Architecture

training-free-architecture-comic-sans-min

🛠️ 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=4

mkdir -p $RESULTS_DIR FILENAME=few_shot_${SHOTS}shot_seed${SEED}.pkl

#### 0. Referans seti oluşturun

python 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 doldurun

python 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şleme

python 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 yapma

python 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.368

SEGM 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çin scripts/matching_cdfsod_pipeline.sh dosyası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:

COCO görselleriyle 1-shot ayarında özel bir veri seti oluşturmak için basit bir betik hazırladık.
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 | |:----------------------------------:|:------------------------------------:| | bird_1 | boat_1 |

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) | |:---------------------------------:|:----------------------------------:| | bird_1_with_SAM_segm | boat_1_with_SAM_segm |

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.478

SEGM 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) | |:----------------------:|:----------------------:| | 000000459673 | 000000407180 |

| 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) | |:---------------------------------:|:----------------------------------:| | 000000517410 | 000000460598 |

📚 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 ---