欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

程序员文章站 2022-06-08 20:46:00
进群:125240963 即可获取数十套PDF哦! ▌理解深度学习面部识别嵌入 那么,基于深度学习的面部识别是怎样工作的呢?秘密就是一种叫做“深度度量学习”的技术。 如果你有深度学习的经验,你应该知道,通常情况下训练好的网络会接受一个输入图像,并且给输入的图像生成一个分类或标签。 图1:利用深度度量 ......
Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

进群:125240963   即可获取数十套PDF哦!

▌理解深度学习面部识别嵌入

那么,基于深度学习的面部识别是怎样工作的呢?秘密就是一种叫做“深度度量学习”的技术。

如果你有深度学习的经验,你应该知道,通常情况下训练好的网络会接受一个输入图像,并且给输入的图像生成一个分类或标签。

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

图1:利用深度度量学习进行面部识别需要“三元组训练”。三元组包括三张不同的面部图像,其中两张属于同一个人。神经网络为每张面部图像生成一个128维向量。对于同一个人的两张面部图像,我们调整神经网络使得输出向量的距离度量尽可能接近。

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

强烈建议阅读以上文章,以深入了解深度学习面部嵌入的工作原理。

▌安装面部识别库

为了用Python和OpenCV吸纳面部识别,我们需要安装一些库:

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

$ workon # optional

$ pip install dlib

或者从源代码进行编译:

$ workon <your env name here> # optional

$ git clone https://github.com/davisking/dlib.git

$ cd dlib

$ mkdir build

$ cd build

$ cmake .. -DUSE_AVX_INSTRUCTIONS=1

$ cmake --build .

$ cd ..

$ python setup.py install --yes USE_AVX_INSTRUCTIONS

安装有GPU支持的dlib(可选)

如果你有兼容CUDA的GPU,那么可以安装有GPU支持的dlib,这样面部识别能更快、更精确。

我建议从源代码安装dlib,这样可以更精细地控制安装过程:

$ workon <your env name here> # optional

$ git clone https://github.com/davisking/dlib.git

$ cd dlib

$ mkdir build

$ cd build

$ cmake .. -DDLIB_USE_CUDA=1 -DUSE_AVX_INSTRUCTIONS=1

$ cmake --build .

$ cd ..

$ python setup.py install --yes USE_AVX_INSTRUCTIONS --yes DLIB_USE_CUDA

安装face_recognition包

face_recognition模块只需简单地使用pip命令即可安装:

$ workon <your env name here> # optional

$ pip install face_recognition

安装imutlis

我们还需要imutils包提供一些遍历的函数。在Python虚拟环境中使用pip即可:

$ workon <your env name here> # optional

$ pip install imutils

▌面部识别数据集

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

$ tree --filelimit 10 --dirsfirst

.

├── dataset

│ ├── alan_grant [22 entries]

│ ├── claire_dearing [53 entries]

│ ├── ellie_sattler [31 entries]

│ ├── ian_malcolm [41 entries]

│ ├── john_hammond [36 entries]

│ └── owen_grady [35 entries]

├── examples

│ ├── example_01.png

│ ├── example_02.png

│ └── example_03.png

├── output

│ └── lunch_scene_output.avi

├── videos

│ └── lunch_scene.mp4

├── search_bing_api.py

├── encode_faces.py

├── recognize_faces_image.py

├── recognize_faces_video.py

├── recognize_faces_video_file.py

└── encodings.pickle

10 directories, 11 files

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

▌用OpenCV和深度学习对面部进行编码

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

图3:利用深度学习和Python进行面部识别。对每一个面部图像,用face_recognition模块的方法生成一个128维实数特征向量。

在识别图像和视频中的面部之前,我们首先需要在训练集中识别面部。要注意的是,我们并不是在训练网络——该网络已经在300万图像的训练集上训练过了。

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

