153 lines
3.6 KiB
Markdown
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)
|