基于YOLOv10+YOLOP+PYQT的可视化系统,实现多类别目标检测+可行驶区域分割+车道线分割【附代码】

文章目录

  • 前言
  • 视频效果
  • 必要环境
  • 一、代码结构
    • 1、 训练参数解析
    • 2、 核心代码解析
      • 1.初始化Detector类
      • 2. @torch.no_grad()
      • 3. 复制输入图像并初始化计数器
      • 4. 调用YOLOv10模型进行目标检测
      • 5. 提取检测结果信息
      • 6. 遍历检测结果并在图像上绘制边界框和标签
      • 7. 准备输入图像以适应End-to-end模型
      • 8. 使用YOLOP模型进行推理
      • 9. 处理可行驶区域分割结果
      • 10. 处理车道线分割结果
  • 二、效果展示
  • 三、完整代码获取
  • 总结


前言

在往期博客中,我们详细介绍了如何搭建YOLOv10和YOLOP的环境。本期将结合这两个算法,实现多类别目标检测、可行驶区域分割和车道线分割等多种任务,并将其部署到PYQT界面中进行展示。


视频效果

b站链接:基于YOLOv10+YOLOP+PYQT的可视化系统,实现多类别目标检测+可行驶区域分割+车道线分割多种任务


必要环境

  1. 配置yolov10环境 可参考往期博客
    地址:搭建YOLOv10环境 训练+推理+模型评估
  2. 配置yolop环境 可参考往期博客
    地址:YOLOP 训练+测试+模型评估

一、代码结构

1、 训练参数解析

首先,我们利用 argparse 模块来设置命令行参数,以便灵活配置模型的权重路径、使用设备(cpu、gpu)等信息

# 解析命令行参数
parser.add_argument('--v10weights', default=r"yolov10s.pt", type=str, help='weights path')
parser.add_argument('--weights', default=r"weights/End-to-end.pth", type=str, help='weights path')
parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--imgsz', type=int, default=640, help='image size')
parser.add_argument('--merge_nms', default=False, action='store_true', help='merge class')
parser.add_argument('--conf_thre', type=float, default=0.3, help='conf_thre')
parser.add_argument('--iou_thre', type=float, default=0.2, help='iou_thre')
parser.add_argument('--augment', action='store_true', help='augmented inference')
opt = parser.parse_args()

关键参数详解:

  1. –v10weights: 指定YOLOv10模型的权重文件路径。

  2. –weights: 指定YOLOP模型的权重文件路径,这个模型包含了车道线分割和可行驶区域分割的任务

  3. –device: 指定运行模型的设备,可以是单个GPU(如 0),或者是CPU(cpu)

  4. –imgsz: 指定输入图像的尺寸,输入图像会被调整为这个尺寸,以适应模型的输入要求

  5. –conf_thre: 设置初始置信度阈值,只有置信度高于这个阈值的检测框才会被保留

  6. –iou_thre: 设置初始IOU阈值,在NMS过程中,只有IOU低于这个阈值的检测框才会被保留

2、 核心代码解析

此部分包含车道线分割、可行驶区域分割和目标检测等关键部分的代码

1.初始化Detector类

这段代码定义了一个名为Detector的类,该类初始化了两个模型:一个是用于End-to-end检测的YOLOP模型,另一个是用于目标检测的YOLOv10模型。通过加载权重文件、设置设备、调整图像大小以及配置模型参数,实现了对这两个模型的初始化和准备工作

class Detector:
    def __init__(self, v10weights, cfg, device, model_path=r'./best_dist_model.pt', imgsz=640, conf=0.5, iou=0.0625, merge_nms=False):
        self.device = device
        self.model = get_net(cfg)
        checkpoint = torch.load(model_path, map_location=device)
        self.model.load_state_dict(checkpoint['state_dict'])
        self.model = self.model.to(device)
        img_w = torch.zeros((1, 3, imgsz, imgsz), device=device)
        _ = self.model(img_w)
        self.model.eval()

        self.stride = int(self.model.stride.max())
        self.imgsz = check_img_size(imgsz, s=self.stride)
        self.merge_nms = merge_nms

        self.model_v10 = YOLOv10(v10weights)
        self.names = self.model_v10.names

