
基于卫星多光谱与气象数据融合,通过像元二分法提取时间序列叶面积指数(LAI)和植被覆盖度(VC),结合滑动窗口构建生长周期特征,用机器学习模型预测作物产量,实现从遥感图像到产量的精准监测与预测。
遥感数据是卫星接收的地表电磁波信息,用于监测植被状态。核心流程分四步:
类比:时间序列特征工程就像“给作物生长画时间线,标记关键节点(如生长速率变化点)”,像元二分法就像“拆解每个像素的‘植被+背景’成分,更精准算出植被状态”。
| 方法/模型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 像元二分法 | 分解像元为植被/背景分量,计算LAI、VC | 精确,考虑背景影响,需调整背景参数 | 高精度农田地块监测(如1:10000比例) | 需地面背景数据,计算复杂 |
| NDVI阈值法 | 基于NDVI阈值(如>0.2为植被)计算覆盖度 | 简单,计算快,受背景干扰 | 省级或区域快速评估 | 阈值依赖作物类型,精度低 |
| 随机森林回归 | 集成决策树,抗过拟合,处理高维特征 | 灵活,适合多变量融合,特征重要性分析 | 多特征(LAI、VC、气象)的产量预测 | 需大量标注数据 |
| 深度学习(CNN) | 卷积神经网络自动提取空间特征 | 自动学习复杂特征,精度高 | 高分辨率影像(如Sentinel-2 10m)的精细监测 | 需大量标注数据,训练时间长 |
| 滑动窗口时间序列 | 对时间序列数据用滑动窗口提取特征(如最大值、变化率) | 捕捉生长动态,量化生长速率 | 产量预测的关键特征(如生长速率影响产量) | 窗口长度需根据作物生长周期调整 |
# 1. 数据预处理
def preprocess(sat_series, cloud_mask, meteo_series):
masked_series = [apply_cloud_mask(img, cloud_mask) for img in sat_series]
corrected_series = [atmospheric_correction(img) for img in masked_series]
return corrected_series, meteo_series
# 2. 时间序列特征提取(滑动窗口)
def extract_ts_features(corrected_series, meteo_series):
nir_series = [img['NIR'] for img in corrected_series]
red_series = [img['Red'] for img in corrected_series]
ts_features = []
for i in range(len(nir_series)):
nir = nir_series[i]
red = red_series[i]
lai_current = calculate_lai(nir, red, background_ref) # background_ref是调整后的背景反射率
vc_current = lai_current * 100
window = ts_features[-30:] if len(ts_features) >= 30 else []
if window:
lai_max = max([f['lai'] for f in window])
lai_growth_rate = (lai_current - lai_max) / 30 # 30天生长速率
else:
lai_max = lai_current
lai_growth_rate = 0
temp_avg = np.mean([m['temp'] for m in meteo_series[i-30:i+1]])
rain_avg = np.mean([m['rain'] for m in meteo_series[i-30:i+1]])
ts_features.append({
'lai': lai_current,
'vc': vc_current,
'lai_max': lai_max,
'growth_rate': lai_growth_rate,
'temp_avg': temp_avg,
'rain_avg': rain_avg
})
return ts_features
# 3. 模型训练与验证
def train_model(features, yields):
from imblearn.over_sampling import SMOTE
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
smote = SMOTE()
X_res, y_res = smote.fit_resample(features, yields)
X_train, X_val, y_train, y_val = train_test_split(X_res, y_res, test_size=0.2, random_state=42)
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
cv_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='r2')
y_pred = model.predict(X_val)
mae = mean_absolute_error(y_val, y_pred)
rmse = np.sqrt(mean_squared_error(y_val, y_pred))
r2 = r2_score(y_val, y_pred)
bootstrap_samples = 1000
bootstrap_scores = []
for _ in range(bootstrap_samples):
indices = np.random.choice(len(X_val), size=len(X_val), replace=True)
y_pred_boot = model.predict(X_val[indices])
bootstrap_scores.append(r2_score(y_val[indices], y_pred_boot))
ci_lower, ci_upper = np.percentile(bootstrap_scores, [2.5, 97.5])
return model, mae, rmse, r2, ci_lower, ci_upper
# 示例调用
sat_series = load_satellite_series('Sentinel-2_2023')
cloud_mask = load_cloud_mask('mask')
meteo_series = load_meteo_series('2023')
corrected, meteo = preprocess(sat_series, cloud_mask, meteo_series)
features = extract_ts_features(corrected, meteo)
model, mae, rmse, r2, ci_lower, ci_upper = train_model(features, historical_yields)
pred_yield = model.predict([features[-1]]) # 预测当前期产量
“面试官您好,针对卫星遥感作物生长状态监测与产量预测,我的思路是:首先,融合卫星多光谱数据(如Sentinel-2的NIR、Red波段)与气象数据(温度、降水),通过像元二分法精确计算叶面积指数(LAI)和植被覆盖度(VC),并构建时间序列特征——比如用30天滑动窗口提取LAI最大值、生长速率(变化率),捕捉作物生长动态;然后,对训练数据进行SMOTE处理平衡样本,用随机森林分析特征重要性,筛选关键变量(如LAI、VC、气象因子);最后,通过5折交叉验证评估模型,计算R²(模型解释能力)、MAE(平均绝对误差)、RMSE(均方根误差),并给出产量预测的95%置信区间(如±10%),量化不确定性。具体流程:数据预处理(云掩膜、大气校正),特征提取(时间序列+像元二分法),模型训练(数据平衡+特征重要性分析),验证(交叉验证+置信区间),最终实现从卫星图像到产量的精准预测。”