单目深度估计部署 rk3588

  搞了一小段时间的单目深度估计,目标是在板端部署用起来,但由于基于开源数据或开源模型,将模型估计的相对深度转换成绝对深度误差非常大(或许是转换方法有问题),另一方面如何具体的在项目中用起来还没好的想法,因此暂且先束之高阁。本博客简单记录一下部署流程。

  尝试过MiDaS的midas_v21_384模型和 AdelaiDepth 模型,没有rk不支持的算子,直接导出onnx,转换rknn,上板子测试。

1 导出onnx

  这一步就不多说了,测试的时候在代码里加上保存onnx的代码。

	print(torch.onnx.ir_version)print("===========  onnx =========== ")dummy_input1 = torch.randn(1, 3, 224, 384).cuda()input_names = ["data"]output_names = ["output"]model.eval()torch.onnx.export(model, dummy_input1, "./weights/midas_v21_384.onnx", verbose=True, input_names=input_names, output_names=output_names, opset_version=12)print("======================== convert onnx Finished! .... ")

2 转换rknn

import os
import urllib
import traceback
import time
import sys
import numpy as np
import cv2
from rknn.api import RKNN
import mathONNX_MODEL = './midas_v21_384.onnx'
RKNN_MODEL = './midas_v21_384.rknn'
DATASET = './images_list.txt'QUANTIZE_ON = True
input_height = 224
input_width = 384def export_rknn_inference(img):# Create RKNN objectrknn = RKNN(verbose=False)# pre-process configprint('--> Config model')rknn.config(mean_values=[[123.675, 116.28, 103.53]], std_values=[[58.395, 57.12, 57.375]], quantized_algorithm='normal', quantized_method='channel', target_platform='rk3588')print('done')# Load ONNX modelprint('--> Loading model')ret = rknn.load_onnx(model=ONNX_MODEL, outputs=["output"])if ret != 0:print('Load model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET, rknn_batch_size=1)if ret != 0:print('Build model failed!')exit(ret)print('done')# Export RKNN modelprint('--> Export rknn model')ret = rknn.export_rknn(RKNN_MODEL)if ret != 0:print('Export rknn model failed!')exit(ret)print('done')# Init runtime environmentprint('--> Init runtime environment')ret = rknn.init_runtime()# ret = rknn.init_runtime(target='rk3566')if ret != 0:print('Init runtime environment failed!')exit(ret)print('done')# Inferenceprint('--> Running model')outputs = rknn.inference(inputs=[img])rknn.release()print('done')return outputsif __name__ == '__main__':print('This is main ...')image_path = './test.jpg'origin_image = cv2.imread(image_path)image_height, image_width = origin_image.shape[:2]image = cv2.resize(origin_image, (input_width, input_height), interpolation=cv2.INTER_LINEAR)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)image = np.expand_dims(image, 0)outputs = export_rknn_inference(image)depth = outputs[0][0]depth_min = depth.min()depth_max = depth.max()max_val = 255if depth_max - depth_min > np.finfo("float").eps:out = max_val * (depth - depth_min) / (depth_max - depth_min)out = cv2.applyColorMap(np.uint8(out), cv2.COLORMAP_INFERNO)result = cv2.resize(out, (image_width, image_height))cv2.imwrite("./test_depth.png", result)

3 测试效果

MiDaS效果
在这里插入图片描述
在这里插入图片描述

板端效果
在这里插入图片描述
  由于推理的代码在之前的博客对应的仓库代码已放多次,且深度估计的后处理比较简单,完整的C++代码就不放了,只贴出后处理的部分代码。

