【YOLOv8】安卓端部署-1-项目介绍

news2024/11/24 3:14:55

【YOLOv8】安卓端部署-1-项目介绍

  • 1 什么是YOLOv8
    • 1.1 YOLOv8 的主要特性
    • 1.2 YOLOv8分割模型
      • 1.2.1 YOLACT实例分割算法之计算掩码
        • 1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系
        • 1.2.1.2 插值时的目标检测中提取的物体特征
        • 1.2.1.3 coefficients(系数)作用
        • 1.2.1.4 YOLACT论文中的示意图
  • 2 环境搭建
    • 2.1 软件安装
      • 2.1.1 Visual Studio
      • 2.1.2 下载和安装nvidia显卡驱动
      • 2.1.3 下载CUDA
      • 2.1.4 安装CUDA
      • 2.1.5 下载cuDNN
      • 2.1.6 安装cuDNN
      • 2.1.7 CUDA安装测试
      • 2.1.8 安装Anaconda
      • 2.1.9 安装pytorch
    • 2.2 YOLOv8安装
      • 2.2.1 克隆YOLOv8并安装
      • 2.2.2 下载预训练权重文件
      • 2.2.3 安装测试
    • 2.3 导出ONNX模型
      • 2.3.1 修改模型
      • 2.3.2 执行命令
    • 2.4 onnx转换成NCNN文件
      • 2.4.1 自动转换
      • 2.4.2 手动转换
    • 2.5 安装Android Studio


1 什么是YOLOv8

YOLOv8 是由 Ultralytics 团队于 2023 年 1 月发布的目标检测模型,是 YOLO 系列的最新重要版本之一。YOLOv8 继承了 YOLO 的核心设计理念,即 “You Only Look Once”,强调单次前向传播即可完成图像中的目标检测任务。相比于之前的版本(如 YOLOv5 和 YOLOv7),YOLOv8 在模型架构、训练策略、特征提取和推理效率等方面做了全面改进。

1.1 YOLOv8 的主要特性

  1. 模型架构改进
    • 自适应的网络架构:YOLOv8 在 Backbone 和 Neck 部分采用了新的设计,例如利用了 CSPNetConvNeXt 的特性,进一步优化了特征提取效率和推理速度。
    • 新型的 Head 设计:YOLOv8 引入了新的预测 Head,支持不同任务(检测、分割、关键点检测等)的统一设计,简化了模型结构,并提高了预测性能。
  2. 支持多任务
    • 目标检测:YOLOv8 支持经典的目标检测任务,即在图像中检测物体并返回边界框和类别标签。
    • 实例分割:YOLOv8 集成了实例分割功能,能够精确地检测物体的轮廓,这在需要对复杂场景进行精确分割时非常有用。
    • 关键点检测:YOLOv8 还支持关键点检测任务,适用于人体姿态估计和动作识别等应用场景。
  3. 优化的训练策略
    • 自动数据增强(AutoAugment):YOLOv8 引入了自动化的数据增强策略,结合 Mosaic、MixUp 等技术,进一步提高了模型的泛化能力。
    • 标签平滑(Label Smoothing):通过引入标签平滑技术,减少了过拟合现象,并改善了模型的训练效果。
    • 先进的优化器支持:YOLOv8 默认支持 AdamW 优化器,并通过结合 Cosine Annealing 调整学习率,提升了训练效率。
  4. 高效的推理速度
    • YOLOv8 采用了更高效的卷积操作,并结合 TensorRT、ONNX 等推理框架进行优化,可以在 GPU 上实现极快的推理速度,适合于实时检测任务。
    • 对于边缘设备(如 Jetson Nano 和 Raspberry Pi),YOLOv8 也能提供良好的性能表现,满足低延迟、高精度的需求。

1.2 YOLOv8分割模型

在这里插入图片描述

YOLOv8的实例分割采用了YOLACT实例分割算法,当然和YOLACT的骨干网和颈部是不同的。

在这里插入图片描述

YOLOv8中的分割模型输出包括两个部分,一个形状为 [1, 116, 8400] 的 output0,另一个形状为 [1, 32, 160, 160] 的 output1。

