从零开始写高性能的人脸识别服务器(一)
文章目录
- 从零开始写高性能的人脸识别服务器(一)
- 1 技术选型
- 2 环境准备
- 2.1 安装**face_recoginize**
- 2.2 安装Redis
- 2.3 Qt5.9.9的安装
- 3 效果演示
- 3.1 Web端展示
- 3.2 Qt客户端展示
从零开始写高性能的人脸识别服务器(一)
从零开始写高性能的人脸识别服务器(二)
从零开始写高性能的人脸识别服务器(三)
从零开始写高性能的人脸识别服务器(四)
从零开始写高性能的人脸识别服务器(一)
如今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做消息队列处理的比较垃圾,架构很垃圾。基本结构如下:
git仓库地址:地址 欢迎大家star!!!!
2 环境准备
技术选型定好之后,我们接下来准备环境,Java的环境不用具体介绍了,编译环境我用的是idea,基于maven开发的。下面我们根据教程来做安装,如果不想做C客户端的可以绕过QT的那一部分。
2.1 安装face_recoginize
需要注意的是一定要用Python3.6版本 ,版本不符合会出现各种各样的问题,dlib版本一定要选择19.7.0的,要不然会出现各种问题。下面介绍一下win10环境下的安装。linux下的安装地址
(1)创建anaconda python3.6环境
conda create --name your_env_name python==3.6.0
(2)安装dlib
必须是19.7.0版本,不要直接写“pip install dlib”。这样会安装最新的版本。
pip install dlib==19.7.0
(3)安装face_recognition
pip install face_recognition
至此就大功告成了。
2.2 安装Redis
本项目中用到了Redis,所以大家需要安装redis,linux环境下的直接百度搜安装教程一大堆。window版本的git:下载地址。安装完之后,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安装包,只需要安装其中的"Debugging Tools for Windows“。如果在遇到其他问题,就百度一下解决方案,这个项目是半年前写的,这段时间有时间我就开源,一些细节啥的忘记了。只记得这篇博客帮了我很多。
3 效果演示
前端写的比较简陋粗糙,因为重心不在前端页面上。注意Web展示的时候我用的本地的html。如果想要在网络地址中使用电脑摄像头,网络地址得支持Https协议。
3.1 Web端展示
由于CSDN上传Gif文件有大小限制,所以我这里直接上截图了
(1)请求摄像头权限
(2)点击拍照,截取图像
(3)上传人脸
点击上传人脸,在弹出的对话框里面输入自己的姓名
(4)点击确定显示上传成功
(5)点击识别,进行人脸识别
3.2 Qt客户端展示
Qt客户端使用了OpenCv调取电脑摄像头。
(1)上传人脸
(2)人脸识别
从零开始写高性能的人脸识别服务器(一)相关推荐
- 从零开始写高性能的人脸识别服务器(二)
文章目录 从零开始写高性能的人脸识别服务器(二) 1 高性能服务器架构 1.1 BIO 1.2 NIO 1.3 架构发展 1.4 网络IO模型对比 2 protobuf序列化协议 2.1 什么是序列化 ...
- 从零开始写高性能的人脸识别服务器(三)
这里写自定义目录标题 从零开始写高性能的人脸识别服务器(三) 1 消息格式 1.1 定义Proto 1.2 编译 2 人脸识别微服务 3 Netty服务器 从零开始写高性能的人脸识别服务器(三) ...
- 人脸识别智能服务器,智能化人脸识别服务器
智能化人脸识别服务器,同时,在新基建的运维管理方面有了进一步的创新,通过自身的研发实现了对各基建网点的自动化全实时监测,及时发现故障并发出警示.自动处理故障网点.通知运维人员通过远程及时处理故障网点. ...
- 自己写一个控制台人脸识别程序
自己写一个控制台人脸识别程序 其中用到的技术:IO文件流,api,json,集合 package com.aa; /****************************************** ...
- 松下推出人脸识别服务器软件 使用深度学习技术
文章来源:ATYUN AI平台 松下公司宣布,采用深度学习技术的人脸识别服务器软件将于2018年7月在海外先行推出,而8月才在日本本土推出. [视频]使用深度学习技术的人脸识别服务器软件 视频链接:松 ...
- 人脸识别智能服务器,【功能实测】大华股份DH-IVS-F7300 动态人脸识别服务器
大华人脸识别服务器 DH-IVS-F7300系列是大华研发的新一代智能视频分析服务器,产品具有人脸实时抓拍.实时建库.布控报警.抓拍库检索历史轨迹和注册库检索.人像库相互比对等功能,可应用于重点通道出 ...
- 人脸识别服务器型号,人脸识别服务器,人脸识别接口,人脸识别方案定制开发
1.简述 1.1 DWFACE人脸识别SDK 由dwface和www两个文件夹内程序组成. 1.2 dwface实现人脸识别算法,是人脸识别核心引擎. 1.3 www 是B/S架构下与底层dwface ...
- 人脸识别服务器架构设计
临时的遐想设计,可能不够成熟,欢迎大家点评 1.网关连接状态服务器,网关定期向状态服务汇报它的client数目(状态包),状态服根据连接数目或者收到状态包的时间差来决定网关的繁忙状态,当client连 ...
- 动态人脸识别系统服务器,大华股份DH-IVS-F7300 动态人脸识别服务器
产品特点 Intel Xeon E5-2680 v2 2.80GHZ /32G/64G 内存/3T 3.5 吋 6GbSATA 硬盘*5/双口千兆网卡/4 个 USB2.0 接口.2 个 USB3.0 ...
最新文章
- harris角点检测与绘制。通过滑动滚动条来控制阈值,以控制检测角点的数量并返回角点坐标
- UI设计培训:UI构思创意技巧和方法
- 快来看看Google出品的Protocol Buffer,别仅仅会用Json和XML了
- Java中如何使用Thread和Runnable创建的线程
- 分割范围Codeforces Round #181 (Div. 2)
- [渝粤教育] 广东-国家-开放大学 21秋期末考试大数据营销10138k2
- 实现原理 扫描枪_激光条码扫描枪原理及五大组成部分!
- Smartdrv在安装操作系统中的作用
- 高大上的PPT表格都是怎样制作完成的
- 「文档编写」- 常见序号写法 @20210412
- mate桌面美化 Linux,ubuntu mate 15.04桌面的美化
- 110001 《创业的旅途》读后感——坚持梦想,虔诚对待,相信生命的奇迹
- 搭建iis自己可以别人_自己也可以搭建一台好用实惠的软导一体机!
- 向Android系统中添加模块及产品流程
- ZigBee设备OTA过程研究及优化
- Laravel的中大型项目构架
- 线下门店如何自动统计每日业绩
- Mac 没法登陆,进入Safe boot模式
- C++之重载:函数名的鱼塘
- python3手动配置环境变量
热门文章
- springboot+vue+Elementui农家乐管理系统-住宿-美食-活动
- AWS之(2) RDS数据库新建
- android 键编译,Android 音视频学习系列 (四) 一键编译 32/64 位 FFmpeg 4.2.2
- OSChina 周二乱弹 —— 好支威有希
- STM32-ESP8266解析天气
- 永久免费 内网穿透工具 傻瓜式配置
- 智汀如何让绿米Aqara无线开关一键联动不同品牌的智能设备?以智汀窗帘电机、星辰智能台灯为例
- 实现网站的高并发访问
- 如何实现自适应页面 (响应式布局)
- 经典语录-2014330