Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于WebRTC的摄像头实时目标检测

Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于WebRTC的摄像头实时目标检测

  • 本篇摘要
  • 20. Streaming:流式传输的多媒体应用
    • 20.5 基于WebRTC的摄像头实时目标检测
      • 20.5.1 环境配置及说明
        • 1. WebRTC
        • 2. TURN服务器
      • 20.5.2 推理函数实现
        • 1. 推理模型:YOLOv10
        • 2. 推理代码
      • 20.5.3 Gradio演示实现
      • 20.5.4 部署与扩展
    • 参考文献:

本章目录如下:

  1. 《Gradio全解20——Streaming:流式传输的多媒体应用(1)——Mistral-7B实现流式传输音频:魔力8号球》;
  2. 《Gradio全解20——Streaming:流式传输的多媒体应用(2)——基于Mini-Omni模型构建对话式聊天机器人》;
  3. 《Gradio全解20——Streaming:流式传输的多媒体应用(3)——实时语音识别技术(ASR)》;
  4. 《Gradio全解20——Streaming:流式传输的多媒体应用(4)——基于Groq的带自动语音检测功能的多模态Gradio应用》;
  5. 《Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于YOLO与WebRTC的摄像头实时目标检测》;
  6. 《Gradio全解20——Streaming:流式传输的多媒体应用(6)——RT-DETR模型构建视频流目标检测系统》。

本篇摘要

本章讲述流式传输的应用,包括音频、图像和视频格式的流式传输。

20. Streaming:流式传输的多媒体应用

本章讲述流式传输的应用,包括音频、图像和视频格式的流式传输。音频应用包括流式传输音频、构建音频对话式聊天机器人、实时语音识别技术和自动语音检测功能;图像应用包括基于WebRTC的摄像头实时目标检测;视频应用包括构建视频流目标检测系统。

20.5 基于WebRTC的摄像头实时目标检测

本指南将使用YOLOv10模型,结合Gradio 5.0的最新流式传输功能,实现用户摄像头画面的实时目标检测,最终效果演示如下:
在这里插入图片描述

20.5.1 环境配置及说明

首先安装所有依赖项。将以下内容添加到requirements.txt文件,并运行命令:pip install -r requirements.txt:

opencv-python
twilio
gradio>=5.0
gradio-webrtc
onnxruntime-gpu

我们将使用ONNX运行时来加速YOLOv10的推理。本文默认GPU可用,如果没有GPU,请将onnxruntime-gpu更改为onnxruntime,没有GPU的情况下,模型运行会较慢,导致演示体验出现延迟。

1. WebRTC

我们将使用OpenCV进行图像处理,并通过Gradio WebRTC自定义组件在底层使用WebRTC,实现近乎零延迟。WebRTC(网页实时通信)是一项支持网页应用及站点直接捕获、选择性流式传输音视频媒体、并在浏览器间无需中介而实现交换任意数据的技术。该技术标准集使数据共享与点对点远程会议成为可能,且用户无需安装插件或第三方软件。

借助WebRTC,我们可以为应用添加基于开放标准运行的实时通信功能。它支持在对等设备之间发送视频、语音和通用数据,使开发者能够构建强大的语音和视频通信解决方案,并且适用于所有现代浏览器以及所有主要平台的原生客户端。WebRTC采用的技术是开放网络标准,以常规JavaScript API的形式在所有主流浏览器中提供。关于WebRTC更多信息请参考:WebRTC API。

2. TURN服务器

如果我们想在任何云提供商上部署此应用程序,则需要使用Twilio的免费API来获取他们的TURN服务器。那么什么是TURN服务器,Twillio如何计费呢?

  1. 什么是STUN、TURN和ICE?
    STUN、TURN和ICE是IETF(The Internet Engineering Task Force:国际互联网工程任务组)制定的标准协议组,用于在建立点对点通信会话时穿透NAT。具体作用如下:
  • 当主机位于NAT防火墙后方时,可通过NAT会话穿透工具(STUN)发现其公网IP地址。若该主机需接收对端连接,会将此公网IP地址作为可连接地址提供。若NAT防火墙仍阻止主机直连,双方则连接至NAT中继穿透服务器(TURN),通过该服务器中转媒体流;
  • WebRTC及其他VoIP技术栈通过支持ICE协议来提升IP通信的可靠性;交互式连接建立(ICE)是协调STUN与TURN实现主机间连接的综合性标准。
  1. Twilio的作用及如何计费?
    Twilio网络穿透服务为兼容ICE的客户端(如支持WebRTC标准的浏览器)提供STUN和TURN服务。Twilio根据TURN服务器转发的数据量进行计费。TURN客户端需在TURN服务器上分配中继地址(即TURN会话),计费数据量为该会话中客户端发送与接收字节数之和。费用将计入创建该会话的TURN客户端关联的Twilio账户SID,按中转数据总量(以兆字节为单位)核算。请注意,不同Twilio区域适用不同费率标准。