2. @torch.no_grad()

这是一个装饰器,用于禁用梯度计算,可以减少内存消耗并加快推理速度,通常在推理时使用

@torch.no_grad()
def __call__(self, image: np.ndarray, conf, iou):

3. 复制输入图像并初始化计数器

复制输入图像以便在结果图像上进行操作,并初始化一个默认字典来记录每个类别的检测次数

img_vis = image.copy()
class_counts = defaultdict(int)

4. 调用YOLOv10模型进行目标检测

使用YOLOv10模型在输入图像上进行目标检测,返回检测结果

results = self.model_v10(image, verbose=True, conf=conf, iou=iou, device=self.device)

5. 提取检测结果信息

提取检测结果中的类别、置信度和边界框坐标

bboxes_cls = results[0].boxes.cls
bboxes_conf = results[0].boxes.conf
bboxes_xyxy = results[0].boxes.xyxy.cpu().numpy().astype('uint32')

6. 遍历检测结果并在图像上绘制边界框和标签

遍历所有检测到的目标,在图像上绘制边界框和标签,并记录每个类别的检测次数

for idx in range(len(bboxes_cls)):
    box_cls = int(bboxes_cls[idx])
    bbox_xyxy = bboxes_xyxy[idx]
    bbox_label = self.names[box_cls]
    class_counts[bbox_label] += 1
    box_conf = f"{bboxes_conf[idx]:.2f}"
    xmax, ymax, xmin, ymin = bbox_xyxy[2], bbox_xyxy[3], bbox_xyxy[0], bbox_xyxy[1]

    img_vis = cv2.rectangle(img_vis, (xmin, ymin), (xmax, ymax), get_color(box_cls + 2), 3)
    cv2.putText(img_vis, f'{str(bbox_label)}/{str(box_conf)}', (xmin, ymin - 10),
                cv2.FONT_HERSHEY_SIMPLEX, 1.0, get_color(box_cls + 2), 3)

7. 准备输入图像以适应End-to-end模型

对输入图像进行调整和预处理,以适应End-to-end模型的输入要求

img, ratio, pad = letterbox_for_img(image, new_shape=self.imgsz, auto=True)
pad_w, pad_h = pad
pad_w = int(pad_w)
pad_h = int(pad_h)
ratio = ratio[1]
img = np.ascontiguousarray(img)
img = transform(img).to(self.device)
im = img.float()
if im.ndimension() == 3:
    im = im.unsqueeze(0)

8. 使用YOLOP模型进行推理

在预处理后的图像上运行End-to-end模型,输出检测结果、车道线分割结果和可行驶区域分割结果

det_out, da_seg_out, ll_seg_out = self.model(im)

9. 处理可行驶区域分割结果

这段代码将对可行驶区域的分割结果进行后处理,首先从模型输出中裁剪出实际的分割结果,通过双线性插值恢复到原始图像尺寸,然后提取每个像素的类别索引,最终生成可行驶区域的分割掩码

_, _, height, width = im.shape
da_predict = da_seg_out[:, :, pad_h:(height - pad_h), pad_w:(width - pad_w)]
da_seg_mask = torch.nn.functional.interpolate(da_predict, scale_factor=int(1 / ratio), mode='bilinear')
_, da_seg_mask = torch.max(da_seg_mask, 1)
da_seg_mask = da_seg_mask.int().squeeze().cpu().numpy()

10. 处理车道线分割结果

这段代码将对车道线分割结果进行后处理,和处理可行驶区域分割结果同理,首先从模型输出中裁剪出实际的分割结果,并通过双线性插值恢复到原始图像尺寸,然后提取每个像素的类别索引,生成最终的分割掩码

