微表情识别API + c++并发服务器系统

微表情识别API + c++并发服务器系统

该项目只开源c++并发服务器程序,模型API部分不开源
地址:https://github.com/lin-lai/-API-

更新功能

4.1版本

  1. 改用epoll实现IO多路复用并发服务器

项目介绍

本项目用于检测并识别视频中人脸的微表情

目标任务:

  1. 用户上传一段人脸视频—final.mp4

    在这里插入图片描述

  2. 合成可以播放的处理后HLS视频流文件,用户可下载

    在这里插入图片描述

    在这里插入图片描述

演示视频:

https://www.bilibili.com/video/BV13u4y1C7ZT/


项目架构

总结构

前后处理模块+API识别模块

c++版服务器+识别API

开源和演示都是c++版
在这里插入图片描述

python版服务器+识别API

在这里插入图片描述

前后处理模块

版本1:linux的c++并发服务器项目
  1. TCP套接字服务器

  2. IO多路复用(select)实现并发

  3. 指令上传下载视频

  4. 文件传输设置开始结束标志位

  5. 使用消息前缀传输数据,防止粘包

  6. 子进程使用ffmpeg分块转成1s的ts流

  7. 循环向API发送视频请求,处理json

  8. 循环合成新视频

版本2:python推流并发服务器
  1. 前台:tornado并发服务器

  2. 分块MP4—ffmpeg

  3. 异步并发 发送API请求,处理json----asyncio+aiohttp

  4. oss推流——阿里云oss服务


API模块

1.pytorch训练识别模型
模型

双帧法 基于resnet的改进模型

结果

在测试集上,模型达到了98%的准确率

输入

一段1s视频

输出

识别到的视频人物表情类别

2.torchserve封装识别模型和检测模型
检测模型

opencv的人脸检测模型

输入

一段1s视频

输出

识别到的类别和视频每一帧的识别人脸所在框组成的json字符串

