赞
踩
yolov8实战第一天——yolov8部署并训练自己的数据集(保姆式教程)_yolov8训练自己的数据集-CSDN博客
yolov8实战第三天——yolov8TensorRT部署(python推理)(保姆教学)-CSDN博客
今天,我们继续yolov8的实战,实时视频流检测,可以将本地视频或视频流,进行yolov8检测后的结果,推成rtsp流,可以实时看到检测结果。
YOLOv8是YOLO目标检测算法的一个变种。它在YOLOv4的基础上进行了一些改进,如使用更大的图像尺寸、更深的网络结构、更多的训练数据等,从而获得更好的检测精度和更快的检测速度。
实时视频流目标检测是一种非常有用的应用场景。例如,在视频监控系统中,我们需要对视频流进行实时分析和检测,以便及时发现异常事件和行为。另外,实时视频流目标检测也可以用于自动驾驶、无人机等领域。
要将YOLOv8和FFmpeg结合起来进行实时视频流目标检测,通常的做法是使用FFmpeg将视频流转换为图像帧,并将这些图像帧输入到YOLOv8模型中进行目标检测。具体步骤如下:
实施这个项目的意义在于,它可以帮助我们快速地对实时视频流进行目标检测,并及时发现异常事件和行为。这对于一些需要实时监控和分析的领域非常有用,如安防、交通、医疗等。另外,这个项目也可以为自动驾驶、无人机等领域的研究提供基础支持。
E:\2345Downloads\ffmpeg-2023-12-18-git-be8a4f80b9-essentials_build\bin
ffmpeg -version
第二章和第三章二选一 。
测试:
新建一个 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
命令行推流完成。
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服务器,直接杀进程就可以:
我这个代码使用的是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"):
- break
- else:
- break
-
- # 释放视频捕获对象
- cap.release()
-
- # 关闭 FFmpeg 进程
- proc.stdin.close()
- proc.wait()
-
- # 关闭显示窗口
- cv2.destroyAllWindows()
3.vlc 打开:
rtmp://127.0.0.1:1935/live/stream
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。