zernike-cnn-v8-1.4 (атмосферная модель)

EfficientNet-B2 (PyTorch + timm), восстанавливает 14 коэффициентов Цернике (OSA-нумерация Z1…Z14, радианы) из пары PSF (phase diversity).

Конфигурация

  • Распределение обучения: Колмогоров (статистика Нолла), D/r₀ ∈ [0.5, 20]
  • Диверсификационный дефокус: +1.0 / −2.0 рад (по моде OSA Z4)
  • Размер входа: пара изображений 256×256, uint16sqrt-нормировка → 2-канальный тензор
  • Loss при обучении: weighted_noll (1/σ²_Noll по каждой моде)
  • Модель камеры при обучении: полная Konnik (photon/dark/PRNU/RON/saturation/ADC, full_well=30 000 e⁻, RON=1.6 e⁻ RMS, 16 бит)
  • Train/Val: 700 000 / 200 000 пар PSF

Метрики

Тест MAE/коэф., рад WF RMS, рад Strehl
Колмогоров D/r₀ ∈ [0.5, 20] 0.0092 0.050 0.997
Closed-loop (D/r₀=5, 15 итер., gain=0.4) 0.034 0.999

На равномерно распределённых аберрациях U[−6,+6] на каждую моду — ломается (MAE ≈ 3.95 рад). Для лабораторных задач использовать вторую модель zernike-cnn-v8-2.0-def1_5.

Использование

from huggingface_hub import hf_hub_download
import torch, timm, torch.nn as nn

ckpt_path = hf_hub_download(
    repo_id="YOUR_USERNAME/zernike-cnn-v8-1.4",
    filename="best_model.pt"
)

class ZernikeModel(nn.Module):
    def __init__(self, num_outputs=14):
        super().__init__()
        self.backbone = timm.create_model(
            "efficientnet_b2", pretrained=False, in_chans=2, num_classes=0
        )
        self.head = nn.Sequential(
            nn.Linear(self.backbone.num_features, 256),
            nn.SiLU(),
            nn.Dropout(0.1),
            nn.Linear(256, num_outputs),
        )

    def forward(self, x):
        return self.head(self.backbone(x))

model = ZernikeModel().eval()
ckpt = torch.load(ckpt_path, map_location="cpu", weights_only=True)
state = ckpt.get("model_state_dict", ckpt)
model.load_state_dict(state)
Downloads last month
4
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Space using J1gA/zernike-cnn-v8-1.4 1