Monodle centerNet3D 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署

news2024/11/17 19:41:41

  一直想做一点3D目标检测,先来一篇单目3D目标检测Monodle(基于centernet的),训练代码参考官方【代码】,这里只讲讲如何部署。

  模型和完整仿真测试代码,放在github上参考链接【模型和完整代码】。

1 模型训练

  训练参考官方代码 https://github.com/xinzhuma/monodle

2 导出onnx

  如果按照官方代码导出的onnx,后处理写起来比较复杂且后处理时耗比较长,这里将后处理的部分代码放到模型中。原始官方导出的onnx模型如下图:
在这里插入图片描述
本示例导出的onnx模型如下图,这样导出便于写后处理代码,模型+后处理整个时耗也比较优:
在这里插入图片描述
把centernet3d.py 文件拷贝一份,命名为export_onnx.py,并进行如下修改:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述 export_onnx.py 修改后的完整代码:

import os
import cv2
import torch
import torch.nn as nn
import numpy as np

from lib.backbones import dla
from lib.backbones.dlaup import DLAUp
from lib.backbones.hourglass import get_large_hourglass_net
from lib.backbones.hourglass import load_pretrian_model


class CenterNet3D(nn.Module):
    def __init__(self, backbone='dla34', neck='DLAUp', num_class=3, downsample=4):
        """
        CenterNet for monocular 3D object detection.
        :param backbone: the backbone of pipeline, such as dla34.
        :param neck: the necks of detection, such as dla_up.
        :param downsample: the ratio of down sample. [4, 8, 16, 32]
        :param head_conv: the channels of convolution in head. default: 256
        """
        assert downsample in [4, 8, 16, 32]
        super().__init__()

        self.heads = {'heatmap': num_class, 'offset_2d': 2, 'size_2d': 2, 'depth': 2, 'offset_3d': 2, 'size_3d': 3,
                      'heading': 24}
        self.backbone = getattr(dla, backbone)(pretrained=True, return_levels=True)
        channels = self.backbone.channels  # channels list for feature maps generated by backbone
        self.first_level = int(np.log2(downsample))
        scales = [2 ** i for i in range(len(channels[self.first_level:]))]
        self.neck = DLAUp(channels[self.first_level:], scales_list=scales)  # feature fusion [such as DLAup, FPN]

        self.heatmapmaxpool = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)

        # initialize the head of pipeline, according to heads setting.
        for head in self.heads.keys():
            if head != 'heatmap':
                output_channels = self.heads[head]
                fc = nn.Sequential(
                    nn.Conv2d(channels[self.first_level], 256, kernel_size=3, padding=1, bias=True),
                    nn.ReLU(inplace=True),
                    nn.Conv2d(256, output_channels, kernel_size=1, stride=1, padding=0, bias=True))
            else:
                output_channels = self.heads[head]
                fc = nn.Sequential(
                    nn.Conv2d(channels[self.first_level], 256, kernel_size=3, padding=1, bias=True),
                    nn.ReLU(inplace=True),
                    nn.Conv2d(256, output_channels, kernel_size=1, stride=1, padding=0, bias=True),
                    nn.Sigmoid())
            # initialization
            if 'heatmap' in head:
                fc[-2].bias.data.fill_(-2.19)
            else:
                self.fill_fc_weights(fc)

            self.__setattr__(head, fc)

    def forward(self, input):
        feat = self.backbone(input)
        feat = self.neck(feat[self.first_level:])

        ret = {}
        for head in self.heads:
            ret[head] = self.__getattr__(head)(feat)
            if head == 'heatmap':
                heatmapmax = self.heatmapmaxpool(ret[head])
        ret.update({'heatmapmax': heatmapmax})
        return ret

    def fill_fc_weights(self, layers):
        for m in layers.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.normal_(m.weight, std=0.001)
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)


