# project_tennis
## 程序结构
```bash
├─ball_speed
│ ├─input_videos
│ ├─sample_output
│ ├─check_transformation.py
│ └─ball_speed_analyzer.py
├─rnn_strike_isolation
│ ├─batch_processing
│ │ ├─extract_human_pose.py
│ │ ├─movenet.tflite
│ │ ├─rnn_1.py
│ │ ├─rnn_2_json_only.py
│ │ ├─rnn_2_video.py
│ │ └─tennis_rnn_rafa.keras
│ ├─sample_output
│ └─test_code
├─video_stream
│ ├─rtsp_output_1
│ ├─rtsp_output_2
│ ├─rtsp_output_3
│ ├─rtsp_output_4
│ └─video_stream_json_output.py
└─viewing_videos
```
程序一共分为四个部分,视频流读取(video_stream)->RNN分析动作(rnn_strike_isolation)->分析球速(ball_speed)->同时浏览多路视频(viewing_videos)。其中前三个部分的大部分代码已经完成,同时浏览多路视频的界面可以根据客户需求来设计。
### 视频流读取(video_stream)
video_stream_json_output.py
输入:4个(或多个)RTSP视频流链接
```bash
rtsp_urls = [
"rtsp://admin:123456@192.168.1.102:8554/profile0",
"rtsp://admin:123456@192.168.1.102:8554/profile0",
"rtsp://admin:123456@192.168.1.102:8554/profile0",
"rtsp://admin:123456@192.168.1.102:8554/profile0"
]
```
输出:对于每一个rtsp视频流,创建一个输出文件夹。里面包括所有的输出视频,以及一个记录每段视频开始/结束时间的.json文件。(参考video_stream/rtsp_output内的文件内容)
程序逻辑:
当用户运行video_stream_json_output.py,程序会先等待一定的缓冲时间(e.g. 5s),之后会以一定间隔(e.g. 3s), 来开始每段视频流的录制。(建议:输入RNN的视频流,可以放到最后一个rtsp link)程序的缓冲时间可以根据摄像头,以及本地电脑的性能来设置。之所以设置缓冲以及间隔时间,是为了避免4路视频同时录制,因电脑overload而带来的时间差。总体来说,这种录制方式可以让各路视频的时间差更可控。这行代码可以来设置缓冲时间,以及间隔时间。
```python
start_delay = 5 + i * 3 # 5, 8, 11, 14 seconds
```
为了在录制过程中同时处理视频,程序会以一段时间来导出录制好的视频(例如,20s的间隔)例如,运行程序2分钟,将会得到6个长度为20s的视频,以及一个含有各个视频开始/结束时间戳的[.json](https://github.com/YilinZhao6/project_tennis/blob/main/video_stream/rtsp_output_1/video_times.json)文件。可以通过修改record_rtsp的argument来修改视频的长度。
```python
thread = Thread(target=record_rtsp, args=(url, start_delay, 20, output_folder))
```
### RNN分析动作(rnn_strike_isolation)
根据项目要求,RNN分析动作的程序被分成了两部分:rnn_1.py负责从视频中提取人体的keypoint特征(本地执行),对于每一个视频,输出一个包含每帧信息的csv文件。将输出的csv文件上传到云端后,在云端执行rnn_2_json_only.py,来用RNN提取视频中的动作瞬间,并输出包含每个动作开始/结束时间戳的.json文件。具体的输出文件格式,可以参考rnn_strike_isolation/sample_output文件夹。
程序逻辑:
rnn_1.py(在本地运行)
当程序开始运行,会搜索source folder(即视频流读取的输出文件夹)是否存在已经保存好的mp4视频(不包括正在录制的mp4缓存文件)。如有,用movenet.tflite来逐帧提取视频中的人体特征,并输出以视频名命名的[.csv](https://github.com/YilinZhao6/project_tennis/blob/main/rnn_strike_isolation/sample_output/1_csv/1_keypoints.csv)文件。rnn_1.py和video_stream_json_output.py应同时运行,rnn_1可以动态读取视频流所保存的新视频。对于一个视频rnn_1.py的处理时间比视频时长要短(20s视频处理16s左右)
rnn_2_json_only.py(在云端运行)
读取上传的csv文件,用tennis_rnn_rafa.keras(RNN)来提取球员的正手/反手动作。输出动作开始/结束的时间戳[.json](https://github.com/YilinZhao6/project_tennis/blob/main/rnn_strike_isolation/sample_output/2_json/1_timestamp.json)文件。rnn_2_json_only.py可以使用tensorflow进行GPU加速。
RNN输出的json文件中的时间戳,是动作相对每一段视频的“相对时间”.结合视频流读取中的[video_times.json](https://github.com/YilinZhao6/project_tennis/blob/main/video_stream/rtsp_output_4/video_times.json),我们可以得到动作的“绝对时间”。我们可以利用“绝对时间”的数据,来导出视频,进行球速分析和多视角的同步预览。
### 分析球速(ball_speed)
输入:一个视频片段
输出:一个标注了球员位置,以及球速的视频
在运行ball_speed_analyzer.py时,程序会首先让用户点击4个点(确定一个矩形),确认player和tennis ball的识别区域。此后,会让用户选择一条线(player 1和player 2的分界线)。最后,让用户点击网球场的四个角,以及中心。在完成上述步骤后,程序利用利用yolov8n.pt开始处理视频。yolov8n.pt模型会逐帧识别球的位置,并计算球的速度。另外,程序还会判断是哪一个球员的turn。假如球靠近了离player1 150px的区域,那么直到网球碰到下一个球员前,都算为player 1的turn.程序除了显示球的实时速度,还会计算出每个turn的最大速度。
在部署中需要确认的地方:
测试用视频中,大部分的球都存在虚影的情况,yolov8n.pt在该种情况下识别率较低。如果摄像头拍出来没有虚影,识别率会高很多。
当用户标注了场地的四个角,以及中心,程序会以网球场的中心做transformation,将label出的大概类似梯形的形状变换成网球场的标准形状--同时变换网球的位置。
[样例输出视频](https://drive.google.com/drive/folders/1ohPbMEhLCQOSE6XOrlFF00bfRNeW9PCK?usp=sharing)
### 同时浏览多路视频(viewing_videos)
这部分还没有完成。大概思路如下:
RNN分析动作后,将“相对时间”转化成“绝对时间”(电脑内的内置时间),这样我们就得到了每个动作的开始和结束时间。根据每个动作的开始和结束时间,从视频流读取(video_stream)的输出文件夹获取视频。每一个输出文件夹的video_times.json都包含了子视频的绝对开始和结束时间,据此可以导出多角度的视频预览。(也可以添加球速的预览)
普通网友
- 粉丝: 0
- 资源: 512
最新资源
- 双有源桥DC-DC变换器与隔离型双向变换器仿真研究:光伏+蓄电池系统下的控制策略与matlab模型,双有源桥DC-DC变器仿真 隔离型双向变器 采用光伏(PV)+蓄电池+负载 光伏采用mppt 控制
- 二维傅里叶变换处理图像过程详解:灰度转换、FFT变换及零频移动,附数据格式调整指南及可运行代码,二维傅里叶变,2D傅里叶变,图像傅里叶变 matlab2018a及以上运行 对图像进行灰度处理后进行做傅
- STM32内部ADC智能光敏路灯项目:源码注释详尽,光敏采集精准,Protues仿真辅助开发,光线弱则路灯亮起,STM32内部12位ADC智能路灯项目,包括程序源码和protues仿真,通过内部ADC
- 基于C# WPF的MVVM架构大屏看板3D可视化展示与工业控件设计,数据库配置化链接,典型三层架构支持,c#WPF MVVM 大屏看板3D可视化 1,WPF编程设计; 2,自定义工业控件设计; 3,数
- Simulink在DSP2833x系列上的电机控制与通讯模型代码自动生成教程,DSP2833x系列基于模型的控制器设计 Simulik自动生成代码 DSP2833x基于模型的电机控制设计 MATLA
- 基于Matlab Simulink的模型预测控制与PI控制结合的Boost变换器均流响应研究,模型预测控制,基于两相交错并联boost变器 可完好地实现均流 模型中包含给定电压跳变和负载突变的响应
- 基于FX3U三边封制袋机:气缸式超音波型前后双伺服送料与模拟量控制变频器给料系统,基于FX3U三边封制袋机程序超音波型 前后双伺服送料,模拟量控制变频器给料,所有切刀用的气缸,不是常用制袋机的电机凸轮
- "微电网智能调控技术:二次控制与比例积分控制协同下的有功无功均分实现",微电网二次控制,下垂控制,比例积分二次控制,补偿了下垂控制的偏差,实现了有功均分和无功均分 ,核心关键词:微电网二次控制; 下垂
- 微电网二次控制策略:基于下垂控制技术的分布式事件触发机制与通信延迟处理效果研究,微电网二次控制,下垂控制,具有通信延迟的微电网分布式事件触发二次控制,实现了二次控制,效果好,有相关参考文献 ,核心
- 澳大利亚模型研究:深度解析5区电网的调压、调频、无功补偿及新能源并网暂态过程,澳大利亚5区14机59节点模型,可研究调压,调频,无功补偿,新能源并网等暂态 ,核心关键词:澳大利亚5区14机59节点
- 考虑源荷随机性的热电联供微网优化系统:基于粒子群PSO算法的经济运行优化模型与随机模拟技术研究(附Matlab程序代码),源荷不确定性 考虑源荷随机特征的热电联供微网优化matlab 复现王锐的含可
- 三菱小型PLC追剪打孔程序:基于高速计数器与编码器,中达优控触摸屏集成应用,三菱小型PLC 1S追剪程序,包装膜追剪打孔 ,拓达伺服,用脉冲加方向的模式,编码器追踪膜的速度, 由于测速度SPD指令和
- 单相H桥级联五电平逆变器SPWM调制闭环仿真研究(附关键波形图),单相H桥级联五电平逆变器仿真(SPWM)2021b 可降版本 闭环仿真 逆变器采用H桥级联的形式连接,单相负载构成 采用SPWM调制
- 基于Matlab Simulink平台的MMC逆变器并网仿真研究:PI控制策略与环流抑制技术探讨,23电平MMC逆变器并网仿真(PI控制) 基于Matlab Simulink仿真平台 采用基于PI控制
- "光伏MPPT仿真研究:直接电压法(恒定电压法)结合PID控制技术的效率优化",光伏MPPT仿真-直接电压法(恒定电压法)加PID控制, ,核心关键词:光伏MPPT仿真; 恒定电压法; 直压法; PI
- MATLAB Simulink 2021b直流微电网设计:风、光、储、负载协同控制,逆变器PQ控制,动态调节电网功率,绝对原创MATLAB Simulink 2021b 直流微电网 风、光、储、负载、
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