使用yolov8和moviepy自动截取视频中人出现的片段

2023-12-20 18:28

本文主要是介绍使用yolov8和moviepy自动截取视频中人出现的片段,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

这么长时间没写博客,其实主要是忙于一个行为实时检测大型项目的开发,最近闲下来就写这篇当年末总结了。这篇文章的起因还是某个业务需求,要求分析视频中有人的部分,没人的部分需要去掉,同时行为检测的数据集如果要自己采集打标,也需要这个步骤。

分析

不想看分析的直接跳到代码复制 ^_^
1.拿到这个问题,我首先就丢给了gpt和一众大语言模型去解决,因为真的不想动手干这种杂活,懒惰之神上身了。

然后我一开始的指令是这样的:
在这里插入图片描述
给了我一个空壳子:
在这里插入图片描述
然后我觉得这种简单的需求,cv2应该可以搞定吧,就指导它使用haar级联检测器去检测:
在这里插入图片描述
在改掉基本的逻辑错误后,我发现,它能检测出人脸的就没几帧!而且这样保存后出来的视频,是几秒钟不同时间的人物动作拼凑,根本达不到要求,这时我才明白我需要的是连贯的人体动作片段,而非抽帧。

2.如何让语言模型理解到底你要干什么:

经过几次尝试,我发现这些语言模型压根不知道我说的片段是什么意思。
于是我使用英文循序渐进的提问,先假设我有两个片段截取:
在这里插入图片描述
告诉它,我这个视频中有两个segments(片段),要把它截取下来,它用moivepy完成了任务。于是,就可以跟它说我有一个模型来检测人物,我其实并不知道有几个片段,也不知道有几个时间点,请结合上面的moviepy来完成。
在这里插入图片描述
于是它完美给出了整个框架和逻辑,除了人体检测部分需要我自己实现。

3.实现人体检测

鉴于之前已经用cv2尝试过简单的图像处理,各种方法都不是很满意,那就直接上目标检测模型好了,同时因为需要连贯的人体检测,不能说我这一帧检测到,下一帧突然消失,所以要加上目标跟踪,那最轻松的方法就是使用yolov8直接一行实现:

results = model.track(frame, persist=True, classes=0,verbose=False)

后面的参数persist表示后一帧要对前一帧产生的结果进行预测,classes=0表示只预测people这一类,其他不是我们需要关心的,verbose=False纯粹是因为yolo输出的打印太烦了,我不关心,直接关掉。
然后查阅可知results.boxes.shape返回的是预测出的目标向量的形状,那么第一维度为0时表示没有预测到,基于这个就可以实现判断。

代码

from ultralytics import YOLO
import moviepy.editor as mp
import cv2
model = YOLO('yolov8n.pt')
# 定义输入片段
input_file = "input.mp4"# 定义相关片段变量
segment_start = None
segment_end = None
segments = []# 用moviepy打开视频源
video = mp.VideoFileClip(input_file)# 循环
for idx, frame in enumerate(video.iter_frames()):people_detected = False# 默认读取RGB,需转换成BGR输入frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)#推理results = model.track(frame, persist=True, classes=0,verbose=False)#对结果进行判断for r in results:if r.boxes.shape[0] != 0:people_detected = Trueif people_detected and segment_start is None:# 开始新的片段segment_start = idx / video.fpselif not people_detected and segment_start is not None:# 结束当前片段segment_end = idx / video.fpsif (segment_end - segment_start) > 1:segments.append((segment_start, segment_end))print((segment_start, segment_end))segment_start = Nonesegment_end = None# 如果一个片段直到结尾,就截取到结束
if segment_start is not None:segment_end = video.durationsegments.append((segment_start, segment_end))# 提取片段并写入本地文件
for i, (segment_start, segment_end) in enumerate(segments):segment_name = f"segment{i+1}.mp4"segment = video.subclip(segment_start, segment_end)segment.write_videofile(segment_name)#关闭视频源
video.reader.close()

这里if (segment_end - segment_start) > 1可以去掉,我加上是为了去掉太短的人物片段,可能是因为模型误报和不稳定导致的,如果想要更准也可以把yolov8n换成yolov8s或者x,模型越大效果越好。

跑出来结果如下:
在这里插入图片描述
有几个片段就会生成几个,segment1,segment2…以此类推。

这篇关于使用yolov8和moviepy自动截取视频中人出现的片段的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/517014

相关文章

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Python使用Matplotlib和Seaborn绘制常用图表的技巧

《Python使用Matplotlib和Seaborn绘制常用图表的技巧》Python作为数据科学领域的明星语言,拥有强大且丰富的可视化库,其中最著名的莫过于Matplotlib和Seaborn,本篇... 目录1. 引言:数据可视化的力量2. 前置知识与环境准备2.1. 必备知识2.2. 安装所需库2.3

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Springboot3 ResponseEntity 完全使用案例

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比... 目录Spring Boot 3 ResponseEntity 完全使用教程前置准备1. 项目基础依赖(M