Dora-rs 机器人框架学习教程(3)——利用yolo实现目标检测

news/2024/7/9 23:44:24 标签: dora, dora-rs, YOLO, 机器人框架, 目标检测

文章目录

  • 1 安装pytroch环境
    • 1.1 nvidia驱动
    • 1.2 安装cuda
    • 1.3 在conda中安装pytorch GPU版本
    • 1.4 检验pytroch是否安装正确
  • 2 编写程序代码
    • 2.1 object_detection.py文件内容如下:
    • 2.2 dataflow.yml 文件内容如下:
  • 3 运行
  • 参考资料

目标:在dora框架下编写一个Python节点读取USB摄像头数据,并调用yolo目标检测API接口函数实现目标检测

1 安装pytroch环境

1.1 nvidia驱动

打开ubuntu的software&updates,选择其中的additional drivers ,选择一个对应驱动
在这里插入图片描述

1.2 安装cuda

执行下述命令,安装ubuntu官方库里的cuda

sudo apt install nvidia-cuda-toolkit

查看cuda版本 nvcc -V
在这里插入图片描述
这里我的电脑上的cuda是12.0,在pytroch的官网上是没有,但是我们可以选择对应cuda11.8的版本也是可以

1.3 在conda中安装pytorch GPU版本

去 pytorch 官网[1]选择对应版本的 pytorch
首先激活conda环境

conda create -n dorars python=3.11
conda activate dorars
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

安装过程会出现以下信息
在这里插入图片描述

1.4 检验pytroch是否安装正确

在安装完后,本节的步骤将会测试安装是否成功,首先进入你之前建的anaconda虚拟环境,输入:

python

进入python终端模式,在终端中输入

import torch
print(torch.rand(5, 3))

安装成功以后会输出以下信息:
在这里插入图片描述

接下来输入

torch.cuda.is_available()

如果输出True那就表示安装环境OK

2 编写程序代码

这里我是在coda环境下运行dora节点的,
step1: 首先激活conda环境

conda create -n dorars python=3.11
conda activate dorars

step2: 下载文件,这里涉及4个文件

  • webcam.py 读取摄像头或者视频流数据,并发布到dora
  • object_detection.py yolov5相关代码
  • plot.py 显示yolov5输出的结果
  • dataflow.yml 配置文件
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.0/examples/python-operator-dataflow/webcam.py
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.0/examples/python-operator-dataflow/plot.py
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.0/examples/python-operator-dataflow/utils.py
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.0/examples/python-operator-dataflow/object_detection.py
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.0/examples/python-operator-dataflow/dataflow.yaml

2.1 object_detection.py文件内容如下:

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

import cv2
import numpy as np
import pyarrow as pa
import torch

from dora import DoraStatus

pa.array([])

CAMERA_WIDTH = 640
CAMERA_HEIGHT = 480

class Operator:
    """
    Infering object from images
    """

    def __init__(self):
        self.model = torch.hub.load("ultralytics/yolov5", "yolov5n")

    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:
        """Handle image
        Args:
            dora_input (dict) containing the "id", "value", and "metadata"
            send_output Callable[[str, bytes | pa.Array, Optional[dict]], None]:
                Function for sending output to the dataflow:
                - First argument is the `output_id`
                - Second argument is the data as either bytes or `pa.Array`
                - Third argument is dora metadata dict
                e.g.: `send_output("bbox", pa.array([100], type=pa.uint8()), dora_event["metadata"])`
        """

        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
        arrays = pa.array(np.array(results.xyxy[0].cpu()).ravel())
        send_output("bbox", arrays, dora_input["metadata"])
        return DoraStatus.CONTINUE

2.2 dataflow.yml 文件内容如下:

 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

3 运行

新建一个终端,进入conda环境

conda create -n dorars python=3.11
conda activate dorars

启动dora节点

dora up
dora start dataflow_yolo.yml --attach

这里去网上找了一个视频,修改 webcam.py 读取视频文件进行测试

请添加图片描述

参考资料

[1] https://pytorch.org/get-started/locally/
[2] https://dora.carsmos.ai/docs/guides/getting-started/yolov5

dora-rs目前资料较少 欢迎大家点赞在评论区交流讨论(cenruping@vip.qq.com) O(∩_∩)O
或者加群水一波(1149897304)


http://www.niftyadmin.cn/n/5312347.html

相关文章

TypeScript产品经理Daniel Rosenwasser介绍TypeScript新特性

这是TypeScript产品经理Daniel Rosenwasser在2019微软开发者大会上介绍TypeScript新特性的演讲视频。 TypeScript在去年推出了突破性的创新。在更智能的推理、强大的表现力、更严格的检查、工具和更快的构建之间,我们将看到TypeScript带来的一些创新的新特性&#x…

软考高级选择考哪个好?

📒软考高级总共5个科目,同样是高级证书,认可度也有区别! 大家一般在「信息系统项目管理师」✔️和「系统架构设计师」✔️二选一 1️⃣信息系统项目管理师 ❤️信息系统项目管理师也叫「高项」,考试内容主要是「项目管理」相关&am…

数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组)

原地移除元素 题目:来源力扣。 思路1 在单数组里面历遍找val,如果是val,就删除。不是就跳过。 时间复杂度O(n^2),最坏情况每个都是val。相当于一个等差数列。 比如 输入:nums [0,1,2,2,3,0,4,2], val 2 下标0开…

sqlite插入语句id自增列问题

sqlite给主键id设置AUTOINCREMENT自增在插入数据的时候报错table has x columns but x-1 values were supplied 为什么自增列要显示不提供,sqlite需要提供自增列table ResTools has 7 columns but 6 values were supplied SQL Statement:insert into ResTools values(管理系统w…

单片机原理及应用:中断系统结构与控制寄存器

大家好啊,这几天因为考试断更了一段时间,现在放假了也可以恢复正常的更新速度了。今天我们来认识一下单片机的中断系统,这里可以说是我们学习单片机以来第一个核心功能,我们会分几期内容来深入了解中断系统的作用原理和应用方式。…

深度学习知识点总结

关于bn层 mean,std 第i个元素就是第i个通道上全部batch张输出特征图所有元素的平均值和方差,所shape就是特征图shape 可学习参数 weight和bias分别对应 γ,β.有bn时cov可以不用bia 在训练过程中,mean和std是统计得到的,然后在迭代过程中动态累加,m*si-1(1-m)*si,m…

Linux--好玩的进度条

前言 先来看看我们想要达到的进度条效果,具体代码会在文章最后面放出。 一、创建文件及Makefile 我们需要实现声明的定义的分离,因此创建如下三个文件。 process.h prcess.c main.c。 touch process.h process.c main.c 同时还需要创建Makefi…

微创新与稳定性的权衡

之前做过一个项目,业务最高峰CPU使用率也才50%,是一个IO密集型的应用。里面涉及一些业务编排,所以为了提高CPU使用率,我有两个方案:一个是简单的梳理将任务可并行的采用并行流、额外线程池等方式做并行;另外…