当前位置: 首页 > news >正文

Lidar AI Solution环境配置

目录

  • Lidar AI Solution环境配置
    • 前言
    • 1. Lidar AI Solution
      • 1.1 Pipeline overview
      • 1.2 GetStart
    • 2. CUDA-BEVFusion
      • 2.1 3D目标检测(nuScenes验证集)
      • 2.2 演示
      • 2.3 模型和数据
      • 2.4 前置条件
      • 2.5 快速开始推理
        • 2.5.1 下载模型和数据到CUDA-BEVFusion文件夹
        • 2.5.2 配置environment.sh
        • 2.5.3 编译运行
      • 2.6 可能遇到的问题
        • 2.6.1 问题1:/usr/bin/ld:cannot find -lspconv
        • 2.6.2 问题2:/libspconv.so:file format not recognized
    • 3. CUDA-CenterPoint
      • 3.1 模型和数据
      • 3.2 前置条件
      • 3.3 环境
      • 3.4 编译运行
    • 4. CUDA-PointPillars
      • 4.1 模型和数据
      • 4.2 前置条件
      • 4.3 环境
      • 4.4 编译运行
    • 结语
    • 下载链接
    • 参考

Lidar AI Solution环境配置

前言

开源项目 Lidar AI Solution 的环境配置,记录自己环境配置过程,仅供自己参考,只进行最最最基本的运行,不涉及任何原理分析(主要是不会😂)

博主环境如下:

系统:Ubuntu20.04

显卡:RTX3060

显卡驱动:510.108.03

CUDA:11.6

cuDNN:8.4.0

TensorRT:8.4.1

整个环境配置的重点和难点在于整个项目的完整拉取

以下内容均 Copy 自 Lidar AI Solutin 的 README 文档,请大家熟读熟读熟读文档

1. Lidar AI Solution

Lidar AI Solution 项目为自动驾驶 3D-Lidar 提供了一个高性能的解决方案🚀🚀🚀,在加速 sparse convolution/CenterPoint/BEVFusion/OSD/Conversion 方面做得非常好

在这里插入图片描述

图1-1 title

1.1 Pipeline overview

在这里插入图片描述

图1-2 pipeline.png

1.2 GetStart

sudo apt-get install git-lfs
git clone --recursive https://github.com/NVIDIA-AI-IOT/Lidar_AI_Solution
cd Lidar_AI_Solution

一定一定一定要按照上述方法完整拉取整个项目(PS:完整项目在 Linux 下大概有 365M 的大小),不要去直接点击 Code ==> DownZIP 下载,也不要直接 git clone 下载,因为该项目依赖于其他项目,因此加上 --recursive 指令是为了循环克隆子项目。

注意:项目的完整拉取非常非常非常重要,后续的问题基本上都是因为没有完整的拉取整个项目所导致的

接下来我们就来聊聊如何完整的拉取整个 repo

首先如果在 Linux 下执行上述指令你会发现由于访问的是外网会非常缓慢,当然你如果有一个好的代理应该是没有问题的,博主之前下了一晚上才下完,但是由于网络经常断开,因此也不能确保整个项目是否完整。当然网上也提供了一些快速高效下载方法,博主也没去折腾了,感兴趣的可以看看 git clone --recursive快速高效下载方法

由于在 Linux 上没有找到合适的代理,也不愿去折腾高速下载方法,因此博主决定在 Windows 下去拉取整个 repo (主要是因为 Windows 下有代理🤣)

在此之前你需要在 Windows 下面安装 git 和 git lfs,比较简单,这里提供博主主要参考的文章:

  • git 安装:Windows系统Git安装教程
  • git 下载地址:https://git-scm.com/downloads
  • git lfs 安装:Windows安装Git LFS
  • git lfs 下载地址:https://github.com/git-lfs/git-lfs/releases/tag/v3.3.0

将 git 和 git lfs 安装完成后,就可以在 cmd 窗口正常执行 git 指令了,指令如下:(PS:一定要记得开代理)

