Я интегрирую блоки Swin Transformer в магистраль YOLOv8 (Ultralytics) и внедряю предварительно обученные веса Swin, используя timm.
Модель обучается и работает без каких-либо ошибок во время выполнения, но производительность (mAP) значительно хуже, чем у стандартного YOLOv8n на том же наборе данных. Что я делаю
Я создал собственный YOLOv8 YAML-файл, в который добавлены блоки SwinTransformer:
Transferred 225/419 items from pretrained weights
Standard YOLOv8n weights loaded.
swinv2_large_window12_192_22k weights downloaded...
-> matching weights for model.4 ...
-> matching weights for model.6 ...
-> matching weights for model.8 ...
Swin weights successfully injected.
Проблема Со стандартным YOLOv8n я получаю:
mAP ~ 0,74 (набор данных RTTS) С моим гибридом YOLOv8 + Swin Transformer я получаю:
mAP ~ 0,69 - 0,72
Таким образом, добавление Swin на самом деле снижает точность, а не улучшает ее. Вопрос
Почему добавление блоков Swin Transformer в YOLOv8 приводит к снижению mAP, даже когда вводятся предварительно обученные веса Swin?
Возможные вещи, в которых я не уверен:
Timm Веса Swin несовместимы с реализацией Ultralytics Swin?
Размеры окон/размеры патчей не совпадают (192 против 640)?
Моя логика сопоставления префиксов неверна?
Ожидает ли YOLOv8 иных слоев нормализации, чем те, которые использует timm?
Должны ли блоки Swin располагаться в магистральной сети по-другому? Что я хочу знать
Как правильно загрузить предварительно обученные веса Swin в пользовательскую модель YOLOv8?
Является ли смешение YOLOv8 и Swin Transformer концептуально несовместимым без переписывания большей части архитектуры?
Почему гибридная модель будет работать хуже даже с предварительно обученными весами?
Как следует Блоки Swin можно настроить (размеры, этапы, размер окна) для хорошей работы с YOLOv8?
Любые идеи, ссылки или примеры будут чрезвычайно признательны.
Я добавил коды conv.py и Tasks.py
Я следовал и использовал эту документацию GitHub: https://github.com/Marfbin/NEU-DET-with-yolov8
Но я узнал, что я не использовал предварительно обученный вес преобразования swin (файл .pth), поэтому значение mAP ниже, чем сейчас, например, 0,55, затем я попытался реализовать этот файл .pth, но, похоже, не удалось. Я пытался увеличить значение mAP в своем наборе данных в течение нескольких дней, но не смог этого понять. Я искал все в Интернете (github, stackoverflow,chatgpt или sth), но не смог этого сделать. Я новичок в этой теме. пожалуйста, можете ли вы помочь мне с этой проблемой. Мне нужно это больше понять. Пожалуйста, не стесняйтесь спрашивать, нужно ли вам увидеть какую-либо реализацию кода или что-то еще для ясности, я могу поделиться
Я интегрирую блоки [b]Swin Transformer[/b] в магистраль YOLOv8 (Ultralytics) и внедряю предварительно обученные веса Swin, используя [b]timm[/b].
Модель обучается и работает без каких-либо ошибок во время выполнения, но производительность (mAP) [b]значительно хуже, чем у стандартного YOLOv8n[/b] на том же наборе данных. [b]Что я делаю[/b] Я создал собственный YOLOv8 YAML-файл, в который добавлены блоки SwinTransformer: [code]# Ultralytics YOLO 🚀, AGPL-3.0 license # YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
def inject_swin_weights_multi(yolo_model, swin_name, layer_indices): """Önceden eğitilmiş Swin-Transformer ağırlıklarını birden fazla YOLOv8 katmanına enjekte eder.""" print(f"🔄 {swin_name} ağırlıkları indiriliyor ve birden fazla katmana enjekte ediliyor...")
for index in layer_indices: yolo_swin_prefix = f'model.{index}' print(f" -> Ağırlıklar {yolo_swin_prefix} için eşleştiriliyor...")
# Eşleştirme işlemi (Önceki örnekte olduğu gibi) for k_timm, v_timm in swin_timm_state_dict.items(): k_yolo = None
# En Olası Eşleştirmeler if k_timm.startswith('patch_embed'): k_yolo = f"{yolo_swin_prefix}.{k_timm}" elif k_timm.startswith('layers'): k_yolo = f"{yolo_swin_prefix}.{k_timm}" elif k_timm.startswith('norm'): k_yolo = f"{yolo_swin_prefix}.{k_timm}"
if k_yolo and k_yolo in yolo_state_dict: if yolo_state_dict[k_yolo].shape == v_timm.shape: new_swin_weights[k_yolo] = v_timm else: print(f" ⚠️ Hata: Boyut uyuşmuyor: {k_yolo} ({yolo_state_dict[k_yolo].shape}) vs {v_timm.shape}")
# 2. Yeni ağırlıkları mevcut YOLO ağırlıklarıyla birleştirme yolo_state_dict.update(new_swin_weights)
# 3. Modeli yükle (strict=False ile) yolo_model.load_state_dict(yolo_state_dict, strict=False) print("✅ Swin-Transformer ağırlıkları başarıyla enjekte edildi.")
except Exception as e: print(f"❌ Swin Ağırlık Enjeksiyonunda Hata Oluştu: {e}") print("Model, SwinTransformer katmanlarını sıfırdan eğitecektir.")
# --- ANA EĞİTİM KODU ---
if __name__ == '__main__': # 1. Modeli Swin-T konfigürasyonu ile oluştur model = YOLO(YOLO_CONFIG_PATH)
# 2. Standart YOLO ağırlıklarını yükle (Diğer katmanlar için) model.load(YOLOV8_WEIGHTS_PATH) print("📢 Standart YOLOv8n ağırlıkları yüklendi.")
# 3. Swin-T Ağırlıklarını Enjekte Et inject_swin_weights_multi(model, SWIN_MODEL_NAME, SWIN_LAYER_INDICES)
# --- İYİLEŞTİRİLMİŞ EĞİTİM STRATEJİSİ ---
# Swin Katmanlarını Dondurma: Modeli ilk 10 epoch dondurarak önceden eğitilmiş bilgiyi koruyun.
# 4. Eğitimi Başlat (Düşük Öğrenme Oranı ile İnce Ayar) model.train( data=DATASET_YAML_PATH, epochs=100, # Yüksek epoch sayısı (daha iyi ince ayar için) imgsz=640, lr0=1e-4, # Başlangıç öğrenme oranını çok düşük tutun warmup_epochs=5, name='yolov8_three_swin_fine_tuned' ) [/code] [b]Обучение проходит нормально, и я получаю такие журналы:[/b] [code]Transferred 225/419 items from pretrained weights Standard YOLOv8n weights loaded. swinv2_large_window12_192_22k weights downloaded... -> matching weights for model.4 ... -> matching weights for model.6 ... -> matching weights for model.8 ... Swin weights successfully injected. [/code] [b]Проблема[/b] [b]Со стандартным YOLOv8n я получаю:[/b] mAP ~ 0,74 (набор данных RTTS) [b]С моим гибридом YOLOv8 + Swin Transformer я получаю:[/b] mAP ~ 0,69 - 0,72 Таким образом, добавление Swin на самом деле снижает точность, а не улучшает ее. [b]Вопрос[/b] Почему добавление блоков Swin Transformer в YOLOv8 приводит к снижению mAP, даже когда вводятся предварительно обученные веса Swin? Возможные вещи, в которых я не уверен: Timm Веса Swin несовместимы с реализацией Ultralytics Swin? Размеры окон/размеры патчей не совпадают (192 против 640)? Моя логика сопоставления префиксов неверна? Ожидает ли YOLOv8 иных слоев нормализации, чем те, которые использует timm? Должны ли блоки Swin располагаться в магистральной сети по-другому? [b]Что я хочу знать[/b] Как правильно загрузить предварительно обученные веса Swin в пользовательскую модель YOLOv8? Является ли смешение YOLOv8 и Swin Transformer концептуально несовместимым без переписывания большей части архитектуры? Почему гибридная модель будет работать хуже даже с предварительно обученными весами? Как следует Блоки Swin можно настроить (размеры, этапы, размер окна) для хорошей работы с YOLOv8? Любые идеи, ссылки или примеры будут чрезвычайно признательны. Я добавил коды conv.py и Tasks.py Я следовал и использовал эту документацию GitHub: https://github.com/Marfbin/NEU-DET-with-yolov8 Но я узнал, что я не использовал предварительно обученный вес преобразования swin (файл .pth), поэтому значение mAP ниже, чем сейчас, например, 0,55, затем я попытался реализовать этот файл .pth, но, похоже, не удалось. Я пытался увеличить значение mAP в своем наборе данных в течение нескольких дней, но не смог этого понять. Я искал все в Интернете (github, stackoverflow,chatgpt или sth), но не смог этого сделать. Я новичок в этой теме. пожалуйста, можете ли вы помочь мне с этой проблемой. Мне нужно это больше понять. Пожалуйста, не стесняйтесь спрашивать, нужно ли вам увидеть какую-либо реализацию кода или что-то еще для ясности, я могу поделиться