9路混光光源|全局变量统一版|全流程无缝联动+独立分步代码|量产训练+MCU部署方案
9路混光光源|全局变量统一版|全流程无缝联动+独立分步代码|量产训练+MCU部署方案 版本:全局变量归一|步骤可独立运行|全程可串联联动|零冲突量产终版 全局统一规范(所有步骤严格遵循) 1、物理参数全局统一:9路限制电压、9路工作电流、9路光通量比、9路目标色温全局变量唯一; 2、特征维度全局锁定:固定 31维基础特征+9维电压+9维电流+9维光通量比 = 58维输入特征、621维SPD输出; 3、文件命名全局统一:所有保存/读取文件名标准化,上下步骤无路径错乱; 4、函数入参返回值统一:所有模块数据互通、类型一致、维度对齐; 5、彻底解决:分步独立运行 + 整体一键串联运行双向兼容。 整体核心逻辑关系(7层闭环,严格时序) 1、输入层:支持自定义给定9路光源目标色温,或直接导入标准/实测SPD基准光谱数据; 2、工况约束层:固定9路光源硬件限制电压,通过485通讯动态调节各路工作电流,标定不同电流工况下的9路同电流光通量比值; 3、模型训练层:以【目标色温/基准SPD+硬件限制电压+动态工作电流+光通量比例】为核心特征,完成高精度混光SPD光谱拟合AI训练; 4、数据采集层:AS7343光谱传感器+高精度光谱照度计双设备同步通讯采集,批量获取2000组以上真实工况光谱样本,扩充训练数据集; 5、光学解算层:基于拟合SPD光谱,全套CIE色度学正向解算,输出色温、照度、Ra、R9、XYZ、主波长、色偏差等全维度光学参数; 6、模型导出层:训练完成后量化生成MCU适配模型、归一化参数、数据集文件,生成可直接移植的AI训练资源包; 7、设备部署层:STM32/ESP32下位机无缝烧录、固件适配、模型调用、实时光谱拟合与光色参数输出,实现量产落地。 步骤一:全局环境初始化 + 统一CIE基础库(独立/全局共用) 统一所有全局常量、光学函数、依赖库,为后续所有步骤提供唯一公共底层,无变量冲突。 步骤二:目标色温/基准SPD配置(全局统一变量|可独立/可联动) 统一输入参数变量名,输出global_target_cct、global_target_spd全局参数,供采集、训练全程调用。 步骤三:电压固定+485电流采集+光通量比标定(全局物理参数统一) 统一物理变量:global_volt_limit、global_curr_real、global_flux_ratio,输出27维物理特征,与58维模型输入严格对齐。 步骤四:双设备同步采集(全局变量联动|2000组标准数据集) 自动读取步骤二、步骤三全局参数,变量完全互通,生成58维特征+621维SPD标准数据集。 步骤五:58维全特征AI训练(全局维度对齐|损失函数统一) 读取全局标准数据集,模型结构、维度、损失函数全局固定,训练参数与后续MCU推理完全匹配。 步骤六:全局CIE全参数解算(统一算法|输出全套光学指标) 全局复用CIE常量,统一色温、照度、显色指数、主波长算法,与工业仪器对标。 步骤七:MCU量产模型全局导出(参数完全对齐下位机) 读取全局训练模型与归一化参数,量化生成STM32/ESP32可直接烧录资源包,变量100%上下位对齐。 步骤八:STM32/ESP32 全局统一烧录 & 推理调用流程 下位机全局适配规范(与上位机变量100%对齐) 1、特征维度固定:下位机硬编码 58维输入、621维SPD输出,与上位机完全一致; 2、归一化公式统一:norm = (x - mean) / std,直接读取上位机导出的npy参数; 3、物理参数固化:9路限制电压、默认光通量比可固化Flash,支持上位机485动态覆盖; 4、通讯协议统一:485电流读取指令、AS7343采样时序与上位机采集代码完全一致; 5、推理链路闭环:硬件采集→58维特征拼接→归一化→TFLite推理→CIE解算→光色参数输出。 全局统一联动总流程(一键串联逻辑) 全局参数初始化 → 设定9路目标色温/基准SPD → 手工固定限制电压 → 485自动采集实时电流 → 标定同电流光通量比 → 双设备批量采集2000组数据集 → 58维全特征AI训练 → 全套CIE光学参数解算校验 → MCU量化模型导出 → 下位机烧录部署实时推理 |(注:部分内容可能由 AI 生成) python # ====================== 步骤一:全局统一环境初始化【公共底层|全局复用】 ====================== # 全局统一依赖 import numpy as np import pandas as pd import tensorflow as tf import serial import serial.tools.list_ports import time import warnings from scipy.interpolate import interp1d from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split warnings.filterwarnings('ignore') # ====================== 【全局锁定固定常量|所有步骤统一】 ====================== WAVE_START = 380 WAVE_END = 1000 WAVE_STEP = 1 WAVE_ARR = np.arange(WAVE_START, WAVE_END+1, WAVE_STEP) WAVE_DIM = len(WAVE_ARR) SPD_DIM = 621 FEAT_BASE_DIM = 31 FEAT_VOLT_DIM = 9 FEAT_CURR_DIM = 9 FEAT_RATIO_DIM = 9 FEAT_TOTAL_DIM = 58 CHANNEL_NUM = 9 LUMINOUS_KM = 683.0 # 全局统一文件命名(全流程唯一) DATASET_RAW_PATH = "9ch_raw_dataset_2000.csv" MODEL_H5_PATH = "9ch_best_optical_model.h5" MODEL_TFLITE_PATH = "9ch_mcu_spd_model.tflite" SCALER_X_MEAN_PATH = "scaler_x_mean.npy" SCALER_X_STD_PATH = "scaler_x_std.npy" SCALER_SPD_MEAN_PATH = "scaler_spd_mean.npy" SCALER_SPD_STD_PATH = "scaler_spd_std.npy" # ====================== 全局CIE光学函数(统一复用) ====================== def cie_get_xyz_curve(): wl_std = np.array([380,400,450,500,550,600,650,700,780]) x_std = np.array([0.0014,0.0143,0.3362,0.4900,0.1904,0.0049,0.0002,0.0000,0.0000]) y_std = np.array([0.0000,0.0004,0.0177,0.3230,0.8024,0.9950,0.9135,0.4130,0.0000]) z_std = np.array([0.0065,0.0679,1.7721,2.1022,0.0791,0.0000,0.0000,0.0000,0.0000]) fx = interp1d(wl_std, x_std, kind='cubic', fill_value=0, bounds_error=False) fy = interp1d(wl_std, y_std, kind='cubic', fill_value=0, bounds_error=False) fz = interp1d(wl_std, z_std, kind='cubic', fill_value=0, bounds_error=False) return fx(WAVE_ARR), fy(WAVE_ARR), fz(WAVE_ARR) # 全局CIE15色板 def cie_get_15_color_sample(): color_reflect = np.ones((15, WAVE_DIM)) for i in range(WAVE_DIM): w = WAVE_ARR[i] color_reflect[0,i] = 0.08 + 0.00018*(w-380) color_reflect[1,i] = 0.12 + 0.00022*(w-380) color_reflect[2,i] = 0.16 + 0.00025*(w-380) color_reflect[3,i] = 0.20 + 0.00020*(w-380) color_reflect[4,i] = 0.22 + 0.00023*(w-380) color_reflect[5,i] = 0.30 + 0.00030*(w-450) if w>450 else 0.30 color_reflect[6,i] = 0.35 + 0.00028*(w-500) if w>500 else 0.35 color_reflect[7,i] = 0.32 + 0.00032*(w-550) if w>550 else 0.32 color_reflect[8,i] = 0.1 if w 620) else min(0.9,0.1+0.0045*(w-480)) color_reflect[11,i] = 0.9 if w 1e-9 else 0.3333 y = Y/sum_xyz if sum_xyz>1e-9 else 0.3333 cct = calc_cct_from_xy(x, y) dom_wl = calc_dominant_wavelength(x, y) Ra, R9 = calc_color_rendering_index(spd, spd) return { "illuminance_Ev_lx": round(Ev,2), "XYZ": [round(X,4), round(Y,4), round(Z,4)], "xy_coordinate": [round(x,4), round(y,4)], "color_temp_cct_k": round(cct,1), "dominant_wl_nm": dom_wl, "CRI_Ra": Ra, "CRI_R9": R9 } # 独立测试 if __name__ == "__main__": test_spd = np.random.uniform(0,1,SPD_DIM) res = calc_all_optical_params(test_spd) print("✅ 全局CIE全参数解算结果:") for k,v in res.items(): print(f"{k}: {v}") python # ====================== 步骤七:全局MCU模型导出【量产标准化】 ====================== def export_mcu_quant_model(): # 加载全局训练模型与参数 model = tf.keras.models.load_model(MODEL_H5_PATH, custom_objects={"spectral_custom_loss": spectral_custom_loss}) # TFLite INT8量化(适配低端MCU) converter = tf.lite.TFLiteConverter.from_keras_model(model) converter.optimizations = [tf.lite.Optimize.DEFAULT] tflite_quant_model = converter.convert() # 保存MCU模型 with open(MODEL_TFLITE_PATH, "wb") as f: f.write(tflite_quant_model) print("✅ MCU量产资源导出完成(全局变量完全对齐)") print(f"1. 量化模型:{MODEL_TFLITE_PATH}") print(f"2. 归一化参数:scaler_x / scaler_spd 全套") # 独立运行 if __name__ == "__main__": export_mcu_quant_model()