Openface在Kubernetes上的实践

 ■ 文/天云软件 研发工程师 陈雪锋

一、概述

本文介绍的是在Kubernetes中实现Openface的一个demo。Openface是一个基于dlib、OpenCV和深度卷积网络的开源应用。其源码和资料可以参考本文结尾处链接,在此不作赘述。

Openface进行人脸识别的过程如下图可以分为几个过程:

f1

1. 鉴别人脸位置

检测人脸位置目前在各个相机、手机等照相应用中都有使用,会自动聚焦于人脸,Openface中使用的是dlib、OpenCV的人脸检测方法。

2. 提取特征向量,进行人脸“校准”

得到原始图像+人脸位置的输入,这一步就要检测人脸中的关键点,然后根据这些关键点对人脸做对齐校准。这些关键点包括眼睛大小位置、鼻子位置、嘴的位置等。然后提出这些特殊点进行校准,无论是在侧脸、低头或是仰视的角度,都能粗略地将眼睛和嘴巴集中到图片中的同一位置。

3. 深度卷积处理

这一步利用深度卷积网络将输入的人脸图像转成128*1的向量表示。这一步骤通常要重复几百万次,之后就可以为每一个人脸生成128个测量,对于同一个人的多张不同图片,它都能够给出基本相同的测量。

4. 进行人脸识别

有了人脸的向量表示后,就可以进行人脸识别了。每当输入一张人脸图片,就可以根据测量值在数据库中找到这个人,这个可以用多种机器学习算法进行完成(比如k-means)。

Kubernetes是谷歌开源的一个大规模容器集群管理系统,能够很方便的管理机器运行容器化的应用。而且Openface放入docker中运行并交给Kubernetes进行管理极大的提高了其移植性与可用性。

二、实现探索 

1. 准备镜像

将官方镜像pull下来:

docker pull docker.io/bamos/openface

至此,我们已经做了最基础的准备,下面开始分别在docker和Kubernetes上实践。

2. 直接在docker上的实践

根据镜像官网上的说明,运行以下命令启动Openface,将9000端口暴露出来以供web访问,-d以后台启动,最后添加命令当容器启动后启动server服务器

docker run -p 9000:9000 -p 8000:8000 -d bamos/openface \

./root/openface/demos/web/start-servers.sh

查看容器日志可以看到容器成功启动,然后在浏览器中输入https://hostIP:8000成功访问页面。

f2

f3

现在验证了我们的镜像和上面的操作步骤是可行与可靠的,下面就将其移植到Kubernetes上来。

3. 在Kubernetes上的实践

首先我们要搭建个Kubernetes集群,这个可以在其官网上参考安装教程。我们将其安装在centos7上,现在我们已经有了一个具有6个节点的Kubernetes集群其中vm1为master,其余为计算节点。

f4

然后为了使用方便我们替换下它的端口号:

docker run -p 9000:9000 -p 8000:8000 -t -i bamos/openface /bin/bash

cd /root/openface/demos/web/

编辑文件 index.html将端口号9000替换为31500

提交我们所做的修改,命名格式将我们的私有镜像仓库地址也加上:

docker commit $CONTAINERID registry.harbor:5000/demo/openface

将修改后的镜像推送到我们的镜像仓库中去:

docker push registry.harbor:5000/demo/openface

接下来就要编写yaml文件了,在master节点编写yaml文件,命名为openface.yaml,其中包括一个service和一个ReplicationController。其中service定义要暴露的端口,我们利用nodePort暴露端口以便外部能够通过nodeIP:nodePort进行访问应用,在Container我们加入启动命令,启动web-server,并且将相应端口号暴露出来。

f5

f6

f7

现在万事俱备只欠东风了,接下来就创建我们的服务和pod了,kubectl create -f openface.yaml

f9

然后可以看到已经在一个节点成功运行了一个pod

f10

访问任一https://nodeIP:31501试试。成功了,而且已经可以顺利的进行训练和识别了。

f11

我们这里只运行了一个pod,为了提高可用性,我们将其扩展到4个,这样即使一个节点宕机也不会出现服务中断的问题。

f12

至此我们已经在Kubernetes上成功运行了Openface的一个demo。

后续还可以利用Kubernetes的打包工具helm进行打包将其做成一个应用,这样就可以更加方便的部署了,有机会后续会继续跟大家分享。

三、备注

Openface源码:https://github.com/cmusatyalab/openface

dlib源码:https://github.com/davisking/dlib

OpenCV实现:OpenCV实现原理

Kubernetes搭建:kubernetes集群搭建

—END—