小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
做个 ROS 2 视觉检测开源库-YOLO介绍与安装
-
大家好,我是刚回广州的小鱼,今天给大家分享一个 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 安装 YOLOv5sudo pip3 install yolov5 -i https://pypi.tuna.tsinghua.edu.cn/simple
因为安装 YOLO 需要下载较多功能包,所以上面的命令使用 -i 选项指定了一个国内清华的软件源进行下载。如果对源码感兴趣或者有修改源码需求的小伙伴,可以通过下载源码方式进行安装,下载以及安装命令如下:
通过源码安装 YOLOv5git 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 目录,打开该目录可以看到同名的结果图片,对应的物体位置和类别已经完美的被检测出来。
YOLOv5 预训练模型对图片的检测结果
除了直接检测一个本地图片,也可以直接指定系统视频设备的编号来启动实时的检测,比如指定设备号为 0 的视频设备,指令如下:
在指定设备上启动实时检测yolov5 detect --source 0 --weights yolov5x.pt
感受完 YOLO 的强大,但要想让 YOLO 结合 ROS 2 一起使用,我们还要掌握如何使用 Python 调用 yolov5 模块,完成检测。
-
你好,我在运行这条命令时出现了以下错误,你知道是如何修改吗
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 CPUTraceback (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 unreachableThe 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 unreachableThe 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)') -
有没有ROS1的功能包呢