def export_onnx(model):
    print('===========  onnx =========== ')
    dummy_input = torch.randn(1, 3, 384, 1280)
    input_names = ['data']
    output_names = ['heatmap', 'offset_2d', 'size_2d', 'depth', 'offset_3d', 'size_3d', 'heading', 'heatmapmax']
    torch.onnx.export(model, dummy_input, './Monodle_epoch_140.onnx', verbose=False, input_names=input_names,
                      output_names=output_names, opset_version=11)
    print('======================== convert onnx Finished! .... ')


if __name__ == '__main__':
    print('This is main ...')
    CLASSES = ['Pedestrian', 'Car', 'Cyclist']

    net = CenterNet3D(backbone='dla34')

    checkpoint = torch.load('./weights/checkpoint_epoch_140.pth',
                            map_location='cpu')
    net.load_state_dict(checkpoint['model_state'], strict=True)
    net.eval()

    export_onnx(net)

    input = torch.randn((1, 3, 1280, 384))
    print('input1:', input.shape, input.dtype)
    output = net(input)

    print(output.keys())
    print(output['heatmap'].shape)
    print(output['offset_2d'].shape)
    print(output['size_2d'].shape)
    print(output['depth'].shape)
    print(output['offset_3d'].shape)
    print(output['size_3d'].shape)
    print(output['heading'].shape)

运行 python export_onnx.py 生成.onn文件。

3 测试效果

官方pytorch 测试效果
在这里插入图片描述
onnx 测试效果
特别说明: 由于官方代码的2d框是用3d框计算得到的,而本博客是直接解码的模型预测出的2d框,所以2d框有所出入。
在这里插入图片描述

4 onnx、rknn、horizon、tensorRT测试转完整代码

  模型和完整仿真测试代码、测试图片参考【模型和完整代码】。

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

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

相关文章

Creating Server TCP listening socket *:6379: listen: Unknown error

错误: 解决方法: 在redis安装路径中打开cmd命令行窗口,输入 E:\Redis-x64-3.2.100>redis-server ./redis.windows.conf结果:

智慧校园学工管理系统的部署

学工体系思政服务该怎么规划建造?思政作为高校育人的中心使命,在做到让学生健康高兴生长的一起,也应满意学生生长成才的各类需求。使用技术为学生供给优质的信息化服务,是其间的有效途径。大数据让个性化教育成为可能,…

Python函数、类和方法

大家好,当涉及到编写可维护、可扩展且易于测试的代码时,Python提供了一些强大的工具和概念,其中包括函数、类和方法。这些是Python编程中的核心要素,可以帮助我们构建高效的测试框架和可靠的测试用例。 本文将探讨Python中的函数、…

Swin Transformer 笔记与理解

目录 解决什么问题基本结构理解 解决什么问题 传统的transformer处理于长序列需要非常大的计算量,而且很慢。且传统的transformer虽然的全局信息的获取上有着很好的效果,但是在局部信息的获取上就没有那么强了。Swim transformer的主要的贡献就是使用分…

LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战

LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战 0.前言 **Modelscope **是一个交互式智能体应用基于ModelScope-Agent,用于方便地创建针对各种现实应用量身定制智能体,目前已经在生产级别落地。AgentFabri…

Java输入与输出详解

Java输入和输出 前言一、Java打印Hello World二、输出到控制台基本语法代码示例格式化字符串 三、从键盘输入读入一个字符正确写法 使用 Scanner 读取字符串/整数/浮点数使用 Scanner 循环读取 N 个数字 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这…

嵌入式智能硬件茶杯垫的设计与实现方案

iCupBox简介 这是一款智能杯垫产品,基于GTD时间管理理念设计,目的是提醒人们专心工作和及时喝水休息,提高工作效率。 https://gitee.com/jiangtao008/iCupBox 开原许可协议:MIT 项目分为客户端APP和杯垫固件系统: 客户端APP,使用QML开发,集成GTD时间管理方法,与杯垫固…

QQ技术导航源码附带交易系统

