单目深度估计模型 lite-mono 测试
lite-mono 使用工业数据集kitti 进行训练,目的使用单目摄像头实现物体深度预测,关于kitti数据集的介绍和下载参考
(二)一文带你了解KITTI数据集-CSDN博客文章浏览阅读2.7w次,点赞64次,收藏294次。文章介绍了KITTI数据集的起源、组成、传感器配置和数据结构,包括图像、点云、相机校准和物体标签的详细信息。此外,还阐述了数据预处理步骤、数据集的组织结构和文件解析,以及用于3D目标检测的评价指标。该数据集对于开发和评估自动驾驶场景中的计算机视觉算法至关重要。https://blog.csdn.net/m0_46556474/article/details/130944612
另一篇介绍lite-mono的帖子可以提前看看
CVPR‘2023 | Lite-Mono: 一种新的轻量级自监督单目深度估计方法_litemono内容-CSDN博客文章浏览阅读842次。本文提出了一种新的轻量级单目自监督单目深度估计方法。设计了一种混合的CNN和Transformer架构来建模多尺度增强的局部特征和全局上下文信息。在8个KITTI数据集上的实验结果证明了该方法的优越性。通过在提出的CDC块中设置优化的扩张率,并插入LGFI模块来获得局部-全局特征相关性,Lite-Mono可以感知不同尺度的物体,甚至是对靠近摄像机的移动物体。论文还验证了该模型在Make3D数据集上的泛化能力。此外,Lite-Mono在模型复杂性和推理速度之间实现了良好的权衡。_litemono内容https://blog.csdn.net/CVHub/article/details/130236211
本文主要尝试把模型转化为onnx, 再利用这个单眼深度估计模型Lite-Mono进行推理
权重的下载
wget -O weights/lite-mono_640x192.zip 'https://surfdrive.surf.nl/files/index.php/s/CUjiK221EFLyXDY/download'wget -O weights/lite-mono-small_640x192.zip 'https://surfdrive.surf.nl/files/index.php/s/8cuZNH1CkNtQwxQ/download'wget -O weights/lite-mono-tiny_640x192.zip 'https://surfdrive.surf.nl/files/index.php/s/TFDlF3wYQy0Nhmg/download'wget -O weights/lite-mono-8m_640x192.zip 'https://surfdrive.surf.nl/files/index.php/s/UlkVBi1p99NFWWI/download'wget -O weights/lite-mono_1024x320.zip 'https://surfdrive.surf.nl/files/index.php/s/IK3VtPj6b5FkVnl/download'wget -O weights/lite-mono-small_1024x320.zip 'https://surfdrive.surf.nl/files/index.php/s/w8mvJMkB1dP15pu/download'wget -O weights/lite-mono-tiny_1024x320.zip 'https://surfdrive.surf.nl/files/index.php/s/myxcplTciOkgu5w/download'wget -O weights/lite-mono-8m_1024x320.zip 'https://surfdrive.surf.nl/files/index.php/s/mgonNFAvoEJmMas/download'
解压
unzip weights/lite-mono_640x192.zip -d weights
unzip weights/lite-mono-small_640x192.zip -d weights
unzip weights/lite-mono-tiny_640x192.zip -d weights
unzip weights/lite-mono-8m_640x192.zip -d weightsunzip weights/lite-mono_1024x320.zip -d weights
unzip weights/lite-mono-small_1024x320.zip -d weights
unzip weights/lite-mono-tiny_1024x320.zip -d weights
unzip weights/lite-mono-8m_1024x320.zip -d weights
Lite-Mono 模型加载
import osimport torch
from torchvision import transforms, datasetsimport networksdef load_network(model='lite-mono', load_weights_folder=None, device='cuda'):device = torch.device('cuda')encoder_path = os.path.join(load_weights_folder, 'encoder.pth')decoder_path = os.path.join(load_weights_folder, 'depth.pth')encoder_dict = torch.load(encoder_path)decoder_dict = torch.load(decoder_path)feed_height = encoder_dict['height']feed_width = encoder_dict['width']encoder = networks.LiteMono(model=model,height=feed_height,width=feed_width,)model_dict = encoder.state_dict()encoder.load_state_dict({k: vfor k, v in encoder_dict.items() if k in model_dict})encoder.to(device)encoder.eval()depth_decoder = networks.DepthDecoder(encoder.num_ch_enc, scales=range(3))depth_model_dict = depth_decoder.state_dict()depth_decoder.load_state_dict({k: vfor k, v in decoder_dict.items() if k in depth_model_dict})depth_decoder.to(device)depth_decoder.eval()return encoder, depth_decoder
ONNX 模型变换方法
def convert_to_onnx(input_shape=(640, 192), output_dir='',encoder=None, decoder=None, device='cpu',
):os.makedirs(output_dir, exist_ok=True)# encoderinput_image = torch.randn(1, 3, input_shape[1], input_shape[0]).to(device)input_layer_names = ['input_image']output_layer_names = ['features']torch.onnx.export(encoder, input_image,file_name + '/encoder.onnx', verbose=True,input_names=input_layer_names,output_names=output_layer_names,do_constant_folding=False,opset_version=13,)# decoderencoder_results = encoder(input_image)features = []features.append(torch.randn(*list(encoder_results[0].shape)).to(device))features.append(torch.randn(*list(encoder_results[1].shape)).to(device))features.append(torch.randn(*list(encoder_results[2].shape)).to(device))input_layer_names = ['features_1', 'features_2', 'features_3']output_layer_names = ['depth']torch.onnx.export(decoder, features,file_name + '/decoder.onnx', verbose=True,input_names=input_layer_names,output_names=output_layer_names,do_constant_folding=False,opset_version=13,)
onnx格式变换
file_name = 'lite-mono_640x192'
input_shape = (640, 192)
model='lite-mono'load_weights_folder = 'weights/' + file_name
encoder, decoder = load_network(model, load_weights_folder)convert_to_onnx(input_shape=input_shape, output_dir=file_name, encoder=encoder, decoder=decoder, device='cuda:0',
)file_name = 'lite-mono-small_640x192'
input_shape = (640, 192)
model='lite-mono-small'load_weights_folder = 'weights/' + file_name
encoder, decoder = load_network(model, load_weights_folder)convert_to_onnx(input_shape=input_shape, output_dir=file_name, encoder=encoder, decoder=decoder, device='cuda:0',
)file_name = 'lite-mono-tiny_640x192'
input_shape = (640, 192)
model='lite-mono-tiny'load_weights_folder = 'weights/' + file_name
encoder, decoder = load_network(model, load_weights_folder)convert_to_onnx(input_shape=input_shape, output_dir=file_name, encoder=encoder, decoder=decoder, device='cuda:0',
)file_name = 'lite-mono-8m_640x192'
input_shape = (640, 192)
model='lite-mono-8m'load_weights_folder = 'weights/' + file_name
encoder, decoder = load_network(model, load_weights_folder)convert_to_onnx(input_shape=input_shape, output_dir=file_name, encoder=encoder, decoder=decoder, device='cuda:0',
)file_name = 'lite-mono_1024x320'
input_shape = (1024, 320)
model='lite-mono'load_weights_folder = 'weights/' + file_name
encoder, decoder = load_network(model, load_weights_folder)convert_to_onnx(input_shape=input_shape, output_dir=file_name, encoder=encoder, decoder=decoder, device='cuda:0',
)file_name = 'lite-mono-small_1024x320'
input_shape = (1024, 320)
model='lite-mono-small'load_weights_folder = 'weights/' + file_name
encoder, decoder = load_network(model, load_weights_folder)convert_to_onnx(input_shape=input_shape, output_dir=file_name, encoder=encoder, decoder=decoder, device='cuda:0',
)file_name = 'lite-mono-tiny_1024x320'
input_shape = (1024, 320)
model='lite-mono-tiny'load_weights_folder = 'weights/' + file_name
encoder, decoder = load_network(model, load_weights_folder)convert_to_onnx(input_shape=input_shape, output_dir=file_name, encoder=encoder, decoder=decoder, device='cuda:0',
)file_name = 'lite-mono-8m_1024x320'
input_shape = (1024, 320)
model='lite-mono-8m'load_weights_folder = 'weights/' + file_name
encoder, decoder = load_network(model, load_weights_folder)convert_to_onnx(input_shape=input_shape, output_dir=file_name, encoder=encoder, decoder=decoder, device='cuda:0',
)
使用onnx进行推理
- 视频捕获:首先初始化视频捕获设备。
- 模型加载:加载编码器和解码器的 ONNX 模型。
- 主循环:在无限循环中读取视频帧,进行推理,处理输出图像,直到按下 ESC 键。
- 资源释放:在结束时释放视频捕获资源并关闭所有窗口。
需要以下库
os:用于文件和路径操作。
copy:用于深拷贝对象。
time:用于时间测量。
argparse:用于处理命令行参数。
cv2:OpenCV库,用于图像处理。
numpy:用于处理数组和矩阵。
onnxruntime:用于运行 ONNX 模型。
def run_inference(encoder, decoder, image):
- 输入:编码器和解码器模型,以及输入图像。
- 处理:
- 预处理:调整图像大小、颜色空间转换、转置和归一化。
- 推理:将处理后的图像输入编码器和解码器,生成深度图。
- 后处理:归一化深度图并转换为
uint8
格式。
def main():
- 解析命令行参数:包括设备编号、视频文件路径和模型路径。
- 视频捕获:使用 OpenCV 从指定设备或视频文件读取帧。
- 加载模型:使用 ONNX Runtime 加载编码器和解码器模型。
- 循环处理:
- 捕获视频帧,进行深度推理,并绘制调试信息。
- 显示输入和输出图像。
def draw_debug(image, elapsed_time, depth_map):
- 输入:原始图像、推理耗时和深度图。
- 处理:
- 使用
cv.applyColorMap
为深度图应用色彩映射。 - 在调试图像上显示推理耗时。
- 使用
完整代码如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import copy
import time
import argparseimport cv2 as cv
import numpy as np
import onnxruntimedef run_inference(encoder, decoder, image):# ONNX Input Sizeinput_size = encoder.get_inputs()[0].shapeinput_width = input_size[3]input_height = input_size[2]# Pre process:Resize, BGR->RGB, Transpose, float32 castinput_image = cv.resize(image, dsize=(input_width, input_height))input_image = cv.cvtColor(input_image, cv.COLOR_BGR2RGB)input_image = input_image.transpose(2, 0, 1)input_image = np.expand_dims(input_image, axis=0)input_image = input_image.astype('float32')input_image = input_image / 255.0# Inferenceinput_name = encoder.get_inputs()[0].namefeatures = encoder.run(None, {input_name: input_image})input_name_01 = decoder.get_inputs()[0].nameinput_name_02 = decoder.get_inputs()[1].nameinput_name_03 = decoder.get_inputs()[2].namedepth_map = decoder.run(None,{input_name_01: features[0],input_name_02: features[1],input_name_03: features[2]},)# Post processdepth_map = np.squeeze(depth_map[0])d_min = np.min(depth_map)d_max = np.max(depth_map)depth_map = (depth_map - d_min) / (d_max - d_min)depth_map = depth_map * 255.0depth_map = np.asarray(depth_map, dtype="uint8")return depth_mapdef main():parser = argparse.ArgumentParser()parser.add_argument("--device", type=int, default=0)parser.add_argument("--movie", type=str, default=None)parser.add_argument("--model",type=str,default='model/lite-mono-tiny_640x192',)args = parser.parse_args()model_dir = args.modelencoder_path = os.path.join(model_dir, 'encoder.onnx')decoder_path = os.path.join(model_dir, 'decoder.onnx')# Initialize video capturecap_device = args.deviceif args.movie is not None:cap_device = args.moviecap = cv.VideoCapture(cap_device)# Load modelencoder = onnxruntime.InferenceSession(encoder_path,providers=['CUDAExecutionProvider','CPUExecutionProvider',],)decoder = onnxruntime.InferenceSession(decoder_path,providers=['CUDAExecutionProvider','CPUExecutionProvider',],)while True:start_time = time.time()# Capture readret, frame = cap.read()if not ret:breakdebug_image = copy.deepcopy(frame)# Inference executiondepth_map = run_inference(encoder,decoder,frame,)elapsed_time = time.time() - start_time# Drawdebug_image, depth_image = draw_debug(debug_image,elapsed_time,depth_map,)key = cv.waitKey(1)if key == 27: # ESCbreakcv.imshow('Input', debug_image)cv.imshow('Output', depth_image)cap.release()cv.destroyAllWindows()def draw_debug(image, elapsed_time, depth_map):image_width, image_height = image.shape[1], image.shape[0]debug_image = copy.deepcopy(image)# Apply ColorMapdepth_image = cv.applyColorMap(depth_map, cv.COLORMAP_JET)depth_image = cv.resize(depth_image, dsize=(image_width, image_height))# Inference elapsed timecv.putText(debug_image,"Elapsed Time : " + '{:.1f}'.format(elapsed_time * 1000) + "ms",(10, 40), cv.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 2,cv.LINE_AA)return debug_image, depth_image
window下启动测试main会有报错
cv2.error: OpenCV(4.10.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:1301: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
解决方法参考
https://stackoverflow.com/questions/67120450/error-2unspecified-error-the-function-is-not-implemented-rebuild-the-librahttps://stackoverflow.com/questions/67120450/error-2unspecified-error-the-function-is-not-implemented-rebuild-the-libra
安装下面模块
pip install opencv-contrib-python
使用一个行车记录仪视频进行测试
相关文章:
单目深度估计模型 lite-mono 测试
lite-mono 使用工业数据集kitti 进行训练,目的使用单目摄像头实现物体深度预测,关于kitti数据集的介绍和下载参考 (二)一文带你了解KITTI数据集-CSDN博客文章浏览阅读2.7w次,点赞64次,收藏294次。文章介绍…...
JAVA基础学习笔记_网络编程
文章目录 网络编程网络编程三要素IPIPv4细节InetAddress 端口号协议 UDPUDP协议(发数据)UDP协议(接受数据)UDP聊天室单播,组播,广播 TCP中文乱码问题代码细节,三次握手和四次挥手 网络编程 计算机之间通过网络进行数据传输 软件结构 C/S,Client/Server,客户端服务器,精美但麻…...
说下JVM中一次完整的GC流程?
大家好,我是锋哥。今天分享关于【说下JVM中一次完整的GC流程?】面试题。希望对大家有帮助; 说下JVM中一次完整的GC流程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中,垃圾回收(GC&am…...
鸿蒙NEXT开发案例:保质期计算
【引言】 保质期计算应用是一个基于鸿蒙NEXT框架开发的数字和文本统计组件。用户可以输入商品的生产日期和保质期天数,应用会自动计算并展示相关信息,包括保质状态、剩余天数、生产日期和到期日期。 【环境准备】 • 操作系统:Windows 10 …...
LLM并发加速部署方案(llama.cpp、vllm、lightLLM、fastLLM)
大模型并发加速部署 解析当前应用较广的几种并发加速部署方案! llama.cpp、vllm、lightllm、fastllm四种框架的对比: llama.cpp:基于C,①请求槽,②动态批处理,③CPU/GPU混合推理vllm:基于Pyth…...
用最小的代价解决mybatis-plus关于批量保存的性能问题
1.问题说明 问题背景说明,在使用达梦数据库时,mybatis-plus的serviceImpl.saveBatch()方法或者updateBatchById()方法的时候,随着数据量、属性字段的增加,效率越发明显的慢。 serviceImpl.saveBatch(); serviceImpl.updateBatch…...
蓝桥杯历届真题 --#递推 翻硬币(C++)
文章目录 思路完整代码结语 原题链接 思路 通过观察测试用例,我们猜测,从左到右依次对比每一个位置上的状态,如果不一样我们就翻一次,最终得到的答案即为正解。 完整代码 //这里是引入了一些常用的头文件,和一些常规操作 //第一…...
BurpSuite-8(FakeIP与爬虫审计)
声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:IP伪造和爬虫审计_哔哩哔哩_bilibili 一、FakeIP 1.配置环境 BurpSuite是java环境下编写的,而今天的插件是python编写的,…...
JAVA8、Steam、list运用合集
Steam运用 Java Stream API为开发人员提供了一种函数式和声明式的方式来表达复杂的数据转换和操作,使代码更加简洁和富有表现力。 1、使用原始流以获得更好的性能【示例:求和】 使用 int、long 和 double 等基本类型时,请使用IntStream、LongStream 和 DoubleStream 等基本流…...
深入详解人工智能机器学习:强化学习
目录 强化学习概述 强化学习的基本概念 定义 关键组件 强化学习过程 常用算法 应用示例 示例代码 代码解释 应用场景 强化学习核心概念和底层原理 核心概念 底层原理 总结 强化学习概述 强化学习(Reinforcement Learning, RL)是机器学习中的…...
docker的简单使用
文章目录 docker简介docker架构镜像和容器镜像有关的常用命令容器相关常用命令 docker简介 Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。 Docker可以让开方子打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到…...
启动的docker容器里默认运行dockerd
问题 已在Dockerfile里yum install docker 但docker run 启动容器后, docker ps等命令无法执行 ps -aux 没有dockerd 进程 临时解决 另开一个终端 docker exec -it 容器名 bash 手动启 dockerd 默认启动 分析 现在启动容器的默认命令是 /sbin/init sbin/init 是根文件系统…...
Python爬虫技术的最新发展
在互联网的海洋中,数据就像是一颗颗珍珠,而爬虫技术就是我们手中的潜水艇。2024年,爬虫技术有了哪些新花样?让我们一起潜入这个话题,看看最新的发展和趋势。 1. 异步爬虫:速度与激情 随着现代Web应用的复…...
什么是厄尔米特(Hermitian)矩阵?
厄米矩阵(Hermitian Matrix)定义 在数学和物理中,厄米矩阵是满足以下条件的复方阵: A A † \mathbf{A}\mathbf{A}^\dagger AA† 其中, A † \mathbf{A}^\dagger A†表示矩阵 A \mathbf{A} A的共轭转置,即…...
从零开始:Linux 环境下的 C/C++ 编译教程
个人主页:chian-ocean 文章专栏 前言: GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C。其中 gcc 用于 C 语言编译,g 专用于 C 编译。 Linux GCC or G的安…...
Excel + Notepad + CMD 命令行批量修改文件名
注意:该方式为直接修改原文件的文件名,不会生成新文件 新建Excel文件 A列:固定为 renB列:原文件名称C列:修改后保存的名称B列、C列,需要带文件后缀,为txt文件就是.txt结尾,为png图片…...
1.1 android:监听并处理返回事件
在Android开发过程中,默认执行返回事件是结束当前界面,返回上一个界面,没有任何提示,但用户可能会误操作,这时出现一个提示界面对用户较为友好,接下来,让我们探究返回事件的处理。 一、onBackP…...
解决Ubuntu关机主板不断电的问题(其它使用GRUB的Linux发行版大概率也可用)
前言: 在某些主板上,Ubuntu20.04系统关机并不会连带主板一起断电。 猜测可能是主板太老了。无法识别较新的系统的关机信号,导致无法断电。连带着一些电脑周边设备也不会断电导致状态无法重置,后续会出现一些问题。 目标…...
【CTF-Web】文件上传漏洞学习笔记(ctfshow题目)
文件上传 文章目录 文件上传 What is Upload-File?Upload-File In CTF Web151 考点:前端校验解题: Web152 考点:后端校验要严密解题: Web153 考点:后端校验 配置文件介绍解题: Web154 考点&am…...
无法正常启动此程序,因为计算机丢失wlanapi.dll
wlanapi.dll丢失怎么办?有没有什么靠谱的修复wlanapi.dll方法_无法启动此程序,因为计算机中丢失wlanapi.dll-CSDN博客 wlanapi.dll是 Windows 操作系统中的一个动态链接库文件,主要与 Windows 无线 LAN (WLAN) API 相关。该DLL提供了许多必要的函数&…...
C++ webrtc开发(非原生开发,linux上使用libdatachannel库)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、libdatachannel库的下载和build二、开始使用 1.2.引入库3.开始使用 总结 前言 使用c开发webrtc在互联网上留下的资料甚少,经过我一段时间的探…...
vue-router路由传参的两种方式(params 和 query )
一、vue-router路由传参问题 1、概念: A、vue 路由传参的使用场景一般应用在父路由跳转到子路由时,携带参数跳转。 B、传参方式可划分为 params 传参和 query 传参; C、而 params 传参又可分为在 url 中显示参数和不显示参数两种方式&#x…...
VBA高级应用30例应用在Excel中的ListObject对象:向表中添加注释
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…...
github操作学习笔记(杂乱版)
git开源的分布式版本控制系统: 每次修改文件提交后,都会自动创建一个项目版本 查看git版本看有没有安装成功:git --version 把默认编辑器设置成vim:git config --global core.editor "vim" 1、设置昵称和邮箱ÿ…...
TaskBuilder SQL执行工具
为了方便开发者连接当前任擎服务器上配置的各个数据源对应的数据库进行相关操作,TaskBuilder提供了一个SQL执行工具,点击系统侧边栏里的执行SQL图标 ,即可打开该工具,界面如下图所示: 该工具从上至下分为三个区域&a…...
快速掌握Quartz.Net计划任务调度框架,轻松实现定时任务
前言 Quartz.Net是一个开源的作业调度框架,可以用于管理计划任务和定期执行。Quartz.Net提供了丰富的作业计划选项,例如精确或模糊时间表达式、日期和时间限制等。Quartz.Net采用分布式架构,允许在多个计算机上运行任务。 Quartz.Net架构设…...
Linux ufw命令丨Linux网络防火墙ufw命令详解
ufw(Uncomplicated Firewall)是Ubuntu系统上默认的防火墙组件,它为轻量化配置iptables而开发,提供了一个非常友好的界面用于创建基于IPv4和IPv6的防火墙规则 ufw在Ubuntu 8.04 LTS后的所有发行版中默认可用,它通过命令…...
shell编程(完结)
shell编程(完结) 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其…...
深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna)
深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna) 前言1.Chat2DB2.SQL Chat3.Wren AI4.Vanna 前言 在数据驱动决策的时代,将自然语言查询转化为结构化查询语言(SQL)的能力变得日益重要。无论是小型创业…...
【Linux】报错:cannot create directory ‘test’: Read-only file system
1 报错 ❤️在使用mkdir test命令创建文件夹的时候,报错如下: mkdir:cannot create directory ‘test’:Read-only file system 2 解决方法 mount -o remount,rw / 🦋上述命令在Linux系统中用于重新挂载(root)文件系统,并将其从只读模式切换到读写模式。 ■ 下面是对…...
python mat是什么文件
.mat就是matlab的文件格式,一般用于matlab和python间的数据传输,python中numpy和scipy提供了一些函数,可以很好的对.mat文件的数据进行读写和处理。 在python中可以使用scipy.io中的函数loadmat()读取mat文件,函数savemat保存文…...
Redis: 一个高效的内存数据存储解决方案
Redis: 一个高效的内存数据存储解决方案 介绍 Redis(Remote Dictionary Server)是一种开源的高性能键值存储系统。它常被用作缓存、消息队列、会话存储、实时数据分析等多种场景。与传统的关系型数据库不同,Redis 是基于内存的数据存储&…...
AR眼镜_消费级工业AR智能眼镜主板硬件解决方案
AR眼镜的研发是一项复杂的软硬件集成工程,它需要在摄影、音频、交互和连接等多个方面提供卓越的基础体验,因此产品的每个细节都显得尤为重要。 在设计AR眼镜时,重量、体积和散热性能都是必须认真考量的关键因素。在芯片平台的选择上ÿ…...
C# 异常处理
C# 异常处理 异常处理是编程中不可或缺的一部分,它允许程序在遇到错误或意外情况时优雅地处理这些问题,而不是直接崩溃。C# 提供了一套强大的异常处理机制,包括 try-catch 块、finally 块和 throw 语句。本文将深入探讨 C# 中的异常处理,包括如何捕获和处理异常,以及如何…...
图解SSH原理
1. 初见SSH SSH是一种协议标准,其目的是实现安全远程登录以及其它安全网络服务。 SSH仅仅是一协议标准,其具体的实现有很多,既有开源实现的OpenSSH,也有商业实现方案。使用范围最广泛的当然是开源实现OpenSSH。 2. SSH工作原理 …...
如何快速批量把 PDF 转为 JPG 或其它常见图像格式?
在某些特定场景下,将 PDF 转换为 JPG 图片格式却具有不可忽视的优势。例如,当我们需要在不支持 PDF 查看的设备或软件中展示文档内容时,JPG 图片能够轻松被识别和打开;此外,对于一些网络分享或社交媒体发布的需求&…...
在CentOS中安装和卸载mysql
在CentOS7中安装和卸载mysql 卸载mysql1、查看是否安装过mysql2、查看mysql服务状态3、关闭mysql服务4、卸载mysql相关的rpm程序5、删除mysql相关的文件6、删除mysql的配置文件my.cnf 安装mysql1、下载mysql相关的rpm程序2、检查/tmp临时目录权限3、安装mysql前的依赖检查3、安…...
第十二章:异常(2)
六、自定义异常类 1. 定义一个类继承 异常类 (1) 定义异常类如果为运行时异常,则需要继承 RuntimeException class CheckedPasswordException extends RuntimeException{} (2) 定义异常类如果为非运行时异常,则需要继承 Exception class CheckedPass…...
DAY5 C++运算符重载
1.类实现> 、<、!、||、!和后自增、前自减、后自减运算符的重载 代码: #include <iostream>using namespace std; class Complex {int rel;int vir; public:Complex(){};Complex(int rel,int vir):rel(rel),vir(vir){cout << "…...
Qt之点击鼠标右键创建菜单栏使用(六)
Qt开发 系列文章 - menu(六) 目录 前言 一、示例演示 二、菜单栏 1.MenuBar 2.Menu 总结 前言 QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、一个状态栏(status…...
Ant Design Pro实战--day01
下载nvm https://nvm.uihtm.com/nvm-1.1.12-setup.zip 下载node.js 16.16.0 //非此版本会报错 nvm install 16.16.0 安装Ant Design pro //安装脚手架 npm i ant-design/pro-cli -g //下载项目 pro create myapp //选择版本 simple 安装依赖 npm install 启动umi yarn add u…...
ejb组件(rmi) webservice平台(xml)
springboot bean 在 Spring Boot 中,Bean 是 Spring 框架的核心概念之一,表示由 Spring 容器管理的对象。通过 Bean 或其他注解(如 Component、Service、Repository 等)来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的…...
[高考] 学习数学的难点
最近想看一些机器学习的书,发现很多概念,很多符号,很多地方是,不知道具体的意思,不懂其中的内涵,所以需要再重新查阅很多的资料,去理解作者每句话是什么意思。 总结一下难点。以詹姆斯-斯图尔特…...
西门子200 smart PLC助力水处理企业自动化改造
摘要 西门子的200SMART PLC,以其强大的功能和灵活的应用性,正成为环保行业中不可或缺的一环。今天,我们就来看看这个小小的PLC是如何在处理环保问题中大显身手的。 不得不说,环保行业的痛点可不少。 比如污水处理,传…...
redis 怎么样查看list
在 Redis 中,可以通过以下方法查看列表的内容或属性: 1. 查看列表中的所有元素 使用 LRANGE 命令: LRANGE key start endkey 是列表的名称。start 是起始索引,0 表示第一个元素。end 是结束索引,-1 表示最后一个元素…...
QT数据库(二):QSqlQueryModel实现数据查询
QSqlQueryModel 可以设置任意的 SELECT 语句来从数据库中查询数据,可以查询一个数据表部分字段的数据,也可以是多个数据表组合的数据。该模型的数据是只读的,即使在界面上修改了QSqlQueryModel 模型的数据,也不能将所做的修改提交…...
【后端面试总结】HTTPS工作原理详解
引言 在现代网络通信中,数据的安全性至关重要。HTTP(Hypertext Transfer Protocol)作为互联网上传输数据的协议,虽然应用广泛,但其数据以明文形式传输,存在被窃取和篡改的风险。为此,HTTPS&…...
Kibana 部署
Kibana 是一个开源的数据可视化和探索工具,主要用于 Elasticsearch 数据的分析和展示。本文将详细介绍如何在 Linux 系统上部署 Kibana,并启用 SSL 加密以确保安全通信。 英文文档:Kibana Guide | Elastic 中文文档:Kibana 用户…...
PostgreSQL 入门
下载与安装 部分国产数据库采用PostgreSQL作为基础进行研发,因此先尝试了解一下原始数据库情况。 PostgreSQL 简称 PG 官网:https://www.postgresql.org/ PostgreSQL “世界上最先进的开源关系型数据库” 这是官网上的口号。 PostgreSQL: The World…...
简单的多网卡选择指定网卡ip注册
简单的多网卡选择指定网卡ip注册 我们公司服务器上面有多个网卡,多网卡则本地ip有多个ip,我们启动服务的时候需要选定他特定的ip,我们服务需要特定的ip进行注册,才能进行正常的通讯功能,我们需要使用如下配置进行特定ip选择&…...