鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    做个 ROS 2 视觉检测开源库-YOLO介绍与安装

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    yolo+ros2 ros2 yolo
    5
    5
    2.3k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小鱼小
      小鱼 技术大佬
      最后由 编辑

      大家好,我是刚回广州的小鱼,今天给大家分享一个 ROS 2 +视觉开源库,这一系列文章本来是放在书籍里的一章,但后来觉得上下文不太符合就给删掉了,文章就放到公众号分享给大家。

      今年是2024年的第一天,以后的文章没有意外就放到 20:24 发,2024记得锁定 20:24 分的《鱼香ROS》哦~

      《做个 ROS 2 视觉检测开源库-YOLO介绍与安装》

      在无人驾驶和室内工作场景中,机器人需要进行物体识别,包括路上的车辆和行人,以及室内的餐盘回收等任务。计算机视觉技术在机器人系统中扮演着至关重要的角色。其中,YOLO(You Only Look Once)是一种高速而准确的目标检测算法,能够实时识别图像或视频中的多个对象,而无需多次检测。
      本章将详细介绍如何将目标检测算法YOLO与ROS 2集成,同时探讨如何创建一个开源库来完成目标检测任务。

      YOLO 介绍与安装

      目标检测(Object Detection)是计算机视觉领域中的一项重要任务,它的主要作用是识别图像中的物体并确定其位置。比如一张道路图像,通过目标检测不仅是要找到道路中的物体,还需要确认物体的位置和类别。在目标检测中物体的位置一般使用边界框(Bounding Box )表示,边界框使用物体的中心位置(x,y)和物体的宽(w)、高(h)四个数据表示,而类别则使用标签表示,一般是字符串,比如货车、轿车和自行车等。
      YOLO 就是一种基于深度学习的时是目标检测算法,也是本章我们要在开源库 中使用的检测算法,所以在开始编写开源库之前,我们先来了解 YOLO 和其使用方法。

      目标检测可以分为单一物体检测和多物体检测,YOLO 就是一种高效且准确多物体检测算法,就像其名字全称 ”You Only Look Once“ 含义一样, “你只需看一眼“ 就可以完成目标检测任务。
      YOLO 有多个版本,YOLOv1 是最早被提出的,在 YOLOv1 之前的时代,目标检测这活一直由 R-CNN 系列算法主导,尽管R-CNN系列在检测准确度方面表现出色,但因为其结构复杂,导致检测速度无法满足实时要求。于是在 2016 年,YOLOv1 算法是由 Joseph Redmon 等人提出,它将目标检测视为一个回归问题,直接在整个图像上使用一个卷积神经网络来预测边界框和类别概率。所以 YOLOv1 算法的特点是速度快,而且能够捕捉到目标的全局信息,减少了背景误检的情况,这一特点也被后续版本的 YOLO 算法所继承。
      本章的重点是结合 ROS 2 来使用 YOLO,所以对目标检测的基本概念和 YOLO 算法的工作原理不会进行更一步的介绍。YOLO 有多个版本,本章我们选用安装更为方便和更容易投入生产的 YOLOv5 作为我们学习和使用的版本。
      要在我们系统上安装 YOLOv5 非常简单,只需要通过 Python 包管理器 pip,一行命令就可以安装,命令如下:
      使用 pip 安装 YOLOv5

      sudo pip3 install yolov5 -i https://pypi.tuna.tsinghua.edu.cn/simple
      

      因为安装 YOLO 需要下载较多功能包,所以上面的命令使用 -i 选项指定了一个国内清华的软件源进行下载。如果对源码感兴趣或者有修改源码需求的小伙伴,可以通过下载源码方式进行安装,下载以及安装命令如下:
      通过源码安装 YOLOv5

      git clone https://github.com/fcakyon/yolov5-pip.git
      cd yolov5-pip
      sudo python3 setup.py install
      

      安装完成后,就可以使用命令行工具进行训练和检测了,我们并没有训练自己的数据集,所以这里使用 YOLOv5 提供的训练好的常见物体的目标检测模型,新建 chapt8/learn_yolo 目录,然后在终端中进入该目录运行下面的命令,下载模型文件和待检测图片:
      使用 wget 下载预训练模型和图片

      wget https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5n.pt
      wget https://raw.githubusercontent.com/fcakyon/yolov5-pip/main/tests/data/zidane.jpg
      

      第一行命令我们下载的是模型文件 yolov5n.pt ,它的大小不到 5 MB,是非常小版本,适合要求较快检测速度的场景,除了 yolov5n.pt ,根据模型从小到大还有 yolov5s.pt, yolov5m.pt, yolov5l.pt, yolov5x.pt,体积越大的模型相应检测精度越高,速度越慢。
      有了模型文件和图片,使用下面的命令就可以使用模型文件对该图片进行目标检测,命令如下:
      使用 yolov5 命令行进行图片检测

      yolov5 detect --source zidane.jpg --weights yolov5n.pt
      ---
      ...
      Fusing layers... 
      YOLOv5n summary: 270 layers, 1872157 parameters, 0 gradients
      image 1/1 /home/fishros/zidane.jpg: 384x640 2 persons, 1 tie, 30.8ms
      Speed: 0.4ms pre-process, 30.8ms inference, 1.0ms NMS per image at shape (1, 3, 640, 640)
      Results saved to runs/detect/exp2
      

      从结果可以看出,对于图片 zidane.jpg ,一共检测出了三个物体 2 persons, 1 tie 耗时 30.8ms,检测结果图片保存在了 runs/detect/exp2 目录,打开该目录可以看到同名的结果图片,对应的物体位置和类别已经完美的被检测出来。
      081bdf3e-1afd-4d00-84f2-43508b61aca1-zidane.jpg

      YOLOv5 预训练模型对图片的检测结果
      除了直接检测一个本地图片,也可以直接指定系统视频设备的编号来启动实时的检测,比如指定设备号为 0 的视频设备,指令如下:
      在指定设备上启动实时检测

      yolov5 detect --source 0 --weights yolov5x.pt
      

      感受完 YOLO 的强大,但要想让 YOLO 结合 ROS 2 一起使用,我们还要掌握如何使用 Python 调用 yolov5 模块,完成检测。

      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

      1 条回复 最后回复 回复 引用 0
      • 海
        海神冲浪
        最后由 编辑

        你好,我在运行这条命令时出现了以下错误,你知道是如何修改吗

        wm@wm-Virtual-Machine:~$ yolov5 detect --source zidane.jpg --weights yolov5l.pt
        YOLOv5 🚀 2024-9-9 Python-3.8.10 torch-2.4.1+cu121 CPU

        Traceback (most recent call last):
        File "/usr/local/lib/python3.8/dist-packages/urllib3/connection.py", line 196, in _new_conn
        sock = connection.create_connection(
        File "/usr/local/lib/python3.8/dist-packages/urllib3/util/connection.py", line 85, in create_connection
        raise err
        File "/usr/local/lib/python3.8/dist-packages/urllib3/util/connection.py", line 73, in create_connection
        sock.connect(sa)
        OSError: [Errno 101] Network is unreachable

        The above exception was the direct cause of the following exception:

        Traceback (most recent call last):
        File "/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py", line 789, in urlopen
        response = self._make_request(
        File "/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py", line 490, in _make_request
        raise new_e
        File "/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py", line 466, in _make_request
        self._validate_conn(conn)
        File "/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py", line 1095, in _validate_conn
        conn.connect()
        File "/usr/local/lib/python3.8/dist-packages/urllib3/connection.py", line 615, in connect
        self.sock = sock = self._new_conn()
        File "/usr/local/lib/python3.8/dist-packages/urllib3/connection.py", line 211, in _new_conn
        raise NewConnectionError(
        urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x7fc7fd1b8d30>: Failed to establish a new connection: [Errno 101] Network is unreachable

        The above exception was the direct cause of the following exception:

        Traceback (most recent call last):
        File "/usr/local/lib/python3.8/dist-packages/requests/adapters.py", line 667, in send
        resp = conn.urlopen(
        File "/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py", line 843, in urlopen
        retries = retries.increment(
        File "/usr/local/lib/python3.8/dist-packages/urllib3/util/retry.py", line 519, in increment
        raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
        urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /api/models/yolov5l.pt/tree/main?recursive=True&expand=False (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fc7fd1b8d30>: Failed to establish a new connection: [Errno 101] Network is unreachable'))

        During handling of the above exception, another exception occurred:

        Traceback (most recent call last):
        File "/usr/local/bin/yolov5", line 8, in <module>
        sys.exit(app())
        File "/usr/local/lib/python3.8/dist-packages/yolov5/cli.py", line 18, in app
        fire.Fire(
        File "/usr/local/lib/python3.8/dist-packages/fire/core.py", line 143, in Fire
        component_trace = _Fire(component, args, parsed_flag_args, context, name)
        File "/usr/local/lib/python3.8/dist-packages/fire/core.py", line 477, in _Fire
        component, remaining_args = _CallAndUpdateTrace(
        File "/usr/local/lib/python3.8/dist-packages/fire/core.py", line 693, in _CallAndUpdateTrace
        component = fn(*varargs, **kwargs)
        File "/usr/local/lib/python3.8/dist-packages/torch/utils/_contextlib.py", line 116, in decorate_context
        return func(*args, **kwargs)
        File "/usr/local/lib/python3.8/dist-packages/yolov5/detect.py", line 107, in run
        model = DetectMultiBackend(weights, device=device, dnn=dnn, data=data, fp16=half)
        File "/usr/local/lib/python3.8/dist-packages/yolov5/models/common.py", line 338, in init
        result = attempt_download_from_hub(w, hf_token=hf_token)
        File "/usr/local/lib/python3.8/dist-packages/yolov5/utils/downloads.py", line 154, in attempt_download_from_hub
        repo_files = list_repo_files(repo_id=repo_id, repo_type='model', token=hf_token)
        File "/usr/local/lib/python3.8/dist-packages/huggingface_hub/utils/_validators.py", line 114, in _inner_fn
        return fn(*args, **kwargs)
        File "/usr/local/lib/python3.8/dist-packages/huggingface_hub/hf_api.py", line 2775, in list_repo_files
        return [
        File "/usr/local/lib/python3.8/dist-packages/huggingface_hub/hf_api.py", line 2775, in <listcomp>
        return [
        File "/usr/local/lib/python3.8/dist-packages/huggingface_hub/hf_api.py", line 2912, in list_repo_tree
        for path_info in paginate(path=tree_url, headers=headers, params={"recursive": recursive, "expand": expand}):
        File "/usr/local/lib/python3.8/dist-packages/huggingface_hub/utils/_pagination.py", line 36, in paginate
        r = session.get(path, params=params, headers=headers)
        File "/usr/local/lib/python3.8/dist-packages/requests/sessions.py", line 602, in get
        return self.request("GET", url, **kwargs)
        File "/usr/local/lib/python3.8/dist-packages/requests/sessions.py", line 589, in request
        resp = self.send(prep, **send_kwargs)
        File "/usr/local/lib/python3.8/dist-packages/requests/sessions.py", line 703, in send
        r = adapter.send(request, **kwargs)
        File "/usr/local/lib/python3.8/dist-packages/huggingface_hub/utils/_http.py", line 66, in send
        return super().send(request, *args, **kwargs)
        File "/usr/local/lib/python3.8/dist-packages/requests/adapters.py", line 700, in send
        raise ConnectionError(e, request=request)
        requests.exceptions.ConnectionError: (MaxRetryError("HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /api/models/yolov5l.pt/tree/main?recursive=True&expand=False (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fc7fd1b8d30>: Failed to establish a new connection: [Errno 101] Network is unreachable'))"), '(Request ID: 78fa4efc-d4bd-41cc-a12c-ae072603e495)')

        S 1 条回复 最后回复 回复 引用 0
        • Y
          yang2004114 0
          最后由 编辑

          有没有ROS1的功能包呢

          1 条回复 最后回复 回复 引用 0
          • S
            shanjinfeng @海神冲浪
            最后由 编辑

            @海神冲浪 跟你一样的错误,请问你解决了吗

            1 条回复 最后回复 回复 引用 0
            • W
              W0rthy9
              最后由 编辑

              截图 2025-02-16 10-59-57.png

              1 条回复 最后回复 回复 引用 0
              • 第一个帖子
                最后一个帖子
              皖ICP备16016415号-7
              Powered by NodeBB | 鱼香ROS