# 从零开始写高性能的人脸识别服务器
# 一、项目介绍
```
如今AI的应用越来越广,但是对于AI产品技术的部署落地是一个很多人都会忽视的地方,因为大部分的AI服务都是基于Python的,将基于Python的AI程序如何部署到Web或者其他平台是一个问题,本专栏将从零开始写一个高性能支持高并发的人脸识别服务器。因为本人的技术栈是Java,所以使用Java的高性能网络IO模型库Netty进行服务器的开发,AI的模型大部分都是Python进行开发的,所以也使用了基于Python的人脸识别框架**face_recoginize**用来开发人脸识别的微服务。由于AI模型的加载一般都很耗时,所以把Python的AI程序做成微服务,服务器和AI微服务之间通过redis队列进行通信。
```
## 1 技术选型
Java 高性能网络模型框架首选 Netty。人脸识别程序选用基于 Python 的人脸识别库 **face_recoginize**.选用 Redis 做消息队列。因为模型在预加载是会很耗时,所以将 Python 人脸识别程序包装成微服务。
由于 Python 全局解释器锁(GIL)的存在,解释器解释执行任何 Python 代码时,都需要先获得这把锁才行,在遇到 I/O 操作时会释放这把锁。如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁,让别的线程有机会执行(这个次数可以通过 sys.setcheckinterval 来调整)。所以虽然 CPython 的线程库直接封装操作系统的原生线程,但 CPython 进程做为一个整体,同一时间只会有一个获得了 GIL 的线程在跑,其它的线程都处于等待状态等着 GIL 的释放。也就是说,对 Python 而言,计算密集型的多线程,其实性能和单线程是一样的。解决方法就是同时运行多个 Python 程序,也就是采用多进程的方式。
Java 服务器收到数据之后,将数据存储在 Redis 的 key1 中,此时产生一个 key2(存储 Python 程序的处理结果)。Java 使用随机数获取随机的处理进程。将 key1 存储到该进程监听的队列中,然后 Java 监听 key2 获取 Python 进程的处理结果,拿到结果之后返回给客户端。
客户端我写了 C 的和 HTML 的。C 的程序使用的是 **Qt5.9.9** + **opencv-2.4.11** + **protobuf-3.1.0**, 之所以这样选,是因为之前是基于 QT5.14 开发的,后面发现程序写完之后发给导师,导师的电脑是 win7,程序打开就崩溃,这也是为啥都说华为现在还在用 VS2013 的原因,因为只有 MSVC2013 版本的才可以兼容 win7 和 win10。然后选择 MSVC2013 之后,Protobuf 的版本就不能太高,因为高版本的 Protobuf 都是基于 C++11 的高级特征,MSVC 只支持一小部分的 C++11 特征,所以使用高版本的会因为不兼容而出错。
因为本菜鸡还不懂架构的一些东西,所以这里的 Redis 做消息队列处理的比较垃圾,架构很垃圾。基本结构如下:
![](https://www.writebug.com/myres/static/uploads/2022/1/3/4b9562d3b48368a114f564053a3ebba2.writebug)
## 2 环境准备
```
技术选型定好之后,我们接下来准备环境,Java的环境不用具体介绍了,编译环境我用的是idea,基于maven开发的。下面我们根据教程来做安装,如果不想做C客户端的可以绕过QT的那一部分。
```
### 2.1 安装 **face_recoginize**
需要注意的是**一定要用 Python3.6 版本** ,版本不符合会出现各种各样的问题,dlib 版本一定要选择 19.7.0 的,要不然会出现各种问题。下面介绍一下 win10 环境下的安装。Linux 下的[安装地址](https://blog.csdn.net/weixin_40450867/article/details/81734815)
(1)创建 anaconda python3.6 环境
```shell
conda create --name your_env_name python==3.6.0
```
(2)安装 dlib
必须是 19.7.0 版本,不要直接写“pip install dlib”。这样会安装最新的版本。
```shell
pip install dlib==19.7.0
```
(3)安装 face_recognition
```shell
pip install face_recognition
```
至此就大功告成了。
### 2.2 安装 Redis
本项目中用到了 Redis,所以大家需要安装 Redis,Linux 环境下的直接百度搜安装教程一大堆。window 版本的 git:[下载地址](https://github.com/MicrosoftArchive/redis/releases)。安装完之后,Python 要安装 Redis 模块。
### 2.3 Qt5.9.9 的安装
这里是安装 C 客户端的程序,如果不需要客户端的程序,可以直接跳过。
Qt 安装直接去百度搜就可以搜到一大堆,在安装的时候选择 MSVC2013。需要注意的是,Qt 想开发 MSVC 环境下编译的程序,**必须要下载相应版本的 VS2013,要不然没法进行编译**,Qt5.9.9 使用的是 MSVC2013,所以要下载 vs2013。
没用过 Qt 的小伙伴可能会遇到 Debug 不可以调试的错误,Qt 项目页选择 MinGW 编译器方式,编译 debug 和 release 版本运行后都可以正常运行,如果是 MSVC 编译器方式,release 版本编译后能正常运行,debug 版本编译正常,但是运行会异常退出,调试弹出 The CDB process terminated 提示框。
解决方法是安装安装 CDB 调试器时,下载 [Windows SDK 安装包](https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive),只需要安装其中的"Debugging Tools for Windows“。如果在遇到其他问题,就百度一下解决方案,这个项目是半年前写的,这段时间有时间我就开源,一些细节啥的忘记了。只记得[这篇博客](https://blog.csdn.net/HuntCode/article/details/94552935)帮了我很多。
## 3 效果演示
前端写的比较简陋粗糙,因为重心不在前端页面上。注意 Web 展示的时候我用的本地的 HTML。如果想要在网络地址中使用电脑摄像头,网络地址得支持 Https 协议。
### 3.1 Web 端展示
由于 CSDN 上传 Gif 文件有大小限制,所以我这里直接上截图了
(1)请求摄像头权限
![](https://www.writebug.com/myres/static/uploads/2022/1/3/3bc0a737dad1fb2ed35b7df11d3ce445.writebug)
(2)点击拍照,截取图像
![](https://www.writebug.com/myres/static/uploads/2022/1/3/f5cbd3da769c2b7c2264caf356565725.writebug)
(3)上传人脸
点击上传人脸,在弹出的对话框里面输入自己的姓名
![](https://www.writebug.com/myres/static/uploads/2022/1/3/f75bcde3997e851b6f63b5f302e850e5.writebug)
(4)点击确定显示上传成功
![](https://www.writebug.com/myres/static/uploads/2022/1/3/371cee9a428a2fd5bacae39a9c8054ac.writebug)
(5)点击识别,进行人脸识别
![](https://www.writebug.com/myres/static/uploads/2022/1/3/be0909c944910d803456a03df99aaf70.writebug)
### 3.2 Qt 客户端展示
Qt 客户端使用了 OpenCv 调取电脑摄像头。
(1)上传人脸
![](https://www.writebug.com/myres/static/uploads/2022/1/3/fa8d906183cf45948556314482f6f8a9.writebug)
(2)人脸识别
![](https://www.writebug.com/myres/static/uploads/2022/1/3/bd1ea6ad775f498e2e7f88f479ab8a94.writebug)
# 二、高并发高负载解决
在这一章,我将带领大家从以下三个方面了解一下项目是如何承载高并发与高负载的,分别是高性能的网络 IO 模型、Protobuf 序列化协议以及 AI 模型多进程微服务。Netty 据说可以承受百万级的并发,使用 Protobuf 序列化传输数据,提升数据的传输效率。
## 1 高性能服务器架构
Java 服务器架构的发展从一开始的 BIO,发展到 NIO,再发展到如今基于 NIO 的 Netty。相信大家如果不理解 Netty 的话,应该也写过 socket 通信(没写过 socket 通信的,麻烦去学习一下谢谢),如果一次性有上万个请求过来,你启动了上万个线程去处理请求,此时你的机器就炸了,Linux 最大支持两千个线程,想支持更多,就得去改配置文件。而且一台机器能承受的线程数是有限的,当线程数量超过一定数量�
没有合适的资源?快使用搜索试试~ 我知道了~
基于Netty和Python的face-recognition库实现的高性能的人脸识别服务器.完整项目代码 计算机毕设
共76个文件
java:17个
xml:7个
dll:7个
需积分: 5 0 下载量 164 浏览量
2023-02-10
19:44:08
上传
评论
收藏 9MB ZIP 举报
温馨提示
本文将从零开始写一个高性能支持高并发的人脸识别服务器。因为本人的技术栈是Java,所以使用Java的高性能网络IO模型库Netty进行服务器的开发,AI的模型大部分都是Python进行开发的,所以也使用了基于Python的人脸识别框架face_recoginize用来开发人脸识别的微服务。由于AI模型的加载一般都很耗时,所以把Python的AI程序做成微服务,服务器和AI微服务之间通过redis队列进行通信。Java 高性能网络模型框架首选 Netty。人脸识别程序选用基于 Python 的人脸识别库 face_recoginize.选用 Redis 做消息队列。因为模型在预加载是会很耗时,所以将 Python 人脸识别程序包装成微服务。 由于 Python 全局解释器锁(GIL)的存在,解释器解释执行任何 Python 代码时,都需要先获得这把锁才行,在遇到 I/O 操作时会释放这把锁。如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁,让别的线程有机会执行(这个次数可以通过 sys.setcheckinterval 来调整)。所以虽然 CPython
资源推荐
资源详情
资源评论
收起资源包目录
基于Netty和Python的face_recognition库实现的高性能的人脸识别服务器.zip (76个子文件)
facerecognitionserver
Qt
build-FaceRecognitionClient-Desktop_Qt_5_9_9_MSVC2013_64bit-Debug
Makefile 26KB
debug
moc_dialog.cpp 5KB
dialog.obj 573KB
moc_dialog.obj 300KB
moc_uploadimagethread.obj 262KB
ResultProto.pb.obj 260KB
FaceRecognitionClient.ilk 2.15MB
facerecognitionclient.vc.pdb 2.75MB
ImageProto.pb.obj 313KB
FaceRecognitionClient.exe 208KB
uploadimagethread.obj 331KB
haarcascade_frontalface_alt2.xml 528KB
libprotobufd.dll 7.54MB
main.obj 316KB
moc_predefs.h 263B
moc_uploadimagethread.cpp 4KB
FaceRecognitionClient.pdb 3.62MB
Makefile.Release 94KB
Makefile.Debug 94KB
.qmake.stash 664B
FaceRecognitionClient
dialog.cpp 6KB
Makefile 32KB
Release
libprotoc.lib 253KB
libprotobuf-lite.dll 303KB
libprotobuf.dll 2.2MB
libprotoc.dll 1.7MB
libprotobuf-lite.lib 494KB
libprotobuf.lib 2.95MB
main.cpp 238B
ResultProto.pb.cc 16KB
FaceRecognitionClient_zh_CN.ts 116B
Makefile.Release 110KB
uploadimagethread.h 1KB
ImageProto.pb.h 10KB
FaceRecognitionClient.pro.user 22KB
ImageProto.pb.cc 21KB
ResultProto.pb.h 8KB
FaceRecognitionClient.pro 2KB
Makefile.Debug 110KB
uploadimagethread.cpp 4KB
.qmake.stash 1KB
dialog.h 2KB
Debug
libprotobufd.lib 2.95MB
libprotocd.dll 4.73MB
libprotocd.lib 254KB
libprotobuf-lited.dll 1006KB
libprotobufd.dll 7.54MB
LICENSE 1KB
Web前端
jquery-3.3.1.min.js 85KB
camera.html 7KB
Netty
FaceRecognitionServer
pom.xml 4KB
dependency-reduced-pom.xml 2KB
src
main
java
xin
marico
facerecogition
initializer
SocketInitializer.java 1KB
HttpInitializer.java 1KB
handler
HttpHandler.java 7KB
SocketHandler.java 5KB
utils
RequestUtils.java 2KB
UUIDUtils.java 480B
test
Test2.java 718B
RedisPub.java 574B
StudentProto.java 35KB
Student.java 1KB
Test.java 744B
Demo1.java 704B
server
FaceRecognitionServer.java 3KB
vo
ImageProto.java 27KB
Result.java 546B
Image.java 780B
ResultProto.java 19KB
FaceRecognitionServer.iml 80B
.idea
uiDesigner.xml 9KB
workspace.xml 10KB
misc.xml 529B
compiler.xml 542B
README.md 51KB
Python人脸识别
facerecogntion.py 5KB
共 76 条
- 1
资源评论
计算机毕设论文
- 粉丝: 1w+
- 资源: 398
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功