# insight-face-paddle
**Repository Path**: woodrow_25/insight-face-paddle
## Basic Information
- **Project Name**: insight-face-paddle
- **Description**: No description available
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2021-11-01
- **Last Updated**: 2025-04-17
## Categories & Tags
**Categories**: Uncategorized
**Tags**: GitHub
## README
简体中文 | [English](README_en.md)
------------------------------------------------------------------------------------------
# InsightFace Paddle
## 1. 介绍
### 1.1 总览
`InsightFacePaddle`是基于PaddlePaddle实现的,开源深度人脸检测、识别工具。`InsightFacePaddle`目前提供了三个预训练模型,包括用于人脸检测的 `BlazeFace`、用于人脸识别的 `ArcFace` 和 `MobileFace`。
- 本部分内容为Whl包预测部署部分。
- 人脸识别相关内容可以参考:[人脸识别](https://github.com/deepinsight/insightface/blob/master/recognition/arcface_paddle/README_cn.md)。
- 人脸检测相关内容可以参考:[基于BlazeFace的人脸检测](https://github.com/deepinsight/insightface/blob/master/detection/blazeface_paddle/README_cn.md)。
Note: 在此非常感谢 [GuoQuanhao](https://github.com/GuoQuanhao) 基于PaddlePaddle复现了 [Arcface的基线模型](https://github.com/GuoQuanhao/arcface-Paddle)。
### 1.2 模型benchmark
在人脸检测任务中,在WiderFace数据集上,BlazeFace的速度与精度指标信息如下。
| 模型结构 | 模型大小 | WiderFace精度 | CPU 耗时 | GPU 耗时 |
| ------------------------- | ----- | ----- | -------- | -------- |
| BlazeFace-FPN-SSH-Paddle | 0.65MB | 0.9187/0.8979/0.8168 | 31.7ms | 5.6ms |
| RetinaFace | 1.68MB | -/-/0.825 | 182.0ms | 17.4ms |
在人脸识别任务中,基于MS1M训练集,模型指标在lfw、cfp_fp、agedb30上的精度指标以及CPU、GPU的预测耗时如下。
| 模型结构 | lfw | cfp_fp | agedb30 | CPU 耗时 | GPU 耗时 |
| ------------------------- | ----- | ------ | ------- | -------| -------- |
| MobileFaceNet-Paddle | 0.9945 | 0.9343 | 0.9613 | 4.3ms | 2.3ms |
| MobileFaceNet-mxnet | 0.9950 | 0.8894 | 0.9591 | 7.3ms | 4.7ms |
**测试环境:**
* CPU: Intel(R) Xeon(R) Gold 6184 CPU @ 2.40GHz
* GPU: a single NVIDIA Tesla V100
**注:** `RetinaFace`的性能数据是使用脚本[test.py](https://github.com/deepinsight/insightface/blob/master/detection/retinaface/test.py)测试得到,这里将`RetinaFace`的image shape修改为`640x480`进行测试。`MobileFaceNet-mxnet`的性能数据是使用脚本:[verification.py](https://github.com/deepinsight/insightface/blob/master/recognition/arcface_mxnet/verification.py)测试得到。
### 1.3 可视化结果展示
基于 `InsightFacePaddle` 的预测结果,示例如下,更多示例结果请参考 [示例](./demo/friends/output/)。
### 1.4 欢迎加入深度学习技术交流群
QQ扫描二维码加入交流群(群号:`705899115`)。
## 2. 安装
1. 安装 PaddlePaddle
`InsightFacePaddle` 需要使用 PaddlePaddle 2.1 及以上版本,可以参考以下步骤安装。
```bash
# for GPU
pip3 install paddlepaddle-gpu
# for CPU
pip3 install paddlepaddle
```
关于安装 PaddlePaddle 的更多信息,请参考 [PaddlePaddle](https://www.paddlepaddle.org.cn/)。
2. 安装 requirements
`InsightFacePaddle` 的依赖在 `requirements.txt` 中,你可以参考以下步骤安装依赖包。
```bash
pip3 install --upgrade -r requirements.txt -i https://mirror.baidu.com/pypi/simple
```
3. 安装 `InsightFacePaddle`
* [建议] 你可以使用 `pip` 工具从 `pypi` 安装最新版本的 `InsightFacePaddle`。
```bash
pip3 install --upgrade insightface-paddle
```
* 你也可以自己构建并安装,请参考以下步骤。
```bash
cd ./InsightFacePaddle
python3 setup.py bdist_wheel
pip3 install dist/*
```
## 3. 快速开始
`InsightFacePaddle` 提供 `命令行(Command Line)` 和 `Python接口` 两种使用方式。
### 3.1 命令行
在命令行中使用 `InsightFacePaddle`。
#### 3.1.1 获取参数信息
你可以通过以下命令获取参数信息。
```bash
insightfacepaddle -h
```
`InsightFacePaddle` 的参数及其解释如下:
| 参数名(args) | 类型(type) | 默认值(default) | 说明(help) |
| ---- | ---- | ---- | ---- |
| det_model | str | BlazeFace | 检测模型名称,或本地模型文件所在目录,该目录下需包含 `inference.pdmodel`、`inference.pdiparams` 和 `inference.pdiparams.info` 三个文件。 |
| rec_model | str | MobileFace | 识别模型名称,或本地模型文件所在目录,该目录下需包含 `inference.pdmodel`、`inference.pdiparams` 和 `inference.pdiparams.info` 三个文件。 |
| use_gpu | bool | True | 是否使用 `GPU` 进行预测,默认为 `True`。 |
| enable_mkldnn | bool | False | 是否开启 `MKLDNN` 进行预测,当 `--use_gpu` 为 `False` 且 `--enable_mkldnn` 为 `True` 时该参数有效,默认值为 `False`。 |
| cpu_threads | int | 1 | CPU 预测时开启的线程数量,当 `--use_gpu` 为 `False` 时该参数有效,默认值为 `1`。 |
| input | str | - | 要预测的视频文件或图像文件的路径,或包含图像文件的目录。 |
| output | str | - | 保存预测结果的目录。|
| det | bool | False | 是否进行检测。 |
| det_thresh | float | 0.8 | 检测后处理的阈值,默认值为`0.8`。 |
| rec | bool | False | 是否进行识别。 |
| index | str | - | 索引文件的路径。 |
| cdd_num | int | 5 | 识别中检索阶段的候选数量,默认值为`5`。 |
| rec_thresh | float | 0.45 | 识别中的检索阈值,由于剔除相似度过低的候选项。默认值为`0.45`。 |
| max_batch_size | int | 1 | 识别中 batch_size 上限,默认值为`1`。 |
| build_index | str | - | 要构建的索引文件路径。 |
| img_dir | str | - | 用于构建索引的图像文件目录。 |
| label | str | - | 用于构建索引的标签文件路径。 |
#### 3.1.2 构建索引
如果使用识别功能,则在开始预测之前,必须先构建索引文件,命令如下。
```bash
insightfacepaddle --build_index ./demo/friends/index.bin --img_dir ./demo/friends/gallery --label ./demo/friends/gallery/label.txt
```
用于构建索引的数据示例如下:
#### 3.1.3 预测
1. 仅检测
* Image(s)
使用下图进行测试:
预测命令如下:
```bash
insightfacepaddle --det --input ./demo/friends/query/friends1.jpg --output ./output
```
检测结果图位于路径 `./output` 下:
* Video
```bash
insightfacepaddle --det --input ./demo/friends/query/friends.mp4 --output ./output
```
2. 仅识别
* Image(s)
使用下图进行测试:
预测命令如下:
```bash
insightfacepaddle --rec --index ./demo/friends/index.bin --input ./demo/friends/query/Rachel.png
```
检测结果输出在终端中:
```bash
INFO:root:File: Rachel.png, predict label(s): ['Rachel']
```
3. 检测+识别系统串联
* Image(s)
使用下图进行测试:
预测命令如下:
```bash
insightfacepaddle --det --rec --index ./demo/friends/index.bin --input ./demo/friends/query/friends2.jpg --output ./output
```
检测结果图位于路径 `./output` 下:
* Video
```bash
insightfacepaddle --det --rec --index ./demo/friends/index.bin --input ./demo/friends/query/friends.mp4 --output ./output
```
### 3.2 Python
同样可以在 Python 中使用 `InsightFacePaddle`。首先导入 `InsightFacePaddle`,因为 `InsightFacePaddle` 使用 `logging` 控制日志输入,因此需要导入 `logging`。
```python
import insightface_paddle as face
import logging
logging.basicConfig(level=logging.INFO)
```
#### 3.2.1 获取参数信息
```python
parser = face.parser()
help_info = parser.print_help()
print(help_info)
```
#### 3.2.2 构建索引
```python
parser = face.parser()
args = parser.parse_args()
args.build_index = "./demo/friends/index.bin"
args.img_dir = "./demo/friends/gallery"
args.label = "./demo/friends/gallery/label.txt"
predictor = face.InsightFace(args)
predictor.build_index()
```
#### 3.2.3 预测
1. 仅检测
* Image(s)
```python
parser = face.parser()
args = parser.parse_args()
args.det = True
args.output = "./output"
input_path = "./demo/friends/query/friends1.jpg"
predictor = face.InsightFace(args)
res = predictor.predict(input_path)
print(next(res))
```
* NumPy
```python
import cv2
parser = face.parser()
args = parser.parse_args()
args.det = True
args.output = "./output"
path = "./demo/friends/query/friends1.jpg"
img = cv2.imread(path)[:, :, ::-1]
predictor = face.InsightFace(args)
res = predictor.predict(img)
print(next(res))
```
* Video
```python
parser = face.parser()
args = parser.parse_args()
args.det = True
args.output = "./output"
input_path = "./demo/friends/query/friends.mp4"
predictor = face.InsightFace(args)
res = predictor.predict(input_path)
for _ in res:
print(_)
```
2. 仅识别
* Image(s)
```python
parser = face.parser()
args = parser.parse_args()
args.rec = True
args.index = "./demo/friends/index.bin"
input_path = "./demo/friends/query/Rachel.png"
predictor = face.InsightFace(args)
res = predictor.predict(input_path, print_info=True)
next(res)
```
* NumPy
```python
import cv2
parser = face.parser()
args = parser.parse_args()
args.rec = True
args.index = "./demo/friends/index.bin"
path = "./demo/friends/query/Rachel.png"
img = cv2.imread(path)[:, :, ::-1]
predictor = face.InsightFace(args)
res = predictor.predict(img, print_info=True)
next(res)
```
3. 检测+识别系统串联
* Image(s)
```python
parser = face.parser()
args = parser.parse_args()
args.det = True
args.rec = True
args.index = "./demo/friends/index.bin"
args.output = "./output"
input_path = "./demo/friends/query/friends2.jpg"
predictor = face.InsightFace(args)
res = predictor.predict(input_path, print_info=True)
next(res)
```
* NumPy
```python
import cv2
parser = face.parser()
args = parser.parse_args()
args.det = True
args.rec = True
args.index = "./demo/friends/index.bin"
args.output = "./output"
path = "./demo/friends/query/friends2.jpg"
img = cv2.imread(path)[:, :, ::-1]
predictor = face.InsightFace(args)
res = predictor.predict(img, print_info=True)
next(res)
```
* Video
```python
parser = face.parser()
args = parser.parse_args()
args.det = True
args.rec = True
args.index = "./demo/friends/index.bin"
args.output = "./output"
input_path = "./demo/friends/query/friends.mp4"
predictor = face.InsightFace(args)
res = predictor.predict(input_path, print_info=True)
for _ in res:
pass
```