yolov8实战第一天——yolov8部署并训练自己的数据集(保姆式教程)_yolov8训练自己的数据集-CSDN博客
yolov8实战第三天——yolov8TensorRT部署(python推理)(保姆教学)-CSDN博客
今天,我们继续yolov8的实战,实时视频流检测,可以将本地视频或视频流,进行yolov8检测后的结果,推成rtsp流,可以实时看到检测结果。
YOLOv8是YOLO目标检测算法的一个变种。它在YOLOv4的基础上进行了一些改进,如使用更大的图像尺寸、更深的网络结构、更多的训练数据等,从而获得更好的检测精度和更快的检测速度。
实时视频流目标检测是一种非常有用的应用场景。例如,在视频监控系统中,我们需要对视频流进行实时分析和检测,以便及时发现异常事件和行为。另外,实时视频流目标检测也可以用于自动驾驶、无人机等领域。
要将YOLOv8和FFmpeg结合起来进行实时视频流目标检测,通常的做法是使用FFmpeg将视频流转换为图像帧,并将这些图像帧输入到YOLOv8模型中进行目标检测。具体步骤如下:
- 定义视频流地址,并使用FFmpeg启动一个进程来读取视频流,并将其转换为图像帧。
- 加载YOLOv8模型,并设置相关参数,如输入图像尺寸、阈值等。
- 循环读取每一帧图像,并将其输入到YOLOv8模型中进行目标检测。
- 处理检测结果,如筛选出置信度高的检测框、绘制边界框等。
- 可以将处理后的图像帧保存到视频文件中,也可以直接在屏幕上显示图像帧(使用OpenCV等库)。
实施这个项目的意义在于,它可以帮助我们快速地对实时视频流进行目标检测,并及时发现异常事件和行为。这对于一些需要实时监控和分析的领域非常有用,如安防、交通、医疗等。另外,这个项目也可以为自动驾驶、无人机等领域的研究提供基础支持。
一、下载ffmpg
下载 FFmpeg
E:\2345Downloads\ffmpeg-2023-12-18-git-be8a4f80b9-essentials_build\bin
ffmpeg -version
二、(可选)搭建EasyDarwin开源流媒体服务器
第二章和第三章二选一 。
测试:
新建一个 demo.bat 的文件,添加内容为:ffmpeg -f gdigrab -i desktop -vcodec mpeg4 -acodec libmp3ame -r 30 -vf scale=1028*720 -f rtsp rtsp://localhost:554/desktopVideo
http://localhost:10008
vlc打开:
rtsp://localhost:554/desktopVideo
在cmd中运行 ffplay rtsp://localhost/desktopVideo 进行拉流。
本地视频推流:
E:\yolov8>ffmpeg -re -i "E:/yolov8/视频/test.mp4" -rtsp_transport udp -vcodec h264 -f rtsp rtsp://localhost/testPushStream
开始推流
访问:
http://localhost:10008/
vlc打开:
rtsp://localhost:554/testPushStream
命令行推流完成。
三、(可选)Nginx搭建rtmp流媒体服务器
windows版nginx下载地址:Index of /download/
在conf文件夹下复制一份nginx-win.conf
,命名为mynginx.conf
:
修改配置文件:mynginx.conf
改一下默认的http服务器端口,默认的是80端口,我改成了10080:
在本配置文件末尾添加rtmp的配置:
rtmp {server {listen 1935;#监听端口,若被占用,可以更改chunk_size 4096;#上传flv文件块儿的大小application live { #创建一个叫live的应用live on;#开启live的应用allow publish 127.0.0.1;allow play all;}}
}
这个配置完之后,推流地址就是:
rtmp://127.0.0.1:1935/live/xxxxxx
,其中xxxxxx可自定义名称。
1.使用命令行启动nginx:
nginx.exe -c conf/mynginx.conf
2. 使用ffmpeg推流:
ffmpeg.exe -re -i test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/live/stream
3.ffmpeg拉流
ffplay.exe rtmp://127.0.0.1:1935/live/stream
如果需要停止nginx服务器,直接杀进程就可以:
四、yolov8推理代码推流
我这个代码使用的是nginx流媒体服务器。
1.先将服务打开:
2.运行检测推流代码:
import cv2
import subprocess
from ultralytics import YOLO# 载入 YOLOv8 模型
model = YOLO('model/yolov8n.pt')# 获取视频内容
cap = cv2.VideoCapture("视频/test.mp4")# 获取原视频的宽度和高度
original_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
original_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))# 设置 FFmpeg 子进程,用于推流
rtmp_url = 'rtmp://127.0.0.1:1935/live/stream' # 修改为您的 NGINX RTMP 服务器地址
command = ['ffmpeg','-y','-f', 'rawvideo','-vcodec', 'rawvideo','-pix_fmt', 'bgr24','-s', "{}x{}".format(original_width, original_height),'-r', str(fps),'-i', '-','-c:v', 'libx264','-pix_fmt', 'yuv420p','-preset', 'ultrafast','-f', 'flv',rtmp_url]# 启动 FFmpeg 进程
proc = subprocess.Popen(command, stdin=subprocess.PIPE)# 循环遍历视频帧
while cap.isOpened():# 从视频中读取一帧success, frame = cap.read()if success:# 对帧运行 YOLOv8 推理results = model(frame)# 在帧上可视化结果annotated_frame = results[0].plot()# 将处理后的帧写入 FFmpeg 进程proc.stdin.write(annotated_frame.tobytes())# 显示带有标注的帧cv2.imshow("YOLOv8 推理", annotated_frame)# 如果按下 'q' 键,则中断循环if cv2.waitKey(1) & 0xFF == ord("q"):breakelse:break# 释放视频捕获对象
cap.release()# 关闭 FFmpeg 进程
proc.stdin.close()
proc.wait()# 关闭显示窗口
cv2.destroyAllWindows()
3.vlc 打开:
rtmp://127.0.0.1:1935/live/stream