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

2018-07-20 05:58:36来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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上实时运行。

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:【leetcode】存在重复【C、Python】

下一篇:Python爬虫的两套解析方法和四种爬虫实现