在过去的十年中,深度学习(DL)取得了巨大的成功。最好的人脸识别系统可以在图像和视频中识别人脸,其精度与人类相当,甚至更高。本文分为两部分:人脸检测和人脸识别。假设熟悉DNN、Python、Keras和TensorFlow。欢迎下载本项目代码以跟随学习。
从在边缘设备上运行的客户端部分开始。首先,编写一个简单的类,该类将人脸图像发送到服务器:
class ImgSend:
def __init__(self, host, port, debug_mode=False):
self.host = host
self.port = port
self.url = host + ":" + str(port) + "/api/faceimg"
self.dbg_mode = debug_mode
def send(self, img):
# 省略部分代码...
response = requests.post(self.url, data=data, headers=headers)
# 省略部分代码...
return result
构造函数接收host和port参数,并形成最终的URL,带有特殊路径/api/faceimg,以将请求路由到面部识别方法。在send方法中,将图像编码为png格式,将其转换为字符串,并使用requests.post函数将字符串发送到服务器。
让转向服务器应用程序。使用Flask微框架将面部识别代码包装在Web API中:
from flask import Flask, request, Response
app = Flask(__name__)
@app.route("/api/faceimg", methods=['POST'])
def test():
# 省略部分代码...
response = {
"message": "RECOGNIZED",
"name": name,
"percent": str(percent)
}
# 省略部分代码...
return Response(response=response_pickled, status=r_status, mimetype="application/json")
在初始化Flask应用程序后,应用route装饰器以触发test方法与指定的URL(客户端应用程序使用的URL相同)。在这个方法中,解码收到的人脸PNG图像,获取嵌入,识别面部,并将响应发送回客户端。
最后,这是运行Web应用程序的代码:
if __name__ == "__main__":
# 省略部分代码...
app.run(host=host, port=port, threaded=False)
由于将在创建的Docker容器中运行Web应用程序,因此需要使用适当的网络设置启动此容器。使用以下命令从映像创建新容器:
c:\>docker network create my-net
c:\>docker create --name FR_2 --network my-net --publish 5050:50 sergeylgladkiy/fr:v1
当FR_2容器启动时,它将主机机器的5050端口转发到容器的内部端口50。现在可以在容器中运行应用程序(注意,因为它在容器内,指定内部端口50):
# python /home/pi_fr/pi_fr_facenet.run_align_dock_flask.lnx.py
0.0.0.0 50
当服务器启动时,可以在Raspberry Pi设备上运行客户端。以下是用来启动应用程序的代码:
if __name__ == "__main__":
# 省略部分代码...
(f_count, rec_count, fps) = vr.process(v_file, True, save_path)
print("Face detections: " + str(f_count))
print("Face recognitions: " + str(rec_count))
print("FPS: " + str(fps))