output0 的第一个维度表示批次大小,始终为 1。

第二个维度由 116 个值组成,116 = 4 + 80 + 32。其中前 4 个值表示检测到的物体的边界框坐标(x,y,宽度和高度),其余 80 个值表示物体属于每个类别的概率。最后 32 值是 32 个掩码原型的系数(coefficients),可以通过处理它们来生成任意数量物体的掩码。

第三个维度有 8400 个值 — 可能检测到的物体数量(8400 = 80 × 80 + 40 × 40 + 20 × 20)。

output1 包含一个由 32 个掩码组成的数组,每个掩码的尺寸为 160 × 160 像素。

要获得检测到的物体的最终掩码,首先需要从第一个输出 output0 中选择最佳概率,对应于感兴趣的物体,并记住该物体掩码的索引。

然后,可以使用掩码的索引从第二个输出中获取该物体的掩码。为了获得物体的最终掩码,需要将第二个输出 output1 中的物体掩码的大小和点插值到输入图像的尺寸上,乘以 4。因为掩码最初是在 160x160 像素的图像上生成的,如果输入尺寸为 640x640 像素,则需要将掩码缩放 4 倍以适应输入图像。

1.2.1 YOLACT实例分割算法之计算掩码

  1. 首先,YOLACT 通过目标检测部分检测出图像中的物体,并获得每个物体的边界框坐标 (x, y, width, height) 以及每个类别的概率。

  2. 然后,YOLACT 从另一个输出中获取与每个物体相对应的掩码。这个输出是一个包含多个掩码原型的数组,每个掩码原型都是一个固定大小的二进制掩码,表示一个通用的物体形状。

  3. 接下来,根据目标检测的结果,选择与感兴趣物体相关的概率最高的掩码系数。最终掩码是通过从目标检测输出中找到对应物体的类别概率最高的索引来完成。

  4. 选定的掩码原型被进一步处理,将其插值到输入图像的尺寸上,以生成与物体实际形状更匹配的掩码。这是通过掩码原型的二进制掩码和物体边框的大小、比例等结合,进一步调整掩码形状来完成的。

  5. 最后,经过插值处理后的掩码将与物体的边界框一起输出,作为最终的实例分割结果。这个掩码将准确地标注物体在图像中的像素级别的位置和形状。

总结起来,YOLACT 通过将掩码原型插值到输入图像的尺寸上,结合目标检测结果,计算出与物体实际形状更匹配的掩码,并输出作为最终的实例分割掩码。这个过程在 YOLACT 在像素级别准确地分割和表示图像中的不同物体。

1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系

在 YOLACT 中,掩码原型和最终的掩码之间的关系说明:

  1. 掩码原型 (Mask Prototype):掩码原型是预定义的、通用的二进制掩码掩形,它们具有固定的尺寸和形状。在 YOLACT 中,掩码原型是一个由固定数量的二进制掩码组成的数组,每个掩码原型表示一种常见的物体形状。这些掩码原型可以用来构建,用于生成最终的掩码。

  2. 最终掩码(Final Mask):最终的掩码是通过选定的掩码原型进行插值和调整后得到的。根据检测的结果,AI 将选定的与感兴趣物体相匹配的掩码原型进行插值和调整。最终的掩码是通过将选定的掩码原型插值到输入图像的尺寸上,以生成与物体实际形状更匹配的掩码。这种插值过程是通过双线性插值算法来完成的。

因此,掩码原型是事先定义的、通用的物体形状模板,而最终的掩码是根据选定的掩码原型经过插值处理后生成的与物体实际形状更匹配的掩码。最终的掩码表示了对象在图像中的像素级别的位置和形状。这个过程在实例分割中,将图像中的物体与它们的掩码系数进行关联。

1.2.1.2 插值时的目标检测中提取的物体特征

在 YOLACT 中,插值过程并不直接考虑目标检测中提取的物体特征。插值过程仅关注将选定的掩码原型插值到输入图像的尺寸上,以生成与物体实际形状更匹配的掩码。

目标检测只负责提供物体的边界框坐标和类别概率,而插值阶段则是依据感兴趣的概率系数上对掩码进行形状的调整。插值过程不考虑目标检测中提取的物体特征,因为掩码原型在设计时已经包含了通用的物体形状信息。

**目标检测和插值是两个独立的步骤,它们分别处理物体的位置和形状。目标检测确定物体的边界框和类别概率,而插值阶段将掩码原型通过插值调整为物体实际的形状。**这个过程让 YOLACT 能够在图像中精确分割物体的边缘位置,而不需要直接考虑目标检测中提取的物体特征。

1.2.1.3 coefficients(系数)作用

在 YOLACT 算法中,coefficients(系数)是用于控制插值过程的参数。这些系数用于调整选定的掩码原型在插值过程中的权重和形状。

具体而言,YOLACT 使用一组系数来对选定的掩码原型组合并调整。这些系数提供了在插值和调整过程中对掩码原型进行加权的参数,使它们用于生成与目标形状相符的最终掩码。系数的权重决定了每个掩码原型的贡献,最终掩码会是这些加权后的掩码原型的线性组合,平滑和优化。

1.2.1.4 YOLACT论文中的示意图

在这里插入图片描述

在这里插入图片描述

2 环境搭建

介绍完YOLOv8后,我们来安装一下环境

2.1 软件安装

2.1.1 Visual Studio

安装Visual Studio 2022 下载Visual Studio 社区版

下载链接:https://visualstudio.microsoft.com/zh-hans/downloads/

在这里插入图片描述

注意:安装时可勾选“Python开发”和“C++开发”

2.1.2 下载和安装nvidia显卡驱动

首先要在设备管理器中查看你的显卡型号,比如在这里可以看到我的显卡型号为RTX 1060。

在这里插入图片描述

NVIDIA 驱动下载:https://www.nvidia.cn/Download/index.aspx?lang=cn 下载对应你的英伟达显卡驱动。

在这里插入图片描述

下载之后就是简单的下一步执行直到完成。 完成之后,在cmd中输入执行:

nvidia-smi

在这里插入图片描述

注:图中的 CUDA Version是当前Driver版本能支持的最高的CUDA版本

2.1.3 下载CUDA

下载CUDA CUDA用的是11.8版本

cuda下载链接:https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal

在这里插入图片描述

下载后得到文件:cuda_11.8.0_522.06_windows.exe 执行该文件进行安装。

2.1.4 安装CUDA

(1) 将cuda运行安装,建议默认路径

在这里插入图片描述

安装时可以勾选Visual Studio Integration

(2) 安装完成后设置环境变量

在这里插入图片描述

看到系统中多了CUDA_PATH和CUDA_PATH_V11_8两个环境变量。

2.1.5 下载cuDNN

cudnn下载地址:Index of /compute/cudnn/redist/cudnn/windows-x86_64 (nvidia.com)

在这里插入图片描述
在这里插入图片描述

需要有NVIDIA账号 注意:cudnn版本要和cuda版本匹配

如果NVIDIA 驱动版本低于为 520.61.05可以安装cudnn的8.9.*版本

下载得到文件cudnn-windows-x86_64-9.5.1.17_cuda11-archive.zip

2.1.6 安装cuDNN

复制cudnn文件

对于cudnn直接将其解开压缩包,然后需要将bin,include,lib中的文件复制粘贴到cuda的文件夹下

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8

注意:对整个文件夹bin,include,lib选中后进行复制粘贴
在这里插入图片描述

2.1.7 CUDA安装测试

最后测试cuda是否配置成功

打开CMD执行:

nvcc -V

在这里插入图片描述

2.1.8 安装Anaconda

Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。

1) 下载安装包 Anaconda

下载Windows版:https://www.anaconda.com/

2) 然后安装anaconda

在这里插入图片描述

2.1.9 安装pytorch

1)创建虚拟环境

环境名字可自己确定,这里本人使用yolo8作为环境名

conda create -n yolo8 python=3.9

安装成功后激活yolo8环境:

conda activate yolo8

在所创建的yolo8环境下安装pytorch, 执行命令:

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

注意:11.8处应为自己电脑上的cuda版本号

离线安装: 下载网址: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/win-64/

安装pytorch2.0版本: pytorch-2.0.0-py3.9_cuda11.8_cudnn8_0.tar.bz

conda install --offline pytorch-2.0.0-py3.9_cuda11.8_cudnn8_0.tar.bz

2.2 YOLOv8安装

2.2.1 克隆YOLOv8并安装

安装Git软件(https://git-scm.com/downloads),克隆项目到本地(如 d:)

项目repo网址: https://github.com/ultralytics/ultralytics

在 Git CMD窗口中执行:

git clone https://github.com/ultralytics/ultralytics

在这里插入图片描述

git clone克隆需要科学上网,请自行解决

在yolo8虚拟环境下执行:

cd F:\Code\Java\JavaCode\Yolov8\ultralytics
pip install -e .

2.2.2 下载预训练权重文件

下载yolov8预训练权重文件,并放置在新建立的weights文件夹下

下载链接:https://docs.ultralytics.com/tasks/segment/

我电脑不行,参数量太大的推理太慢,我选择yolov8s-seg权重

例如:F:\Code\Java\JavaCode\Yolov8\ultralytics\ultralytics\weights

2.2.3 安装测试

预测图片:

yolo segment predict model=F:/Code/Java/JavaCode/Yolov8/ultralytics/ultralytics/weights/yolov8s-seg.pt source=F:/Code/Java/JavaCode/Yolov8/ultralytics/ultralytics/assets/bus.jpg

在这里插入图片描述

预测结果在F:\Code\Java\JavaCode\Yolov8\ultralytics\runs\segment\predict

在这里插入图片描述

预测点复杂图形

在这里插入图片描述

实时预测摄像头:

yolo segment predict predict model=F:/Code/Java/JavaCode/Yolov8/ultralytics/ultralytics/weights/yolov8s-seg.pt source=0 show

在这里插入图片描述

2.3 导出ONNX模型

2.3.1 修改模型

因为有些函数onnx并不支持,所以我们需要手动修改一下

1)修改文件1: F:\Code\Java\JavaCode\Yolov8\ultralytics\nn\modules\block.py中

class C2f(nn.Module)改动如下

在这里插入图片描述

class C2f(nn.Module):
    """Faster Implementation of CSP Bottleneck with 2 convolutions."""

    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
        """Initializes a CSP bottleneck with 2 convolutions and n Bottleneck blocks for faster processing."""
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))

    def forward(self, x):
        """Forward pass through C2f layer."""
        # y = list(self.cv1(x).chunk(2, 1))
        # y.extend(m(y[-1]) for m in self.m)
        # return self.cv2(torch.cat(y, 1))
        
        x= self.cv1(x)
        x =[x,x[:,self.c:, ...]]
        x.extend(m(x[-1]) for m in self.m)
        x.pop(1)
        return self.cv2(torch.cat(x,1))

2)修改文件2: F:\Code\Java\JavaCode\Yolov8\ultralytics\nn\modules\head.py中

class Detect(nn.Module)改动如下

在这里插入图片描述

def forward(self, x):
    """Concatenates and returns predicted bounding boxes and class probabilities."""
    shape = x[0].shape  # BCHW
    for i in range(self.nl):
        x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)
    if self.training:
        return x
    elif self.dynamic or self.shape != shape:
        self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))
        self.shape = shape
    
    return torch.cat([xi.view(shape[0],self.no, -1)for xi in x], 2)

注意1:旧版本的YOLOv8两个改动处都在 \ultralytics\nn\modules.py中

注意2:训练YOLOv8时不需要这两个改动

2.3.2 执行命令

yolo export model=F:/Code/Java/JavaCode/Yolov8/ultralytics/ultralytics/weights/yolov8n-seg.pt  format=onnx simplify=True opset=12
yolo export model=F:/Code/Java/JavaCode/Yolov8/ultralytics/ultralytics/weights/yolov8s-seg.pt  format=onnx simplify=True opset=12

在这里插入图片描述

在这里插入图片描述

自己训练出的权重文件导出:

yolo export model=path/to/best-seg.pt format=onnx simplify=True opset=12

2.4 onnx转换成NCNN文件

2.4.1 自动转换

一键生成:https://convertmodel-1256200149.cos-website.ap-nanjing.myqcloud.com/

打开我们刚刚生成的两个文件

在这里插入图片描述

2.4.2 手动转换

如果不想一键生成,可以自己安装

1)安装protobuf

下载protobuf-3.19.4安装包,并解压; 在VS2022的X64命令行下执行以下命令

注: 为解压的protobuf-3.19.4文件夹的根目录。

在这里插入图片描述

cd <protobuf-root-dir>
mkdir build-vs2022
cd build-vs2022

cmake -G "NMake Makefiles" ^
  -DCMAKE_BUILD_TYPE=Release ^
  -DCMAKE_INSTALL_PREFIX=%cd%/install ^
  -Dprotobuf_BUILD_TESTS=OFF ^
  -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ^
  -Dprotobuf_WITH_ZLIB=OFF ^
  ../cmake

nmake
nmake install

在这里插入图片描述

在这里插入图片描述

编译后可执行检查安装是否成功

protoc.exe --version

在这里插入图片描述

2)克隆和安装ncnn

首先克隆ncnn

git clone https://github.com/Tencent/ncnn.git

打开VS2022的X64命令行(进入到ncnn根目录下)执行以下语句

注意:cmake -G…这条命令有三个需要换成protobuf的根目录

cd <ncnn-root-dir>
mkdir -p build-vs2022
cd build-vs2022

cmake -G "NMake Makefiles" ^
  -DCMAKE_BUILD_TYPE=Release ^
  -DCMAKE_INSTALL_PREFIX=%cd%/install ^
  -DProtobuf_INCLUDE_DIR=<protobuf-root-dir>/build-vs2022/install/include ^
  -DProtobuf_LIBRARIES=<protobuf-root-dir>/build-vs2022/install/lib/libprotobuf.lib ^
  -DProtobuf_PROTOC_EXECUTABLE=<protobuf-root-dir>/build-vs2022/install/bin/protoc.exe ^
  -DNCNN_VULKAN=OFF ^
  -DNCNN_BUILD_WITH_STATIC_CRT=ON ..

nmake
nmake install

其中

cmake -G "NMake Makefiles" ^
  -DCMAKE_BUILD_TYPE=Release ^
  -DCMAKE_INSTALL_PREFIX=%cd%/install ^
  -DProtobuf_INCLUDE_DIR=D:/software_code/protobuf/protobuf-3.19.4/build-vs2022/install/include ^
  -DProtobuf_LIBRARIES=D:/software_code/protobuf/protobuf-3.19.4/build-vs2022/install/lib/libprotobuf.lib ^
  -DProtobuf_PROTOC_EXECUTABLE=D:/software_code/protobuf/protobuf-3.19.4/build-vs2022/install/bin/protoc.exe ^
  -DNCNN_VULKAN=OFF ^
  -DNCNN_BUILD_WITH_STATIC_CRT=ON ..

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

编译后 D:\ncnn\build-vs2022\tools\onnx下有onnx2ncnn.exe

3) 生成ncnn文件

拷贝yolov8n-seg.onnx和yolov8s-seg.onnx文件到D:\ncnn\buildvs2022\tools\onnx\

在这里插入图片描述

执行命令生成ncnn相应的param和bin文件

onnx2ncnn.exe yolov8n-seg.onnx yolov8n-seg.param yolov8n-seg.bin
onnx2ncnn.exe yolov8s-seg.onnx yolov8s-seg.param yolov8s-seg.bin

在这里插入图片描述

4)使用ncnn_optimize优化ncnn文件

产生新的param和bin文件:

ncnn\build-vs2022\tools路径下执行

先拷贝yolov8n-seg.bin和yolov8n-seg.param文件,以及yolov8s-seg.bin 和yolov8s-seg.param文件到此路径下

在这里插入图片描述

执行命令:

ncnnoptimize.exe yolov8n-seg.param yolov8n-seg.bin yolov8n-seg-opt.param yolov8n-seg-opt.bin 0
ncnnoptimize.exe yolov8s-seg.param yolov8s-seg.bin yolov8s-seg-opt.param yolov8s-seg-opt.bin 0

在这里插入图片描述

2.5 安装Android Studio

官网:https://developer.android.google.cn/studio/

安装时会提示安装SDK 同意licenses 注意:Android SDK安装路径中不要有空格

注意配置: File->Settings->Appearance & Behavior ->System Settings->Android SDK SDK Platforms

选中面向手机的Android版本

SDK Tools选中NDK, CMake

注意:cmake的版本选择不要太高

ndk版本为24.0.8215888 cmake版本为3.10.2.4988404

在这里插入图片描述

检查build.gradle(app)文件

在这里插入图片描述

在android下添加我们指定的ndk版本

ndkVersion "24.0.8215888"

添加 CMake 到文件 local.properties

在这里插入图片描述

sdk.dir=D\:\\software_code\\android\\sdk
ndk.dir=D\:\\software_code\\android\\sdk\\ndk\\24.0.8215888
cmake.dir=D\:\\software_code\\android\\sdk\\cmake\\3.10.2.4988404

然后Press the button Sync project with Gradle Files in the upper right.

在这里插入图片描述

同步Gradle成功

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

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

相关文章

基于Spring Boot+Unipp的博物馆预约小程序(协同过滤算法、二维码识别)【原创】

&#x1f388;系统亮点&#xff1a;协同过滤算法、二维码识别&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框…

Spring Boot 3 【八】整合实现高可用 Redis 集群

一、引言 在当今快速发展的软件开发领域&#xff0c;系统的性能和可靠性至关重要。Springboot 3 整合 Redis 7 集群具有多方面的重大意义。 首先&#xff0c;随着业务的不断发展&#xff0c;数据量呈爆炸式增长&#xff0c;单个 Redis 服务器往往难以满足存储和处理需求。Red…

网络安全-企业环境渗透2-wordpress任意文件读FFmpeg任意文件读

一、 实验名称 企业环境渗透2 二、 实验目的 【实验描述】 操作机的操作系统是kali 进入系统后默认是命令行界面 输入startx命令即可打开图形界面。 所有需要用到的信息和工具都放在了/home/Hack 目录下。 本实验的任务是通过外网的两个主机通过代理渗透到内网的两个主机。…

如何创建一个网站?初学者的分步指南

在当今数字化时代&#xff0c;即便你对 Web 开发、设计或编码一窍不通&#xff0c;也能轻松搭建属于自己的网站。无论你是想为个人打造展示平台&#xff0c;还是为企业建立线上形象&#xff0c;只要掌握正确的方法&#xff0c;借助合适的工具与资源&#xff0c;就能在短时间内完…

OceanBase V4.x应用实践:如何排查表被锁问题

DBA在日常工作中常常会面临以下两种常见情况&#xff1a; 业务人员会提出问题&#xff1a;“表被锁了&#xff0c;导致业务受阻&#xff0c;请帮忙解决。” 业务人员还会反馈&#xff1a;“某个程序通常几秒内就能执行完毕&#xff0c;但现在却运行了好几分钟&#xff0c;不清楚…

MongoDB进阶篇-索引(索引概述、索引的类型、索引相关操作、索引的使用)

文章目录 1. 索引概述2. 索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引2.3.1 地理空间索引&#xff08;Geospatial Index&#xff09;2.3.2 文本索引&#xff08;Text Indexes&#xff09;2.3.3 哈希索引&#xff08;Hashed Indexes&#xff09; 3. 索引相关操作3.1 查看索…

Ubuntu20.04 Rk3588 交叉编译ffmpeg7.0

firefly 公司出的rk3588的设备&#xff0c;其中已经安装了gcc 交叉编译工具&#xff0c;系统版本是Ubuntu20.04。 使用Ubuntu20.04 交叉编译ffmpeg_ubuntu下配置ffmpeg交叉编译器为arm-linux-gnueabihf-gcc-CSDN博客文章浏览阅读541次。ubuntu20.04 交叉编译ffmpeg_ubuntu下配…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Java项目-基于SpringBoot+vue的租房网站设计与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

24.UE5枚举,怪物分类,龙卷风技能

