# 📊 Báo Cáo HTML - PSNR Baseline & Hyperparameters Chi Tiết

## ✅ Cập Nhật Hoàn Thành

Hệ thống báo cáo HTML đã được nâng cấp để bao gồm:

1. **PSNR Baseline Metrics** - Đánh giá chất lượng model cloud removal
2. **Hyperparameters Chi Tiết** - Tất cả thông số để tái hiện training
3. **Auto-Generate Report** - Tự động tạo báo cáo sau khi training xong

---

## 🎯 Tính Năng Mới

### 1. PSNR Baseline Analysis

Báo cáo giờ hiển thị 3 metrics cards cho cloud removal:

```
┌─────────────────┬─────────────────┬─────────────────┐
│ 📈 Model PSNR   │ 📉 Baseline PSNR│ ⚡ Improvement  │
│   25.43 dB      │   18.50 dB      │   +6.93 dB      │
└─────────────────┴─────────────────┴─────────────────┘
```

**Phân tích PSNR Baseline:**
- ✅ **Model > Baseline**: Màu xanh - Model TỐT HƠN không làm gì
- ❌ **Model < Baseline**: Màu cam - Model TỆ HƠN không làm gì

**Giải thích:**
- **Baseline PSNR**: PSNR giữa ảnh cloudy và ảnh clean (không xử lý)
- **Model PSNR**: PSNR giữa output model và ảnh clean
- **Improvement**: Model PSNR - Baseline PSNR
- **% Improvement**: (Improvement / Baseline) × 100%

### 2. Hyperparameters Chi Tiết

Section mới "🎯 Hyperparameters - Chi Tiết Tái Hiện" bao gồm:

#### Model Hyperparameters
```python
model_type: unet
n_estimators: 200       # (cho Random Forest)
max_depth: 30
learning_rate: 0.0001
batch_size: 8
num_epochs: 50
use_gpu: True
use_s1: True           # Sentinel-1 radar data
```

#### Data Processing
```python
test_size: 0.2
feature_mode: image    # hoặc 'simple', 'extended'
n_features: 6
features: ['B02', 'B03', 'B04', 'B08', 'VV', 'VH']
```

#### Geo & Time Parameters
```python
bbox: [105.5, 9.2, 106.4, 10.0]
time_range: "2023-03-01/2023-12-31"
resolution: 10m
```

### 3. Training Reproducibility

Box đặc biệt với hướng dẫn:

```
📝 Lưu ý:
• Lưu toàn bộ các tham số trên để reproduce kết quả
• Sử dụng cùng dataset và time range để đảm bảo tính nhất quán
• Random seed: 42 (mặc định)
• Generated: 23/02/2026 14:35:42
```

---

## 📁 Files Đã Cập Nhật

### 1. [report_generator.py](report_generator.py)

**Function: `generate_training_report()`**

Thêm mới:
- Extract `val_psnr`, `baseline_psnr`, `improvement`
- Extract `hyperparameters` dict từ training_result
- Parse common hyperparameters (n_estimators, max_depth, learning_rate, etc.)
- Extract features, feature_mode, data_source

**HTML Template Updates:**
- Thêm 3 stat cards cho PSNR metrics
- Section "PSNR Baseline Analysis" với màu sắc động
- Section "Hyperparameters - Chi Tiết Tái Hiện"
  - Model Hyperparameters
  - Data Processing
  - Geo & Time Parameters
- Box hướng dẫn reproducibility

### 2. [train_cloud_removal.py](train_cloud_removal.py)

**Function: `train_cloud_removal_model()`**

Thêm vào `torch.save()`:
```python
'hyperparameters': {
    'data_dir': data_dir,
    'use_s1': use_s1,
    'batch_size': batch_size,
    'num_epochs': num_epochs,
    'learning_rate': learning_rate,
    'device': device,
    'model_type': 'unet',
    'architecture': 'U-Net',
    'optimizer': 'Adam',
    'criterion': 'L1Loss',
    'scheduler': 'ReduceLROnPlateau',
    'train_size': len(train_dataset),
    'val_size': len(val_dataset),
    'test_size': 0.2,
    's2_bands': len(s2_bands),
    'feature_mode': 'image',
    'random_seed': 42
}
```

### 3. [api_server.py](api_server.py)

**Function: `list_cloud_removal_models()`**

Thêm extract từ checkpoint:
```python
val_psnr = checkpoint.get('val_psnr', None)
baseline_psnr = checkpoint.get('baseline_psnr', None)
hyperparams = checkpoint.get('hyperparameters', {})
```

**Function: `run_cloud_training()`**

Thêm auto-generate report sau khi training:
```python
training_result = {
    'val_psnr': val_psnrs[-1],
    'baseline_psnr': baseline_psnr,
    'hyperparameters': {...},
    'data_source': ...,
    'collections': [...],
    'features': [...]
}

report_path, _ = generate_training_report(training_result)
```

---

## 🚀 Cách Sử Dụng

### 1. Training Cloud Removal

```bash
# Start API server
python api_server.py

# Hoặc qua web interface
http://localhost:8000/cloud-training
```