sudo apt-get install git-lfs
git clone --recursive https://github.com/NVIDIA-AI-IOT/Lidar_AI_Solution

完整的项目拉取如下图所示:

在这里插入图片描述

图1-3 LiDAR-AI-Solution完整项目拉取

下载完成以后把整个项目拷贝到 Linux 进行后续操作就行,值得注意的是,从 Windows 拉取的代码放在 Linux 下会有一个小小的 bug,这个我们之后也会提到。

这里博主也提供下博主自己拉取的整个 repo,感兴趣的可以自行下载,下载链接 Baidu Drive (注意该代码下载于 2023/5/25 日,若有改动请参考最新)

至此,整个项目文件就准备好了,对于每个任务可以查看对应子文件夹下的 README 文档

2. CUDA-BEVFusion

Copy 自 CUDA-BEVFusion 的 README.md 文档

这个 repo 包含使用 CUDA & TensorRT 进行 BEVFusion 推理的源码和模型

在这里插入图片描述

图2-1 cuda-bevfusion推理

2.1 3D目标检测(nuScenes验证集)

  • 对于所有模型,我们使用 BEVFusion-Base 配置
    • 相机分辨率为 256x701
  • 对于相机的 backbone 我们选择 SwinTiny 和 ResNet50
ModelFrameworkPrecisionmAPNDSFPS
Swin-Tiny
BEVFusion-Base
PytorchFP32+FP1668.5271.388.4(on RTX3090)
ResNet50PytorchFP32+FP1667.9370.97-
ResNet50TensorRTFP1667.8970.9818(on ORIN)
ResNet50-PTQTensorRTFP16+INT867.6670.8125(on ORIN)
  • 注:我们在 ORIN 测试的时间是基于 nuScenes 6019 验证集样本的平均值
    • 因此激光雷达点的数量是影响 FPS 的主要原因
    • 请参考 3DSparseConvolution 的 README 查看更多细节

2.2 演示

在这里插入图片描述

图2-2 cuda-bevfusion演示

2.3 模型和数据

  • 为了快速体验,我们提供了 nuScenes 的样例数据,你可以从 Baidu Drive 下载,它包含如下内容:
    • 6 视角的相机图像
    • camera/lidar/ego 的转换矩阵
    • 用于 bevfusion-pytorch 数据的 example-data.pth,允许导出 onnx 不用依赖于完整的数据集
  • 所有的模型都可以从 Baidu Drive 下载,它包含如下内容:
    • swin-tiny onnx models
    • resnet50 onnx 和对应的 pytorch models
    • resnet50 int8 onnx 和对应的 PTQ models

2.4 前置条件

为了构建 bevfusion,我们需要以依赖以下库:

  • CUDA >= 11.0
  • CUDNN >= 8.2
  • TensorRT >= 8.5.0
  • libprotobuf-dev == 3.6.1
  • Compute Capability >= sm_80
  • Python >= 3.6

上面性能表中的数据是我们在 Nvidia Orin 平台上,使用 TensorRT-8.6、cuda-11.4 以及 cudnn8.6 得到的

关于 CUDA、CUDNN、TensorRT 的安装可以参考 Ubuntu20.04部署YOLOv5 或者 Ubuntu20.04软件安装大全 这里不再赘述

你可能会发现博主的 TensorRT 版本似乎并不满足要求,是的,但博主没去安装高版本的 TensorRT,先将就用吧,后续推理也就提示了一个 API 的警告,并没有太大的错误。软件版本不要求完全一致,但是需要尽可能的对应

2.5 快速开始推理

:在安装完 apt install git-lfs 以后请使用 git clone --recursive 来拉取整个项目,确保依赖的完整性

2.5.1 下载模型和数据到CUDA-BEVFusion文件夹

  • 从 Baidu Drive 下载 model.zip
  • 从 Baidu Drive 下载 nuScenes-example-data.zip