int MiDaS::GetResult(int8_t **PtrBlob, std::vector<int> &qnt_zp, std::vector<float> &qnt_scale, cv::Mat &SegMask)
{int ret = 0;int8_t *Output = (int8_t *)PtrBlob[0];int QuantZp = qnt_zp[0];float QuantScale = qnt_scale[0];float DepthMin = 0;float DepthMax = 0;float DeQntValue = 0;for (int h = 0; h < InputHeight_; h++){for (int w = 0; w < InputWidth_; w++){DeQntValue = DeQnt2F32(Output[h * InputWidth_ + w], QuantZp, QuantScale);DepthMap_[h][w] = DeQntValue;if (h == 0 && w == 0){DepthMin = DeQntValue;DepthMax = DeQntValue;}else{if (DeQntValue < DepthMin){DepthMin = DeQntValue;}if (DeQntValue > DepthMax){DepthMax = DeQntValue;}}}}for (int h = 0; h < InputHeight_; h++){for (int w = 0; w < InputWidth_; w++){DeQntValue = DepthMap_[h][w];DepthMap_[h][w] = MaxValue_ * (DeQntValue - DepthMin) / (DepthMax - DepthMin);DepthMapGray_.at<uchar>(h, w) = static_cast<uchar>(int(DepthMap_[h][w]));}}cv::applyColorMap(DepthMapGray_, SegMask, cv::COLORMAP_AUTUMN);return ret;
}

AdelaiDepth效果
在这里插入图片描述
在这里插入图片描述
  以上两个不用修改模型结构,可以直接上rk板子,其它(bts、ZoeDepth、DiverseDepth、Metric3D、monodepth2、DSINE)需要修改摸结构才能上板子的就不贴出了。

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

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

相关文章

huggingface登不进去?

HF-Mirror点这个镜像网站

二重积分 - 包括计算方法和可视化

二重积分 - 包括计算方法和可视化 flyfish 计算在矩形区域 R [ 0 , 1 ] [ 0 , 2 ] R [0, 1] \times [0, 2] R[0,1][0,2] 下&#xff0c;函数 z 8 x 6 y z 8x 6y z8x6y 的二重积分。这相当于计算曲面 z 8 x 6 y z 8x 6y z8x6y 与 xy 平面之间的体积。 二重积分…

【LeetCode】赎金信

目录 一、题目二、解法完整代码 一、题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使…

UMI HTTP接口手册

Translate to English 命令行手册&#xff1a; README_CLI.mdHTTP接口手册&#xff1a; README_HTTP.md HTTP接口手册 &#xff08;本文档仅适用于 Umi-OCR 最新版本。旧版本请查看 Github备份分支 中对应版本的文档。&#xff09; 基础说明 如上图&#xff0c;必须允许HTT…

MySQL篇五:基本查询

文章目录 前言1. Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2. Retrieve2.1 SELECT 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式2.1.4 为查询结果指定别名2.1.5 结果去重 2.2 WHERE 条件2.2.1 练习 2.3 结果排序2.3.1 练习 …

Java内存区域与内存溢出异常(补充)

2.2.5 方法区 方法区(Method Area)与Java堆一样&#xff0c;是各个线程共享的内存区域&#xff0c;它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分&#xff0c;但是它却有一…

分布式事务Seata AT 详解

AT模式 一阶段&#xff1a; 向seata server端申请全局事务id&#xff0c;传递给下游参与服务 执行各个本地事务&#xff0c;在事务执行前后记录seata自己的undo log/imag (用于回滚&#xff09;到表中&#xff0c;该表为根据官网手动创建 各个本地事务申请全局锁 申请成功提…

2024浙江外国语学院汉语桥线上项目 “在杭州,看见更好的中国”开班

7月9日上午&#xff0c;由教育部中外语言交流合作中心主办、浙江外国语学院国际商学院承办的2024汉语桥“在杭州&#xff0c;看见更好的中国”线上项目正式启动。项目负责人何骅老师及汉语桥教师团队&#xff0c;与来自越南、缅甸、日本、俄罗斯的100名学员相聚云端&#xff0c…

Nginx配置基础

ect/nginx/nginx.conf配置 1&#xff09;nginx 相关目录 工作目录&#xff1a;ect/nginx 家目录 执行文件&#xff1a;/usr/sbin/nginx 启动或重载 sudo /usr/sbin/nginx -t 检查配置文件 sudo /usr/sbin/nginx -s reload 重启服务 日志文件&#xff1a;/var/log/nginx 启动文…

计算机视觉研究方向初学习,计算机视觉都有什么方向??!到底是干什么的?!

计算机视觉研究方向初学习&#xff0c;计算机视觉都有什么方向&#xff1f;&#xff1f;&#xff01;到底是干什么的&#xff1f;&#xff01; 语义分割图像分类目标检测和定位实例分割、全景分割物体跟踪姿态估计人脸识别人体识别图像增强风格迁移图像生成视觉问答视频分析光学…

