Ich integriere Swin Transformer-Blöcke in das YOLOv8-Backbone (Ultralytics) und injiziere vorab trainierte Swin-Gewichte mit timm.
Das Modell trainiert und läuft ohne Laufzeitfehler, aber die Leistung (mAP) ist erheblich schlechter als Standard-YOLOv8n im gleichen Datensatz. Was ich bin tun
Ich habe eine benutzerdefinierte YOLOv8 YAML-Datei erstellt, die SwinTransformer-Blöcke hinzugefügt hat:
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.
Das Problem Mit Standard-YOLOv8n erhalte ich:
mAP ~ 0,74 (RTTS-Datensatz) Mit meinem YOLOv8 + Swin Transformer-Hybrid erhalte ich:
mAP ~ 0,69 - 0,72
Das Hinzufügen von Swin verringert also tatsächlich die Genauigkeit, anstatt sie zu verbessern. Die Frage
Warum führt das Hinzufügen von Swin-Transformerblöcken zu YOLOv8 zu einem niedrigeren mAP, selbst wenn vorab trainierte Swin-Gewichte injiziert werden?
Mögliche Dinge, bei denen ich mir nicht sicher bin:
Sind timm Swin-Gewichte inkompatibel mit der Ultralytics Swin-Implementierung?
Stimmen Fenstergrößen/Patchgrößen nicht überein (192 vs. 640)?
Ist meine Präfixzuordnungslogik falsch?
Erwartet YOLOv8 andere Normalisierungsschichten als timm verwendet?
Sollten die Swin-Blöcke anders im Backbone platziert werden?
Was ich wissen möchte
Wie lädt man vorab trainierte Swin-Gewichte richtig in ein benutzerdefiniertes YOLOv8-Modell?
Mischt man YOLOv8 und Swin Transformer konzeptionell inkompatibel, ohne mehr von der Architektur neu zu schreiben?
Warum sollte das Hybridmodell selbst mit vorab trainierten Gewichten schlechter abschneiden?
Wie sollten Swin-Blöcke konfiguriert werden (Abmessungen, Stufen, Fenstergröße), damit sie gut mit YOLOv8 funktionieren?
Ich habe Codes hinzugefügt conv.py und task.py
Ich habe diese Github-Dokumentation befolgt und verwendet: https://github.com/Marfbin/NEU-DET-with-yolov8
Aber ich habe gelernt, dass ich kein vortrainiertes Swin-Transformationsgewicht (.pth-Datei) verwendet habe, sodass der mAP-Wert niedriger als jetzt ist, zum Beispiel 0,55. Dann habe ich versucht, diese .pth-Datei zu implementieren, aber ich schätze, es ist fehlgeschlagen. Ich habe tagelang versucht, den mAP-Wert meines Datensatzes zu erhöhen, aber ich konnte es nicht herausfinden. Ich habe alles im Internet durchsucht (github, stackoverflow, chatgpt oder so), aber es ist mir nicht gelungen.
Ich integriere [b]Swin Transformer[/b]-Blöcke in das YOLOv8-Backbone (Ultralytics) und injiziere vorab trainierte Swin-Gewichte mit [b]timm[/b].
Das Modell trainiert und läuft ohne Laufzeitfehler, aber die Leistung (mAP) ist [b]erheblich schlechter als Standard-YOLOv8n[/b] im gleichen Datensatz. [b]Was ich bin tun[/b] Ich habe eine benutzerdefinierte YOLOv8 YAML-Datei erstellt, die SwinTransformer-Blöcke hinzugefügt hat: [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
- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5) [/code] Ich habe diesen Code für chatgpt geschrieben, um eine vorab trainierte Swin-Transformations-PTH-Datei zu laden: [code]import torch from ultralytics import YOLO import timm
# --- YOL VE KONFİGÜRASYON AYARLARI --- # Swin Transformer eklediğiniz YAML dosyasının yolu YOLO_CONFIG_PATH = '../yolov8_three_swinTrans.yaml'
# Standart YOLOv8n ağırlıklarının yolu (Diğer katmanlar için) YOLOV8_WEIGHTS_PATH = '../yolov8n.pt'
# RTTS Veri Kümesi YAML Yolu DATASET_YAML_PATH = "../RTTS/data.yaml"
# timm kütüphanesinden kullanılacak önceden eğitilmiş Swin-T modeli SWIN_MODEL_NAME = 'swinv2_large_window12_192_22k'
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] Das Training läuft normal und ich erhalte Protokolle wie diese: [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]Das Problem[/b] [b]Mit Standard-YOLOv8n erhalte ich:[/b] mAP ~ 0,74 (RTTS-Datensatz) [b]Mit meinem YOLOv8 + Swin Transformer-Hybrid erhalte ich:[/b] mAP ~ 0,69 - 0,72 Das Hinzufügen von Swin verringert also tatsächlich die Genauigkeit, anstatt sie zu verbessern. [b]Die Frage[/b] Warum führt das Hinzufügen von Swin-Transformerblöcken zu YOLOv8 zu einem niedrigeren mAP, selbst wenn vorab trainierte Swin-Gewichte injiziert werden? Mögliche Dinge, bei denen ich mir nicht sicher bin: [list] [*]Sind timm Swin-Gewichte inkompatibel mit der Ultralytics Swin-Implementierung?
[*]Stimmen Fenstergrößen/Patchgrößen nicht überein (192 vs. 640)?
[*]Ist meine Präfixzuordnungslogik falsch?
[*]Erwartet YOLOv8 andere Normalisierungsschichten als timm verwendet?
[*]Sollten die Swin-Blöcke anders im Backbone platziert werden?
[/list] [b]Was ich wissen möchte[/b] [list] [*]Wie lädt man vorab trainierte Swin-Gewichte richtig in ein benutzerdefiniertes YOLOv8-Modell?
[*]Mischt man YOLOv8 und Swin Transformer konzeptionell inkompatibel, ohne mehr von der Architektur neu zu schreiben?
[*]Warum sollte das Hybridmodell selbst mit vorab trainierten Gewichten schlechter abschneiden?
[*]Wie sollten Swin-Blöcke konfiguriert werden (Abmessungen, Stufen, Fenstergröße), damit sie gut mit YOLOv8 funktionieren?
[/list] Ich habe Codes hinzugefügt conv.py und task.py Ich habe diese Github-Dokumentation befolgt und verwendet: https://github.com/Marfbin/NEU-DET-with-yolov8 Aber ich habe gelernt, dass ich kein vortrainiertes Swin-Transformationsgewicht (.pth-Datei) verwendet habe, sodass der mAP-Wert niedriger als jetzt ist, zum Beispiel 0,55. Dann habe ich versucht, diese .pth-Datei zu implementieren, aber ich schätze, es ist fehlgeschlagen. Ich habe tagelang versucht, den mAP-Wert meines Datensatzes zu erhöhen, aber ich konnte es nicht herausfinden. Ich habe alles im Internet durchsucht (github, stackoverflow, chatgpt oder so), aber es ist mir nicht gelungen.
Ich habe eine Sammlung von Nachrichtenartikeln und möchte einige neue (unvoreingenommene) Nachrichtenartikel mit meta-llama/Meta-Llama-3-8B-Instruct erstellen. Die Artikel befinden sich in einem...
Die Frage ist nicht schwierig und ich habe sie bereits auf meine eigene Weise gelöst, aber ich würde gerne Ihre Meinung hören. Vielleicht gibt es eine Möglichkeit, dies zu einer verbesserten Option...
Ich möchte so etwas wie Folgendes machen, aber ich möchte wissen, ob es eine elegantere Möglichkeit gibt, dies ohne die Paarklasse zu tun. Die Paarklasse existiert nicht mehr, also müsste ich meine...
Ich arbeite mit einem großen XSD -Schema mit vielen XSD: Element Einträge mit einem XML: Lang -attribut. Ich möchte JAXB mit einer benutzerdefinierten Bindung verwenden, um in den generierten Java...
Ich verwende Yolov8 für die Echtzeit-Handerkennung in einer Web-App. Das Modell funktioniert gut in Python, aber nachdem es in TensorFlow.js konvertiert wurde, kämpft die Erkennung, wenn die Hand zu...