跳过主要内容

Yolov8

使视频流智能化

Let's add a yolov8 object detection operator, that you can find as an example. 这将帮助我们将对象检测为网络摄像头流中的边界框。

  1. 安装必须依赖

    conda create -n example_env python=3.11
    conda activate test_env
    pip install -r https://raw.githubusercontent.com/dora-rs/dora/v0.3.5/examples/python-operator-dataflow/requirements.txt
  2. 建立一个新的 object_detection.py python文件,包含以下内容

    wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.5/examples/python-operator-dataflow/object_detection.py

    object_detection.py:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-

    import numpy as np
    import pyarrow as pa

    from dora import DoraStatus
    from ultralytics import YOLO

    pa.array([])

    CAMERA_WIDTH = 640
    CAMERA_HEIGHT = 480

    class Operator:
    def __init__(self):
    self.model = YOLO("yolov8n.pt")

    def on_event(
    self,
    dora_event,
    send_output,
    ) -> DoraStatus:
    if dora_event["type"] == "INPUT":
    return self.on_input(dora_event, send_output)
    return DoraStatus.CONTINUE

    def on_input(
    self,
    dora_input,
    send_output,
    ) -> DoraStatus:

    frame = dora_input["value"].to_numpy().reshape((CAMERA_HEIGHT, CAMERA_WIDTH, 3))
    frame = frame[:, :, ::-1] # OpenCV image (BGR to RGB)
    results = self.model(frame) # includes NMS
    # 处理结果
    boxes = np.array(results[0].boxes.xyxy.cpu())
    conf = np.array(results[0].boxes.conf.cpu())
    label = np.array(results[0].boxes.cls.cpu())
    # 将它们连接在一起
    arrays = np.concatenate((boxes, conf[:, None], label[:, None]), axis=1)

    send_output("bbox", pa.array(arrays.ravel()), dora_input["metadata"])
    return DoraStatus.CONTINUE

    运算符由以下部分组成:

    on_event 当一个事件已接收,此方法调用。 当前有4个事件类型:

    • STOP:表示算子收到信号要停止。
    • INPUT: 表示已收到一个输入。
      • 您可以使用 dora_event['id'] 获得 id。
      • 您可以使用 dora_event['data'] 以字节数组形式获取数据。
      • 您可以使用 dora_event['value'],获取 arrow 数组形式的数据。
      • 您可以使用 dora_event['metadata'] 获取元数据。
    • INPUT_CLOSED: 表示输入源已关闭。 如果输入对算子的行为是关键的,这会更有用。
    • ERROR: 表示错误信息已接收。
    • UNKNOWN: 表示未知信息已接收。
  3. 在数据流中添加一个算子。

    wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.5/examples/python-operator-dataflow/dataflow.yaml

    dataflow.yaml:

    nodes:
    - id: webcam
    operator:
    python: webcam.py
    inputs:
    tick: dora/timer/millis/100
    outputs:
    - image

    - id: object_detection
    operator:
    python: object_detection.py
    inputs:
    image: webcam/image
    outputs:
    - bbox

    - id: plot
    operator:
    python: plot.py
    inputs:
    image: webcam/image
    bbox: object_detection/bbox

    在本例中,我们将 webcam/image 输出连接到 yolov8 的 image 输入。 然后将 object_detection/bbox 连接到 plot/obstacles_bbox。

    输入以节点名称为前缀,以便能够分隔名称冲突。

  4. 运行

    dora up
    dora start dataflow.yml --attach

    该图会将图像中检测到的对象显示为带有标签和置信度分数的边界框。