# 下载模型和数据到 CUDA-BEVFusion 文件夹
cd CUDA-BEVFusion# 解压模型和数据压缩文件
unzip model.zip
unzip nuScenes-example-data.zip# 下面是解压后整个文件夹的结构
CUDA-BEVFusion
|-- example-data|-- 0-FRONT.jpg|-- 1-FRONT_RIGHT.jpg|-- ...|-- camera_intrinsics.tensor|-- ...|-- example-data.pth`-- points.tensor
|-- src
|-- qat
|-- model|-- resnet50int8|   |-- bevfusion_ptq.pth|   |-- camera.backbone.onnx|   |-- camera.vtransform.onnx|   |-- default.yaml|   |-- fuser.onnx|   |-- head.bbox.onnx|   `-- lidar.backbone.xyz.onnx|-- resnet50`-- swint
|-- bevfusion
`-- tool

2.5.2 配置environment.sh

好,在正式配置之前我们需要解决一个小bug,也就是之前提到过的,当你在 Windows 下面拉取代码放到 Linux 上面时会导致执行 shell 脚本时报错,如下图所示:

在这里插入图片描述

图2-3 执行shell脚本出错

原因是 Windows 和 Linux 的 .sh 脚本文件格式不同,如果在脚本中有空行,脚本是在 Windows 下进行编辑之后传到 Linux 上去执行的话,就会出现这个问题

Windows 下的换行符是\r\n,而 Linux 下的换行符是 \n,没有识别/r,所以会导致上述错误,这个属于脚本编码的问题

解决办法是在对应脚本文件目录下,执行以下命令即可

vim enviroment.sh
:set ff=unix
:wq

上述通过 vim 编辑器打开脚本文件后设置格式为 Linux 格式并保存退出

参考自 Linux下执行Shell脚本出现$‘\r‘: command not found解决方法

因此,如果你的项目是从 Windows 复制到 Linux 下的话,可能存在上述问题,请将 tools 文件夹下的所有脚本文件均按照上述方法修改为 Linux 格式,请确保 tools 下所有 .sh 文件格式均修改完成

OK! 解决了上述小 bug 之后按照 README.md 就可以正常执行推理了

1. 安装 python 依赖库

sudo apt install libprotobuf-dev
pip install onnx

如果需要使用 Python 推理的话需要安装

这里有些问题需要和大家讨论下,我看 Issues 里面有人提问说推理遇到了一些问题,杜老师是说 sudo apt install libprotobuf-dev=3.6.1 但是我安装时说找不到对应版本,如下图所示:

在这里插入图片描述

图2-4 libprotobuf-dev版本找不到

我们可以使用 apt-cache show package 查找指定包的详情,参考自 【Linux】使用apt-get查询并安装指定版本的软件

sudo apt update
sudo apt-cache show package

在这里插入图片描述

图2-5 查找libprotobuf-dev

可以看到查找有多个版 3.6.1.3-2ubuntu5.2、3.6.1.3-2ubuntu5,博主随便安装了一个指令如下:

sudo apt install libprotobuf-dev=3.6.1.3-2ubuntu5.2

但是在后续执行 Python 推理的时候出现如下警告,最终能编译完成,但是执行的时候直接 Segmentation fault 崩溃了

在这里插入图片描述

图2-6 python推理时出错

从编译警告不难看出,protobuf编译的版本是 3.20.3 与要求的版本 3.6.1 并不匹配,博主之前有安装过 protobuf,而 CMakeLists.txt 中是通过 find_pakcage 去找 protobuf 的,找到了之前下载的 3.20.3 版本,还有一些其它的警告也是与 protobuf 相关的,因此可能需要自己手动指定下 protobuf 的头文件和库文件路径,让它正常匹配到所对应的 3.6.1 版本,而不是其它的版本。

因此,博主最终也没解决 Python 推理,等有时间再去折腾吧,C++ 的推理一切正常,下面我们继续。

2. 在 environments.sh 文件中修改 TensorRT/CUDA/CUDNN/BEVFusion 变量

