# 人脸特征维度说明 ## 当前特征维度 **当前模型输出: 1024维** 根据 `face_recognizer.onnx` 模型的输出节点信息: - 输出节点名称: `fc1_act_50` - 输出形状: `[None, 1024, 1, 1]` - 实际特征维度: **1024维** (经过 flatten 后) ## 特征维度是否可调整? ### ❌ 运行时无法调整 **特征维度由预训练的ONNX模型决定,运行时无法修改。** 原因: 1. 特征维度是模型架构的固有属性 2. 1024维是模型最后一层全连接层的输出大小 3. 修改维度需要重新训练模型或使用降维技术 ### ✅ 可选方案 如果确实需要调整特征维度,有以下几种方式: #### 方案1: 使用降维技术 (推荐用于存储优化) ```python from sklearn.decomposition import PCA import numpy as np # 提取1024维特征 feature_1024 = extractor.extract_single_feature(image) # shape: (1024,) # 使用PCA降维到512维 pca = PCA(n_components=512) # 需要先用大量特征训练PCA模型 pca.fit(training_features) # training_features shape: (N, 1024) # 降维 feature_512 = pca.transform(feature_1024.reshape(1, -1)) # shape: (1, 512) ``` **优点**: - 减少存储空间 (512维约为原来的50%) - 保留大部分判别信息 - 不需要重新训练模型 **缺点**: - 需要收集训练数据训练PCA - 会损失部分精度 - 增加预处理步骤 #### 方案2: 哈希降维 (快速但有精度损失) ```python import numpy as np def hash_reduce_dimension(feature, target_dim=512): """使用随机投影降维""" # 创建固定的随机投影矩阵 np.random.seed(42) projection_matrix = np.random.randn(1024, target_dim) projection_matrix /= np.linalg.norm(projection_matrix, axis=0) # 投影降维 reduced_feature = np.dot(feature, projection_matrix) # 归一化 reduced_feature /= np.linalg.norm(reduced_feature) return reduced_feature # 使用 feature_512 = hash_reduce_dimension(feature_1024, target_dim=512) ``` **优点**: - 无需训练,即插即用 - 速度快 **缺点**: - 精度损失较大 - 不保证最优性 #### 方案3: 使用不同的预训练模型 更换为输出不同维度的人脸识别模型: **常见模型及其特征维度**: - ArcFace (ResNet50): **512维** - FaceNet: **128维** 或 **512维** - CosFace: **512维** - 当前模型: **1024维** #### 方案4: 修改API返回部分特征 如果只是为了API传输优化,可以选择只返回前N维: ```python # 在 app.py 中修改 feature_vector = face_info.feature[:512].tolist() # 只返回前512维 ``` **⚠️ 警告**: 这会严重影响识别精度,**不推荐**! ## 建议 ### 如果是为了节省存储空间: 👉 **使用方案1 (PCA降维)** - 平衡存储和精度 ### 如果是为了API传输优化: 👉 **保持1024维** - 可以使用GZIP压缩传输: ```python import gzip import json # 压缩特征 feature_json = json.dumps(feature).encode('utf-8') compressed = gzip.compress(feature_json) # 传输压缩数据... # 解压 decompressed = gzip.decompress(compressed) feature = json.loads(decompressed.decode('utf-8')) ``` ### 如果必须使用特定维度: 👉 **更换为对应维度的预训练模型** (需要重新部署) ## 当前API配置 ```python # 当前配置 feature_dim = 1024 # 固定值 similarity_threshold = 0.7 # 可调整阈值 ``` ## 总结 - ✅ **特征维度: 1024维 (固定)** - ❌ **运行时无法调整** - ✅ **可以使用降维技术优化存储** - ✅ **可以更换模型改变维度** - ⚠️ **不建议截断特征向量** --- 如有其他问题,请查看: - API文档: [API_USAGE.md](API_USAGE.md) - 模型代码: [models/facerecoger.py](models/facerecoger.py)