关于TURN服务器更多信息请参考:Network Traversal Service。

20.5.2 推理函数实现

我们将从Hugging Face Hub下载YOLOv10模型,并实例化一个自定义推理类来使用该模型。本文不包含推理类的具体实现细节,但我们可以在下面链接查看完整源代码:freddyaboulton/webrtc-yolov10n,该实现主要参考了下面这个GitHub仓库:ibaiGorordo/ONNX-YOLOv8-Object-Detection 。

1. 推理模型:YOLOv10

近年来,YOLO系列因其在计算成本与检测性能之间的有效平衡,已成为实时目标检测领域的主导技术。研究者们针对YOLO的架构设计、优化目标、数据增强策略等方面进行了深入探索,取得了显著进展。然而,依赖非极大值抑制(NMS)的后处理方式阻碍了YOLO的端到端部署,并对推理延迟产生负面影响。此外,YOLO各组件设计缺乏全面深入的考量,导致明显的计算冗余并限制了模型能力,使得其效率欠佳而存在较大性能提升空间。

在YOLOv10中,旨在从后处理和模型架构两方面共同推进YOLO系列的性能-效率边界。为此,YOLOv10首先提出用于NMS-free训练的一致性双重分配策略,在保持高性能同时显著降低推理延迟;其次,引入面向YOLO的效率-精度全方位驱动模型的设计策略,从效率与精度两个维度系统优化YOLO的各个组件,大幅降低计算开销并提升模型能力。

这些技术共同构建了新一代实时端到端目标检测YOLO系列——YOLOv10。大量实验表明,YOLOv10在不同模型规模下均实现了最优的性能与效率表现,例如:

  • 在COCO数据集相近AP(Accurate Performance)指标下,YOLOv10-S比RT-DETR-R18快1.8倍,且参数量与FLOPs减少2.8倍;
  • 与YOLOv9-C相比,YOLOv10-B在同等性能下延迟降低46%,参数量减少25%。

YOLOv10的更多信息请参阅:YOLOv10: Real-Time End-to-End Object Detection。

截至发文前,YOLO系列的最新进展是YOLOE(ye):实时全场景视觉系统,它是一个高效、统一且开放的目标检测与分割模型,能够像人眼一样实时感知任何物体。该模型支持多种提示机制(包括文本提示、视觉输入提示以及无提示范式),且完全开源,与封闭式YOLO模型相比,其具有零推理开销和零迁移开销的特性。YOLOE更多信息请参阅YOLOE: Real-Time Seeing Anything。

2. 推理代码

我们选择使用yolov10-n变体,因为它具有最低的延迟特性,具体性能数据可以参考YOLOv10 GitHub仓库README中的性能章节。也可以选择最新的yoloe,代码实现如下:

from huggingface_hub import hf_hub_download
# yolov10
from inference import YOLOv10model_file = hf_hub_download(repo_id="onnx-community/yolov10n", filename="onnx/model.onnx"
)
model = YOLOv10(model_file)
# yoloe
from ultralytics import YOLOEdef init_model(model_id, is_pf=False):# model_id:"yoloe-v8s"(default),"yoloe-v8m","yoloe-v8l","yoloe-11s","yoloe-11m", "yoloe-11l"filename = f"{model_id}-seg.pt" if not is_pf else f"{model_id}-seg-pf.pt"path = hf_hub_download(repo_id="jameslahm/yoloe", filename=filename)model = YOLOE(path)return model
model = init_model("yoloe-v8s")def detection(image, conf_threshold=0.3):image = cv2.resize(image, (model.input_width, model.input_height))# yolo10new_image = model.detect_objects(image, conf_threshold)# yoloe# new_image = model.predict(source=image, conf=conf_threshold)return new_image

我们的推理函数detection接受来自网络摄像头的numpy数组和一个期望的置信度阈值,像YOLO这样的目标检测模型会识别多个目标,并为每个目标分配一个置信度分数。置信度越低,出现误检的可能性越高,因此允许用户根据自身需要调整置信度阈值。该函数返回一个numpy数组,对应于输入图像,并在所有检测到的目标上绘制了边界框。

20.5.3 Gradio演示实现

Gradio演示很简单,主要实现以下几个特定功能:

  1. 使用WebRTC自定义组件,确保输入和输出通过WebRTC与服务器进行发送/接收,WebRTC组件将同时作为输入和输出组件;
  2. 利用stream事件的time_limit参数,该参数为每个用户的流设置处理时间。在多用户环境中,例如在Spaces上,我们将在此时间段后停止处理当前用户的流,并转向下一个用户;
  3. 应用自定义CSS,使页面上的网络摄像头WebRTC和滑块Slider居中显示。

