yolov8实战第一天——yolov8部署并训练自己的数据集(保姆式教程)_yolov8训练自己的数据集-CSDN博客
yolov8实战第三天——yolov8TensorRT部署(python推理)(保姆教学)-CSDN博客
今天,我们继续yolov8的实战,实时视频流检测,可以将本地视频或视频流,进行yolov8检测后的结果,推成rtsp流,可以实时看到检测结果。
YOLOv8是YOLO目标检测算法的一个变种。它在YOLOv4的基础上进行了一些改进,如使用更大的图像尺寸、更深的网络结构、更多的训练数据等,从而获得更好的检测精度和更快的检测速度。
实时视频流目标检测是一种非常有用的应用场景。例如,在视频监控系统中,我们需要对视频流进行实时分析和检测,以便及时发现异常事件和行为。另外,实时视频流目标检测也可以用于自动驾驶、无人机等领域。
要将YOLOv8和FFmpeg结合起来进行实时视频流目标检测,通常的做法是使用FFmpeg将视频流转换为图像帧,并将这些图像帧输入到YOLOv8模型中进行目标检测。具体步骤如下:
- 定义视频流地址,并使用FFmpeg启动一个进程来读取视频流,并将其转换为图像帧。
- 加载YOLOv8模型,并设置相关参数,如输入图像尺寸、阈值等。
- 循环读取每一帧图像,并将其输入到YOLOv8模型中进行目标检测。
- 处理检测结果,如筛选出置信度高的检测框、绘制边界框等。
- 可以将处理后的图像帧保存到视频文件中,也可以直接在屏幕上显示图像帧(使用OpenCV等库)。
实施这个项目的意义在于,它可以帮助我们快速地对实时视频流进行目标检测,并及时发现异常事件和行为。这对于一些需要实时监控和分析的领域非常有用,如安防、交通、医疗等。另外,这个项目也可以为自动驾驶、无人机等领域的研究提供基础支持。
一、下载ffmpeg
下载 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"):
break
else:
break
# 释放视频捕获对象
cap.release()
# 关闭 FFmpeg 进程
proc.stdin.close()
proc.wait()
# 关闭显示窗口
cv2.destroyAllWindows()
3.vlc 打开:
rtmp://127.0.0.1:1935/live/stream