# 修改为你当前使用的路径
export TensorRT_Lib=/path/to/TensorRT/lib
export TensorRT_Inc=/path/to/TensorRT/include
export TensorRT_Bin=/path/to/TensorRT/binexport CUDA_Lib=/path/to/cuda/lib64
export CUDA_Inc=/path/to/cuda/include
export CUDA_Bin=/path/to/cuda/bin
export CUDA_HOME=/path/to/cudaexport CUDNN_Lib=/path/to/cudnn/lib# resnet50/resnet50int8/swint
export DEBUG_MODEL=resnet50int8# fp16/int8
export DEBUG_PRECISION=int8
export DEBUG_DATA=example-data
export USE_Python=OFF

博主修改后如下所示:

export TensorRT_Lib=/opt/TensorRT-8.4.1.5/lib
export TensorRT_Inc=/opt/TensorRT-8.4.1.5/include
export TensorRT_Bin=/opt/TensorRT-8.4.1.5/binexport CUDA_Lib=/usr/local/cuda-11.6/lib64
export CUDA_Inc=/usr/local/cuda-11.6/include
export CUDA_Bin=/usr/local/cuda-11.6/bin
export CUDA_HOME=/usr/local/cuda-11.6/export CUDNN_Lib=/usr/local/cuda-11.6/lib64# resnet50/resnet50int8/swint
export DEBUG_MODEL=resnet50int8# fp16/int8
export DEBUG_PRECISION=int8
export DEBUG_DATA=example-data
export USE_Python=OFF

3.在终端上执行 enviroment.sh 文件

bash tool/enviroment.sh

博主执行完之后如下图所示:

在这里插入图片描述

图2-7 执行enviroment.sh文件

2.5.3 编译运行

1.利用 tensorRT 构建模型

bash tool/build_trt_engine.sh

博主执行完之后如下图所示:

在这里插入图片描述

图2-8 执行build_trt_engine.sh文件

2.编译并运行程序

bash tool/run.sh

博主执行完之后如下图所示:

在这里插入图片描述

图2-9-1 执行run.sh文件

在这里插入图片描述

图2-9-2 执行run文件

在这里插入图片描述

图2-9-3 执行run文件

在这里插入图片描述

图2-9-4 执行run文件

build/cuda-bevfusion.jpg 如下图所示:

在这里插入图片描述

图2-10 build/cuda-bevfusion.jpg

至此,CUDA-BEVFusion 的环境配置到这里就结束了!!!

后续的 onnx 和 PTQ 模型导出的细节、Python推理、进一步的性能提升相关内容需要大家自行去了解了

2.6 可能遇到的问题

2.6.1 问题1:/usr/bin/ld:cannot find -lspconv

分析:没有找到稀疏卷积的库文件,其库文件位于 libraries/3DSparseConvolution/libspconv 中,如果你没有完整拉取整个项目会发现该文件夹下的 lib 文件为空,导致无法找到库文件

解决办法:完整拉取整个项目

在这里插入图片描述

图2-11 问题1

2.6.2 问题2:/libspconv.so:file format not recognized

分析:这个问题在 Issues 17 有人遇到,博主遇到这个问题是因为在问题 1 中的 libspconv.so 找不到时利用手动添加的方式,手动下载库文件导致的

解决办法:完整拉取整个项目

在这里插入图片描述

图2-12 问题2

3. CUDA-CenterPoint

Copy 自 CUDA-CenterPoint 的 README.md 文档

这个 repo 包含使用 CUDA & TensorRT 进行 CenterPoint 推理的源码和模型

整个推理分为以下几个阶段:

  • Voxelization with CUDA kernel
  • 3D backbone with NV spconv-scn
  • RPN & CenterHead with TensorRT
  • Decode & NMS with CUDA kernel

3.1 模型和数据

这个 demo 使用 nuScenes Dataset 中的激光雷达数据,onnx 模型可以通过给定的脚本从下面给出的 checkpoint 中导出

DatasetCheckpointConfig
nuScenesepoch_20.pthnusc_centerpoint_voxelnet_0075voxel_fix_bn_z

3.2 前置条件

为了构建 centerpoint 推理需要 CUDATesorRT、libspconv 库,注意 libspconv 在 Tesla 平台只支持 sm_80 & sm_86,在嵌入式平台只支持 sm_87

