目标检测之数据预测

标签: 无 分类: 机器学习 创建时间:2024-09-02 06:22:35 更新时间:2024-10-31 11:33:29

1.前言

前几篇文章使用了 ssd 进行了静态视频的输出,然后卡在了检测结果的输出上面了。使用 yolov8 的基本流程也类似

  • 定义视频流地址,并使用FFmpeg启动一个进程来读取视频流,并将其转换为图像帧。
  • 加载YOLOv8模型,并设置相关参数,如输入图像尺寸、阈值等。
  • 循环读取每一帧图像,并将其输入到YOLOv8模型中进行目标检测。
  • 处理检测结果,如筛选出置信度高的检测框、绘制边界框等。
  • 可以将处理后的图像帧保存到视频文件中,也可以直接在屏幕上显示图像帧(使用OpenCV等库)
参考文章:
【1】.基于DL Streamer与YOLOv8模型实现多路视频流实时分析 这里首次提到了一个叫 DL Streamer 的东西,DL Streamer是一个高性能的深度学习视频流处理框架,它支持多种视频源输入,包括摄像头、视频文件和网络流等。DL Streamer提供了丰富的功能,如视频解码、预处理、模型推理和后处理等,使得开发人员能够快速地搭建视频流处理系统。
【2】.YOLOv8 实时检测视频并将结果处理为 httpflv 这里有整个代码,但是关于模型的构建还是没有想过的说明
【3】.用训练好的模型在Yolov8上进行推理演示python代码,含图像检测,视频推理,实时摄像头检测。 1.图像检测;2.视频检测;3.实时摄像头检测。
【4】.yolov8实战第五天——yolov8+ffmpg实时视频流检测并进行实时推流——(推流,保姆教学) 这里还安装了 nginx-rtmp 模块,使用windows进行了安装和配置
【5】.快速入门 这里似乎是 yolov8 的官方说明文档
【6】.【YOLOv8】实战一:手把手教你使用YOLOv8实现实时目标检测 下载模型权重文件,这一步其实可以不做,我们在第三步导出模型为onnx的时候如果权重文件不存在,会自动帮我们下载一个权重文件,但速度会较慢,所以个人还是建议先在官网中下载权重文件,再导出为onnx模型.
【7】.yolov8图像识别python 这里有 yolov8.pt 的下载地址
【8】.使用OpenCV和YOLOv8制作目标检测器(附源码) 这里还提供了一个区域的人员检测的问题。1.进行区域划分,编写算法,判断不同区域内的人员数量。2.小狗检测器,使用预训练模型获取小狗和沙发的目标框,并且计算两者的关系,以此来触发报警。3.车辆检测器。

2.视频预测

使用官方默认的模型,对视频数据mp4进行标注,然后发布为 rtmp 。这里的 model 如果不在本地的话,会自动去网上下载,然后保存到本地。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import cv2
import subprocess
from ultralytics import YOLO

# 载入 YOLOv8 模型
model = YOLO('yolov8n.pt')

