🚀 لا وقت للتدريب!
التقسيم المثيل المرجعي بدون تدريب
أحدث ما توصلت إليه التقنية (Papers with Code)
_أفضل النتائج 1-shot_ | -21CBCE?style=flat&logo=paperswithcode)
_أفضل النتائج 10-shot_ | -21CBCE?style=flat&logo=paperswithcode)
_أفضل النتائج 30-shot_ | -21CBCE?style=flat&logo=paperswithcode)
🚨 تحديث (22 يوليو 2025): تمت إضافة تعليمات للبيانات المخصصة!
🔔 تحديث (16 يوليو 2025): تم تحديث الكود مع التعليمات!
📋 جدول المحتويات
- 🎯 أبرز النقاط
- 📜 الملخص
- 🧠 البنية المعمارية
- 🛠️ تعليمات التثبيت
- 1. استنساخ المستودع
- 2. إنشاء بيئة conda
- 3. تثبيت SAM2 و DinoV2
- 4. تحميل مجموعات البيانات
- 5. تحميل نقاط تحقق SAM2 و DinoV2
- 📊 كود الاستدلال: إعادة إنتاج نتائج SOTA لـ 30-shot في Few-shot COCO
- 0. إنشاء مجموعة مرجعية
- 1. ملء الذاكرة بالمراجع
- 2. معالجة بنك الذاكرة
- 3. الاستدلال على الصور المستهدفة
- النتائج
- 🔍 مجموعة بيانات مخصصة
- 0. إعداد مجموعة بيانات مخصصة ⛵🐦
- 0.1 إذا كانت التعليقات المتوفرة هي مربعات الاحتواء فقط
- 0.2 تحويل تعليقات coco إلى ملف pickle
- 1. ملء الذاكرة بالمراجع
- 2. معالجة بنك الذاكرة بعدياً
- 📚 الاستشهاد
🎯 أبرز النقاط
- 💡 بدون تدريب: لا حاجة لإعادة التدريب أو هندسة التعليمات—فقط صورة مرجعية.
- 🖼️ معتمد على المرجع: تقسيم كائنات جديدة باستخدام أمثلة قليلة فقط.
- 🔥 أداء رائد: يتفوق على الأساليب السابقة الخالية من التدريب على COCO وPASCAL VOC وCross-Domain 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 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 ..
4. تنزيل مجموعات البيانات
يرجى تنزيل مجموعة بيانات COCO ووضعها في data/coco
5. تنزيل نقاط التحقق لـ 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 ../..
📊 كود الاستدلال
⚠️ إخلاء مسؤولية: هذا كود بحثي — توقع بعض الفوضى!
إعادة إنتاج نتائج SOTA بعدد 30 لقطة في 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
#### 0. إنشاء مجموعة مرجعية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)
0. تجهيز مجموعة بيانات مخصصة ⛵🐦
لنتخيل أننا نريد اكتشاف القوارب⛵ والطيور🐦 في مجموعة بيانات مخصصة. لاستخدام طريقتنا سنحتاج إلى:
- صورة مرجعية مشروحة واحدة على الأقل لكل فئة (أي صورة مرجعية واحدة للقارب وصورة مرجعية واحدة للطائر)
- عدة صور هدف للعثور على أمثلة للفئات المطلوبة.
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)
تصوير صور المرجع (لقطة واحدة):| صورة مرجعية واحدة للطائر 🐦 | صورة مرجعية واحدة للقارب ⛵ |
|:-----------------------------:|:-------------------------------:|
| |
|
0.1 إذا كانت التعليقات التوضيحية للإطار المحيط فقط متوفرة
نحن نوفر أيضًا نصًا برمجيًا لتوليد أقنعة تقسيم على مستوى الكائن باستخدام 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 من مربعات الإحاطة الحقيقية، لقطة واحدة):تم حفظ تصوّر أقنعة التقسيم المُولدة في data/my_custom_dataset/annotations/custom_references_with_SAM_segm/references_visualisations/.
| صورة مرجعية بلقطة واحدة لعصفور 🐦 (تم تقسيمها تلقائياً بواسطة SAM) | صورة مرجعية بلقطة واحدة لقارب ⛵ (تم تقسيمها تلقائياً بواسطة SAM) |
|:---------------------------------:|:----------------------------------:|
| |
|
0.2 تحويل تعليقات 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 ---