Face_reg_app/FaceFeatureExtractorAPI/FEATURE_DIMENSION.md

3.6 KiB

人脸特征维度说明

当前特征维度

当前模型输出: 1024维

根据 face_recognizer.onnx 模型的输出节点信息:

  • 输出节点名称: fc1_act_50
  • 输出形状: [None, 1024, 1, 1]
  • 实际特征维度: 1024维 (经过 flatten 后)

特征维度是否可调整?

运行时无法调整

特征维度由预训练的ONNX模型决定,运行时无法修改。

原因:

  1. 特征维度是模型架构的固有属性
  2. 1024维是模型最后一层全连接层的输出大小
  3. 修改维度需要重新训练模型或使用降维技术

可选方案

如果确实需要调整特征维度,有以下几种方式:

方案1: 使用降维技术 (推荐用于存储优化)

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: 哈希降维 (快速但有精度损失)

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维:

# 在 app.py 中修改
feature_vector = face_info.feature[:512].tolist()  # 只返回前512维

⚠️ 警告: 这会严重影响识别精度,不推荐!

建议

如果是为了节省存储空间:

👉 使用方案1 (PCA降维) - 平衡存储和精度

如果是为了API传输优化:

👉 保持1024维 - 可以使用GZIP压缩传输:

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配置

# 当前配置
feature_dim = 1024  # 固定值
similarity_threshold = 0.7  # 可调整阈值

总结

  • 特征维度: 1024维 (固定)
  • 运行时无法调整
  • 可以使用降维技术优化存储
  • 可以更换模型改变维度
  • ⚠️ 不建议截断特征向量

如有其他问题,请查看: