基于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 = deviceself.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_nmsself.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] += 1box_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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【致知功夫 各随分限】成长需要时间,助人须考虑对方的承受程度

帮助他人需考虑各人的分限所能及的,初学圣学需时间沉淀,存养心性 任何人都应该受到教育,不应受到贫富、贵贱的差异而排除在教育之外,对于不同材质的学生,需要因材施教; 每天都有新的认知,大我…

STL—容器—string类【对其结构和使用的了解】【对oj相关练习的训练】

STL—容器—string类 其实string类准确来说并不是容器,因为他出现的时间比STL要早,但是也可以说是容器吧。 1.为什么要学习string类? 1.1C语言当中的字符串 C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作…

CTFShow的RE题(三)

数学不及格 strtol 函数 long strtol(char str, char **endptr, int base); 将字符串转换为长整型 就是解这个方程组了 主要就是 v4, v9的关系, 3v9-(v10v11v12)62d10d4673 v4 v12 v11 v10 0x13A31412F8C 得到 3*v9v419D024E75FF(1773860189695) 重点&…

Windows ipconfig命令详解,Windows查看IP地址信息

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 ipconfig 1、基…

Android Studio Run窗口中文乱码解决办法

Android Studio Run窗口中文乱码解决办法 问题描述: AndroidStudio 编译项目时Run窗口中文乱码,如图: 解决方法: 依次打开菜单:Help--Edit Custom VM Options,打开studio64.exe.vmoptions编辑框&#xf…

计算机专业怎么选择电脑

现在高考录取结果基本已经全部出来了,很多同学都如愿以偿的进入到了计算机类专业,现在大部分同学都在为自己的大学生活做准备了,其中第一件事就是买电脑,那计算机类专业该怎么选择电脑呢? 计算机专业是个一类学科&…

网络中的网络 NiN

一、全连接层问题 1、卷积层的参数:输入的通道数乘以输出的通道数再乘以窗口的高宽 2、全连接层的参数就是输入的元素个数乘以输出的元素个数,也就是输入的通道数乘以输入的高宽,再乘以输出的通道数乘以输出的高宽,贼大的量级 …

NLP简介

自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自…

【算法】(C语言):冒泡排序、选择排序、插入排序

冒泡排序 从第一个数据开始到第n-1个数据,依次和后面一个数据两两比较,数值小的在前。最终,最后一个数据(第n个数据)为最大值。从第一个数据开始到第n-2个数据,依次和后面一个数据两两比较,数值…

关于用户咨询华为擎云L410笔记本安装Windows系统的说明

同样也是单位购买的华为擎云L410 KLVU-WDU0笔记本电脑,国产UOS系统某些软件用着不是很方便,用户咨询是否能够安装Windows10或者Windows7? 带着种种疑问也做了一些查询,之前也给一些国产设备更改过操作系统,之前的国产设…

计算机网络浅谈—什么是 OSI 模型?

开放系统通信(OSI)模型是一个代表网络通信工作方式的概念模型。 思维导图 什么是 OSI 模型? 开放系统互连 (OSI) 模型是由国际标准化组织创建的概念模型,支持各种通信系统使用标准协议进行通信。简单而言,OSI 为保证…

智能交通(3)——Learning Phase Competition for Traffic Signal Control

论文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 论文代码 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越来越多可用的城市数据和先进的学习技术使人们能够提…

【pytorch19】交叉熵

分类问题的loss MSECross Entropy LossHinge Loss (SVN用的比较多) ∑ i m a x ( 0 , 1 − y i ∗ h θ ( x i ) ) \sum_imax(0,1-y_i*h_\theta(x_i)) ∑i​max(0,1−yi​∗hθ​(xi​)) Entropy(熵) Uncertainty(…

ESP32——物联网小项目汇总

商品级ESP32智能手表 [文章链接] 用ESP32,做了个siri?!开源了! [文章链接]

UDP协议:独特之处及其在网络通信中的应用

在网络通信领域,UDP(用户数据报协议,User Datagram Protocol)是一种广泛使用的传输层协议。与TCP(传输控制协议,Transmission Control Protocol)相比,UDP具有其独特的特点和适用场景…

02STM32环境搭建新建工程

STM32环境搭建&新建工程 软件安装:开发方式&新建工程步骤&架构 个人心得 软件安装: 安装Keil5 MDK 安装器件支持包 软件注册 安装STLINK驱动 安装USB转串口驱动 开发方式&新建工程步骤&架构 STM32开发方式: 1.寄存器 …

mysql中的递归函数recursive

递归部门 WITH recursive dept_tree AS (SELECTsd.mine_id AS mine_id,sd.dept_id AS dept_id,sd.tenant_id AS tenant_id,sd.order_num,sd.dept_name AS topName,sd.dept_id AS topIdFROMsys_dept sdWHERE<!-- 加上or后也会查询出dept节点 sd.parent_id #{deptId} or sd.…

uniapp H5页面设置跨域请求

记录一下本地服务在uniapp H5页面访问请求报跨域的错误 这是我在本地起的服务端口号为8088 ip大家可打开cmd 输入ipconfig 查看 第一种方法 在源码视图中配置 "devServer": {"https": false, // 是否启用 https 协议&#xff0c;默认false"port&q…

跨界客户服务:拓展服务边界,创造更多价值

在当今这个日新月异的商业时代&#xff0c;跨界合作已不再是新鲜词汇&#xff0c;它如同一股强劲的东风&#xff0c;吹散了行业间的壁垒&#xff0c;为企业服务创新开辟了前所未有的广阔天地。特别是在客户服务领域&#xff0c;跨界合作正以前所未有的深度和广度&#xff0c;拓…

一文理解 Treelite,Treelite 为决策树集成模型的部署和推理提供了高效、灵活的解决方案

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、什么是 Treelite&#xff1f; Treelite 是一个专门用于将决策树集成模型高效部署到生产环境中的机器学习模型编译器&#xff0c;特别适合处理大批量数据的推理任务&#xff0c;能够显著提升推理性能…