当前位置: 首页 > news >正文

从服务器端获取人脸数据,在本地检测特征,并将特征发送给服务器

目录

1.定义函数get_database_process:        

2.定义函数features_construct:

3.定义函数send_features_data:

4. 定义函数database_features_construct:

5. main 函数


1.定义函数get_database_process:        

        首先,发送一条消息,告知服务器端要进行人脸数据库特征构建

message_to_send = {'message': 'get_database_face', 'data': 0}

        然后就等待接收 服务端发送的数据,并将数据存储在多进程队列result_queue 中,等待检测函数获取。

        接收数据格式:

{”name“: 姓名, "image": 图片}

def receive_send(client_socket, result_queue):"""接收服务器端 receive_data信息,若成功接收则发送success 否则发送 failure并将信息存储在result_queue 中Args:client_socket:"""receive_data = client_socket.recv(4096000)receive_data = receive_data.decode('utf-8')if len(receive_data):feedback_data = 'success'client_socket.sendall(feedback_data.encode('utf-8'))result_queue.put(receive_data)else:feedback_data = 'failure'client_socket.sendall(feedback_data.encode('utf-8'))
def get_database(client_socket, result_queue):"""从服务器端接收数据(姓名,图片)  {”name“: 姓名, "image": 图片}放在result_queue队列中,然后让本地模型检测特征 用于人脸数据库的构建Args:client_socket:result_queue:"""message_to_send = {'message': 'get_database_face', 'data': 0}send_receive(client_socket, message_to_send)while True:receive_send(client_socket, result_queue)

2.定义函数features_construct:

        从 result_queue 队列中取出,从服务器获取的人脸数据库信息(姓名,图片) {”name“: 姓名, "image": 图片}

        然后 将数据 进行 字节序列解码为字符串的操作,

        再将 JSON 格式的字符串转换为 Python 对象 词典,

        然后提取,姓名,人脸图片

        然后将经过Base64编码的图像数据解码,并使用OpenCV库将解码后的字节数据转换为NumPy数组,以便在Python中进行图像处理和分析

        使用app.get 检测人脸特征 并存放在 result_queue1 以待发送

        存放在 result_queue1 队列的 数据格式为词典形式

       {”name“: 姓名, "feature": 人脸特征}

        姓名:str

        人脸特征:[ 1,2,3..............]

def features_construct(app, result_queue, result_queue1):"""从 result_queue 队列中取出,从服务器获取的人脸数据库信息(姓名,图片)  {”name“: 姓名, "image": 图片}使用app.get 检测人脸特征 并存放如result_queue1 以待发送发送数据格式  {”name“: 姓名, "feature": 人脸特征}Args:app:result_queue:result_queue1:"""while True:while not result_queue.empty():face_data = result_queue.get()face_data = json.loads(face_data.decode('utf-8'))name = face_data['name']image = face_data['image']# 解码图像img_bytes = base64.b64decode(image)# 将字节数据转换为NumPy数组image = cv2.imdecode(np.frombuffer(img_bytes, np.uint8), cv2.IMREAD_COLOR)features = []data_dict = {}for i in range(image):img = image[i]face_all = app.get(img)for face_single in face_all:  # 遍历每个人脸features.append(face_single.normed_embedding)  # 将人脸的嵌入特征加入features列表feature = mean_feature_fusion(features)data_dict['name'] = namedata_dict['feature'] = featureresult_queue1.put(data_dict)

3.定义函数send_features_data:

       从多进程队列result_queue1 中 读取数据 feature_data,

        添加消息头message:feature

        数据格式:

{'message': 'feature', "name": '姓名', 'feature': "人脸特征"}

        将词典数据 转换为JSON格式的字符串

        然后对字符串进行UTF-8编码 进行传输

def send_features_data(client_socket, result_queue1):"""进行数据发送,将多进程队列result_queue1 中 数据读取并发送回服务器端  :人脸数据可特征构建人脸特征数据(姓名,特征数据)Args:client_socket:result_queue: 多进程队列"""while True:while not result_queue1.empty():feature_data = result_queue1.get()feature_data['message'] = 'feature'json_data = json.dumps(feature_data)send_receive(client_socket, json_data)
def send_receive(client_socket, data):"""发送数据 data,并接收服务器端  feedback信息Args:client_socket:data: 要发送的数据"""client_socket.sendall(data.encode('utf-8'))feedback_data = client_socket.recv(1024)feedback_data = feedback_data.decode('utf-8')print("已发送数据,对方已接收,反馈信息为:", feedback_data)

