Yolov8
使视频流智能化
Let's add a yolov8
object detection operator, that you can find as an example. 这将帮助我们将对象检测为网络摄像头流中的边界框。
-
安装必须依赖
conda create -n example_env python=3.11
conda activate test_env
pip install -r https://raw.githubusercontent.com/dora-rs/dora/v0.3.6/examples/python-operator-dataflow/requirements.txt -
建立一个新的
object_detection.py
python文件,包含以下内容wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.6/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
: 表示未知信息已接收。
-
在数据流中添加一个算子。
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.6/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。输入以节点名称为前缀,以便能够分隔名称冲突。
-
运行
dora up
dora start dataflow.yml --attach该图会将图像中检测到的对象显示为带有标签和置信度分数的边界框。