微表情识别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.rhkb.cn/news/141785.html

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

相关文章

【李沐深度学习笔记】线性代数

课程地址和说明 线性代数p1 本系列文章是我学习李沐老师深度学习系列课程的学习笔记,可能会对李沐老师上课没讲到的进行补充。 线性代数 标量 标量(scalar),亦称“无向量”。有些物理量,只具有数值大小&#xff0c…

基于微信小程序的校园失物招领系统设计与实现(源码+lw+部署文档+讲解等)

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

Qt创建线程(使用moveToThread方法创建子线程)

1.moveTothread方法: (1)要使用moveToThread方法必须继承与QObject类 (2)创建任务对象时不能指定父对象 例子: MyWork* work new MyWork(this); // error MyWork* work new MyWork; // ok (3&#…

北工大汇编题——分支程序设计

题目要求 信息检素程序设计:在数据区,有9个不同的信息,编号 0-8,每个信息包括20 个字符。从键盘接收 0-8 之间的一个编号,然后再屏幕上显示出相应编号的信息内容,按“q”键退出 完整代码 DATAS SEGMENTn0…

搭建SpringBoot项目三种方式(超详细版)

目录 一、官网下载压缩包解压 二、通过Idea脚手架搭建 三、Spring Boot项目结构 3.1 pom.xml文件 3.2 启动类 3.3 配置文件 四、通过创建Maven项目添加依赖 一、官网下载压缩包解压 接下来我们搭建一个SpringBoot项目,并引入SpringMVC的功能,首先…

自学WEB服务器搭建01-安装Express+Node.js框架完成Hello World!

一、前言,网站开发扫盲知识 1.网站搭建开发包括什么? 前端、后端(服务端)数据库 前端开发主要涉及用户界面(UI)和用户体验(UX),负责实现网站的外观和交互逻辑。前端开发…

多线程进阶:常见的锁策略、CAS

之前我们所了解的属于多线程的初阶内容。今天开始,我们进入多线程进阶的学习。 锁的策略 乐观锁 悲观锁 这不是两把具体的锁,应该叫做“两类锁” 乐观锁:预测锁竞争不是很激烈(这里做的工作可能就会少一些) 悲观锁…

3.6+铁死亡+WGCNA+机器学习

今天给同学们分享一篇3.6铁死亡WGCNA机器学习的生信文章“Identification of ferroptosis related biomarkers and immune infiltration in Parkinsons disease by integrated bioinformatic analysis”,这篇文章于2023年3月14日发表在BMC Med Genomics期刊上&#…

Mac电脑信息大纲记录软件 OmniOutliner 5 Pro for Mac中文

OmniOutliner 5 Pro是一款专业级的Mac大纲制作工具,它可以帮助用户更好地组织和管理信息,以及制作精美的大纲。以下是OmniOutliner 5 Pro的主要功能和特点: 强大的大纲组织和管理功能。OmniOutliner 5 Pro为用户提供了多层次的大纲结构&…

【QT】QT事件Event大全

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT中的事件Event技术,主要从QT事件流程和常用QT事件方法等方面展开,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易…

virtualbox安装linux虚拟机访问互联网(外网)的方法

virtualbox安装linux虚拟机访问互联网(外网)的方法 设置方法效果图 设置方法 效果图

Linux系统编程-文件

目录 1、系统编程介绍以及文件基本操作文件编程系统调用文件基本读写练习 2、文件描述符以及大文件拷贝文件描述符大文件拷贝对比试验 3、文件实战练习 1、系统编程介绍以及文件基本操作 系统编程是基于Linux封装好的一些函数,进行开发。 Linux文件信息属性在indo…

用AI解决量子学问题

3 人工智能用于量子力学 在这一部分中,我们提供了有关如何设计高级深度学习方法以有效学习神经波函数的技术评述。在第3.1节中,我们概述了一般情况下定义和解决量子多体问题的方法。在第3.2节中,我们介绍了学习量子自旋系统基态的方法。在第…

微信收款码费率0.38太坑了

作为一个有多年运营经验的商家,我本人在申请收款功能时曾经走过了不少弯路。我找遍了市面上的知名的支付公司,但了解到的收款手续费率通常都在0.6左右,最低也只能降到0.38。这个过程吃过不少苦头。毕竟,收款功能是我们商家的命脉&…

Java笔记三

包机制: 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。 包语句的语法格式为:pack pkg1[. pkg2[. pkg3...]]; 般利用公司域名倒置作为包名;如com.baidu.com,如图 导包: 为了能够…

Python学习 day01(注意事项)

注释 print语句 变量 数据类型的转换 运算符 / 的结果为浮点数。若// 的两边有一个为浮点数,则结果为浮点数,否则为整数。 字符串 7. 精度控制 8. input()

五、点击切换、滚动切换、键盘切换

简介 通过事件改变当前展示的信息组件,交互的事件有点击上下切换、鼠标轮动上下切换、键盘上下键切换。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:App.vue、public 一、鼠标点击上下箭头切换 <template><div class="app-background"…

python学习--类的浅拷贝与深拷贝

变量的赋值操作 只是形成两个变量&#xff0c;实际上还是指向同一个对象 浅拷贝 Python拷贝一般都是浅拷贝&#xff0c;拷贝时&#xff0c;对象包含的子对象内容不拷贝&#xff0c;因此&#xff0c;源对象与拷贝对象会引用同一个子对象 深拷贝 使用copy模块的deepcopy函数…

古彝文识别:文化遗产的数字化之旅

目录 &#x1f345;前言&#x1f353;古彝文介绍&#x1f353;古彝文识别的重难点&#x1f352;原籍难以获取&#xff0c;传统翻译过程繁琐&#xff0c;周期长。&#x1f352;版式多样&#xff0c;笔画相近。&#x1f352;图像质量差&#xff0c;手写识别难。&#x1f352;古彜…

成为威胁:网络安全中的动手威胁模拟案例

不断变化的网络威胁形势要求组织为其网络安全团队配备必要的技能来检测、响应和防御恶意攻击。然而&#xff0c;在研究中发现并继续探索的最令人惊讶的事情是&#xff0c;欺骗当前的网络安全防御是多么容易。 防病毒程序建立在庞大的签名数据库之上&#xff0c;只需更改程序内…