2-26 枚举、怪物分类、龙旋风技能、掉落概率_哔哩哔哩_bilibili 目录 1.枚举 1.1枚举类型的创建 1.2 将枚举类型绑定到怪物蓝图上 1.3枚举类型的使用 1.3.1创建新的掉落物 1.3.2更改怪物掉落逻辑 2.龙卷风技能 2.1输入映射 2.2龙卷风发射物的创建 2.3龙卷风伤害逻辑…

推荐几个 VSCode 流程图工具

Visual Studio Code&#xff08;简称VSCode&#xff09;是一个由微软开发的免费、开源的代码编辑器。 VSCode 发布于 2015 年&#xff0c;而且很快就成为开发者社区中广受欢迎的开发工具。 VSCode 可用于 Windows、macOS 和 Linux 等操作系统。 VSCode 拥有一个庞大的扩展市…

解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“

最近给电脑做了新版的 Windows 11 LTSC操作系统&#xff0c;在启动VMware Workstation时&#xff0c;提示"此虚拟机已启用侧通道缓解&#xff0c;可增强安全性&#xff0c;但也会降低性能"&#xff0c;但是我没有启用 Hyper-V 相关的任何功能以及 WSL&#xff0c; 从…

Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复

目录 安装包 flume的部署 负载均衡测试 故障恢复 安装包 在这里给大家准备好了flume的安装包 通过网盘分享的文件&#xff1a;apache-flume-1.9.0-bin.tar.gz 链接: https://pan.baidu.com/s/1DXMA4PxdDtUQeMB4J62xoQ 提取码: euz7 --来自百度网盘超级会员v4的分享 ----…

P2TR(Taproot 交易)和Musig2

目录 P2TR(Taproot 交易)和Musig2 P2TR(Taproot 交易) Musig2 总结 P2TR(Taproot 交易)和Musig2 都是比特币和区块链技术中的先进功能,它们各自具有独特的特点和应用场景。以下是两者的区别及举例说明: P2TR(Taproot 交易) 定义: P2TR是一种比特币交易类型,旨…

Web 入门

HTTP 一、概念 Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 二、特点 基于TCP协议&#xff1a;面向连接&#xff0c;安全。基于请求-响应模型的&#xff1a;一次请求对应一次响应。HTTP协议是无状态的协…

Docker+Nginx | Docker(Nginx) + Docker(fastapi)反向代理

在DockerHub搜 nginx&#xff0c;第一个就是官方镜像库&#xff0c;这里使用1.27.2版本演示 1.下载镜像 docker pull nginx:1.27.2 2.测试运行 docker run --name nginx -p 9090:80 -d nginx:1.27.2 这里绑定了宿主机的9090端口&#xff0c;只要访问宿主机的9090端口&#…

Postman之变量操作

系列文章目录 1.Postman之安装及汉化基本使用介绍 2.Postman之变量操作 3.Postman之数据提取 4.Postman之pm.test断言操作 5.Postman之newman Postman之变量操作 1.pm.globals全局变量2.pm.environment环境变量3.pm.collectionVariables集合变量4.pm.variables5.提取数据-设置变…

鸿蒙动画开发08——帧动画

1、概 述 帧动画通过应用onFrame逐帧回调的方式&#xff0c;让开发者在应用侧的每一帧都可以设置属性值&#xff0c;从而实现设置了该属性值对应组件的动画效果。 相比于属性动画&#xff0c;开发者可感知动画的过程&#xff0c;实时修改UI侧的值&#xff0c;具有事件可实时响…

《Python基础》之字符串格式化输出

目录 方式一 1、带索引 {0} 2、不带索引 { } 3、{自定义变量} 方式二 方式三 控制浮点数精度 方式一 使用.format( )进行格式化 1、带索引 {0} name boy age 18 high 183.55555 gender man print(姓名是&#xff1a;{0},年龄是:{1},身高是:{2},性别是:{3},身高是…

OpenCV相机标定与3D重建(3)校正鱼眼镜头畸变的函数calibrate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::fisheye::calibrate 函数是 OpenCV 中用于校正鱼眼镜头畸变的一个重要函数。该函数通过一系列棋盘格标定板的图像来计算相机的内参矩阵和畸变…