#示例json
[["surprise",[[136,503,87,454],[135,504,85,454],// other data...]
]
3.在docker容器中部署组成微服务API
运行环境

可以用GPU,也可以只用cpu

端口

暴露端口:30088

映射到容器的端口:8080

启动
torchserve --start --ncs --model-store model-store --models IDB-emo-video.mar
测试API示例

本机终端


D:\work\IDB-py3.9>curl http://127.0.0.1:30088/predictions/IDB-emo-video -T EP02_01f.avi
["surprise",[[136,503,87,454],[135,504,85,454],[134,504,84,454],// other data...]
]

docker容器内部终端
在这里插入图片描述


C++并发服务器详细说明

文件结构

项目架构
lb@lb-xa:~/myProject/网编微表情识别API/服务端/4.0$ tree -L 2
.
├── data				---------用户上传文件保存位置
│   ├── 1.txt
│   ├── 2.txt
│   ├── final			---------用户原视频转HLS保存文件夹
│   ├── final.mp4		---------用户上传原视频
│   ├── other
│   ├── output_video	---------API合成HLS文件保存文件夹
│   └── test.txt
├── func				---------功能模块
│   ├── UpDownFile.cpp
│   └── VideoHandle.cpp
├── include				---------头文件
│   ├── myhead.h
│   ├── UpDownFile.h
│   └── VideoHandle.h
├── main				---------项目可执行文件
├── main.cpp			---------项目主入口文件
├── Makefile			---------makefile编译项目
├── output				---------编译中间生成文件
│   ├── func
│   ├── main.d
│   └── main.o
└── 说明文档.txt8 directories, 15 files

数据存放文件夹结构

在这里插入图片描述

实现功能

  1. 指令上传下载

    上传:put file.txt
    下载:get file.txt
    
  2. IO多路复用(select),高性能并发

    初始化:fd_set stFdr;              // 初始化表FD_ZERO(&stFdr);           // 全置0FD_SET(fd_Server, &stFdr); // 将服务器接受请求IO文件加入检测表
    检测:fd_set stFdrTmp = stFdr;// 缓存表,存放select每次返回的结果ret = select(max + 1, &stFdrTmp, NULL, NULL, NULL);
    循环条件处理:if (FD_ISSET(i, &stFdrTmp))// 如果表中i位置为1,表示有客户端活跃
    
  3. 自定义文件传输标志位,通知对方文件传输开始与结束

    STF:文件传输开始标志位
    EOF:文件传输结束标志位
    
  4. 使用消息前缀(int),防止粘包

    12put file.txt3STF1024data...
    
  5. 创建子进程处理视频

  6. 子进程处理完任务发信号通知父进程回收资源,防止僵尸进程

    父进程:// 注册回收信号并绑定回调处理函数signal(SIGUSR1, signal_handler); 子进程:// 结束后,给父进程发送信号通知回收资源kill(getppid(), SIGUSR1);
  7. 将上传的视频处理成hls流媒体文件

    • 用户上传原视频文件

    • 转换HLS文件

  8. 循环发送API请求(curl库),携带ts文件

  9. json+opencv库处理API返回结果,生成新的ts流文件


5.0版本【研发中】

功能

  1. 添加数据库,上传指令先要带上上传文件的信息和一个key值,数据库保存文件上传者信息、key、视频位置

    put username key file.txt
    
  2. 下载指令需要带上上传者用户和key,服务器验证完,再返回下载文件

    get username key file.txt
    
  3. 采用生产者消费者架构模式,实现解耦

    • 线程1:循环发送视频请求,返回json结果加入队列
    • 线程2:循环从队列中拿取json,合成视频
  4. 发送视频请求采用IO多路复用框架实现并发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马JVM总结(二十四)

(1)练习-分析a a:先执行iload1:把数据读入到操作数栈中 iinc:把局部变量表中的1号曹位做一个自增,他在局部变量表中发生的并没有影响到操作数栈 a:限制性自增在做iload 自增变成12 iload把12读取到操作数…

Linux学习之HIS部署(4)

ElasticSearch部署 ElasticSearch资源 RabbitMQ资源 ElasticSearch服务部署 #OpenJDK环境部署 [rootServices ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootServices ~]# yum -y install java-1.8.0-openjdk-devel.x86_64 #安装OpenJDk ... Compl…

微信删除好友对方知道吗?如何加回微信好友?

微信是我们日常生活中使用最多的社交软件,很多小伙伴在使用微信时都曾发出过这样的疑问:微信删除好友对方知道吗?当自己在微信中删除某人后,对方是否会收到信息提醒?另外,如果删除好友后感到后悔&#xff0…

start()方法源码分析

当我们创建好一个线程之后,可以调用.start()方法进行启动,start()方法的内部其实是调用本地的start0()方法, 其实Thread.java这个类中的方法在底层的Thread.c文件中都是一一对应的,在Thread.c中start0方法的底层调用了jvm.cpp文件…

seata的启动与使用

1 下载seata 下载地址:https://github.com/seata/seata/releases/v0.9.0/ 1.1 修改配置文件 将下载得到的压缩包进行解压,进入conf目录,调整下面的配置文件: registry.conf registry {type "nacos"nacos {serverA…

Spring 学习(八)事务管理

1. 事务 1.1 事务的 ACID 原则 数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列。事务必须满足 ACID 原则——即原子性(Atomicity)、一致性(Consistency)、隔离性(Iso…

uniapp:tabBar点击后设置动画效果

APP端不支持dom操作,也不支持active伪类,绞尽脑汁也没办法给uniapp原生的tabBar点击加动画效果,所以最终只能舍弃原生tabBar,改用自定义tabBar。 自定义tabBar的原理是,页面的上部分分别是tabBar对应的页面组件&#…

Matlab绘图函数subplot、tiledlayout、plot和scatter

一、绘图函数subplot subplot(m,n,p)将当前图窗划分为 mn 网格,并在 p 指定的位置创建坐标区。MATLAB按行号对子图位置进行编号。第一个子图是第一行的第一列,第二个子图是第一行的第二列,依此类推。如果指定的位置已存在坐标区,…

计算物理专题----随机游走实战

计算物理专题----随机游走实战 Problem 1 Implement the 3D random walk 拟合线 自旋的 拟合函数(没有数学意义) 参数:0.627,3.336,0.603,-3.234 自由程满足在一定范围内的均匀分布以标准自由程为单位长度,…

node的服务端对接科大讯飞-火星ai解决方案

序: 官方给的node对接火星的demo其实只适用于node开发的web应用,但是对于纯node 作为服务端,也就是作为webapi来调用,你会发现,location.host直接是获取不到location的。这个时候,其实要单独起个wss的服务的…

C++: stack 与 queue

目录 1.stack与queue stack queue 2.priority_queue 2.1相关介绍 2.2模拟实现priority_queue --仿函数: --push --pop --top --size --empty --迭代器区间构造 2.3仿函数 3.容器适配器 stack模拟实现 queue模拟实现 学习目标: 1.stack和queue介绍与使用 2.pri…

PHP8中伪变量“$this->”和操作符“::”的使用-PHP8知识详解

对象不仅可以调用自己的变量和方法,也可以调用类中的变量和方法。PHP8通过伪变量“$this->”和操作符“::”来实现这些功能。 1.伪变量“$this->” 在通过对象名->方法调用对象的方法时,如果不知道对象的名称,而又想调用类中的方法…

基于微信小程序的校园代送跑腿系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

Mooctest

开发者 测试框架junit 1.字符串不能除 2.a给了c 3. 4. 5.输入是否>0 6.注释

Python中的用法与常见问题解析

装饰器是Python语言中一种强大且常用的概念。通过装饰器,我们可以在不修改原始函数代码的情况下,给函数添加额外的功能,比如日志记录、性能分析、输入验证等。在本文中,我们将深入探讨Python中装饰器的用法和常见问题,…

Leetcode刷题笔记--Hot51-60

1--环形链表II 主要思路: 快慢指针,快指针每次走两步,慢指针每次走一步; 第一次相遇时,假设慢指针共走了 f 步,则快指针走了 2f 步; 假设起点到环入口结点的长度为 a(不包括入口结点…

【7.Vue 利用Heatmap.js 制作自定义热力图】

1.效果 2.背景 需要根据后端检测的设备的数值显示设备周围的清洁度,用户希望用热力图的方式来显示,于是在网上找了资料,发现可以用Heatmap.js来实现。 Heatmap.js 官网:https://www.patrick-wied.at/static/heatmapjs/ 3.引入组件 安装Heatmap.js npm install Heatmap.…

Nginx之带宽限制解读

目录 基本介绍 指令配置 limit_rate limit_rate_after 实战测试 原理: 令牌桶算法 基本介绍 在高负载的网络环境下,为了保持服务的稳定性,限速 (download rate) 是一种必要的操控拜访量的手法。Nginx 是一款高性能的 Web 服务器和反向代…

踩中AIGC 美图看清自己“工具”本职

日前,美图公司发布 2023 年中期业绩,实现总收入 12.61 亿元,同比增长 29.8%;实现经调整后归母净利润 1.51 亿元,同比增长 320.4%,利润增速是收入增速的十倍。同时,在 AIGC 的加持下,…

Verilog零基础入门(边看边练与测试仿真)-状态机-笔记(7-10讲)

文章目录 第七讲第八讲第九讲第十讲 第七讲 1、最简单的状态机-三角波发生器 1、两种状态的代码: //最简单的状态机,三角波发生器; timescale 1ns/10ps module tri_gen(clk,res,d_out); input clk; input res; o…