waterman 发表于 2024-11-24 18:15

AI挑战营(进阶):1. InsightFace 快速上手

# 简介

InsightFace是一个开源的2D/3D人脸分析工具,基于Pytorch和MXNet实现,包含多个人脸识别、人脸检测和人脸对齐的前沿算法,经过优化适合高效的训练与部署。

# 环境准备与安装

## 环境需求

* **操作系统** :Ubuntu 22.04
* **CUDA** :11.8
* **Python** :3.10
* **PyTorch** :2.1.0

## 安装步骤

InsightFace 的安装非常简单,可以通过以下命令直接完成:

```
pip install insightface -i https://pypi.tuna.tsinghua.edu.cn/simple
```

在github上的代码库中还有对安装的一些介绍


可以看到,除了安装`insightface`库外,为了使用GPU,我们还需要安装一些额外的库,如`onnxruntime-gpu`以启用 GPU 推理。

```
pip install mxnet onnxruntime-gpu numpy==1.23.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
```

### 注意事项

1. **卸载`onnxruntime`**
   如果您的系统已经安装了 `onnxruntime`,请在安装 `onnxruntime-gpu` 前卸载它,否则可能会导致推理过程中出现冲突错误。
   
   ```
   pip uninstall onnxruntime
   ```
2. **修改 numpy 版本**
   使用 InsightFace 的 `insightface-cli` 工具时,可能会因 numpy 的版本不兼容报错:
   
   ```
   AttributeError: module 'numpy' has no attribute 'bool'
   ```
   
   经过尝试,将 numpy 的版本修改为 `1.23.2`可以避免这个错误。
3. **解决动态库缺失问题**

如果报错如下:

```
FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcublasLt.so.11: cannot open shared object file: No such file or directory
```

则根据下表安装对应版本的`onnxruntime-gpu`。

| CUDA | cuDNN | PyTorch | onnxruntime-gpu | Install command                                                                                                                                                                                                                                        |
| ------ | ------- | --------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 12.x | 9.x   | 2.4.1   | 1.19.2          | pip install onnxruntime-gpu==1.19.2                                                                                                                                                                                                                  |
| 12.x | 8.9   | 2.3.1   | 1.18.0          | pip install onnxruntime-gpu==1.18.0 \--extra-index-url(https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/) |
| 11.8 | 8.9   | 2.3.1   | 1.19.2          | pip install onnxruntime-gpu==1.19.2 \--extra-index-url(https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-11/pypi/simple/) |

我尝试的是第三行的安装命令,可以解决我报错的问题。

# 模型下载

InsightFace 提供了多种模型用于不同场景的人脸分析,如下图所示:

![](https://file1.elecfans.com/web1/M00/F5/C5/wKgaoWdC-s6AXFbVAAEOROXzSUw733.jpg)

为了能够正常进行推理,我们首先需要使用`insightface-cli`下载相应的模型:

```
insightface-cli model.download buffalo_sc
```

默认会使用 `buffalo_l` 模型,如果没有提前下载,系统会在首次运行时自动下载。为了节省资源,我们可以选择更小的 `buffalo_sc` 模型。

github上下载链接为google drive,我已将其上传至百度云盘,如果github上的链接无法访问,可以使用以下百度云盘链接获取模型:

* 链接: https://pan.baidu.com/s/1vGcAq1piOEyYPphHq4f_4A?pwd=4n85
* 提取码: 4n85

# 推理与测试

## 人脸检测

完成上述安装和模型下载后,我们可以使用 InsightFace 进行人脸检测。以下是完整的代码示例:

```
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image

app = FaceAnalysis(name="buffalo_sc",providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
img = ins_get_image('/tmp/code/computer_version/insightface/j1')
faces = app.get(img)
rimg = app.draw_on(img, faces)
cv2.imwrite("./j1_output.jpg", rimg)
```

### 说明

1. **模型名称指定**
   初始化 `FaceAnalysis` 时,需指定模型名称为 `buffalo_sc`。如果未指定,系统将自动下载并使用默认的 `buffalo_l` 模型。
2. **图片路径**
   经尝试,图片路径需要为 **绝对路径** ,否则会报错。执行`ins_get_image`读取图片时,支持的图片格式包括 `.jpg`、`.png` 和 `.jpeg`,无需额外指定后缀名。

图片`j1.jpg`为我们自己准备好的图片,如下图:


执行上述代码进行推理,推理结果就会输出到图片`j1_output.jpg`中,如下图所示:


## 人脸识别

在完成检测的基础上,我们可以进一步实现人脸识别,通过比较目标人脸与检测结果的人脸特征向量计算相似度。以下是完整代码:

```
# 将人脸特征向量转换为矩阵
feats = []
for face in faces:
    feats.append(face.normed_embedding)
feats = np.array(feats, dtype=np.float32)

# 提取目标人脸向量
target = ins_get_image("/tmp/code/computer_version/insightface/target")
target_faces = app.get(target)   # 得到人脸信息
target_feat = np.array(target_faces.normed_embedding, dtype=np.float32)

# 人脸向量相似度对比
sims = np.dot(feats, target_feat)
target_index = int(sims.argmax())

rimg = app.draw_on(img, ])   # 将人脸框绘制到图片上
cv2.imwrite("j1_output_target.jpg", rimg)      # 保存图片
```

### 注意事项

1. **目标人脸的选择**
   在准备目标人脸图片时,建议截取稍大范围的区域,避免仅包含人脸部分,否则可能识别失败。

其中/tmp/code/computer_version/insightface/target就是我们要识别的目标图片,如下图所示:


执行上述代码后,识别结果会保存为 `j1_output_target.jpg`,识别结果如下图所示:


# 总结

通过以上流程,我们在 PC 端初步完成了 InsightFace 的全流程操作,为后续在 RV1106 上的部署提供了参考与思路。借助 InsightFace 提供的功能包,我们快速实现了高效的多人实时人脸识别。整个流程涵盖了环境配置、模型下载与加载以及推理测试等关键步骤,其中核心部分主要集中在人脸检测和人脸识别两个模型的使用。

nmg 发表于 2024-11-25 10:17

<p><img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan21.gif" width="63" />速度~</p>

申小林 发表于 2024-11-28 22:50

<p>跟大佬学习一下。</p>

<p>&nbsp;</p>
页: [1]
查看完整版本: AI挑战营(进阶):1. InsightFace 快速上手