Почему моя интеграция YOLOv8 + Swin Transformer приводит к более низкому значению MAP по сравнению со стандартным YOLOv8Python

Программы на Python
Ответить
Anonymous
 Почему моя интеграция YOLOv8 + Swin Transformer приводит к более низкому значению MAP по сравнению со стандартным YOLOv8

Сообщение Anonymous »

Я интегрирую блоки Swin Transformer в магистраль YOLOv8 (Ultralytics) и внедряю предварительно обученные веса Swin, используя timm.

Модель обучается и работает без каких-либо ошибок во время выполнения, но производительность (mAP) значительно хуже, чем у стандартного YOLOv8n на том же наборе данных.
Что я делаю
Я создал собственный YOLOv8 YAML-файл, в который добавлены блоки SwinTransformer:

Код: Выделить всё

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 6  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs

# YOLOv8.0n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
- [-1, 6, SwinTransformer, [256, True]]
- [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
- [-1, 6, SwinTransformer, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
- [-1, 3, SwinTransformer, [1024, True]]
- [-1, 1, SPPF, [1024, 5]]  # 9

# YOLOv8.0n head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 6], 1, Concat, [1]]  # cat backbone P4
- [-1, 3, C2f, [512]]  # 12

- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]]  # cat backbone P3
- [-1, 3, C2f, [256]]  # 15 (P3/8-small)

- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]]  # cat head P4
- [-1, 3, C2f, [512]]  # 18 (P4/16-medium)

- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]]  # cat head P5
- [-1, 3, C2f, [1024]]  # 21 (P5/32-large)

- [[15, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)
Я написал этот код для chatgpt для загрузки предварительно обученного pth-файла преобразования swin

Код: Выделить всё

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'

# YAML'daki SwinTransformer katmanlarının indeksleri:
# 4:  - [-1, 6, SwinTransformer, [256, True]]
# 6:  - [-1, 6, SwinTransformer, [512, True]]
# 8:  - [-1, 3, SwinTransformer, [1024, True]]
SWIN_LAYER_INDICES = [4, 6, 8]

# --- MANUEL YÜKLEME FONKSİYONU ---

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...")

try:
# 1.  Swin-Transformer modelini timm'den (önceden eğitilmiş) yükle
swin_timm_model = timm.create_model(swin_name, pretrained=True)
swin_timm_state_dict = swin_timm_model.state_dict()

yolo_state_dict = yolo_model.state_dict()
new_swin_weights = {}

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'
)
Обучение проходит нормально, и я получаю такие журналы:

Код: Выделить всё

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), но не смог этого сделать. Я новичок в этой теме. пожалуйста, можете ли вы помочь мне с этой проблемой. Мне нужно это больше понять. Пожалуйста, не стесняйтесь спрашивать, нужно ли вам увидеть какую-либо реализацию кода или что-то еще для ясности, я могу поделиться

Подробнее здесь: https://stackoverflow.com/questions/798 ... compared-t
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»