4. 定义函数database_features_construct:

        使用多进程 将上述函数串联起来

def database_features_construct(app, result_queue, result_queue1):# 服务器地址和端口server_address = ('192.168.2.4', 12345)# 创建一个TCP socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接到服务器client_socket.connect(server_address)print(f"Connected to server at {server_address}")# 发送消息给服务器message_to_send = "Hello, server! This is the client."client_socket.send(message_to_send.encode('utf-8'))# 接收服务器消息data = client_socket.recv(1024)print(f"Received data from server: {data.decode('utf-8')}")get_database_process = multiprocessing.Process(target=get_database, args=(client_socket, result_queue))features_construct_process = multiprocessing.Process(target=features_construct, args=(app, result_queue, result_queue1))send_features_data_process = multiprocessing.Process(target=send_features_data, args=(client_socket, result_queue1))# 启动进程get_database_process.start()features_construct_process.start()send_features_data_process.start()# 等待两个进程结束get_database_process.join()features_construct_process.join()send_features_data_process.join()# 关闭连接client_socket.close()

5. main 函数

if __name__ == "__main__":parser2 = argparse.ArgumentParser(description='insightface app test')  # 创建参数解析器,设置描述为'insightface app test'# 通用设置parser2.add_argument('--ctx', default=0, type=int,help='ctx id, <0 means using cpu')  # 添加参数'--ctx',默认值为0,类型为整数,帮助信息为'ctx id, <0 means using cpu'parser2.add_argument('--det-size', default=640, type=int,help='detection size')  # 添加参数'--det-size',默认值为640,类型为整数,帮助信息为'detection size'face_args = parser2.parse_args()  # 解析参数face_app = FaceAnalysis()  # 创建FaceAnalysis实例face_app.prepare(ctx_id=face_args.ctx, det_size=(face_args.det_size, face_args.det_size))  # 准备分析器,设置ctx_id和det_sizeresult_queue = multiprocessing.Queue()  # 多进程队列result_queue1 = multiprocessing.Queue()database_features_construct(face_app, result_queue, result_queue1)

相关文章:

  • ubuntu20中安装cmake-gui
  • 计算机毕业设计 基于SpringBoot的车辆网位置信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 【Rust】快速教程——从hola,mundo到所有权
  • 为什么Transformer模型中使用Layer Normalization(Layer Norm)而不是Batch Normalization(BN)
  • Java中的集合内容总结——Collection接口
  • macOS下如何使用Flask进行开发
  • 下厨房网站月度最佳栏目菜谱数据获取及分析
  • 探索NLP中的核心架构:编码器与解码器的区别
  • mac苹果电脑需要安装杀毒软件吗?
  • Go 之 captcha 生成图像验证码
  • 使用docker部署ELK日志框架-Elasticsearch
  • 使用 Redis 实现分布式锁,解决分布式锁原子性、死锁、误删、可重入、自动续期等问题(使用SpringBoot环境实现)
  • 封装比较好的登录页面
  • 性能测试常见问题总结
  • 数据库表字段以表格形式写入Word
  • 【node学习】协程
  • 【剑指offer】让抽象问题具体化
  • JavaScript的使用你知道几种?(上)
  • JavaScript类型识别
  • Java读取Properties文件的六种方法
  • Java教程_软件开发基础
  • Js基础知识(一) - 变量
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • react 代码优化(一) ——事件处理
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 关于 Cirru Editor 存储格式
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 入门级的git使用指北
  • 深度学习中的信息论知识详解
  • 我看到的前端
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一份游戏开发学习路线
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • # .NET Framework中使用命名管道进行进程间通信
  • # 达梦数据库知识点
  • #微信小程序(布局、渲染层基础知识)
  • (33)STM32——485实验笔记
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (arch)linux 转换文件编码格式
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)LINQ之路
  • (转)原始图像数据和PDF中的图像数据
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .sh 的运行
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @EnableAsync和@Async开始异步任务支持
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • []串口通信 零星笔记