J1gA/zernike-cnn-v8-1.4
03
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,
uint16→sqrt-нормировка → 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
Метрики
На равномерно распределённых аберрациях 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)