# 获取视频内容
cap = cv2.VideoCapture('./data/pedestrians.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://xxx/live/test2' # 修改为您的 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)
# 获取检测结果,detections是一个包含物体坐标、类别和置信度的数组,可以根据需要进一步处理这些信息
# detections=model.postprocess(results)

# 在帧上可视化结果
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()
参考文章:
【1】.零基础yolov8实时检测 根据模型返回数据自己处理原图像,可以自己设置检测框以及检测标签的样式,相关模型返回数据及处理方式请参考官方文档
【2】.python 获取视频上的时间戳 video.get(cv2.CAP_PROP_POS_MSEC),获取当前帧的时间戳,单位为毫秒。
【3】.python opencv 获取rtmp实践戳 这里也是通过 cv2.CAP_PROP_POS_MSEC 获取到的rtmp的时间戳。

3.预测参数

model接口参数如下:

  • source
    指定用于推理的数据源。可以是实时源的图像路径、视频文件、目录、URL 或设备 ID。支持多种格式和来源,可跨不同类型的输入灵活应用。默认:’ultralytics/assets’

  • conf
    设置检测的最小置信度阈值。置信度低于此阈值的检测到的对象将被忽略。调整此值有助于减少误报。默认:0.25

  • iou
    非极大值抑制 (NMS) 的交并集 (IoU) 阈值。较低的值会消除重叠框,从而减少检测次数,这对于减少重复项很有用。默认:0.7

  • imgsz
    定义用于推理的图像大小。可以是用于调整正方形大小的单个整数 640 或(高度,宽度)元组。适当的尺寸可以提高检测精度和处理速度。默认:0.7

  • half
    启用半精度 (FP16) 推理,这可以加快受支持 GPU 上的模型推理速度,同时对准确性的影响最小。默认:False

  • device
    指定用于推理的设备(例如,cpu、cuda:0 或 0)。允许用户选择 CPU、特定 GPU 或其他计算设备来执行模型。默认:None

  • max_det
    每个图像允许的最大检测数。限制模型在单次推理中可以检测到的对象总数,防止密集场景中的过多输出。默认:300

  • vid_stride
    视频输入的帧步长。允许在视频中跳帧以加快处理速度,但会牺牲时间分辨率。值为 1 时处理每一帧,较高的值会跳过帧。默认:1

  • stream_buffer
    确定是否对视频流的传入帧进行排队。如果为 False,旧帧将被丢弃以容纳新帧(针对实时应用程序进行了优化)。如果为“True”,则将新帧放入缓冲区中排队,确保不会跳过任何帧,但如果推理 FPS 低于流 FPS,则会导致延迟。默认:False

  • visualize
    在推理过程中激活模型特征的可视化,提供对模型“看到”的内容的见解。对于调试和模型解释很有用。默认:False

  • augment
    启用预测测试时间增强 (TTA),可能会以推理速度为代价提高检测鲁棒性.默认:False

  • agnostic_nms
    启用与类无关的非极大值抑制 (NMS),它合并不同类的重叠框。在类重叠很常见的多类检测场景中很有用。默认:False

  • classes
    将预测过滤为一组类 ID。仅返回属于指定类别的检测。对于在多类检测任务中关注相关对象很有用。按类别过滤结果。可以指定单个类别(例如class=0)或多个类别(例如class=[0,2,3])。默认值为None,表示不进行类别过滤。默认:None

  • retina_masks
    如果模型中可用,则使用高分辨率分割掩模。这可以提高分割任务的掩模质量,提供更精细的细节。默认:False

  • embed
    指定从中提取特征向量或嵌入的图层。对于聚类或相似性搜索等下游任务很有用。默认:None

  • show
    是否显示检测结果。如果设置为True,则会在屏幕上显示检测到的对象。默认值为False。

  • save
    是否保存带有检测结果的图像。如果设置为True,则会将检测结果保存为图像文件。默认值为False。

  • save_txt
    是否将检测结果保存为文本文件(.txt)。默认值为False。

  • save_conf
    是否将检测结果与置信度分数一起保存。默认值为False。

  • save_crop
    是否保存裁剪后的带有检测结果的图像。默认值为False。

  • hide_labels
    是否隐藏标签。如果设置为True,则在显示检测结果时不显示对象标签。默认值为False。

  • hide_conf
    是否隐藏置信度分数。如果设置为True,则在显示检测结果时不显示置信度分数。默认值为False。

  • line_width
    边界框的线宽。如果设置为None,则根据图像大小进行自动缩放。默认值为None。

  • visualize
    是否可视化模型特征。默认值为False。

  • boxes
    在分割预测中显示边界框。默认值为True。

参考文章:
【1】.YOLOv8预测参数详解(全面详细、重点突出、大白话阐述小白也能看懂)
【2】.Model Prediction with Ultralytics YOLO 这里是官方的关于预测结果的说明文档,有些参数说明:boxes、masks、probs,speed等。

3.预测结果

通常使用 model 传入相关的参数,就可以得到一个 results 结果,其中包含了 boxes 属性,也包含了如 plot() 这样的方法。

1
results = model("bus.jpg")

Boxes object can be used to index, manipulate, and convert bounding boxes to different formats.

参考文章:
【1】.YOLOv8得到物体的坐标中心点信息
【2】.Reference for ultralytics/engine/results.py 这是 results 结果的 API 说明。
【3】.视频流识别—python
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。