示例代码如下:

import gradio as gr
from gradio_webrtc import WebRTC
from twilio.rest import Client
import oscss = """.my-group {max-width: 600px !important; max-height: 600px !important;}.my-column {display: flex !important; justify-content: center !important; align-items: center !important;}"""
account_sid = os.environ.get("TWILIO_ACCOUNT_SID")
auth_token = os.environ.get("TWILIO_AUTH_TOKEN")
if account_sid and auth_token:client = Client(account_sid, auth_token)token = client.tokens.create()rtc_configuration = {"iceServers": token.ice_servers,"iceTransportPolicy": "relay",}
else:rtc_configuration = Nonewith gr.Blocks(css=css) as demo:gr.HTML("""<h1 style='text-align: center'>YOLOv10 Webcam Stream (Powered by WebRTC ⚡️)</h1>""")with gr.Column(elem_classes=["my-column"]):with gr.Group(elem_classes=["my-group"]):image = WebRTC(label="Stream", rtc_configuration=rtc_configuration)conf_threshold = gr.Slider(label="Confidence Threshold",minimum=0.0,maximum=1.0,step=0.05,value=0.30,)image.stream(fn=detection, inputs=[image, conf_threshold], outputs=[image], time_limit=10)if __name__ == "__main__":demo.launch()

20.5.4 部署与扩展

该应用已部署在Hugging Face Spaces上,地址:freddyaboulton/webrtc-yolov10n,我们可以将它作为开发实时图像应用的起点。

如遇任何问题或有疑问,可以在Space页面提交issue或在WebRTC组件的GitHub仓库提出问题。

参考文献:

  1. Streaming AI Generated Audio
  2. Run Inference on servers
  3. Spaces ZeroGPU: Dynamic GPU Allocation for Spaces

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSCP - Proving Grounds - NoName

主要知识点 linux命令注入SUID find提权 具体步骤 从nmap开始搜集信息&#xff0c;只开放了一个80端口 Nmap scan report for 192.168.171.15 Host is up (0.40s latency). Not shown: 65534 closed tcp ports (reset) PORT STATE SERVICE VERSION 80/tcp open http …

c++_csp-j算法 (6)_高精度算法(加减乘除)

高精度算法 C++高精度算法是指在C++编程语言中实现高精度计算的算法。在C++中,通常整数的范围是有限的,超出这个范围的整数计算会导致溢出。高精度算法的出现,使得C++程序能够处理超出常规整数范围的大整数计算,包括高精度加法、减法、乘法、除法等运算。 在C++中实现高精…

从OpenMP中的不兼容,窥探AI应用开发中的并行编程

在AI相关的项目开发中,偶然遇到下面这个问题: OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the progr am. That is dangerous, sin…

vue2+element实现Table表格嵌套输入框、选择器、日期选择器、表单弹出窗组件的行内编辑功能

vue2element实现Table表格嵌套输入框、选择器、日期选择器、表单弹出窗组件的行内编辑功能 文章目录 vue2element实现Table表格嵌套输入框、选择器、日期选择器、表单弹出窗组件的行内编辑功能前言一、准备工作二、行内编辑1.嵌入Input文本输入框1.1遇到问题1.文本框内容修改失…

c#OdbcDataReader的数据读取

先有如下c#示例代码&#xff1a; string strconnect "DSNcustom;UIDsa;PWD123456;" OdbcConnection odbc new OdbcConnection(strconnect); odbc.Open(); if (odbc.State ! System.Data.ConnectionState.Open) { return; } string strSql "select ID from my…

【HTML5】老式放映机原理-实现图片无缝滚动

老式放映机原理-实现图片无缝滚动 实现思路&#xff1a; 页面设计部分——先将视口div设置为相对定位&#xff0c;再视口div里面嵌套一个类似“胶卷”的div,把该div设置为绝对定位&#xff0c;此时“胶卷"会挂靠在视口上面&#xff0c;再将“胶卷”的left属性设置为负值…

LeetCode 1781. 所有子字符串美丽值之和 题解

示例 输入&#xff1a;s "aabcb" 输出&#xff1a;5 解释&#xff1a;美丽值不为零的字符串包括 ["aab","aabc","aabcb","abcb","bcb"] &#xff0c;每一个字符串的美丽值都为 1这题光用文字解说还是无法达到讲…

2025ACTF Web部分题解

