YOLOv5-7.0实例分割+TensorRT部署

news2025/2/24 17:37:27

一:介绍

将YOLOv5结合分割任务并进行TensorRT部署,是一项既具有挑战性又令人兴奋的任务。分割(Segmentation)任务要求模型不仅能够检测出目标的存在,还要精确地理解目标的边界和轮廓,为每个像素分配相应的类别标签,使得计算机能够对图像进行更深入的理解和解释。而TensorRT作为一种高性能的深度学习推理引擎,能够显著加速模型的推理过程,为实时应用提供了强大的支持。

在本文中,我们将探讨如何将YOLOv5与分割任务相结合,实现同时进行目标检测和像素级别的语义分割。我们将详细介绍模型融合的技术和步骤,并深入讨论如何利用TensorRT对模型进行优化,以实现在嵌入式设备和边缘计算环境中的高效部署。通过阐述实验结果和性能指标,我们将展示这一方法的有效性和潜力,为读者带来关于结合YOLOv5、分割任务和TensorRT部署的全面认识。

二:python

  1. 打开pycharm,终端输入pip install labelme
  2. 为了方便我们之后标注的工作,需要打开C盘->用户->用户名->.labelmerc文件打开之后,将第一行的auto_save改为true,方便标框需要将create_polygon改为W,方便修改标注框将edit_polygon改为J
  3. 下载结束后,pycharm终端输入labelme,打开你数据集的文件夹,进行标注即可,这里不放图片演示了
  4. 标注完之后我们需要将json文件转换为txt文件,下面放上所需要的代码
    import json
    import os
    import argparse
    from tqdm import tqdm
    
    
    def convert_label_json(json_dir, save_dir, classes):
        json_paths = os.listdir(json_dir)
        classes = classes.split(',')
    
        for json_path in tqdm(json_paths):
            # for json_path in json_paths:
            path = os.path.join(json_dir, json_path)
            with open(path, 'r') as load_f:
                json_dict = json.load(load_f)
            h, w = json_dict['imageHeight'], json_dict['imageWidth']
    
            # save txt path
            txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))
            txt_file = open(txt_path, 'w')
    
            for shape_dict in json_dict['shapes']:
                label = shape_dict['label']
                label_index = classes.index(label)
                points = shape_dict['points']
    
                points_nor_list = []
    
                for point in points:
                    points_nor_list.append(point[0] / w)
                    points_nor_list.append(point[1] / h)
    
                points_nor_list = list(map(lambda x: str(x), points_nor_list))
                points_nor_str = ' '.join(points_nor_list)
    
                label_str = str(label_index) + ' ' + points_nor_str + '\n'
                txt_file.writelines(label_str)
    
    
    if __name__ == "__main__":
        """
        python json2txt_nomalize.py --json-dir my_datasets/color_rings/jsons --save-dir my_datasets/color_ringsts --classes "cat,dogs"
        """
        parser = argparse.ArgumentParser(description='json convert to txt params')
        parser.add_argument('--json-dir', type=str, default=r'json', help='json path dir')
        parser.add_argument('--save-dir', type=str, default=r'txt',help='txt save dir')
        parser.add_argument('--classes', type=str,default="1", help='classes')
        args = parser.parse_args()
        json_dir = args.json_dir
        save_dir = args.save_dir
        classes = args.classes
        convert_label_json(json_dir, save_dir, classes)
  5. 转换为txt文件后,划分一下数据集,进行训练(此步骤有手就行,在此不演示了)

  6. 将你训练得到的best.pt通过gen_wts.py转换为wts文件,为了方便操作,将best.pt放入目录下,终端输入:python gen_wts.py -w best.pt

     gen_wts.py的代码如下

    import sys
    import argparse
    import os
    import struct
    import torch
    from utils.torch_utils import select_device
    
    
    def parse_args():
        parser = argparse.ArgumentParser(description='Convert .pt file to .wts')
        parser.add_argument('-w', '--weights', required=True,
                            help='Input weights (.pt) file path (required)')
        parser.add_argument(
            '-o', '--output', help='Output (.wts) file path (optional)')
        parser.add_argument(
            '-t', '--type', type=str, default='detect', choices=['detect', 'cls'],
            help='determines the model is detection/classification')
        args = parser.parse_args()
        if not os.path.isfile(args.weights):
            raise SystemExit('Invalid input file')
        if not args.output:
            args.output = os.path.splitext(args.weights)[0] + '.wts'
        elif os.path.isdir(args.output):
            args.output = os.path.join(
                args.output,
                os.path.splitext(os.path.basename(args.weights))[0] + '.wts')
        return args.weights, args.output, args.type
    
    
    pt_file, wts_file, m_type = parse_args()
    print(f'Generating .wts for {m_type} model')
    
    # Initialize
    device = select_device('cpu')
    # Load model
    print(f'Loading {pt_file}')
    model = torch.load(pt_file, map_location=device)  # load to FP32
    model = model['ema' if model.get('ema') else 'model'].float()
    
    if m_type == "detect":
        # update anchor_grid info
        anchor_grid = model.model[-1].anchors * model.model[-1].stride[..., None, None]
        # model.model[-1].anchor_grid = anchor_grid
        delattr(model.model[-1], 'anchor_grid')  # model.model[-1] is detect layer
        # The parameters are saved in the OrderDict through the "register_buffer" method, and then saved to the weight.
        model.model[-1].register_buffer("anchor_grid", anchor_grid)
        model.model[-1].register_buffer("strides", model.model[-1].stride)
    
    model.to(device).eval()
    
    print(f'Writing into {wts_file}')
    with open(wts_file, 'w') as f:
        f.write('{}\n'.format(len(model.state_dict().keys())))
        for k, v in model.state_dict().items():
            vr = v.reshape(-1).cpu().numpy()
            f.write('{} {} '.format(k, len(vr)))
            for vv in vr:
                f.write(' ')
                f.write(struct.pack('>f', float(vv)).hex())
            f.write('\n')
    

 三、TensorRT

  1. 下载与YOLOv5-7.0对应的tensorrt分割版本wang-xinyu/tensorrtx: Implementation of popular deep learning networks with TensorRT network definition API (github.com)
  2. 使用cmake解压,嫌麻烦直接自己配置也行
  3. TensorRT的配置我之前文章里面有写,不清楚的可以去看一下Windows YOLOv5-TensorRT部署_tensorrt在windows部署_Mr Dinosaur的博客-CSDN博客
  4. 打开config.h,修改一下自己的检测类别和图片大小
  5. 打开yolov5_seg.cpp,找到主函数进行文件路径修改​​​​​​​
  6. 如果你显源码运行麻烦(我就是),当然也可以自行修改去生成它的engine引擎文件,引擎文件生成后即可进行分割测试
  7. 分割结果推理速度一般吧,比检测要慢一些

 

 

 

 

 

