165 lines
4.9 KiB
Markdown
165 lines
4.9 KiB
Markdown
|
|
# 🌾 Giải Thích Quy Trình Phân Loại Đất Trồng Cây
|
||
|
|
|
||
|
|
File notebook `02.predict_ODC.ipynb` sử dụng **Machine Learning** kết hợp với **dữ liệu vệ tinh** để phân loại các loại đất/cây trồng. Dưới đây là quy trình chi tiết:
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## **Bước 1: Thu thập dữ liệu vệ tinh** (Cell 3-4)
|
||
|
|
|
||
|
|
```python
|
||
|
|
date_range = ('2022-09-01', '2023-10-01')
|
||
|
|
longtitude_range = (105.86575, 105.94120)
|
||
|
|
latitude_range = (9.65070, 9.69850)
|
||
|
|
data = load_data(dc, date_range, longtitude_range, latitude_range)
|
||
|
|
```
|
||
|
|
|
||
|
|
- Lấy ảnh **Sentinel-2** (ảnh quang học) từ kho dữ liệu trong khoảng thời gian và vị trí cụ thể
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## **Bước 2: Xử lý mây** (Cell 5)
|
||
|
|
|
||
|
|
```python
|
||
|
|
result = mask_clean(data)
|
||
|
|
```
|
||
|
|
|
||
|
|
- Loại bỏ các pixel bị mây che phủ để đảm bảo dữ liệu chính xác
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## **Bước 3: Tính chỉ số NDVI** (Cell 6-10)
|
||
|
|
|
||
|
|
```python
|
||
|
|
ndvi = calculate_indices(result, index='NDVI', satellite_mission='s2')
|
||
|
|
fill_nan_ndvi = fill_nan(ndvi, time_split)
|
||
|
|
average_ndvi = fill_nan_ndvi.resample(time='1M').mean()
|
||
|
|
```
|
||
|
|
|
||
|
|
- **NDVI** (Normalized Difference Vegetation Index) = (NIR - Red) / (NIR + Red)
|
||
|
|
- Giá trị từ **-1 đến 1**: cao = thực vật xanh tốt, thấp = đất trống/nước
|
||
|
|
- Điền giá trị nan (mây) và tính trung bình theo tháng
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## **Bước 4: Lấy dữ liệu Radar Sentinel-1** (Cell 11)
|
||
|
|
|
||
|
|
```python
|
||
|
|
dsvh, dsvv = load_data_sen1(dc, date_range, coordinates)
|
||
|
|
average_vv = calculate_average(dsvv, time_pattern='1M')
|
||
|
|
average_vh = calculate_average(dsvh, time_pattern='1M')
|
||
|
|
```
|
||
|
|
|
||
|
|
- **VH, VV**: Dữ liệu radar (xuyên mây), cho biết cấu trúc bề mặt
|
||
|
|
- Giúp phân biệt lúa ngập nước, cây trồng cạn, mặt nước...
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## **Bước 5: Dự đoán bằng Model ML** (Cell 12) ⭐ **QUAN TRỌNG NHẤT**
|
||
|
|
|
||
|
|
```python
|
||
|
|
loaded_model = joblib.load("model_train/model_odc.joblib")
|
||
|
|
data_array = predict(loaded_model, data.rio.crs, average_ndvi, average_vh, average_vv)
|
||
|
|
```
|
||
|
|
|
||
|
|
**Model đã được train trước** với dữ liệu mẫu (training data) gồm:
|
||
|
|
- **Đầu vào (Features)**: NDVI theo tháng + VH + VV (chuỗi thời gian)
|
||
|
|
- **Đầu ra (Labels)**: Loại đất đã được gắn nhãn thủ công
|
||
|
|
|
||
|
|
### Cách model phân loại:
|
||
|
|
|
||
|
|
| Đặc điểm | Loại đất |
|
||
|
|
|----------|----------|
|
||
|
|
| NDVI cao đều, VV thấp | Rừng |
|
||
|
|
| NDVI biến đổi theo mùa vụ, VH cao (nước) | Lúa |
|
||
|
|
| NDVI thấp, VV rất thấp | Sông/nước |
|
||
|
|
| NDVI trung bình ổn định | Cây lâu năm (CLN) |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## **Bước 6: Hiển thị kết quả** (Cell 13-15)
|
||
|
|
|
||
|
|
```python
|
||
|
|
colors = ["#abcee9", "#ffef44", "#c4ff9e", "#ffd6a8", "#93ddda", "#1aeef7", "#ffa7f2", "#33ee33"]
|
||
|
|
labels = ["Lúa tôm", "Lúa", "CHN", "CLN", "TS", "Sông", "Đất xây dựng", "Rừng"]
|
||
|
|
```
|
||
|
|
|
||
|
|
### 8 lớp phân loại:
|
||
|
|
|
||
|
|
| Mã | Tên | Màu | Ý nghĩa |
|
||
|
|
|----|-----|-----|---------|
|
||
|
|
| 0 | Lúa tôm | 🔵 Xanh nhạt | Luân canh lúa-tôm |
|
||
|
|
| 1 | Lúa | 🟡 Vàng | Đất trồng lúa |
|
||
|
|
| 2 | CHN | 🟢 Xanh lá nhạt | Cây hàng năm |
|
||
|
|
| 3 | CLN | 🟠 Cam nhạt | Cây lâu năm (cây ăn trái) |
|
||
|
|
| 4 | TS | 🩵 Xanh ngọc | Thủy sản |
|
||
|
|
| 5 | Sông | 🔷 Cyan | Mặt nước sông |
|
||
|
|
| 6 | Đất XD | 💗 Hồng | Đất xây dựng |
|
||
|
|
| 7 | Rừng | 💚 Xanh đậm | Rừng |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## **Bước 7: Lưu kết quả** (Cell 16)
|
||
|
|
|
||
|
|
```python
|
||
|
|
region_result.rio.to_raster("KetQuaPhanLoaiDatODC.tif")
|
||
|
|
```
|
||
|
|
|
||
|
|
- Xuất file GeoTIFF chứa mã phân loại (0-7) cho từng pixel
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📊 **Tóm tắt quy trình:**
|
||
|
|
|
||
|
|
```
|
||
|
|
Ảnh vệ tinh (Sentinel-1 + Sentinel-2)
|
||
|
|
↓
|
||
|
|
Xử lý (loại mây, tính NDVI, VH, VV)
|
||
|
|
↓
|
||
|
|
Kết hợp features theo thời gian (13 tháng)
|
||
|
|
↓
|
||
|
|
Model ML (Random Forest/XGBoost) dự đoán
|
||
|
|
↓
|
||
|
|
Bản đồ phân loại 8 lớp đất
|
||
|
|
↓
|
||
|
|
File .tif (mỗi pixel = 1 mã loại đất)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📁 Cấu trúc dữ liệu đầu vào cho Model
|
||
|
|
|
||
|
|
### Features (Đặc trưng):
|
||
|
|
- **NDVI theo 13 tháng**: 13 bands
|
||
|
|
- **VH (radar) theo 13 tháng**: 13 bands
|
||
|
|
- **VV (radar) theo 13 tháng**: 13 bands
|
||
|
|
- **Tổng cộng**: ~39 features cho mỗi pixel
|
||
|
|
|
||
|
|
### Labels (Nhãn):
|
||
|
|
- Được lấy từ shapefile training: `train/ST_training data_updated_1130points_new.shp`
|
||
|
|
- 1130 điểm mẫu đã được gắn nhãn thủ công bởi chuyên gia
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🔧 Các thư viện sử dụng
|
||
|
|
|
||
|
|
| Thư viện | Mục đích |
|
||
|
|
|----------|----------|
|
||
|
|
| `datacube` | Truy vấn dữ liệu vệ tinh |
|
||
|
|
| `xarray` | Xử lý dữ liệu đa chiều |
|
||
|
|
| `rioxarray` | Đọc/ghi GeoTIFF |
|
||
|
|
| `joblib` | Load/save model ML |
|
||
|
|
| `sklearn` / `xgboost` | Training model |
|
||
|
|
| `matplotlib` / `hvplot` | Trực quan hóa |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📝 Ghi chú
|
||
|
|
|
||
|
|
- **Độ phân giải**: 10-20m (tùy cấu hình)
|
||
|
|
- **Thời gian xử lý**: Phụ thuộc vào kích thước vùng và số scenes
|
||
|
|
- **Yêu cầu**: Cần kết nối internet để tải dữ liệu vệ tinh từ Planetary Computer hoặc ODC
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
*Tài liệu được tạo ngày 14/12/2025*
|