人脸的检测与识别,这方面的文章,我们前期的文章也有相关的介绍,主要涉及到MediaPipe Face Detection,以及基于openCV的人脸检测与识别,并且我们基于CNN卷积神经网络训练了自己的人脸识别模型。本期我们分享一个可以用于2D与3D人脸检测与识别的python库InsightFace。
InsightFace是一个用于2D和3D人脸分析的集成Python库。 InsightFace 有效地实现了各种最先进的人脸识别、人脸检测和人脸对齐算法,并针对训练和部署进行了优化。它支持一系列主干架构,包括 IResNet、RetinaNet、MobileFaceNet、InceptionResNet_v2 和 DenseNet。 除了模型之外,它还可以使用 MS1M、VGG2 和 CASIA-WebFace 等面部数据集。
https://github.com/deepinsight/insightface
PyTorch 1.6+ and/or MXNet=1.6-1.8, with Python 3.x.
使用insightface前,我们需要安装相应的第三方库,insightface主要基于pytorch,在运行本期代码前,确保自己的电脑上安装了pytorch,且版本大于1.6。然后我们还需要安装insightface。
pip install insightface
这里只需要使用pip进行安装即可,安装过程中,会自动安装相关的第三方库。
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting insightface
Downloading insightface-0.7.3.tar.gz (439 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 439.5/439.5 kB 9.9 MB/s eta 0:00:00
Installing build dependencies ... done
Getting requirements to build wheel ... done
Installing backend dependencies ... done
Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from insightface) (1.22.4)
Collecting onnx (from insightface)
Downloading onnx-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.6/14.6 MB 101.3 MB/s eta 0:00:00
Building wheels for collected packages: insightface
Building wheel for insightface (pyproject.toml) ... done
Created wheel for insightface: filename=insightface-0.7.3-cp310-cp310-linux_x86_64.whl size=1054571 sha256=36da8226c173934e3336d6477a2cdab835fb8a173e585bed38277691b2c9a4fb
Stored in directory: /root/.cache/pip/wheels/e3/d0/80/e3773fb8b6d1cca87ea1d33d9b1f20a223a6493c896da249b5
Successfully built insightface
Installing collected packages: onnx, insightface
Successfully installed insightface-0.7.3 onnx-1.14.0
安装完成后,会自动安装insightface与onnx,当然此模型还需要安装onnxruntime,若电脑中有GPU可以安装GPU版本,当然若只有CPU,可以直接安装onnxruntime。
pip install onnxruntime-gpu
'''
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting onnxruntime-gpu
Downloading onnxruntime_gpu-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (121.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.6/121.6 MB 2.4 MB/s eta 0:00:00
Collecting coloredlogs (from onnxruntime-gpu)
Downloading coloredlogs-15.0.1-py2.py3-none-any.whl (46 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 46.0/46.0 kB 6.6 MB/s eta 0:00:00
Requirement already satisfied: flatbuffers in /usr/local/lib/python3.10/dist-packages (from onnxruntime-gpu) (23.3.3)
Requirement already satisfied: numpy>=1.21.6 in /usr/local/lib/python3.10/dist-packages (from onnxruntime-gpu) (1.22.4)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from onnxruntime-gpu) (23.1)
Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from onnxruntime-gpu) (3.20.3)
Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from onnxruntime-gpu) (1.11.1)
Collecting humanfriendly>=9.1 (from coloredlogs->onnxruntime-gpu)
Downloading humanfriendly-10.0-py2.py3-none-any.whl (86 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 86.8/86.8 kB 13.0 MB/s eta 0:00:00
Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->onnxruntime-gpu) (1.3.0)
Installing collected packages: humanfriendly, coloredlogs, onnxruntime-gpu
Successfully installed coloredlogs-15.0.1 humanfriendly-10.0 onnxruntime-gpu-1.15.1
'''
成功安装完成所有库之后,我们就可以进行人脸的检测与识别任务了。
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(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
#img = ins_get_image('t2')
img = cv2.imread('112233.jpg')
faces = app.get(img)
rimg = app.draw_on(img, faces)
cv2.imwrite("./t3_output.jpg", rimg)
首先我们需要从insightface.app中import FaceAnalysis人脸检测分析库,并基于FaceAnalysis搭建一个用于人脸检测的app,并配置此app检测的对象尺寸。
配置完成后,我们就可以读取一张需要进行人脸检测的图片,这里可以使用cv2.imread来读取一张图片,当然这里我们也可以读取一段视频来进行人脸的检测。
得到图片后,我们直接使用app.get函数来进行人脸的检测,最后使用app.draw_on函数,把检测结果显示在原图片上。从检测的结果来看,模型不仅进行了人脸检测,还对人脸的性别与年龄进行了预测,当然insightface不仅可以进行人脸检测,还可以进行人脸识别,只不过需要我们自己搭建自己的数据集,并进行人脸模型的训练,这个我们后期进行分享吧。