网站功能 QQ登录 友联自助交换 友情链接交易功能 多功能搜索 ico小图标本地化 网站图片本地化 蜘蛛日志 文章评论 网站评论 自助链接匿名提交站点,添加友链访问网站自动审核通过 VIP 会员等级 VIP 付费升级 单个文章或者站点付费快审 多背景图片可自定义背景图片…

Web Server项目实战2-Linux上的五种IO模型

上一节内容的补充:I/O多路复用是同步的,只有调用某些API才是异步的 Unix/Linux上的五种IO模型 a.阻塞 blocking 调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停地去检查这个函数有没有返回&#xff0c…

【算法】二分算法——寻找峰值

题解:寻找峰值(二分算法) 目录 1.题目2.暴力求解3.二分算法4.总结 1.题目 题目链接:LINK 2.暴力求解 暴力求解的思路很简单,这个数组的形状无非就三种: 一直上升下降(这里包含先下降后上升)先升后降 总结一下规律&#xff1…

详解CSS(二)

目录 1.背景属性 1.1背景颜色 1.2背景图片 1.3背景平铺 1.4背景位置 1.5背景尺寸 2.圆角矩形 3.元素的显示模式 3.1行内元素/内联元素(Inline element) 3.2块级元素(Block-level element) 3.3行内块元素(In…

一键自动回复,提升客服效率,解锁销售新高度

在快速迭代的跨境电商时代,效率与顾客体验是决定商家能否脱颖而出的关键要素。作为一款专为跨境电商设计的全能管理工具,现我们已全面升级,与俄罗斯头部电商平台Ozon深度整合,推出自动回复功能,旨在帮助卖家实现客服管…

1.Nacos 入门与实战(Spring Cloud)

1.Nacos 入门与实战 1.什么是 Nacos?1.1 Nacos 功能1.1.1 配置中心1.1.2 注册中心 1.2 Nacos 优点 2.Nacos 基本使用2.1 Nacos 部署安装2.1.1 部署方式2.1.2 安装并启动2.2.3 配置数据源2.2.4 开启控制台授权登录(可选) 2.2 配置中心使用2.2.1 创建配置…

使用API有效率地管理Dynadot域名,进行域名邮箱的默认邮件转发设置

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

Docker-Android安卓模拟器本地部署并实现远程开发测试

文章目录 1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Ubuntu系统使用Docker部署docker-android安卓模拟器,并结合cpolar内网穿透工具实现公网远程访问本地…

504 Gateway Time-out

问题描述 做Excel导入的功能,由于Excel的数据比较多,需要做处理然后入库,数据量大概200万,所以毫无悬念的导入Excel接口调用超过了一分钟,并且报错:504 gateway timeout。 解决方案 nginx超时限制。路径…

51单片机入门:AT24C02

AT24C02简介 AT24C02是一个2K bit的EEPROM存储器,使用I2C通信方式(其中02对应2K bit,类似的,AT24C04/08对应4K bit/8K bit的存储器)。 其原理图如下: 对应的引脚及其功能: 引脚名称功能A0/A1…

ThingsBoard物联网网关在暖通自控中的应用

ThingsBoard是用于数据收集、处理、可视化和设备管理的开源物联网平台。 场景 智能办公场景中的物联网需求包括能源管理、安全监控、环境监测、空间优化和设备自动化,以提升效率、节约成本并增强员工的舒适度和安全性。 通过监测建筑内部的温度、湿度、光照等数据&a…

WordPress插件Disable WP REST API,可根据是否登录来禁用REST API

前面跟大家分享了代码版禁用WordPress REST API的方法(详见『WordPress4.7以上版本如何禁用JSON REST API?』),不过有些站长不太敢折腾自己的网站代码,那么建议试试这款Disable WP REST API,它可以&#xf…

linux命令arp的使用

arp arp 命令用于显示和修改 IP 到 MAC 转换表 补充说明 arp 命令 是 Address Resolution Protocol,地址解析协议,是通过解析网络层地址来找寻数据链路层地址的一个网络协议包中极其重要的网络传输协议。而该命令可以显示和修改 arp 协议解析表中的缓…