517 lines
13 KiB
Markdown
Executable File
517 lines
13 KiB
Markdown
Executable File
# 📊 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! 🚀**
|