ll_predict = ll_seg_out[:, :, pad_h:(height - pad_h), pad_w:(width - pad_w)]
ll_seg_mask = torch.nn.functional.interpolate(ll_predict, scale_factor=int(1 / ratio), mode='bilinear')
_, ll_seg_mask = torch.max(ll_seg_mask, 1)
ll_seg_mask = ll_seg_mask.int().squeeze().cpu().numpy()

二、效果展示

在这里插入图片描述
在这里插入图片描述

三、完整代码获取

链接:基于YOLOv10+YOLOP+PYQT的可视化系统,实现多类别目标检测+可行驶区域分割+车道线分割


总结

本期博客就到这里啦,喜欢的小伙伴们可以点点关注,感谢!

最近经常在b站上更新一些有关目标检测的视频,大家感兴趣可以来看看 https://b23.tv/1upjbcG

学习交流群:995760755

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/778661.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年导游资格证题库备考题库,高效备考!

1.台湾著名的太鲁阁公园的特色是()。 A.丘陵和溶洞 B.森林和瀑布 C.峡谷和断崖 D.彩林和彩池 答案:C 解析:台湾著名的太鲁阁公园的特色是峡谷和断崖。 2.下列位于台湾的景区中,素有"神秘的森林王国"之…

DropNotch for Mac v1.0.1 在 Mac 刘海快速使用 AirDrop

应用介绍 DropNotch 是一款专为Mac设计的应用程序,可以将MacBook的凹口区域(刘海)转换为文件放置区。 功能特点 文件共享: 用户可以将文件拖放到MacBook的凹口区域,并通过AirDrop、邮件、消息等方式轻松共享。多显示器支持: 即…

Web漏洞扫描工具AppScan与AWVS测评及使用体验

AppScan和AWVS业界知名的Web漏洞扫描工具,你是否也好奇到底哪一个能力更胜一筹呢?接下来跟随博主一探究竟吧。 1. 方案概览 第一步:安装一个用于评测的Web漏洞靶场(本文采用最知名和最广泛使用的靶场,即OWASP Benchma…

WY-35A4T三相电压继电器 导轨安装 约瑟JOSEF

功能简述 WY系列电压继电器是带延时功能的数字式交流电压继电器。 可用于发电机,变压器和输电线的继电保护装置中,作为过电压或欠电压闭锁的动作元件 LCD实时显示当前输入电压值 额定输入电压Un:100VAC、200VAC、400VAC产品满足电磁兼容四级标准 产品…

Spring容器Bean之XML配置方式

一、首先看applicationContext.xml里的配置项bean 我们采用xml配置文件的方式对bean进行声明和管理,每一个bean标签都代表着需要被创建的对象并通过property标签可以为该类注入其他依赖对象,通过这种方式Spring容器就可以成功知道我们需要创建那些bean实…

使用LoFTR模型进行图像配准、重叠区提取

LoFTR模型源自2021年CVPR提出的一篇论文LoFTR: Detector-Free Local Feature Matching with Transformers,其基于pytorch实现图像配准,与基于superpointsuperglue的方法不同, 是一个端到端的图像配准方法。与LoFTR官方库相关的有loftr2onnx库…

NDVI数据集提取植被覆盖度FVC

植被覆盖度FVC 植被覆盖度(Foliage Vegetation Cover,FVC)是指植被冠层覆盖地表的面积比例,通常用来描述一个区域内植被的茂密程度或生长状况。它是生态学、环境科学以及地理信息系统等领域的重要指标,对于理解地表能…

SwinTransformer的相对位置索引的原理以及源码分析

文章目录 1. 理论分析2. 完整代码 引用:参考博客链接 1. 理论分析 根据论文中提供的公式可知是在 Q Q Q和 K K K进行匹配并除以 d \sqrt d d ​ 后加上了相对位置偏执 B B B。 A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d B ) V \begin{aligned} &…

