Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!
进群:125240963 即可获取数十套PDF哦!
▌理解深度学习面部识别嵌入
那么,基于深度学习的面部识别是怎样工作的呢?秘密就是一种叫做“深度度量学习”的技术。
如果你有深度学习的经验,你应该知道,通常情况下训练好的网络会接受一个输入图像,并且给输入的图像生成一个分类或标签。
图1:利用深度度量学习进行面部识别需要“三元组训练”。三元组包括三张不同的面部图像,其中两张属于同一个人。神经网络为每张面部图像生成一个128维向量。对于同一个人的两张面部图像,我们调整神经网络使得输出向量的距离度量尽可能接近。
强烈建议阅读以上文章,以深入了解深度学习面部嵌入的工作原理。
▌安装面部识别库
为了用Python和OpenCV吸纳面部识别,我们需要安装一些库:
$ 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
▌面部识别数据集
$ 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
▌用OpenCV和深度学习对面部进行编码
图3:利用深度学习和Python进行面部识别。对每一个面部图像,用face_recognition模块的方法生成一个128维实数特征向量。
在识别图像和视频中的面部之前,我们首先需要在训练集中识别面部。要注意的是,我们并不是在训练网络——该网络已经在300万图像的训练集上训练过了。
首先需要导入必需的包。这个脚本需要事先安装imutils、face_recognition和OpenCV。请翻到前面“安装面部识别库”一节确保你已经安装了必须的库。
首先用argparse处理运行时传递的命令行参数:
行3用输入数据集的路径,建立了一个列表imagePaths。
我们还需要在循环开始之前初始化两个列表,分别是knownEncodings和knownNames。这两个列表分别包含面部编码数据和数据集中相应人物的名字(行6和行7)。
现在可以依次循环侏罗纪公园中的每个角色了!
接下来定位面部位置并计算编码:
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方法传递了两个参数:
行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,那么速度应该会快得多。
▌识别图像中的面部
注意:别忘了我们的模型是根据原版电影中的四个角色进行训练的: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上实时运行。