3.3 环境

Tesla 平台

  • Ubuntu20.04 x86_64 with Nvidia Tesla A30

  • CUDA 11.4 + cuDNN 8.4.1 + TensorRT 8.4.12.5

嵌入式平台

  • Nvidia Drive Orin 6.0.3.0

  • CUDA 11.4 + cuDNN 8.3.3 + TensorRT 8.4.10.4

3.4 编译运行

在编译运行之前还需要做几件事情

首先,如果你的项目是从 Windows 下面复制到 Linux 下面的,请按照之前 CUDA-BEVFusion 所讲,将 tool 文件夹下的所有 .sh 脚本文件格式均修改为 Linux 格式,具体方法请参照 2.5.2 小节,这里不再赘述

然后,你需要修改 CMakeLists.txt 中的内容,具体修改如下:

# 30行 修改tensorRT路径
set(TENSORRT_ROOT         /opt/TensorRT-8.4.1.5)# 31行 修改CUDA路径
set(CUDA_TOOLKIT_ROOT_DIR /usr/local/cuda-11.6)

最后,在 data 文件夹下创建一个 prediction 文件夹用于保存预测结果信息

在测试数据上运行检测过程,指令如下:

cd CUDA-CenterPoint
bash tool/build.trt.sh
mkdir -p build && cd build
cmake .. && make -j
./centerpoint ../data/test/ --verbose

在这里插入图片描述

图3-1 CUDA-CenterPoint模型构建过程

在这里插入图片描述

图3-2 CUDA-CenterPoint编译过程

在这里插入图片描述

图3-3 CUDA-CenterPoint运行过程

至此,CUDA-CenterPoint 的环境配置到这里就结束了!!!

后续的可视化推理结果以及推理结果评估博主没有尝试,感兴趣的可以自己看看

在这里插入图片描述

图3-4 CUDA-CenterPoint结果可视化

4. CUDA-PointPillars

Copy 自 CUDA-PointPillars 的 README.md 文档

这个 repo 包含使用 TensorRT 进行 pointpillars 推理的源码和模型,模型由 OpenPCDet 创建由 onnx_graphsurgeon 修改

整个推理分为 4 个阶段:

  • Convert points cloud into 4-channle voxels
  • Extend 4-channel voxels to 10-channel voxel features
  • Run TensorRT engine to get 3D-detection raw data
  • Parse bounding box, class type and direction

4.1 模型和数据

这个 demo 使用 KITTI 数据集中的激光雷达数据,onnx 文件可以通过 tool 文件夹下的脚本从预训练模型中导出

4.2 前置条件

为了构建 pointpillars 推理,需要 TensorRTCUDA 以及在 TensorRT 中的 PillarScatter layer 插件

4.3 环境

  • Nvidia Jetson Xavier/Orin + Jetpack 5.0
  • CUDA 11.4 + cuDNN 8.3.2 + TensorRT 8.4.0

4.4 编译运行

由于我们拉取的 Lidar_AI_Solution 项目已经包含了 CUDA-PointPillars 因此不需要单独去拉取该 repo 了

在正式编译运行之前还需要修改下对应的 CMakeLists.txt 文件,修改内容如下:

# 61行 修改TensorRT头文件路径
set(TENSORRT_INCLUDE_DIRS /opt/TensorRT-8.4.1.5/include)# 62行 修改TensorRT库文件路径
set(TENSORRT_LIBRARY_DIRS /opt/TensorRT-8.4.1.5/lib)

修改完成后执行如下指令完成编译:

mkdir build && cd build
cmake .. && make -j$(nproc)
./demo

${nproc} 会显示当前进程可用的CPU数量,博主的数量为12,上述指令等价于

cmake .. && make -j12

编译过程如下图所示:

在这里插入图片描述

图4-1 CUDA-PointPillars编译过程

在这里插入图片描述

图4-2 CUDA-PointPillars运行过程

至此,CUDA-PointPillars 的环境配置到这里就结束了!!!

