🚀 زمان آموزش ندارم!
تقسیمبندی نمونه مبتنی بر مرجع بدون نیاز به آموزش
پیشرفتهترین روشها (مقالات با کد)
_بهترین عملکرد 1 نمونهای_ | -21CBCE?style=flat&logo=paperswithcode)
_بهترین عملکرد 10 نمونهای_ | -21CBCE?style=flat&logo=paperswithcode)
_بهترین عملکرد 30 نمونهای_ | -21CBCE?style=flat&logo=paperswithcode)
🚨 بهروزرسانی (۲۲ تیر ۱۴۰۴): دستورالعملها برای مجموعه دادههای سفارشی افزوده شدند!
🔔 بهروزرسانی (۱۶ تیر ۱۴۰۴): کد با دستورالعملها بهروزرسانی شد!
📋 فهرست مطالب
- 🎯 نکات برجسته
- 📜 چکیده
- 🧠 معماری
- 🛠️ دستورالعمل نصب
- 1. کلون کردن مخزن
- 2. ساخت محیط کاندا
- 3. نصب SAM2 و DinoV2
- 4. دانلود مجموعه دادهها
- 5. دانلود مدلهای از پیش آموزشدیده SAM2 و DinoV2
- 📊 کد استنتاج: بازتولید نتایج SOTA 30 نمونهای در Few-shot COCO
- 0. ساخت مجموعه مرجع
- 1. پر کردن حافظه با مرجعها
- 2. پسپردازش بانک حافظه
- 3. استنتاج روی تصاویر هدف
- نتایج
- 🔍 دیتاست سفارشی
- 0. آمادهسازی دیتاست سفارشی ⛵🐦
- 0.1 اگر فقط نشانهگذاریهای bbox موجود است
- 0.2 تبدیل نشانهگذاریهای coco به فایل pickle
- 1. پر کردن حافظه با مراجع
- 2. پردازش پسین بانک حافظه
- 📚 استناد
🎯 نکات برجسته
- 💡 بدون آموزش: بدون تنظیم دقیق، بدون مهندسی پرامپت—تنها با یک تصویر مرجع.
- 🖼️ مبتنی بر مرجع: تقسیمبندی اشیای جدید تنها با چند نمونه.
- 🔥 عملکرد SOTA: عملکرد بهتر نسبت به رویکردهای بدون آموزش قبلی در COCO، PASCAL VOC و FSOD بین دامنهای.
📜 چکیده
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
۲. ایجاد محیط conda
ما یک محیط conda با بستههای مورد نیاز ایجاد خواهیم کرد.
conda env create -f environment.yml
conda activate no-time-to-train
3. نصب SAM2 و DinoV2
ما SAM2 و DinoV2 را از سورس نصب خواهیم کرد.
pip install -e .
cd dinov2
pip install -e .
cd ..
۴. دانلود دیتاستها
لطفاً دیتاست COCO را دانلود کرده و در مسیر data/coco قرار دهید
۵. دانلود چکپوینتهای SAM2 و DinoV2
ما دقیقاً همان چکپوینتهای SAM2 که در مقاله استفاده شده را دانلود خواهیم کرد. (با این حال توجه داشته باشید که چکپوینتهای SAM2.1 هماکنون در دسترس هستند و ممکن است عملکرد بهتری داشته باشند.)
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 ../..
📊 کد استنتاج
⚠️ سلب مسئولیت: این کد پژوهشی است — انتظار کمی بینظمی داشته باشید!
بازتولید نتایج 30-شات SOTA در Few-shot COCO
متغیرهای مفید را تعریف کنید و یک پوشه برای نتایج ایجاد نمایید:
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
#### ۰. ایجاد مجموعه مرجعpython no_time_to_train/dataset/few_shot_sampling.py \
--n-shot $SHOTS \
--out-path ${RESULTS_DIR}/${FILENAME} \
--seed $SEED \
--dataset $CLASS_SPLIT
#### 1. حافظه را با ارجاعات پر کنید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. پردازش پسازآن بانک حافظه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. استنتاج بر روی تصاویر هدف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
اگر مایلید نتایج استنتاج را به صورت آنلاین (همزمان با محاسبه) مشاهده کنید، این آرگومان را اضافه کنید: --model.init_args.model_cfg.test.online_vis True
برای تنظیم پارامتر آستانه امتیاز score_thr، آرگومان را اضافه کنید (برای مثال، مشاهده همه نمونههایی با امتیاز بالاتر از 0.4):
--model.init_args.model_cfg.test.vis_thr 0.4
تصاویر اکنون در مسیر results_analysis/few_shot_classes/ ذخیره خواهند شد. تصویر سمت چپ حقیقت زمینی را نشان میدهد، تصویر سمت راست نمونههای بخشبندیشده را که توسط روش بدون آموزش ما یافت شدهاند نشان میدهد.توجه داشته باشید که در این مثال ما از تقسیمبندی few_shot_classes استفاده میکنیم، بنابراین باید انتظار داشته باشیم فقط نمونههای بخشبندیشده کلاسهای موجود در این تقسیمبندی را ببینیم (نه همه کلاسها در COCO).
#### نتایج
پس از اجرای همه تصاویر مجموعه اعتبارسنجی، باید به موارد زیر دست یابید:
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
🔍 دیتاست سفارشی
ما دستورالعملهایی برای اجرای پایپلاین خود بر روی دیتاست سفارشی ارائه میدهیم. فرمت حاشیهنویسی همیشه به صورت COCO است.
خلاصه؛ برای مشاهده مستقیم نحوه اجرای کامل پایپلاین بر روی دیتاستهای سفارشی، فایلscripts/matching_cdfsod_pipeline.shرا به همراه اسکریپتهای نمونه دیتاستهای CD-FSOD (مانندscripts/dior_fish.sh) بیابید.
۰. آمادهسازی دیتاست سفارشی ⛵🐦
فرض کنیم میخواهیم قایقها⛵ و پرندگان🐦 را در یک دیتاست سفارشی شناسایی کنیم. برای استفاده از روش ما به موارد زیر نیاز داریم:
- حداقل ۱ تصویر مرجع حاشیهنویسیشده برای هر کلاس (یعنی ۱ تصویر مرجع برای قایق و ۱ تصویر مرجع برای پرنده)
- چندین تصویر هدف برای یافتن نمونههای کلاسهای مورد نظر ما.
mkdir -p data/my_custom_dataset
python scripts/make_custom_dataset.py
این کار یک مجموعه داده سفارشی با ساختار پوشه زیر ایجاد خواهد کرد:
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)
بصریسازی تصاویر مرجع (۱-نمونهای):| تصویر مرجع ۱-نمونهای برای پرنده 🐦 | تصویر مرجع ۱-نمونهای برای قایق ⛵ |
|:---------------------------------:|:----------------------------------:|
| |
|
۰.۱ اگر تنها نشانهگذاریهای bbox موجود باشد
ما همچنین یک اسکریپت برای تولید ماسکهای بخشبندی سطح نمونه با استفاده از SAM2 ارائه میدهیم. این ابزار زمانی مفید است که تنها نشانهگذاریهای جعبه محاطی برای تصاویر مرجع در اختیار داشته باشید.
# 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
تصاویر مرجع با ماسکهای سگمنتیشن در سطح نمونه (تولید شده توسط SAM2 از جعبههای مرجع واقعیت، 1-شات):تصاویر بصری از ماسکهای سگمنتیشن تولید شده در مسیر data/my_custom_dataset/annotations/custom_references_with_SAM_segm/references_visualisations/ ذخیره شدهاند.
| تصویر مرجع 1-شات برای پرنده 🐦 (سگمنت شده به طور خودکار با SAM) | تصویر مرجع 1-شات برای قایق ⛵ (سگمنت شده به طور خودکار با SAM) |
|:---------------------------------:|:----------------------------------:|
| |
|
۰.۲ تبدیل حاشیهنویسیهای coco به فایل 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. حافظه را با ارجاعات پر کنید
ابتدا متغیرهای مفید را تعریف کرده و یک پوشه برای نتایج ایجاد کنید. برای نمایش صحیح برچسبها، نام کلاسها باید بر اساس شناسه دستهبندی به همان ترتیبی که در فایل json ظاهر میشود، مرتب شوند. به عنوان مثال، bird شناسه دستهبندی 16 را دارد، boat شناسه دستهبندی 9 را دارد. بنابراین، 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
مرحله 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. بانک حافظه پسپردازش
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. استنتاج بر روی تصاویر هدف
اگر مقدار ONLINE_VIS برابر با True باشد، نتایج پیشبینی در مسیر results_analysis/my_custom_dataset/ ذخیره شده و همزمان با محاسبه نمایش داده میشوند. توجه داشته باشید که اجرای برنامه با نمایش آنلاین بسیار کندتر است.
میتوانید آستانه امتیاز VIS_THR را تغییر دهید تا نمونههای قطعهبندی شده بیشتری یا کمتری را مشاهده کنید.
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
نتایج
شاخصهای عملکرد (با دقیقاً همان پارامترهای دستورات بالا) باید به شرح زیر باشند:
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
نتایج بصری در مسیر results_analysis/my_custom_dataset/ ذخیره میشوند. توجه داشته باشید که روش ما برای تشخیص منفیهای کاذب کار میکند، یعنی تصاویری که هیچ نمونهای از کلاسهای مورد نظر را ندارند.برای بزرگنمایی روی تصاویر کلیک کنید ⬇️
| تصویر هدف با قایقها ⛵ (چپ GT، راست پیشبینی) | تصویر هدف با پرندگان 🐦 (چپ GT، راست پیشبینی) |
|:----------------------:|:----------------------:|
| |
|
| تصویر هدف با قایقها و پرندگان ⛵🐦 (چپ GT، راست پیشبینی) | تصویر هدف بدون قایق یا پرنده 🚫 (چپ GT، راست پیشبینی) |
|:---------------------------------:|:----------------------------------:|
| |
|
📚 ارجاع
اگر از این کار استفاده میکنید، لطفاً ما را ارجاع دهید:
@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 ---