四、总结

  • 部署的话基本就这些操作,可以将接口进行封装,方便之后调用,需要的话我之后再更新吧
  • 分割的速度要比检测慢了快有10ms左右,对速度有要求的话需要三思
  • 分割对大目标比较友好,如果你想检测小目标的话还是使用目标检测吧

 半年多没更新了,对粉丝们说声抱歉,之后会不定时进行更新!

 

 

 

 

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

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

相关文章

使用Git进行项目版本控制

1、什么是Git? GIT,全称是分布式版本控制系统,git通常在编程中会用到,并且git支持分布式部署,可以有效、高速的处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地&#xff0c…

SOLIDWORKS参数化设计表方法

客户痛点:随着人力资源价格的增长,设计人员不足,需要3D建模的数量多,为方便后续的CAM程序。 数据问题:之前是使用二维图纸,标准件/非标准件产品简单,都是单件,图纸发放以二维方式&a…

【C++标准模板库STL】map, unordered_map, set, unordered_set简介与常用函数

文章目录 map是STL中的标准容器,以键值对的形式存储,即为哈希表,并且是有序的unordered_map也是表示哈希表的容器,但是没有顺序,unordered_map查询单个key的时候效率比map高,但是要查询某一范围内的key值时…

【LeetCode每日一题】——128.最长连续序列

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 中等 三【题目编号】 128.最长连续序列 四【题目描述】 给定一个未…

[保研/考研机试] KY56 数制转换 北京大学复试上机题 C++实现

题目链接: 数制转换https://www.nowcoder.com/share/jump/437195121691734210665 描述 求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。 不同进制的表示符号为(0&a…

正则表达式试炼

我希望在这里列出我很多想写的正则表达式,很多我想写,但是不知道怎么写的。分享点滴案例。未来这个文章会越来越长 案例 我有这样的一批文字,我需要删掉Mozilla/5.0前面的所有内容,如果可以用正则表达式批量匹配到,删…

面向数据科学家的懒惰Python 库

你今天感到昏昏欲睡吗?使用这五个库来提高您的工作效率。 一、介绍 数据科学既鼓舞人心,又具有挑战性。通过绘制各种图表以及微调模型以获得最佳结果来执行数据预处理和清理并从数据中生成见解是相当费力的。 在这篇博客中,我将向您介绍五个 …

YOLO v8目标跟踪详细解读(一)