Sau khi training xong:
1. ✅ Model được lưu với đầy đủ metadata + hyperparameters
2. ✅ Báo cáo HTML tự động được tạo trong `reports/`
3. ✅ Báo cáo bao gồm PSNR baseline + hyperparameters

### 2. Xem Báo Cáo

```bash
# Qua web interface
http://localhost:8000/reports

# Hoặc mở trực tiếp file
reports/training_report_YYYYMMDD_HHMMSS.html
```

### 3. Tái Hiện Training

Mở báo cáo HTML → Xem section "Hyperparameters" → Copy tất cả tham số:

```python
# Reproduction example
from train_cloud_removal import train_cloud_removal_model

model, train_losses, val_losses, val_psnrs, baseline_psnr = train_cloud_removal_model(
    data_dir="winter_dataset",
    use_s1=True,
    batch_size=8,
    num_epochs=50,
    learning_rate=1e-4,
    device="cuda",
    save_dir="cloud_removal_model"
)
```

---

## 📊 Ví Dụ Báo Cáo

### Cloud Removal Training Report

```html
📊 Báo Cáo Training Model
Land Classification - 23/02/2026 14:35:42

📈 Tóm Tắt Kết Quả
┌──────────────┬──────────────┬──────────────┐
│ Model PSNR   │ Baseline PSNR│ Improvement  │
│  25.43 dB    │  18.50 dB    │  +6.93 dB    │
└──────────────┴──────────────┴──────────────┘

🎯 PSNR Baseline Analysis
✅ Model TỐT HƠN baseline - Kết quả đáng tin cậy!

Model PSNR:      25.43 dB
Baseline PSNR:   18.50 dB (cận dưới)
Improvement:     +6.93 dB (+37.5%)

Giải thích:
- Baseline PSNR: PSNR giữa ảnh cloudy và ảnh clean (không làm gì)
- Model PSNR: PSNR giữa output model và ảnh clean
- Improvement > 0: Model đang khử mây hiệu quả!

⚙️ Cấu Hình Training
Model Type:      UNET
Data Source:     SEN12MS-CR Dataset (winter_dataset)
Collections:     Sentinel-2 L2A, Sentinel-1 RTC
Model Path:      cloud_removal_model/cloud_removal_unet_best.pth

🎯 Hyperparameters - Chi Tiết Tái Hiện

📊 Model Hyperparameters
model_type:      unet
learning_rate:   0.0001
batch_size:      8
num_epochs:      50
use_gpu:         True
use_s1:          True

📦 Data Processing
test_size:       0.2
feature_mode:    image
n_features:      6
features:        B02, B03, B04, B08, VV, VH

🌍 Geo & Time Parameters
bbox:            []
time_range:      
resolution:      10m

📝 Lưu ý:
• Lưu toàn bộ các tham số trên để reproduce kết quả
• Sử dụng cùng dataset và time range để đảm bảo tính nhất quán
• Random seed: 42 (mặc định)
```

---

## 🔍 So Sánh Trước & Sau

### ❌ Trước (Thiếu thông tin)

```
📊 Tóm Tắt Kết Quả
- Train Loss: 0.0123
- Val Loss: 0.0098

⚙️ Cấu Hình
- Model: U-Net
- Batch Size: 8
```

**Vấn đề:**
- ❌ Không có PSNR baseline → Không biết model có tốt không
- ❌ Thiếu hyperparameters → Không tái hiện được
- ❌ Thiếu data info → Không biết dataset gì

### ✅ Sau (Đầy đủ)

```
📊 Tóm Tắt Kết Quả
- Model PSNR: 25.43 dB
- Baseline PSNR: 18.50 dB
- Improvement: +6.93 dB (+37.5%)
- Train Loss: 0.0123
- Val Loss: 0.0098

🎯 PSNR Baseline Analysis
✅ Model TỐT HƠN baseline - Kết quả đáng tin cậy!

🎯 Hyperparameters (Đầy đủ để reproduce)
- Model: U-Net
- Learning Rate: 0.0001
- Batch Size: 8
- Epochs: 50
- Use S1: True
- Test Size: 0.2
- Feature Mode: image
- Random Seed: 42
- Dataset: SEN12MS-CR (winter_dataset)
- Collections: Sentinel-2 L2A, Sentinel-1 RTC
```

**Lợi ích:**
- ✅ Có PSNR baseline → Đánh giá chính xác chất lượng
- ✅ Có đầy đủ hyperparameters → Tái hiện dễ dàng
- ✅ Có data info → Biết nguồn gốc dataset

---

## 💡 Best Practices

### 1. Luôn Lưu Báo Cáo

Sau mỗi lần training:
```bash
# Báo cáo tự động được tạo tại
reports/training_report_20260223_143542.html
```

### 2. Đặt Tên Model Rõ Ràng

```
cloud_removal_unet_best.pth
├─ Epoch: 48
├─ PSNR: 25.43 dB
├─ Baseline: 18.50 dB
└─ Hyperparameters: {...}
```

### 3. Version Control Hyperparameters