文章目录 ACTF uploadnot so web 1not so web 2 ACTF upload 前面登录随便输入可以进入文件上传页面, 随便上传一张图片, 发现路由存在file_path参数, 尝试路径穿越读取文件 发现可以成功读取 读取源码 /upload?file_path../app.pyimport uuid import os import hashlib im…

双目标清单——AI与思维模型【96】

一、定义 双目标清单思维模型是一种将决策或任务分解为两个主要目标&#xff0c;并分别列出相关要素和行动步骤的思维方式。这两个目标通常具有相互关联又有所侧重的特点&#xff0c;通过明确并列出与每个目标相关的具体事项&#xff0c;有助于更清晰地分析问题、制定计划和分…

深度学习系统学习系列【6】之深度学习技巧

文章目录 数据集准备数据集扩展数据预处理1. 0均值&#xff08;Zero Centralization&#xff09;代码实现 2. 归一化&#xff08;Normalization&#xff09;代码实现 3. 主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;实现步骤代码实现 4. 白化&#xf…

rfsoc petalinux适配调试记录

1。安装虚拟机 2.设置共享文件夹 https://xinzhi.wenda.so.com/a/1668239544201149先设置文件夹路径 vmware 12 下安装 ubuntu 16.04 后&#xff0c;按往常的惯例安装 vmware-tools&#xff0c;安装时提示建议使用 open-vm-tools&#xff0c;于是放弃 vmware-tools 的安装&am…

# YOLOv1:开启实时目标检测的新时代

YOLOv1&#xff1a;开启实时目标检测的新时代 在计算机视觉领域&#xff0c;目标检测一直是研究的热点和难点问题。它不仅需要准确地识别出图像中的物体&#xff0c;还需要确定这些物体的位置。YOLO&#xff08;You Only Look Once&#xff09;系列算法以其高效的实时目标检测…

uni-app vue3 实现72小时倒计时功能

功能介绍 &#xff0c;数组项有一个下单时间 &#xff0c;比如今天下单在72小时内可以继续支付&#xff0c;超过则默认取消订单 页面按钮处 加上倒计时 <!-- 倒计时 --> <text v-if"item.timeLeft > 0">{{ formatTime(item.remaining) }}</text&g…

一周学会Pandas2 Python数据处理与分析-Pandas2数据类型转换操作

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas 提供了灵活的方法来处理数据类型转换&#xff0c;以下是常见操作及代码示例&#xff1a; 1. 查看数据类型 …

LLM损失函数面试会问到的

介绍一下KL散度 KL&#xff08;Kullback-Leibler散度衡量了两个概率分布之间的差异。其公式为&#xff1a; D K L ( P / / Q ) − ∑ x ∈ X P ( x ) log ⁡ 1 P ( x ) ∑ x ∈ X P ( x ) log ⁡ 1 Q ( x ) D_{KL}(P//Q)-\sum_{x\in X}P(x)\log\frac{1}{P(x)}\sum_{x\in X}…

基于CBOW模型的词向量训练实战:从原理到PyTorch实现

基于CBOW模型的词向量训练实战&#xff1a;从原理到PyTorch实现 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;词向量是将单词映射为计算机可处理的数值向量的重要方式。通过词向量&#xff0c;单词之间的语义关系能够以数学形式表达&#xff0c;为后续的文本分…

Linux——进程终止/等待/替换

前言 本章主要对进程终止&#xff0c;进程等待&#xff0c;进程替换的详细认识&#xff0c;根据实验去理解其中的原理&#xff0c;干货满满&#xff01; 1.进程终止 概念&#xff1a;进程终止就是释放进程申请的内核数据结构和对应的代码和数据 进程退出的三种状态 代码运行…

iOS开发架构——MVC、MVP和MVVM对比

文章目录 前言MVC&#xff08;Model - View - Controller&#xff09;MVP&#xff08;Model - View - Presenter&#xff09;MVVM&#xff08;Model - View - ViewModel&#xff09; 前言 在 iOS 开发中&#xff0c;MVC、MVVM、和 MVP 是常见的三种架构模式&#xff0c;它们主…

0506--01-DA

36. 单选题 在娱乐方式多元化的今天&#xff0c;“ ”是不少人&#xff08;特别是中青年群体&#xff09;对待戏曲的态度。这里面固然存在 的偏见、难以静下心来欣赏戏曲之美等因素&#xff0c;却也有另一个无法回避的原因&#xff1a;一些戏曲虽然与观众…

关于Java多态简单讲解

面向对象程序设计有三大特征&#xff0c;分别是封装&#xff0c;继承和多态。 这三大特性相辅相成&#xff0c;可以使程序员更容易用编程语言描述现实对象。 其中多态 多态是方法的多态&#xff0c;是通过子类通过对父类的重写&#xff0c;实现不同子类对同一方法有不同的实现…