在此之前,我们已经对yolo系列做出了详细的探析,有兴趣的朋友可以参考yolov8等文章。YOLOV8对生态进行了优化,目前已经支持了分割,分类,跟踪等功能,这对于我们开发者来说,是十分便利。今天我们对…

沐渥六门氮气柜技术参数详解

氮气柜是用来存储电子元器件、芯片、半导体器件、金属材料、电路板、精密仪器等物品的设备,通过充入氮气降低柜内湿度,达到防潮、防氧化、防静电、防锈和防霉效果。 六门氮气柜参数 1、容积:约1380L;外尺寸:W1200*D700…

【人工智能前沿弄潮】—— SAM系列:SAM从提示生成物体mask

SAM从提示生成物体mask Segment Anything Model(SAM)根据指示所需的对象来预测对象掩码。该模型首先将图像转换为图像嵌入,从而可以从提示中高效地生成高质量的掩码。 SamPredictor类为模型提供了一个简单的接口来提示模型。用户可以首先使…

LeetCode 33题:搜索旋转排序数组

目录 题目 思路 代码 暴力解法 分方向法 二分法 题目 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 …

Macbook pro、air、imac 在打字好卡,延迟特别严重,要怎么解决?

MacBook pro在打字好卡&#xff0c;延迟特别严重&#xff0c;到底是什么问题呢&#xff1f;卡的死&#xff0c;打个字要反应很久很久才能响应过来&#xff0c;这不是我理想中的macbook pro。以前也没有这样的问题&#xff0c;找找原因。 上网逛了一圈&#xff0c;发现大家都说…

自动切换HTTP爬虫ip助力Python数据采集

在Python的爬虫世界里&#xff0c;你是否也被网站的IP封锁问题困扰过&#xff1f;别担心&#xff0c;我来教你一个终极方案&#xff0c;让你的爬虫自动切换爬虫ip&#xff0c;轻松应对各种封锁和限制&#xff01;快来跟我学&#xff0c;让你的Python爬虫如虎添翼&#xff01; 首…

@Transactional 注解下,事务失效的七种场景

文章目录 1、异常被捕获后没有抛出2、抛出非运行时异常3、方法内部直接调用4、新开启一个线程5、注解到private方法上6、数据库本身不支持7、事务传播属性设置错误 Transactional是一种基于注解管理事务的方式&#xff0c;spring通过动态代理的方式为目标方法实现事务管理的增强…

腾讯云服务器镜像操作系统大全_Linux_Windows清单

腾讯云CVM服务器的公共镜像是由腾讯云官方提供的镜像&#xff0c;公共镜像包含基础操作系统和腾讯云提供的初始化组件&#xff0c;公共镜像分为Windows和Linux两大类操作系统&#xff0c;如TencentOS Server、Windows Server、OpenCloudOS、CentOS Stream、CentOS、Ubuntu、Deb…

Python基础小项目

今天给大家写一期特别基础的Python小项目&#xff0c;欢迎大家支持&#xff0c;并给出自己的完善修改 &#xff08;因为我写的都是很基础的&#xff0c;运行速率不是很好的 目录 1. 地铁票价题目程序源码运行截图 2. 购物车题目程序源码运行截图 3. 名片管理器题目程序源码运行…

应用程序运行报错:First section must be [net] or [network]:No such file or directory

应用程序报错环境&#xff1a; 在linux下&#xff0c;调用darknet训练的模型&#xff0c;报错&#xff1a;First section must be [net] or [network]:No such file or directory&#xff0c;并提示&#xff1a;"./src/utils.c:256: error: Assertion 0 failed." 如…

GAMES101:作业1记录

主要记录一下GAMES101作业的记录和思考。 1 总览2. 代码编写get_model_matrix(float rotation_angle)get_projection_matrix(float eye_fov,float aspect_ratio,float zNear,f1 oat zFar)进阶代码 Eigen::Matrix4f get_model_matrix_anyaxis(Vector3f axis, float angle) 3. 其…

如何学习嵌入式软件开发?

首先就是认知和基础阶段的学习。这部分一般都是要求学习一些行业认知类的课程&#xff0c;指导嵌入式未来的发展前景和就业趋势&#xff0c;C语言的入门&#xff0c;开发工具的使用&#xff0c;常见的命令&#xff0c;数据结构算法等内容。这一部分主要的就是要靠记忆力&#x…

odoo-034 float 浮点数比较

文章目录 前提问题解决总结 前提 odoo 版本&#xff1a;13 python&#xff1a;3.6.9 问题 比较销售订单行中已送货跟已开票&#xff0c;在 tree 视图显示搜索后的结果。发现搜索条件为已送货 > 已开票时&#xff0c;结果中会包含已送货已开票的。 解决 把这两个值打印出…