@ -123,7 +123,8 @@ def split_by_plus(s: str) -> list[str]:
# %%
# %%
import joblib
import joblib
folder_path = Path ( " ./degree3 " )
# 使用绝对路径来确保模型文件能够被正确找到
folder_path = Path ( __file__ ) . parent / " degree3 "
def load_all_models ( ) :
def load_all_models ( ) :
@ -131,14 +132,10 @@ def load_all_models():
加载所有模型到 model_list
加载所有模型到 model_list
"""
"""
global model_list
global model_list
# 清空列表以确保重新加载(尽管有启动时加载一次的逻辑)
# 清空列表以确保重新加载
# model_list = []
model_list = [ ]
# ^^^ 注释掉这行,因为 FastAPI 的 on_event("startup") 应该只执行一次。
# 如果在开发中需要热重载模型,可以取消注释或提供专门的重载端点。
if model_list : # 如果已经加载过,则不再重复加载 (主要由 startup_event 控制)
print ( f " [MODEL_LOADER] Attempting to load models... " )
print ( f " [MODEL_LOADER] Models already loaded. Count: { len ( model_list ) } " )
return
print (
print (
f " [MODEL_LOADER] Attempting to load models. Initial model_list length: { len ( model_list ) } "
f " [MODEL_LOADER] Attempting to load models. Initial model_list length: { len ( model_list ) } "
@ -187,26 +184,15 @@ def load_all_models():
for file_path_obj in files_found :
for file_path_obj in files_found :
if file_path_obj . is_file ( ) :
if file_path_obj . is_file ( ) :
try :
try :
model_name_parts = file_path_obj . name . split ( " .xlsx " )
filename = file_path_obj . name
if len ( model_name_parts ) > 1 :
# 移除文件扩展名 .pkl
model_name = model_name_parts [ 0 ]
model_name = filename [ : - 4 ]
else :
# 移除 _model_degree3 后缀
model_name_base = file_path_obj . stem
if model_name . endswith ( " _model_degree3 " ) :
if model_name_base . endswith ( " _model_degree3 " ) :
model_name = model_name [ : - 14 ]
model_name = model_name_base [ : - len ( " _model_degree3 " ) ]
# 移除 .xlsx 后缀(如果存在)
elif model_name_base . endswith (
if " .xlsx " in model_name :
" 3 "
model_name = model_name . split ( " .xlsx " ) [ 0 ]
) : # 兼容 *3.pkl 但不含 .xlsx 的情况
model_name = model_name_base [ : - len ( " 3 " ) ] . rstrip (
" . "
) # 移除可能的尾部'.' (来自.pkl)
if model_name . endswith ( " _model_degree " ) : # 进一步处理
model_name = model_name [ : - len ( " _model_degree " ) ]
else :
model_name = model_name_base
print (
f " [MODEL_LOADER] WARNING: Filename { file_path_obj . name } does not contain ' .xlsx ' as expected for name splitting. Using ' { model_name } ' as model name based on stem. "
)
loaded_model = joblib . load ( file_path_obj )
loaded_model = joblib . load ( file_path_obj )
temp_model_list . append (
temp_model_list . append (
@ -237,6 +223,12 @@ def load_all_models():
def get_welding_coefficient ( row ) :
def get_welding_coefficient ( row ) :
coefficient = 0.0
coefficient = 0.0
global model_list
global model_list
# 添加调试日志, 查看model_list的长度和内容
print ( f " [DEBUG] model_list length: { len ( model_list ) } " )
loaded_model_names = [ model [ " name " ] for model in model_list ]
print ( f " [DEBUG] Loaded models: { loaded_model_names } " )
model_map = { model [ " name " ] : model for model in model_list }
model_map = { model [ " name " ] : model for model in model_list }
lenth = row . 长度_m
lenth = row . 长度_m
welding_type = row . 坡口代码
welding_type = row . 坡口代码
@ -278,7 +270,9 @@ def get_welding_coefficient(row):
model_name = f " { item } _ { welding_position } "
model_name = f " { item } _ { welding_position } "
selected_model_info = model_map . get ( model_name )
selected_model_info = model_map . get ( model_name )
if selected_model_info is None :
if selected_model_info is None :
raise KeyError ( f " 模型 ' { model_name } ' 未加载 " )
print ( f " ⚠️ 处理坡口代码模型不存在: { model_name } , 错误: 模型未加载 " )
coefficient = float ( ' nan ' )
break
model = selected_model_info [ " model " ]
model = selected_model_info [ " model " ]
range_str = MODEL_RANGES . get ( model_name , " 0-Infinity " )
range_str = MODEL_RANGES . get ( model_name , " 0-Infinity " )
min_val_str , max_val_str = range_str . split ( " - " )
min_val_str , max_val_str = range_str . split ( " - " )
@ -293,8 +287,13 @@ def get_welding_coefficient(row):
coefficient = float ( ' nan ' )
coefficient = float ( ' nan ' )
break
break
else :
else :
try :
prediction = float ( model . predict ( thickness_array ) [ 0 ] )
prediction = float ( model . predict ( thickness_array ) [ 0 ] )
coefficient + = prediction
coefficient + = prediction
except Exception as e :
print ( f " ⚠️ 模型预测失败: { model_name } , 错误: { e } " )
coefficient = float ( ' nan ' )
break
except Exception as e :
except Exception as e :
coefficient = float ( ' nan ' )
coefficient = float ( ' nan ' )
print (
print (
@ -392,6 +391,9 @@ def process_excel(
当 sheet_name 为 None 时 , 处理工作簿内所有工作表并返回 { sheet_name : DataFrame } 。
当 sheet_name 为 None 时 , 处理工作簿内所有工作表并返回 { sheet_name : DataFrame } 。
"""
"""
# 在每次预测之前重新加载模型,确保模型能够被正确加载
load_all_models ( )
path_like , excel_bytes = _prepare_excel_source ( excel_source )
path_like , excel_bytes = _prepare_excel_source ( excel_source )
def get_source ( ) :
def get_source ( ) :
@ -426,6 +428,21 @@ def startup_event():
load_all_models ( )
load_all_models ( )
@app.get ( " /models " , summary = " 获取已加载的模型列表 " )
def get_models ( ) :
"""
获取已加载的模型列表 , 用于调试和检查模型加载状态
"""
global model_list
return {
" total_models " : len ( model_list ) ,
" models " : [ {
" name " : model [ " name " ] ,
" filename " : model [ " filename " ]
} for model in model_list ]
}
def _sanitize_sheet_name ( name : Union [ str , int ] , existing : set [ str ] ) - > str :
def _sanitize_sheet_name ( name : Union [ str , int ] , existing : set [ str ] ) - > str :
base = str ( name ) if str ( name ) . strip ( ) else " Sheet "
base = str ( name ) if str ( name ) . strip ( ) else " Sheet "
base = base [ : 31 ]
base = base [ : 31 ]
@ -520,7 +537,36 @@ async def predict(
def main ( ) :
def main ( ) :
print ( " [TEST] Script started... " )
# 检查degree3文件夹是否存在
print ( f " [TEST] Current file path: { __file__ } " )
print ( f " [TEST] Folder path: { folder_path } " )
print ( f " [TEST] Folder exists: { folder_path . exists ( ) } " )
print ( f " [TEST] Folder is directory: { folder_path . is_dir ( ) } " )
# 列出degree3文件夹中的文件
if folder_path . exists ( ) and folder_path . is_dir ( ) :
files = list ( folder_path . glob ( " *3.pkl " ) )
print ( f " [TEST] Number of model files found: { len ( files ) } " )
for file in files [ : 10 ] : # 显示前10个文件
print ( f " [TEST] Found model file: { file . name } " )
# 加载模型
load_all_models ( )
load_all_models ( )
# 添加调试信息,显示加载的模型名称
print ( f " [DEBUG] Total models loaded: { len ( model_list ) } " )
for model in model_list :
print ( f " [DEBUG] Loaded model: { model [ ' name ' ] } from { model [ ' filename ' ] } " )
# 检查是否包含CV17.5相关的模型
cv175_models = [ model [ ' name ' ] for model in model_list if ' CV17.5 ' in model [ ' name ' ] ]
print ( f " [DEBUG] CV17.5 models found: { cv175_models } " )
# 检查是否包含平焊相关的模型
pinghan_models = [ model [ ' name ' ] for model in model_list if ' 平焊 ' in model [ ' name ' ] ]
print ( f " [DEBUG] 平焊 models found: { pinghan_models } " )
# result_obj = process_excel(source_excel_path, sheet_name=0)
# result_obj = process_excel(source_excel_path, sheet_name=0)
# output_file_path = source_excel_path.parent.joinpath(
# output_file_path = source_excel_path.parent.joinpath(
# source_excel_path.stem + "_预测结果.xlsx"
# source_excel_path.stem + "_预测结果.xlsx"