Khi thử nghiệm:
```python
# Experiment 1
learning_rate = 1e-4
batch_size = 8
# → PSNR = 25.43 dB

# Experiment 2
learning_rate = 1e-3
batch_size = 16
# → PSNR = 26.12 dB ✅ Better!
```

Báo cáo sẽ tự động ghi lại để so sánh.

### 4. Share Kết Quả

```bash
# Share HTML report
cp reports/training_report_20260223_143542.html /shared/results/

# Người khác có thể:
1. Xem kết quả chi tiết
2. Lấy hyperparameters để reproduce
3. Hiểu được baseline performance
```

---

## 📚 Technical Details

### PSNR Calculation

```python
def calculate_psnr(img1, img2, max_value=1.0):
    mse = torch.mean((img1 - img2) ** 2)
    if mse == 0:
        return float('inf')
    psnr = 20 * math.log10(max_value) - 10 * torch.log10(mse)
    return psnr.item()
```

### Baseline PSNR

```python
def calculate_baseline_psnr(dataloader, device):
    # PSNR between cloudy input and clean target
    # This is the "do nothing" baseline
    total_psnr = 0
    for inputs, targets in dataloader:
        s2_cloudy = inputs[:, :num_s2_bands, :, :]
        psnr = calculate_psnr(s2_cloudy, targets)
        total_psnr += psnr
    return total_psnr / len(dataloader)
```

### Report Generation

```python
# In api_server.py - run_cloud_training()
training_result = {
    'val_psnr': val_psnrs[-1],
    'baseline_psnr': baseline_psnr,
    'hyperparameters': {
        'data_dir': config.data_dir,
        'use_s1': config.use_s1,
        'batch_size': config.batch_size,
        'num_epochs': config.num_epochs,
        'learning_rate': config.learning_rate,
        # ... more
    },
    # ... more fields
}

report_path, _ = generate_training_report(training_result)
```

---

## 🎓 Hiểu Về PSNR Baseline

### Tại Sao Cần Baseline?

**Scenario 1: Baseline = 18.5 dB, Model = 25.4 dB**
- Improvement = +6.9 dB (+37%)
- ✅ Model TỐT! Đáng để deploy

**Scenario 2: Baseline = 18.5 dB, Model = 16.2 dB**
- Improvement = -2.3 dB (-12%)
- ❌ Model TỆ! Làm TỒI hơn không làm gì!

**Scenario 3: Baseline = 25.0 dB, Model = 25.5 dB**
- Improvement = +0.5 dB (+2%)
- ⚠️ Model OK nhưng cải thiện ít, có thể không đáng effort

### PSNR Thresholds

| PSNR (dB) | Quality | Note |
|-----------|---------|------|
| < 20 | Poor | Nhiều artifacts |
| 20-25 | Fair | Chấp nhận được |
| 25-30 | Good | Chất lượng tốt |
| 30-35 | Very Good | Rất tốt |
| > 35 | Excellent | Xuất sắc |

### Improvement Thresholds

| Improvement | Đánh Giá | Quyết Định |
|-------------|----------|-----------|
| < 0 dB | Tệ | Không dùng model |
| 0-2 dB | Yếu | Cần cải thiện |
| 2-5 dB | OK | Chấp nhận được |
| 5-10 dB | Tốt | Đáng deploy |
| > 10 dB | Xuất sắc | Deploy ngay! |

---

## 🔧 Troubleshooting

### Lỗi: Báo cáo không có PSNR

**Nguyên nhân:** Model cũ chưa lưu `val_psnr` và `baseline_psnr`

**Giải pháp:** Train lại model với code mới:
```bash
python train_cloud_removal.py
```

### Lỗi: Hyperparameters bị thiếu

**Nguyên nhân:** Training result không có `hyperparameters` dict

**Giải pháp:** Đảm bảo `torch.save()` bao gồm:
```python
torch.save({
    ...,
    'hyperparameters': {...}
}, path)
```

### Báo cáo không tự động tạo

**Kiểm tra:**
```python
# In api_server.py - run_cloud_training()
try:
    report_path, _ = generate_training_report(training_result)
    print(f"[REPORT] Generated: {report_path}")
except Exception as e:
    print(f"[REPORT ERROR] {e}")
```

---

## ✨ Summary

### Đã Thêm:
1. ✅ **PSNR Baseline** metrics trong báo cáo
2. ✅ **Chi tiết Hyperparameters** để reproduce
3. ✅ **Auto-generate report** sau training
4. ✅ **Visual indicators** (màu sắc) cho PSNR
5. ✅ **Hướng dẫn reproducibility**

### Files Cập Nhật:
- ✅ [report_generator.py](report_generator.py)
- ✅ [train_cloud_removal.py](train_cloud_removal.py)
- ✅ [api_server.py](api_server.py)

### Lợi Ích:
- 📊 **Đánh giá chính xác** chất lượng model
- 🔄 **Tái hiện dễ dàng** kết quả training
- 📝 **Tài liệu đầy đủ** cho mỗi experiment
- 🎯 **So sánh khoa học** giữa các model
- ✅ **Professional workflow** cho research

**Giờ bạn có hệ thống báo cáo cực kỳ chuyên nghiệp! 🚀**