结语

这篇博客主要介绍了 Lidar_AI_Solution 的环境配置,也就是将 README 文档重新 Copy 了一次,没有涉及到任何的原理分析,大家在环境配置过程中一定要熟读 README 文档,不要忘记安装对应的库和包,除此之外,可以到 Issues 里面多看看别人遇到的一些问题,可能你也遇到过。

该 repo 中涉及到了大量的知识,包括剪枝、量化、部署、BEV感知、Lidar点云、3D检测…,集大成者,感觉把前面所学的剪枝、量化、自动驾驶CV课程全都串起来了呀,如果大家对这个 repo 感兴趣的话可以自行研究。

最后如果大家觉得这个 repo 对你有帮助的话,不妨帮忙点个 ⭐️ 支持一波!!!

下载链接

  • git 下载地址

  • git lfs 下载地址

  • Lidar AI Solution 完整项目下载地址

  • CUDA-BEVFuison 数据下载

  • CUDA-BEVFusion 模型下载

参考

  • Lidar AI Solution

  • git clone --recursive快速高效下载方法

  • Windows系统Git安装教程

  • Windows安装Git LFS

  • Ubuntu20.04部署YOLOv5

  • Ubuntu20.04软件安装大全

  • Linux下执行Shell脚本出现$‘\r‘: command not found解决方法

  • 【Linux】使用apt-get查询并安装指定版本的软件

相关文章:

Lidar AI Solution环境配置

目录 Lidar AI Solution环境配置前言1. Lidar AI Solution1.1 Pipeline overview1.2 GetStart 2. CUDA-BEVFusion2.1 3D目标检测(nuScenes验证集)2.2 演示2.3 模型和数据2.4 前置条件2.5 快速开始推理2.5.1 下载模型和数据到CUDA-BEVFusion文件夹2.5.2 配置environment.sh2.5.3…...

子串--子字符串 0528

210102 201012 A1A2…An An…A2A1 如何做, 翻转的是21,因为2>1; 翻转的是210,因为2>0; 翻转的是2101,因为2>1; 翻转的是21010,因为2>0; 翻转的是210102,因为22且1&…...

大数据教程【01.04】--excel的使用

更多信息请关注WX搜索GZH:XiaoBaiGPT Excel中的大数据处理 Excel是一款功能强大的电子表格软件,它广泛用于数据处理和分析。对于大数据处理,Excel提供了多种功能和工具,可以帮助用户处理大量的数据。在本教程中,我们…...

Java输入输出流

目录 一、数据流概念 1.输入输出的概念​ 2.流的概念 3.流的操作 二、常用的流分类 三、文件输入输出流 1.FileReader和FileWriter 2.FileInputStream和FileOutStream 四、复制文件 一、数据流概念 1.输入输出的概念​ 输入输出技术用于处理设备之间的数据传输&#x…...

1688商品ID采集一件代发详情页面数据

本篇博文介绍了对1688商品详情API的二次封装,将URL参数封装成Python函数,直接传入参数即可获取搜索结果,例如1688商品标题、价格、一件代发、sku属性和URL等。提供了详细的代码示例和接口调用Demo。 1688.item_get-获得1688商品详情数据 1.请…...

丽江“美丽县城”建设,高精度地籍免像控案例分享

一、项目背景 云南省地矿测绘院于2020年6月承接丽江市玉龙县“美丽县城”建设项目1:500倾斜摄影及地形图测绘项目。项目要求对玉龙县城区及其周边等约30平方公里区域进行优于3CM倾斜摄影测量。 并基于三维模型完成地形高程点、地貌、地物特征点的采集成图&#xf…...

我是如何精通软件工程的

软件工程是一个庞大且不断演化的领域,涉及许多创新。虽然如此,大多数技术 —— 如果不是全部 —— 在软件工程中往往最终汇聚为几个基本原则。工程师更好地掌握软件工程的方法是熟悉软件工程的基础知识,而不是那些不断变化的框架、语言或平台…...

如何使用 Python Nornir 实现基于 CLI 的网络自动化?

