Web Analytics

no-time-to-train

⭐ 228 stars Vietnamese by miquel-espinosa

🌐 Ngôn ngữ

🚀 Không Thời Gian Để Huấn Luyện!

Phân Đoạn Tham Chiếu Theo Đối Tượng Không Cần Huấn Luyện

GitHub Website arXiv

Trạng thái tiên tiến nhất (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)


🚨 Cập nhật (22 tháng 7 năm 2025): Đã thêm hướng dẫn cho bộ dữ liệu tùy chỉnh!
🔔 Cập nhật (16 tháng 7 năm 2025): Mã nguồn đã được cập nhật kèm hướng dẫn!


📋 Mục lục

🎯 Điểm nổi bật

Liên kết:

📜 Tóm tắt

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. Tạo môi trường conda

Chúng ta sẽ tạo một môi trường conda với các gói cần thiết.

conda env create -f environment.yml
conda activate no-time-to-train

3. Cài đặt SAM2 và DinoV2

Chúng ta sẽ cài đặt SAM2 và DinoV2 từ mã nguồn.

pip install -e .
cd dinov2
pip install -e .
cd ..

4. Tải xuống các bộ dữ liệu

Vui lòng tải xuống bộ dữ liệu COCO và đặt nó vào data/coco

5. Tải xuống các checkpoint SAM2 và DinoV2

Chúng ta sẽ tải xuống các checkpoint SAM2 chính xác đã được sử dụng trong bài báo. (Tuy nhiên, lưu ý rằng các checkpoint SAM2.1 đã có sẵn và có thể hoạt động tốt hơ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 ../..

📊 Mã suy luận

⚠️ Lưu ý: Đây là mã nghiên cứu — có thể sẽ hơi lộn xộn!

Tái tạo kết quả SOTA 30-shot trong Few-shot COCO

Định nghĩa các biến hữu ích và tạo một thư mục cho kết quả:

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. Tạo bộ tham chiếu

python no_time_to_train/dataset/few_shot_sampling.py \
        --n-shot $SHOTS \
        --out-path ${RESULTS_DIR}/${FILENAME} \
        --seed $SEED \
        --dataset $CLASS_SPLIT
#### 1. Lấp đầy bộ nhớ bằng các tham chiếu

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. Xử lý hậu kỳ bộ nhớ ngân hàng

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. Suy luận trên các hình ảnh mục tiêu

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
Nếu bạn muốn xem kết quả suy luận trực tuyến (ngay khi chúng được tính toán), hãy thêm đối số:

    --model.init_args.model_cfg.test.online_vis True
Để điều chỉnh tham số ngưỡng điểm số score_thr, hãy thêm đối số (ví dụ, trực quan hóa tất cả các trường hợp có điểm số cao hơn 0.4):
    --model.init_args.model_cfg.test.vis_thr 0.4
Các hình ảnh bây giờ sẽ được lưu trong results_analysis/few_shot_classes/. Hình ảnh bên trái hiển thị dữ liệu thực tế, hình ảnh bên phải hiển thị các vùng phân đoạn do phương pháp không cần huấn luyện của chúng tôi tìm được.

Lưu ý rằng trong ví dụ này chúng tôi đang sử dụng bộ chia few_shot_classes, do đó, chúng ta chỉ nên mong đợi thấy các vùng phân đoạn của các lớp trong bộ chia này (không phải tất cả các lớp trong COCO).

#### Kết quả

Sau khi chạy tất cả các hình ảnh trong tập kiểm định, bạn sẽ thu được:

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


🔍 Bộ dữ liệu tùy chỉnh

Chúng tôi cung cấp hướng dẫn để chạy pipeline của mình trên một bộ dữ liệu tùy chỉnh. Định dạng chú thích luôn ở định dạng COCO.

TLDR; Để xem trực tiếp cách chạy toàn bộ pipeline trên bộ dữ liệu tùy chỉnh, hãy xem scripts/matching_cdfsod_pipeline.sh cùng với các script ví dụ của bộ dữ liệu CD-FSOD (ví dụ: scripts/dior_fish.sh)

0. Chuẩn bị bộ dữ liệu tùy chỉnh ⛵🐦

Hãy tưởng tượng chúng ta muốn phát hiện thuyền⛵ và chim🐦 trong một bộ dữ liệu tùy chỉnh. Để sử dụng phương pháp của chúng tôi, bạn sẽ cần:

Chúng tôi đã chuẩn bị một script ví dụ để tạo bộ dữ liệu tùy chỉnh với ảnh coco, cho trường hợp 1-shot.
mkdir -p data/my_custom_dataset
python scripts/make_custom_dataset.py
Điều này sẽ tạo ra một bộ dữ liệu tùy chỉnh với cấu trúc thư mục như sau:
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)
Trực quan hóa hình ảnh tham chiếu (1-shot):

