1. 流式处理
  2. 使用Webrtc从网络摄像头进行对象检测

使用WebRTC从网络摄像头流中进行实时对象检测

在本指南中,我们将使用YOLOv10在Gradio中从用户的网络摄像头流中执行实时对象检测。我们将利用Gradio 5.0中引入的最新流媒体功能。您可以在下面看到实际效果的成品:

设置

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

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

我们将使用ONNX运行库来加速YOLOv10的推理。本指南假设您可以访问GPU。如果没有,请将onnxruntime-gpu更改为onnxruntime。没有GPU的情况下,模型运行速度会变慢,导致演示卡顿。

我们将使用OpenCV进行图像处理,并使用Gradio WebRTC自定义组件在底层使用WebRTC,以实现接近零延迟。

注意: 如果你想在任何云提供商上部署这个应用程序,你需要使用免费的Twilio API来访问他们的TURN服务器。在Twilio上创建一个免费账户。如果你不熟悉TURN服务器,请参考这个指南

推理函数

我们将从Hugging Face hub下载YOLOv10模型,并实例化一个自定义推理类来使用这个模型。

本指南未涵盖推理类的实现,但如果您感兴趣,可以在此处找到源代码here。此实现大量借鉴了这个github仓库

我们正在使用yolov10-n变体,因为它具有最低的延迟。请参阅YOLOv10 GitHub仓库中的性能部分。

from huggingface_hub import hf_hub_download
from inference import YOLOv10

model_file = hf_hub_download(
    repo_id="onnx-community/yolov10n", filename="onnx/model.onnx"
)

model = YOLOv10(model_file)

def detection(image, conf_threshold=0.3):
    image = cv2.resize(image, (model.input_width, model.input_height))
    new_image = model.detect_objects(image, conf_threshold)
    return new_image

我们的推理函数,detection,接受来自摄像头的numpy数组和所需的置信度阈值。像YOLO这样的目标检测模型会识别许多对象并为每个对象分配一个置信度分数。置信度越低,误报的可能性越高。我们将允许用户调整置信度阈值。

该函数返回一个与输入图像相对应的numpy数组,其中所有检测到的对象都在边界框中。

Gradio演示

Gradio 演示很简单,但我们将实现一些特定的功能:

  1. 使用WebRTC自定义组件确保输入和输出通过WebRTC发送到/从服务器。
  2. WebRTC 组件将同时作为输入和输出组件。
  3. 利用stream事件的time_limit参数。此参数为每个用户的流设置处理时间。在多用户设置中,例如在Spaces上,我们将在该时间段后停止处理当前用户的流,并继续处理下一个用户的流。

我们还将应用自定义CSS来将摄像头和滑块居中显示在页面上。

import gradio as gr
from gradio_webrtc import WebRTC

css = """.my-group {max-width: 600px !important; max-height: 600px !important;}
         .my-column {display: flex !important; justify-content: center !important; align-items: center !important;}"""

with 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()

结论

我们的应用程序托管在Hugging Face Spaces 这里

您可以使用此应用程序作为起点,使用Gradio构建实时图像应用程序。如果您有任何问题或遇到问题,请毫不犹豫地在空间或WebRTC组件GitHub仓库中提出问题。