在现代网络环境中,网络自动化已成为管理和配置网络设备的重要工具。Python Nornir 是一个强大的自动化框架,它提供了一个简单而灵活的方式来执行网络自动化任务。本文将详细介绍如何使用 Python Nornir 实现基于 CLI 的网络自动化。 1. Python Nornir 概…...

并发编程的三大特性之有序性

有序性的概念 Java文件在被cpu执行前会进行编译成cpu可以执行的指令,为了提高cpu的执行效率会对其中的一些语句进行重排序。Java指令最终是乱序执行的目的是为了提高cpu的执行效率,发挥cpu的性能 单例模式由于指令重排可能会出现上述的问题&#xff0…...

LeetCode:相交链表(java)

相交链表 题目描述指针法解题 #LeetCode 160题:相交链表,原题链接 原题链接。相交链表–可以打开测试 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返…...

利用PHP导出MySQL数据表结构和SQL文件

目录 一、获取数据库所有的数据表 方法一:TP5 方法二:原生PHP 二、导出指定数据表的数据结构 三、 导出SQL文件 四、生成SQL语句 五、完整代码 前端 后端 语言:PHP 数据库:MySQL 功能:分为四部分,① 查出数…...

接口测试框架分析

框架大体上已经写完了,不过说实话好多代码让我自己写我也写不出来,那该怎么办呢?很简单,把现在已经写好的代码保存起来,等用的时候拿出来复制粘贴就好了,如果你是大神,自己会写,那就…...

spring boot日志

日志介绍日志的使用日志级别日志持久化更简单的输入日志lombok的运行原理 日志介绍 日志的作用: 1:发现问题; 2:定位问题; 3:记录用户的行为:看哪些是方法用户;还能拿到用户的ip&am…...

【Vue2.0源码学习】虚拟DOM篇-Vue中的DOM-更新子节点

文章目录 1. 前言2. 更新子节点3. 创建子节点4. 删除子节点5. 更新子节点6. 移动子节点7. 回到源码8. 总结 1. 前言 在上一篇文章中,我们了解了Vue中的patch过程,即DOM-Diff算法。并且知道了在patch过程中基本会干三件事,分别是:…...

rsync

配置rsync源服务器: #建立/etc/rsyncd.conf 配置文件 vim /etc/rsyncd.conf #添加以下配置项 uid root gid root use chroot yes #禁锢在源目录 address 192.168.80.10 …...

javascript:void(0)

javascript:void(0) 是一个 JavaScript 中常见的使用方式&#xff0c;它通常用于在 HTML 中作为链接的 href 属性值。 在 HTML 中&#xff0c;链接&#xff08;<a> 元素&#xff09;的 href 属性指定了链接目标的 URL。当用户点击该链接时&#xff0c;浏览器会加载该 UR…...

ThingsBoard教程(五三):规则节点解析 Kafka Node, MQTT Node

Kafka Node Since TB Version 2.0 Kafka节点将消息发送到Kafka代理。它可以接收任何类型的消息。该节点会通过Kafka生产者将记录发送到Kafka服务器。 配置 主题模式 - 可以是静态字符串,也可以是使用消息元数据属性解析的模式。例如${deviceType}引导服务器 - 用逗号分隔的…...

基于PHP实现的网上留言管理系统的设计

摘 要 随着互联网技术的迅猛发展,网络已经充斥到我们生活的方方面面,网上留言系统已经成为各种网站不可或缺的一个组成部分。一个设计美观、功能完善的网上留言系统是网站吸引网民的一个重要因素。同时,它还为网络用户提供了一个多人参与的信息交流平台。基于PHP实现的网上…...

【9 Vue全家桶 – Vuex状态管理】

1 什么是状态管理 其实是数据管理但是为了更好的指出是由于状态的变化导致数据的变化(响应式数据),我们称之为状态管理. 2 Vuex的状态管理 组件只能直接读取state,而不能直接修改state,必须通过mutation才能修改.(pinia可以直接读取和修改state) 3 Vuex的安装 npm install …...