| Hình ảnh tham chiếu 1-shot cho CHIM 🐦 | Hình ảnh tham chiếu 1-shot cho THUYỀN ⛵ | |:--------------------------------------:|:---------------------------------------:| | bird_1 | boat_1 |

0.1 Nếu chỉ có chú thích bbox

Chúng tôi cũng cung cấp một script để tạo mặt nạ phân đoạn cấp đối tượng bằng cách sử dụng SAM2. Điều này hữu ích nếu bạn chỉ có các chú thích bounding box cho hình ảnh tham chiếu.

# 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
Hình ảnh tham chiếu với mặt nạ phân đoạn cấp độ đối tượng (được tạo bởi SAM2 từ các hộp chứa gt, 1-shot):

Hình ảnh trực quan hóa của các mặt nạ phân đoạn đã được lưu tại data/my_custom_dataset/annotations/custom_references_with_SAM_segm/references_visualisations/.

| Hình ảnh tham chiếu 1-shot cho CHIM 🐦 (tự động phân đoạn bằng SAM) | Hình ảnh tham chiếu 1-shot cho THUYỀN ⛵ (tự động phân đoạn bằng SAM) | |:---------------------------------:|:----------------------------------:| | bird_1_with_SAM_segm | boat_1_with_SAM_segm |

0.2 Chuyển đổi chú thích coco sang tập tin 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. Đổ đầy bộ nhớ với các tham chiếu

Đầu tiên, định nghĩa các biến hữu ích và tạo một thư mục để lưu kết quả. Để hiển thị nhãn đúng cách, tên các lớp phải được sắp xếp theo id danh mục như trong tệp json. Ví dụ, bird có id danh mục là 16, boat có id danh mục là 9. Do đó, 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
Chạy bước 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. Xử lý hậu kỳ bộ nhớ ngân hàng

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. Suy luận trên các ảnh mục tiêu

Nếu ONLINE_VIS được đặt thành True, kết quả dự đoán sẽ được lưu trong results_analysis/my_custom_dataset/ và hiển thị ngay khi được tính toán. LƯU Ý rằng chạy với chế độ trực quan hóa trực tuyến sẽ chậm hơn nhiều.

Bạn có thể thay đổi ngưỡng điểm số VIS_THR để xem nhiều hoặc ít đối tượng được phân đoạn hơn.

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

Kết quả

Các chỉ số hiệu suất (với đúng các tham số như các lệnh trên) nên là:

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

Kết quả trực quan được lưu trong results_analysis/my_custom_dataset/. Lưu ý rằng phương pháp của chúng tôi hoạt động với các trường hợp âm tính giả, tức là các hình ảnh không chứa bất kỳ đối tượng nào thuộc các lớp mong muốn.

Bấm vào hình để phóng to ⬇️

| Ảnh mục tiêu với thuyền ⛵ (trái GT, phải dự đoán) | Ảnh mục tiêu với chim 🐦 (trái GT, phải dự đoán) | |:----------------------:|:----------------------:| | 000000459673 | 000000407180 |

| Ảnh mục tiêu với thuyền và chim ⛵🐦 (trái GT, phải dự đoán) | Ảnh mục tiêu không có thuyền hoặc chim 🚫 (trái GT, phải dự đoán) | |:---------------------------------:|:----------------------------------:| | 000000517410 | 000000460598 |

📚 Trích dẫn

Nếu bạn sử dụng công trình này, vui lòng trích dẫn chúng tôi:

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