relocatex getwd

bindtextdom.obj : error LNK2019: unresolved external symbol relocatex referenced in function libintl_bindtextdomain dcigettext.obj : error LNK2019: unresolved external symbol getwd referenced in function libintl_dcigettext

3102.最小化曼哈顿距离

解题思路 分析时间复杂度&#xff0c;计算任意两点的曼哈顿距离达到 O ( n 2 ) O(n^2) O(n2)&#xff0c;会超时需要优化。 因此优化可以将曼哈顿距离与切比雪夫距离的相互关系找出来&#xff0c;然后转换成求切比雪夫距离的方式&#xff0c;得到 d i s t a n c e ( A , B ) …

SpringBoot实战:轻松实现接口数据脱敏

文章目录 引言一、接口数据脱敏概述1.1 接口数据脱敏的定义1.2 接口数据脱敏的重要性1.3 接口数据脱敏的实现方式 二、开发环境三、实现接口返回数据脱敏3.1 添加依赖3.2 创建自定义注解3.3 定义脱敏枚举类3.4 创建自定义序列化类 四、测试4.1 编写测试代码4.2 测试 五、总结 引…

vmware workstation安装debian虚拟机有时无法访问windows共享文件夹

问题 安装好debian12之后&#xff0c;已经按要求安装了vmhgfs工具&#xff0c;然后进行文件共享&#xff0c;是可以连接上的&#xff0c;但重启虚拟机后&#xff0c;共享文件夹就无法访问了 解决办法&#xff0c;参考&#xff1a;在 Linux 客户机中装载共享文件夹的办法 vmh…

C++基础(七):类和对象(中-2)

上一篇博客学的默认成员函数是类和对象的最重要的内容&#xff0c;相信大家已经掌握了吧&#xff0c;这一篇博客接着继续剩下的内容&#xff0c;加油&#xff01; 目录 一、const成员&#xff08;理解&#xff09; 1.0 引入 1.1 概念 1.2 总结 1.2.1 对象调用成员函数 …

多尺度旋转编码

ROPE编码中不使用所有维度旋转同样的角度&#xff0c;而是对成对的维度进行不同的旋转角度&#xff0c;这样设计的原因在于它能够捕捉不同尺度上的位置信息&#xff0c;并且更好地处理长序列数据。让我们更详细地解释一下&#xff1a; 1. 多尺度位置信息 通过对不同维度成对使…

自动群发消息插件常用源代码科普!

随着网络技术的快速发展&#xff0c;自动群发消息插件成为了众多企业和个人提高效率、加强沟通的重要工具。 然而&#xff0c;开发一个高效且稳定的自动群发消息插件并非易事&#xff0c;需要深入理解并熟练掌握相关的源代码。 本文将从五个方面&#xff0c;通过具体的源代码…

Ubuntu 添加so库搜索路径

方法一&#xff1a; 修改 /etc/ld.so.conf文件 将需要配置的库复制到一个目录中&#xff0c;注意复制指令需要添加 -a 选项, -a选项可以将现有so库的链接关系一同拷贝&#xff0c;如果不加 -a 需要重新使用 ln进行链接: sudo cp -a *.so* /libsdk/编辑 /etc/ld.so.conf文件 …

WebKit源代码探秘:深入理解其组织结构与组件

WebKit是一个开源的浏览器引擎&#xff0c;最初由苹果公司开发&#xff0c;现在由许多贡献者共同维护。它以其高性能、易用性和可扩展性而闻名&#xff0c;被用于多个流行的浏览器和应用程序中。WebKit的源代码组织是模块化的&#xff0c;使得开发者可以轻松地找到所需的组件并…

2024第六届上海国际新材料展览会-12月精彩呈现

2024第六届上海国际新材料展览会 The 6th shanghai International New Materials Exhibition in 2024 时 间&#xff1a;2024年12月18-20日 地 点&#xff1a;上海新国际博览中心 CIME 2024专业、权威&#xff0c;涵盖整个新材料行业的国际盛会。 期待与您在CIME 2024现场相…