Oracle游标学习

declare-- 1 声明一个游标cursor emp_cursor isselect ID,XM,KSNO from ZGXX where rownum < 10; v_stu_info emp_cursor%rowtype; -- %rowtype: 声明 emp表的所有字段 begin-- 2 开启游标open emp_cursor;-- 3 获取数据&#xff08;一次获取一行&#xff09;循环获取 去掉…...

几种常用的正则表达式

1、身份证号正则表达式 身份证号是一串18位数字和字母的组合&#xff0c;其中最后一位可能为数字或者字母 X。以下是可以用于匹配身份证号的正则表达式&#xff1a; /^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[Xx\d]$/上述正则表达式中包含…...

华为OD机试真题 Java 实现【快速开租建站】【2023Q1 200分】,附详细解题思路

一、题目描述 当前IT部门支撑了子公司颗粒化业务&#xff0c;该部门需要实现为子公司快速开租建站的能力&#xff0c;建站是指在一个全新的环境部署一套IT服务。 每个站点开站会由一系列部署任务项构成&#xff0c;每个任务项部署完成时间都是固定和相等的&#xff0c;设为1。…...

照片中对象识别模型YOLOv3在iOS项目中的浅析与使用

本文所指的YOLOv3模型为苹果开发者官网提供的图形识别对象的CoreML模型&#xff0c;可识别80种对象&#xff0c;并给出识别的对象在图形中的位置和大小信息。 我们可以直接在官网下载该模型&#xff1a; 机器学习 - 模型 - Apple Developer 然后直接将模型拖入工程中&#x…...

Caffeine 本地高速缓存工具类

目录 Caffeine工具类方式 SpringBoot 整合 Caffeine 缓存 &#xff08;SpringCache模式&#xff09; 驱逐策略 开发使用 Caffeine是一种高性能的缓存库&#xff0c;是基于Java 8的最佳&#xff08;最优&#xff09;缓存框架&#xff0c;性能各方面优于guava。 Caffeine工具…...

加密解密软件VMProtect教程(八)许可制度之序列号生成器

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…...

单源最短路的建图

1.热浪 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/problem_show.php?pid1379 很裸的单源最短路问题&#xff0c;n2500,可以用dijksta或者spfa都能过&#xff0c;下面展示spfa的做法 #include<bits/stdc.h> usi…...

MyBatis基本操作及SpringBoot单元测试

目录 一、什么是单元测试&#xff1f; 1.1 单元测试的好处 1.2 单元测试的实现步骤 1.2.1 生成单元测试类&#xff1a; 1.2.2 SpringBootTest注解 1.2.3 检验方法结果&#xff1a; 二、利用MyBatis实现查询操作 2.1单表查询 2.2 参数占位符 #{} 和 ${} 2.2.1 ${} 字符…...

Linux之创建进程、查看进程、进程的状态以及进程的优先级

文章目录 前言一、初识fork1.演示2.介绍3.将子进程与父进程执行的任务分离4.多进程并行 二、进程的状态1.进程的状态都有哪些&#xff1f;2.查看进程的状态2.运行&#xff08;R&#xff09;3.阻塞4.僵尸进程&#xff08;Z&#xff09;1.僵尸状态概念2.为什么要有僵尸状态&#…...

k8s部署rabbitmq

docker pull rabbitmq:3.9.28-management 1.部署模板 apiVersion: v1 kind: Service metadata:name: rabbitmq spec:ports:- name: amqpport: 5672targetPort: 5672- name: managementport: 15672targetPort: 15672selector:app: rabbitmq---apiVersion: apps/v1 kind: Statef…...

关于QGroundControl的软件架构的理解

首先QGC是基于QT平台开发&#xff0c;个人理解软件架构即为项目前后端结构&#xff0c;以及前后端数据交互的逻辑。下面是对QGroundControl源码的一些个人理解&#xff0c;写这个博客只是为了记录下来&#xff0c;防止时间久了忘记&#xff0c;过程中看了一些大佬的博客来帮助理…...