# Xử lý mây (Cloud Processing) — Hệ thống Land Classification

Tài liệu chi tiết về các phương pháp xử lý mây cho dữ liệu Sentinel-2. Module độc lập `cloud_removal.py` cung cấp nhiều chiến lược có thể chọn.

## Tổng quan

Hệ thống cung cấp **7 phương pháp xử lý mây** khác nhau, từ cổ điển đến hiện đại (ML/DL):

1. **Classic** - 3 bước cổ điển (temporal → median → spatial) - mặc định
2. **Temporal Only** - Chỉ temporal interpolation (nhanh nhất)
3. **Median Composite** - Ưu tiên median composite (giảm nhiễu tốt nhất)
4. **ML KNN** - Machine Learning K-Nearest Neighbors inpainting
5. **ML RF** - Machine Learning Random Forest inpainting
6. **Deep Inpainting** - Deep Learning CNN inpainting (yêu cầu model)
7. **Hybrid** - Kết hợp classical + ML (cân bằng tốc độ và chất lượng)

---

## Cách sử dụng

### API Endpoint

Lấy danh sách các methods:
```bash
GET /api/cloud-removal/methods
```

Response:
```json
{
  "success": true,
  "methods": {
    "classic": "3-step classical: temporal → median → spatial (default, balanced)",
    "temporal_only": "Temporal interpolation only (fastest, needs many scenes)",
    "median_composite": "Median composite priority (best noise reduction)",
    "ml_knn": "ML K-Nearest Neighbors inpainting (good quality, medium speed)",
    "ml_rf": "ML Random Forest inpainting (high quality, slower)",
    "deep": "Deep Learning CNN inpainting (best quality, requires model)",
    "hybrid": "Hybrid classical + ML (balanced speed & quality)"
  },
  "default": "classic"
}
```

### Config trong Prediction

Thêm `cloud_removal_method` vào config:

```python
config = {
    "model_filename": "model_odc.joblib",
    "min_lon": 105.5,
    "max_lon": 105.6,
    "min_lat": 10.0,
    "max_lat": 10.1,
    "start_date": "2024-01-01",
    "end_date": "2024-12-31",
    "max_scenes": 12,
    "cloud_cover": 30,
    "resolution": 20,
    "use_gpu": false,
    "cloud_removal_method": "hybrid"  # Chọn method tại đây
}
```

### Programmatic Usage

```python
from cloud_removal import process_cloud_removal

# Load Sentinel-2 data with SCL band
s2_data = load(...) 

# Process clouds with selected method
cleaned_data, metadata = process_cloud_removal(
    s2_data=s2_data,
    method="hybrid",  # or "classic", "ml_knn", etc.
    verbose=True
)

print(f"Cloud coverage: {metadata['cloud_coverage_percent']:.1f}%")
print(f"Steps applied: {metadata['steps_applied']}")
```

---

## Chi tiết các phương pháp

### 1. Classic (Mặc định)

**Mô tả:** 3 bước cổ điển kết hợp temporal, median, và spatial interpolation.

**Quy trình:**
1. Temporal interpolation (ffill + bfill)
2. Median compositing (nếu >= 3 scenes)
3. Spatial interpolation (nearest neighbor)
4. Fallback fillna(0)

**Ưu điểm:**
- Cân bằng tốc độ và chất lượng
- Đã được test kỹ, ổn định
- Phù hợp hầu hết trường hợp

**Nhược điểm:**
- Không tối ưu cho các gaps lớn
- Có thể tạo artifacts ở biên

**Khi nào dùng:** Default choice, phù hợp cho production

---

### 2. Temporal Only

**Mô tả:** Chỉ sử dụng temporal interpolation (ffill + bfill).

**Ưu điểm:**
- Nhanh nhất
- Giữ xu hướng thời gian tốt
- Ít tạo artifacts

**Nhược điểm:**
- Yêu cầu nhiều time steps
- Không xử lý được gaps liên tục
- Chất lượng kém nếu ít scenes

**Khi nào dùng:** Khi có nhiều scenes (>10) và cần tốc độ

---

### 3. Median Composite

**Mô tả:** Ưu tiên median composite, sau đó spatial interpolation.

**Ưu điểm:**
- Giảm nhiễu tốt nhất
- Chống outliers hiệu quả
- Tạo composite trơn

**Nhược điểm:**
- Mất thông tin temporal
- Yêu cầu >= 3 scenes
- Chậm hơn temporal only

**Khi nào dùng:** Khi cần giảm nhiễu, không quan tâm temporal dynamics

---

### 4. ML KNN Inpainting

**Mô tả:** Sử dụng K-Nearest Neighbors để học từ pixels hợp lệ và dự đoán pixels bị mây.

**Quy trình:**
1. Xác định valid pixels (không có mây)
2. Train KNN model với spatial coordinates + spectral values
3. Predict invalid pixels
4. Fill predictions vào dataset

**Ưu điểm:**
- Chất lượng cao hơn classical
- Học spatial patterns
- Không cần pretrained model

**Nhược điểm:**
- Chậm hơn classical
- Yêu cầu đủ valid pixels (>10)
- Tốn RAM nếu ảnh lớn

**Hyperparameters:**
- n_neighbors: 5
- weights: 'distance'

**Khi nào dùng:** Khi cần chất lượng cao và có đủ valid pixels

---