软件设计之Java入门视频(12)

软件设计之Java入门视频(12) 视频教程来自B站尚硅谷: 尚硅谷Java入门视频教程,宋红康java基础视频 相关文件资料(百度网盘) 提取密码:8op3 idea 下载可以关注 软件管家 公众号 学习内容: 该视频共分为1-7…

gptoolbox matlab工具箱cmake 调试笔记

一、问题描述 起因:在matlab中运行Offset surface of triangle mesh in matlab的时候报错: 不支持将脚本 signed_distance 作为函数执行: E:\MATLAB_File\gptoolbox\mex\signed_distance.m> 出错 offset_bunny (第 22 行) D signed_distance(BC,V,F…

绝区贰--及时优化降低 LLM 成本和延迟

前言 大型语言模型 (LLM) 为各行各业带来了变革性功能,让用户能够利用尖端的自然语言处理技术处理各种应用。然而,这些强大的 AI 系统的便利性是有代价的 — 确实如此。随着 LLM 变得越来越普及,其计算成本和延迟可能会迅速增加,…

Python实战训练(方程与拟合曲线)

1.方程 求e^x-派(3.14)的解 用二分法来求解,先简单算出解所在的区间,然后用迭代法求逼近解,一般不能得到精准的解,所以设置一个能满足自己进度的标准来判断解是否满足 这里打印出解x0是因为在递归过程中…

经典双运算放大器LM358

前言 LM358双运放有几十年的历史了吧?通用运放,很常用,搞电路的避免不了接触运放,怎么选择运放,是工程师关心的问题吧? 从本文开始,将陆续发一些常用的运放,大家选型可以参考&#…

【最新整理】全国高校本科及专科招生和毕业数据集(2008-2022年)

整理了各省高校本科、专科招生和毕业数据等21个相关指标,包括招生、在校、毕业人数,以及财政教育支出、教育经费等数据。含原始数据、线性插值、回归填补三个版本,希望对大家有所帮助 一、数据介绍 数据名称:高校本科、专科招生…

如何处理 PostgreSQL 中由于表连接顺序不当导致的性能问题?

文章目录 一、理解表连接和连接顺序二、识别由于表连接顺序不当导致的性能问题三、影响表连接顺序的因素四、解决方案手动调整连接顺序创建合适的索引分析数据分布和优化查询逻辑 五、示例分析手动调整连接顺序创建索引优化查询逻辑 六、总结 在 PostgreSQL 中,表连…

[FreeRTOS 内部实现] 事件组

文章目录 事件组结构体创建事件组事件组等待位事件组设置位 事件组结构体 // 路径:Source/event_groups.c typedef struct xEventGroupDefinition {EventBits_t uxEventBits;List_t xTasksWaitingForBits; } EventGroup_t;uxEventBits 中的每一位表示某个事件是否…

【LeetCode:3101. 交替子数组计数 + 滑动窗口 + 数学公式】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

怎样把自己电脑ip改成动态ip:步骤与解析

在今天的网络世界中,IP地址是计算机与互联网沟通的桥梁。而动态IP地址,作为其中的一种类型,由于其自动分配和管理的特性,为用户提供了更大的便利性和灵活性。那么,您是否想知道怎样将电脑IP改为动态呢?本文…

用Excel处理数据图像,出现交叉怎么办?

一、问题描述 用excel制作X-Y散点图,意外的出现了4个交叉点,而实际上的图表数据是没有交叉的。 二、模拟图表 模拟部分数据,并创建X-Y散点图,数据区域,X轴数据是依次增加的,因此散点图应该是没有交叉的。…

js好用的动态分页插件

js好用的动态分页插件是一款简单的分页样式插件,支持样式类型,当前页,每页显示数量,按钮数量,总条数,上一页文字,下一页文字,输入框跳转等功能。 js好用的动态分页插件