3DCNN模型预测后获取测试集视频实际标签及关联结果的实现
解决3DCNN动作识别测试集文件名关联与结果表格输出问题
核心问题原因
train_test_split 默认仅对特征数组X和标签数组y进行拆分,不会自动保留文件名这类元数据,导致拆分后特征与文件名的关联丢失。
解决方案步骤
1. 提前绑定元数据与特征、标签
在拆分前,将视频文件名、提取的特征、真实标签打包成统一数据集(推荐用Pandas DataFrame,便于管理):
import pandas as pd import numpy as np # 假设你已经有以下数据: # X: 所有视频提取的3DCNN特征列表(每个元素是形状为(frames, h, w, c)的数组) # y: 对应视频的真实标签数组 # file_names: 对应视频的文件名列表(如["jump_001.mp4", "kick_005.mp4"...]) # 打包成DataFrame dataset_df = pd.DataFrame({ "features": X, "true_label": y, "file_name": file_names })
2. 拆分带元数据的数据集
用train_test_split直接拆分整个DataFrame,确保文件名与特征、标签的关联不丢失:
from sklearn.model_selection import train_test_split # 按8:2拆分训练集和测试集,stratify保证类别分布一致 train_df, test_df = train_test_split( dataset_df, test_size=0.2, stratify=dataset_df["true_label"], random_state=42 # 固定随机种子保证可复现 )
3. 执行模型预测并提取结果
从测试集DataFrame中提取特征、标签和文件名,执行预测后获取预测类别与分数:
# 将特征列表转换为模型可接受的numpy数组 X_test = np.stack(test_df["features"].values) y_test = test_df["true_label"].values test_file_names = test_df["file_name"].values # 模型预测 pred_probs = model.predict(X_test) # 取概率最大的类别作为预测标签 pred_labels = np.argmax(pred_probs, axis=1) # 取最大概率值作为预测分数 pred_scores = np.max(pred_probs, axis=1)
4. 生成结果表格
将所有结果整合为DataFrame,直接打印或保存为文件:
# 生成结果表格 result_df = pd.DataFrame({ "视频文件名": test_file_names, "真实类别": y_test, "预测类别": pred_labels, "预测分数": pred_scores.round(4) # 保留4位小数更美观 }) # 打印结果 print(result_df) # 保存为CSV文件(方便后续分析) result_df.to_csv("动作识别测试结果.csv", index=False, encoding="utf-8-sig")
补救方案:已拆分X和y的情况
如果已经拆分了X_val_test和y_val_test,且拆分时用了固定random_state,可以用相同参数拆分文件名列表,直接关联:
# 用和之前拆分X、y完全相同的参数拆分文件名列表 _, _, _, _, _, test_file_names = train_test_split( X, y, file_names, test_size=0.2, stratify=y, random_state=42 )
之后再按步骤3、4生成结果表格即可。
注意事项
- 确保
X、y、file_names三个数组的长度完全一致,否则会出现索引不匹配的问题。 - 如果是实时从视频文件提取特征,建议在提取阶段就记录文件名,避免后续手动对应出错。
内容的提问来源于stack exchange,提问作者MatPar
相关产品推荐
相关产品推荐