### 5. ML Random Forest Inpainting

**Mô tả:** Sử dụng Random Forest để inpainting, tương tự KNN nhưng phức tạp hơn.

**Ưu điểm:**
- Chất lượng cao nhất trong ML methods
- Xử lý non-linear patterns tốt
- Robust với outliers

**Nhược điểm:**
- Chậm nhất trong ML methods
- Tốn nhiều RAM
- Có thể overfit với ít data

**Hyperparameters:**
- n_estimators: 10
- max_depth: 10
- n_jobs: -1 (parallel)

**Khi nào dùng:** Khi cần chất lượng tối đa và không quan tâm tốc độ

---

### 6. Deep Inpainting (CNN)

**Mô tả:** Sử dụng CNN autoencoder để reconstruct pixels bị mây.

**Trạng thái:** **Đang phát triển** - yêu cầu pretrained model

**Quy trình (planned):**
1. Stack bands thành multi-channel image
2. Tạo binary mask (1=cloud, 0=valid)
3. Run through CNN autoencoder
4. Blend predictions với valid pixels

**Ưu điểm (khi có model):**
- Chất lượng tốt nhất
- Xử lý large gaps hiệu quả
- Học global context

**Nhược điểm:**
- Yêu cầu pretrained model
- Chậm nhất (GPU recommended)
- Phức tạp để deploy

**Khi nào dùng:** Khi có GPU và pretrained model, cần chất lượng tối đa

---

### 7. Hybrid (Khuyến nghị)

**Mô tả:** Kết hợp classical + ML để cân bằng tốc độ và chất lượng.

**Quy trình:**
1. Temporal interpolation (nhanh)
2. Check remaining NaN percentage
3. Nếu > 5%: Apply ML KNN inpainting
4. Nếu <= 5%: Apply spatial interpolation
5. Fallback fillna(0)

**Ưu điểm:**
- Cân bằng tốc độ và chất lượng
- Adaptive - chỉ dùng ML khi cần
- Hiệu quả với mọi cloud coverage

**Nhược điểm:**
- Phức tạp hơn classic
- Khó debug

**Khi nào dùng:** **Khuyến nghị cho production** - tự động chọn strategy phù hợp

---

## So sánh Performance

| Method | Tốc độ | Chất lượng | RAM | Yêu cầu |
|--------|--------|------------|-----|---------|
| classic | ⭐⭐⭐⭐ | ⭐⭐⭐ | Thấp | Không |
| temporal_only | ⭐⭐⭐⭐⭐ | ⭐⭐ | Thấp | Nhiều scenes |
| median_composite | ⭐⭐⭐ | ⭐⭐⭐⭐ | Thấp | >= 3 scenes |
| ml_knn | ⭐⭐ | ⭐⭐⭐⭐ | Trung bình | Đủ valid pixels |
| ml_rf | ⭐ | ⭐⭐⭐⭐⭐ | Cao | Đủ valid pixels |
| deep | ⭐ | ⭐⭐⭐⭐⭐ | Rất cao | Pretrained model + GPU |
| hybrid | ⭐⭐⭐ | ⭐⭐⭐⭐ | Trung bình | Không |

---

## Phát hiện mây (SCL)

Tất cả methods đều sử dụng SCL (Scene Classification Layer):

```python
# SCL values:
# 0: No data, 1: Saturated/Defective, 2: Dark Area Pixels
# 3: Cloud shadows, 4: Vegetation, 5: Not vegetated, 6: Water
# 7: Unclassified, 8: Cloud medium probability, 9: Cloud high probability
# 10: Thin cirrus, 11: Snow/Ice

cloud_mask = (scl == 3) | (scl == 8) | (scl == 9) | (scl == 10) | (scl == 11)
invalid_mask = (scl == 0) | (scl == 1)
full_mask = cloud_mask | invalid_mask
```

---

## Testing & Comparison

So sánh nhiều methods trên cùng dữ liệu:

```python
from cloud_removal import compare_methods

results = compare_methods(
    s2_data=s2_data,
    methods=["classic", "temporal_only", "ml_knn", "hybrid"]
)

for method, result in results.items():
    print(f"{method}: {result['remaining_nan_percent']:.2f}% NaN remaining")
```

---

## Khuyến nghị sử dụng

### Production (General)
```
cloud_removal_method: "hybrid"
```
- Cân bằng tốc độ và chất lượng
- Adaptive theo cloud coverage

### High Quality (Research)
```
cloud_removal_method: "ml_rf"
```
- Chất lượng tối đa
- Chấp nhận tốc độ chậm

### Fast Processing (Monitoring)
```
cloud_removal_method: "temporal_only"
```
- Cần nhiều scenes (>10)
- Ưu tiên tốc độ

### Low Cloud Coverage (<10%)
```
cloud_removal_method: "classic"
```
- Đơn giản, hiệu quả
- Ổn định, đã test kỹ

---

## Vị trí code

- **Module:** `cloud_removal.py` - Standalone cloud removal module
- **API Integration:** `api_server.py` - API endpoints và config
- **Documentation:** `CLOUD_PROCESSING.md` - Tài liệu này

---

## Phát triển tiếp

- [ ] Implement CNN autoencoder cho deep inpainting
- [ ] Add quality scoring system
- [ ] Optimize ML methods với Dask
- [ ] Add weighted temporal interpolation
- [ ] Support custom ML models

