hoàn thành chức năng tính ndvi analysys 2 màn hình

This commit is contained in:
Victor Phan
2025-12-24 13:57:08 +07:00
parent 389c7c141f
commit e86709df85
25 changed files with 4755 additions and 460 deletions
+228
View File
@@ -0,0 +1,228 @@
# HƯỚNG DẪN SỬ DỤNG HỆ THỐNG MỚI
## Tổng quan
Hệ thống đã được cập nhật để chuẩn hóa việc trích xuất features giữa training và prediction, sử dụng module `feature_extractor.py`.
## Các thành phần mới
### 1. feature_extractor.py
Module chuẩn hóa việc trích xuất features với 3 modes:
- **simple**: 3 features cơ bản
- NDVI_mean
- VH_db_mean
- VV_db_mean
- **temporal**: 39+ features time-series
- NDVI_t1, NDVI_t2, ..., NDVI_tn
- NDWI_t1, NDWI_t2, ..., NDWI_tn
- NDBI_t1, NDBI_t2, ..., NDBI_tn
- VH_db_mean, VV_db_mean, VH_VV_ratio
- **extended**: 15 features với statistics
- NDVI_mean, NDVI_std, NDVI_min, NDVI_max
- NDWI_mean, NDWI_std, NDWI_min, NDWI_max
- NDBI_mean, NDBI_std, NDBI_min, NDBI_max
- VH_db_mean, VV_db_mean, VH_VV_ratio
### 2. train_module.py (Đã cập nhật)
- Thêm tham số `feature_mode` (default='simple')
- Sử dụng FeatureExtractor để extract features
- Lưu `feature_mode` vào metadata của model
- Load đúng bands Sentinel-2 theo feature mode
### 3. api_server.py (Cần cập nhật thủ công)
File này quá lớn để tự động replace. Cần thay thế hàm `run_prediction` bằng version mới trong `run_prediction_new.py`.
## Cách sử dụng
### Training với feature modes khác nhau
#### 1. Simple Mode (Mặc định - Nhanh nhất)
```python
from train_module import train_model
result = train_model(
bbox=[105.6, 9.3, 106.2, 9.8],
time_range='2023-03-01/2023-05-31',
max_scenes=12,
feature_mode='simple', # 3 features
model_type='xgboost',
use_cache=True
)
```
#### 2. Temporal Mode (Cho model_odc.joblib)
```python
result = train_model(
bbox=[105.6, 9.3, 106.2, 9.8],
time_range='2023-03-01/2023-05-31',
max_scenes=12,
feature_mode='temporal', # 39+ features
model_type='random_forest',
use_cache=True
)
```
#### 3. Extended Mode (Cân bằng speed/accuracy)
```python
result = train_model(
bbox=[105.6, 9.3, 106.2, 9.8],
time_range='2023-03-01/2023-05-31',
max_scenes=12,
feature_mode='extended', # 15 features
model_type='xgboost',
use_cache=True
)
```
### Prediction
Prediction sẽ tự động detect feature_mode từ model metadata và sử dụng FeatureExtractor tương ứng.
```python
# Prediction sẽ tự động:
# 1. Load model metadata
# 2. Đọc feature_mode từ metadata
# 3. Khởi tạo FeatureExtractor với mode tương ứng
# 4. Extract features giống như training
# 5. Predict
```
## Tạo metadata cho model_odc.joblib
Model hiện tại `model_odc.joblib` được train với 39 features (temporal mode) nhưng chưa có metadata. Tạo metadata:
```bash
python create_odc_metadata.py
```
File này sẽ tạo `model_train/model_odc_info.json` với:
- n_features: 39
- feature_mode: "temporal"
- features: list of 39 feature names
## So sánh các modes
| Feature Mode | N Features | Training Time | Accuracy | Use Case |
|-------------|-----------|---------------|----------|----------|
| simple | 3 | Nhanh nhất | Trung bình | Test nhanh, dataset nhỏ |
| extended | 15 | Trung bình | Tốt | Cân bằng speed/accuracy |
| temporal | 39+ | Chậm nhất | Tốt nhất | Production, dataset lớn |
## Lưu ý quan trọng
### 1. Bands được load
- **simple**: B04, B08, SCL
- **temporal/extended**: B02, B03, B04, B08, B11, SCL
### 2. Cache compatibility
Cache cũ từ trước khi cập nhật sẽ KHÔNG tương thích vì:
- Không có field `feature_mode`
- Features có thể không match
**Giải pháp**: Xóa cache cũ
```bash
rm -rf dataset_cache/*
```
### 3. Model compatibility
- Models cũ (trước cập nhật) sẽ được coi là `feature_mode='simple'` nếu không có metadata
- Models mới sẽ có field `feature_mode` trong metadata
## Workflow đề xuất
### Bước 1: Xóa cache cũ
```bash
rm -rf dataset_cache/*
```
### Bước 2: Tạo metadata cho model_odc.joblib
```bash
python create_odc_metadata.py
```
### Bước 3: Cập nhật api_server.py
Thay thế hàm `run_prediction` (line 834-1295) với nội dung từ `run_prediction_new.py`
### Bước 4: Test training với simple mode
```bash
# Qua web interface hoặc
python test_training_simple.py
```
### Bước 5: Test prediction với model vừa train
```bash
# Qua web interface
# Model sẽ tự động detect feature_mode và extract đúng features
```
### Bước 6: Test với temporal mode (nếu cần accuracy cao)
```bash
python test_training_temporal.py
```
## Troubleshooting
### Lỗi: "feature_mode not found in metadata"
- Model cũ chưa có metadata
- **Giải pháp**: Hệ thống tự động fallback về 'simple' mode
### Lỗi: "Expected X features but got Y"
- Feature extraction không match với training
- **Giải pháp**: Kiểm tra model metadata, đảm bảo feature_mode đúng
### Lỗi: "B11 band not found"
- Sentinel-2 scene thiếu SWIR band
- **Giải pháp**: Hệ thống tự động fallback về B02
## API Changes
### TrainingConfig (Mới)
```python
class TrainingConfig(BaseModel):
# ... existing fields ...
feature_mode: str = "simple" # NEW: 'simple', 'temporal', 'extended'
```
### Model Metadata (Mới)
```json
{
"feature_mode": "temporal",
"features": ["NDVI_t1", "NDVI_t2", ...],
"n_features": 39,
...
}
```
## File Structure
```
/home/x79/remote-sensing/
├── feature_extractor.py # NEW: Core feature extraction module
├── train_module.py # UPDATED: Uses FeatureExtractor
├── api_server.py # NEEDS UPDATE: run_prediction function
├── run_prediction_new.py # NEW: Updated run_prediction code
├── create_odc_metadata.py # NEW: Generate metadata for model_odc.joblib
├── SYSTEM_UPDATE_GUIDE.md # This file
└── model_train/
├── model_odc.joblib # Existing 39-feature model
├── model_odc_info.json # TO CREATE: Metadata file
└── ...
```
## Next Steps
1. ✅ Created feature_extractor.py
2. ✅ Updated train_module.py
3. ⏳ Update api_server.py (manual)
4. ⏳ Create metadata for model_odc.joblib
5. ⏳ Test full workflow
## Contact & Support
Nếu gặp vấn đề, kiểm tra:
1. feature_extractor.py có import được không
2. Model metadata có field `feature_mode` chưa
3. Cache đã được xóa chưa
4. api_server.py đã cập nhật run_prediction chưa