首先需要导入必需的包。这个脚本需要事先安装imutils、face_recognition和OpenCV。请翻到前面“安装面部识别库”一节确保你已经安装了必须的库。

首先用argparse处理运行时传递的命令行参数:

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

行3用输入数据集的路径,建立了一个列表imagePaths。

我们还需要在循环开始之前初始化两个列表,分别是knownEncodings和knownNames。这两个列表分别包含面部编码数据和数据集中相应人物的名字(行6和行7)。

现在可以依次循环侏罗纪公园中的每个角色了!

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

接下来定位面部位置并计算编码:

1 # detect the (x, y)-coordinates of the bounding boxes

2 # corresponding to each face in the input image

3 boxes = face_recognition.face_locations(rgb,

4 model=args["detection_method"])

5

6 # compute the facial embedding for the face

7 encodings = face_recognition.face_encodings(rgb, boxes)

8

9 # loop over the encodings

10 for encoding in encodings:

11 # add each encoding + name to our set of known names and

12 # encodings

13 knownEncodings.append(encoding)

14 knownNames.append(name)

这段代码是最有意思的部分!

每次循环都会检测一个面部图像(或者一张图像中有多个面部,我们假设这些面部都属于同一个人,但如果你使用自己的图像的话,这个假设有可能不成立,所以一定要注意)。

比如,假设rgb里的图像是Ellie Sattler的脸。

行3和4查找面部位置,返回一个包含了许多方框的列表。我们给face_recognition.face_locations方法传递了两个参数:

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

行3构建了一个字典,它包含encodings和names两个键。

行4-6将名字和编码保存到硬盘中,供以后使用。

怎样才能在终端上运行encode_faces.py脚本?

要创建面部嵌入,可以从终端执行以下命令:

1$ python encode_faces.py --dataset dataset --encodings encodings.pickle

2[INFO] quantifying faces...

3[INFO] processing image 1/218

4[INFO] processing image 2/218

5[INFO] processing image 3/218

6...

7[INFO] processing image 216/218

8[INFO] processing image 217/218

9[INFO] processing image 218/218

10[INFO] serializing encodings...

11$ ls -lh encodings*

12-rw-r--r--@ 1 adrian staff 234K May 29 13:03 encodings.pickle

从输出中课件,它生成了个名为encodings.pickle的文件,该文件包含了数据集中每个面部图像的128维面部嵌入。

在我的Titan X GPU上,处理整个数据集花费了一分钟多一点,但如果只使用CPU,就要做好等待很久的心理准备。

在我的Macbook Pro上(没有GPU),编码218张图像需要21分20秒。

如果你有GPU并且编译dlib时选择了支持GPU,那么速度应该会快得多。

▌识别图像中的面部

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!

 

注意:别忘了我们的模型是根据原版电影中的四个角色进行训练的:Alan Grant、Ellie Sattler、Ian Malcolm和John Hammond。模型并没有针对Donald Gennaro(律师)进行训练,所以他的面部被标记为“Unknown”。这个行为是特意的(不是意外),以演示我们的视频识别系统在识别训练过的面部的同时,会把不认识的面部标记为“Unknown”。

▌面部识别代码能运行在树莓派上吗?

从某种意义上,可以。不过有一些限制:

树莓派内存太小,没办法运行更准确的基于CNN的面部检测器;

因此只能用HOG方式;

即使如此,HOG方式在树莓派上也太慢,没办法用于实时面部检测;

所以只能用OpenCV的Haar层叠方式。

即使这样能运行起来,实际的速率也只有1~2FPS,而且就算是这种速率也需要许多技巧。

▌总结

在这篇指南中,我们学习了如何利用OpenCV、Python和深度学习来进行面部识别。此外,我们还利用了Davis King的dlib库和Adam Geitgey的face_recognition模块,后者对dlib的深度度量学习进行了封装,使得面部识别更容易完成。

我们发现,我们的面部识别实现同时具有以下两个特点:准确,并且能在GPU上实时运行。