Face_reg_app/FaceFeatureExtractorAPI/FEATURE_DIMENSION.md

153 lines
3.6 KiB
Markdown

# 人脸特征维度说明
## 当前特征维度
**当前模型输出: 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)