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

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

【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 channelsself.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  # BCHWfor i in range(self.nl):x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)if self.training:return xelif 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 = shapereturn 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-vs2022cmake -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 ^../cmakenmake
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-vs2022cmake -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成功

相关文章:

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

【YOLOv8】安卓端部署-1-项目介绍 1 什么是YOLOv81.1 YOLOv8 的主要特性1.2 YOLOv8分割模型1.2.1 YOLACT实例分割算法之计算掩码1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系1.2.1.2 插值时的目标检测中提取的物体特征1.2.1.3 coefficients&#xff08;系数&#xff09;作用1.…...

会员等级经验问题

问题描述 会员从一级完成任务升级到二级以后&#xff0c;一级显示还差经验&#xff0c;这里差的其实是二级到三级的经验&#xff0c;如下图所示 修复方法 1、前端需要修改&#xff1a; 路径&#xff1a;/pages/users/user_vip/index.vue 方便复制&#xff1a; v-if"i…...

go-zero(一) 介绍和使用

go-zero 介绍和使用 一、什么是 go-zero&#xff1f; go-zero 是一个基于 Go 语言的微服务框架&#xff0c;提供了高效、简单并易于扩展的 API 设计和开发模式。它主要目的是为开发者提供一种简单的方式来构建和管理云原生应用。 1.go-zero 的核心特性 高性能&#xff1a; g…...

buuoj WEB做题笔记

[极客大挑战 2019]EasySQL password输入存在注入&#xff1a; 123or 11 -- flag{68144110-18b9-4882-93f1-6f6e7b1c67ec} [极客大挑战 2019]Havefun 看网页源码&#xff0c;发现尾部有一段注释得代码&#xff0c;尝试 /?catdog,回显得flag{01c680f5-0d62-4e2c-a805-cfcf6b…...

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手 简介&#xff1a; Aurora是一个带UI且免费的GPT私人聊天助手&#xff0c;可切换GPT-3.5&#xff0c;4&#xff0c;4o等常用版本。用户可通过部署Aurora&#xff0c;快速打造自己专属的AI助手。阿里云计算巢已将Aurora打包为SaaS…...

用sqlmap工具打sqli-labs前20关靶场

这个星期我们用手动注入打了前20关靶场&#xff0c;今天我们用sqlmap直接梭哈前20关 1.介绍sqlmap sqlmap是一个自动化的SQL注入工具&#xff0c;其主要功能是扫描&#xff0c;发现并利用给定的URL和SQL注入漏洞。 2.下载和使用sqlmap 官方下载地址&#xff1a;GitHub - sq…...

Spark SQL大数据分析快速上手-完全分布模式安装

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 Hadoop完全分布式环境搭建步骤-CSDN博客,前置环境安装参看此博文 完全分布模式也叫集群模式。将Spark目…...

弹幕发送功能‘简单’实现

导入依赖 <!-- websocket弹幕依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>后端代码 package com.by.danmaku;import org.springfra…...

springboot基于SpringBoot的校园招聘网站的设计与实现现

摘 要 校园招聘网站是一个专门为高校毕业生和用人单位提供就业与招聘信息的网络平台。该网站通过现代互联网技术&#xff0c;实现了职位信息的发布、简历投递、在线沟通等功能&#xff0c;极大地方便了企业和学生之间的互动。在设计上&#xff0c;网站注重用户体验&#xff0c…...

徒手从零搭建一套ELK日志平台

徒手从零搭建一套ELK日志平台 日志分析的概述日志分析的作用主要收集工具集中式日志系统主要特点采集日志分类ELK概述初级版ELK终极版ELK高级版ELKELK收集日志的两种形式 搭建ELK平台Logstash工作原理Logstash核心概念环境准备安装部署docker添加镜像加速器安装部署Elasticsear…...

java八股-SpringCloud微服务-Eureka理论

文章目录 SpringCloud架构Eureka流程Nacos和Eureka的区别是&#xff1f;CAP定理Ribbon负载均衡策略自定义负载均衡策略如何实现&#xff1f;本章小结 SpringCloud架构 Eureka流程 服务提供者向Eureka注册服务信息服务消费者向注册中心拉取服务信息服务消费者使用负载均衡算法挑…...

Git 多仓库提交用户信息动态设置

Git 多仓库提交用户信息动态设置 原文地址&#xff1a;dddhl.cn 前言 在日常开发中&#xff0c;我们可能需要同时管理多个远程仓库&#xff08;如 GitHub、Gitee、GitLab&#xff09;&#xff0c;而每个仓库使用不同的邮箱和用户名。比如&#xff0c;GitHub 和 Gitee 使用相…...

CPU详细介绍

CPU&#xff08;中央处理器&#xff0c;Central Processing Unit&#xff09;是计算机系统的核心部件之一&#xff0c;被称为计算机的“大脑”。它负责执行计算机程序中的各种指令&#xff0c;并管理和协调计算机系统的各个硬件组件。以下是对 CPU 的详细介绍&#xff0c;包括其…...

kafka中的数据清理策略

Kafka 中的数据清理策略主要用于控制数据的保留时间和存储空间&#xff0c;确保系统不会因为数据积累过多而影响性能。Kafka 提供了两种主要的数据清理策略&#xff1a; 1、基于时间的清理策略&#xff1a; 配置参数&#xff1a;log.retention.hours 或 log.retention.ms工作…...

django基于Django的二手电子设备交易平台设计与开发

摘 要 科学技术日新月异&#xff0c;人们的生活都发生了翻天覆地的变化&#xff0c;二手电子设备交易平台管理当然也不例外。过去的信息管理都使用传统的方式实行&#xff0c;既花费了时间&#xff0c;又浪费了精力。在信息如此发达的今天&#xff0c;我们可以通过网络这个媒介…...

WPF如何全局应用黑白主题效果

灰白色很多时候用于纪念&#xff0c;哀悼等。那么使用 WPF如何来做到这种效果呢&#xff1f;要实现的这种效果&#xff0c;我们会发现&#xff0c;它其实不仅仅是要针对图片&#xff0c;而是要针对整个窗口来实现灰白色。 如果只是针对图片的话&#xff0c;我可以可以对图片进…...

软件测试之测试用例扩展

软件测试之测试用例扩展 1. 测试用例覆盖2. UI布局覆盖3. 兼容性覆盖4. 测试用例条数 1. 测试用例覆盖 规则覆盖UI布局兼容性 2. UI布局覆盖 2条用例即可 布局, 颜色与原型图一致图片和文字描述无误 3. 兼容性覆盖 测试5大浏览器 火狐谷歌ieEge苹果 4. 测试用例条数 使…...

【Apache Paimon】-- 2 -- 核心特性 (0.9.0)

目录 1、实时更新 1.1、实时大批量更新 1.2、支持定义合并引擎 1.3、支持定义更新日志生成器 2、海量数据追加处理 2.1、append table 2.2、快速查询 3、数据湖功能(类比:hudi、iceberg、delta) 3.1、支持 ACID 事务 3.2、支持 Time travel(时间旅行) 3.3、支持…...

Mybatis入门

在学习MyBatis之前先了解一下什么是Mybatis&#xff1f;它能解决什么问题&#xff1f; 什么是 MyBatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。 Mybatis解决什么问题&#xff1f; MyBatis 免除了几乎所有的 JDBC…...

智能方法求解-圆环内传感器节点最大最小距离分布

本篇文章是博主在最优化、人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在最优化算…...

Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装

Python Matplotlib 安装指南&#xff1a;使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装 Matplotlib是Python最常用的数据可视化工具之一&#xff0c;结合Miniconda可以轻松管理安装和依赖项。在这篇文章中&#xff0c;我们将详细介绍如何使用Miniconda在Linux、mac…...

数学建模学习(137):使用Python进行频数分析

在数据科学的工作中,频数分析是一种用于描述变量值出现次数的重要统计方法。SPSS等工具提供了便捷的频数分析功能,而在Python中,我们同样可以通过灵活的库来实现相同的分析。在本文中,我们将介绍如何使用Python来完成频数分析,并演示如何用Pandas、Matplotlib等库来分析和…...

[Unity] 【游戏开发】Unity开发基础1-创建Unity项目:从Unity Hub选择合适的渲染管

创建一个新的Unity项目通常是开发过程中的第一步,而Unity为此提供了强大的工具和灵活的选项。本文将详细介绍如何使用Unity Hub创建项目、选择合适的Unity版本、模板和渲染管线,并阐述每种选项的优缺点和适用场景。 1. Unity Hub:统一管理项目和版本 Unity Hub是Unity提供…...

大型语言模型综述 A Survey of Large Language Models

文章源自 2303.18223 (arxiv.org) 如有侵权&#xff0c;请通知下线 这是一篇关于大语言模型&#xff08;LLMs&#xff09;的综述论文&#xff0c;主要介绍了 LLMs 的发展历程、技术架构、训练方法、应用领域以及面临的挑战等方面&#xff0c;具体内容如下&#xff1a; 摘要…...

基于MATLAB的混沌序列图像加密程序

设计目的 图像信息生动形象&#xff0c;它已成为人类表达信息的重要手段之一&#xff0c;网络上的图像数据很多是要求发送方和接受都要进行加密通信&#xff0c;信息的安全与保密显得尤为重要&#xff0c;因此我想运用异或运算将数据进行隐藏&#xff0c;连续使用同一数据对图…...

容器安全检测和渗透测试工具

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect Docker-bench-…...

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…...

MyBatis——#{} 和 ${} 的区别和动态 SQL

1. #{} 和 ${} 的区别 为了方便&#xff0c;接下来使用注解方式来演示&#xff1a; #{} 的 SQL 语句中的参数是用过 ? 来起到类似于占位符的作用&#xff0c;而 ${} 是直接进行参数替换&#xff0c;这种直接替换的即时 SQL 就可能会出现一个问题 当传入一个字符串时&#xff…...

学习日志014--用python实现顺序表

之前我们用c语言实现顺序表&#xff0c;今天就然我们用python来复习一遍 一、创建顺序表 python的类可以代替c中的结构体作为复合数据类型。 创建学生类&#xff0c;并用装饰器将方法属性化&#xff0c;便于之后的修改。属性装饰器&#xff0c;可以在保护私有属性&#xff0…...

Android ConstraintLayout 基础

Android ConstraintLayout 基础 屏障线 Barrier设置水平和垂直方向的约束关系长宽比链式结构组站位辅助线 参考地址 屏障线 Barrier 以下是使用 ConstraintLayout 在 Android 中实现简单屏障线&#xff08;Barrier&#xff09;使用的示例代码&#xff0c;主要步骤如下&#xf…...

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库&#xff0c;过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 &#xff08;停止mysql的命令为&#xff1a;sudo service mysql stop&#xff0…...

【网站推荐】the top trending open-source startups, every quarter

每季度最热门的开源初创公司 我们根据 GitHub 存储库自 2020 年以来的明星增长情况发布热门开源项目&#xff0c;并将其称为 Runa 开源初创公司 (ROSS) 指数。 una Capital actively invests in open-source startups (like Nginx and MariaDB) and considers an active deve…...

Java通过calcite实时读取kafka中的数据

引入maven依赖 <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-kafka</artifactId> <version>1.28.0</version> </dependency> 测试代码 import java.sql.Connection; import java.sql.DriverMan…...

el-table 数据去重后合并表尾合计行,金额千分位分割并保留两位小数,表尾合计行表格合并

问题背景 最近在做后台管理项目el-table 时候需要进行表尾合计&#xff0c;修改合计后文字的样式&#xff0c;合并单元格。 想实现的效果 合并表尾单元格前三列为1格&#xff1b;对某些指定的单元格进行表尾合计&#xff1b;合计后的文本样式加粗&#xff1b;涉及到金额需要千…...

Flutter:RotationTransition旋转动画

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationController late AnimationController _controller;overridevoid initState() {super…...

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情&#xff0c;将它与表白结合在一起&#xff0c;会创造出别具一格的惊喜效果。使用Python的turtle模块&#xff0c;我们可以轻松绘制出动态的烟花特效&#xff0c;再配合文字表白&#xff0c;打造一段专属的浪漫体验。 接下来&#xff0c;让…...

Java面试题分享

1、hashmap的底层设计原理以及扩容规则&#xff0c;是否线程安全&#xff0c;如何线程安全。 jdk1.7以前采用数组加链表结构通过键哈希确定数组下标存键值对。jdk1.8及以后采用数组加链表加红黑树&#xff0c;链表超阈值且数组满足条件会转红黑树&#xff0c;哈希函数先取键 h…...

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…...

【计算机网络】UDP协议

一、UDP协议格式 1.报头的含义 ① 16位源端口号&#xff1a;自己的端口号 ② 16位目的端口号&#xff1a;对方的端口号 ③ 16位UDP长度&#xff1a;整个数据报(UDP报头UDP有效载荷)的长度&#xff0c;最大64KB 一个UDP最多传64KB的数据&#xff0c;如果要传的数据 > 64K…...

vulhub之log4j

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 漏洞简介 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 Apache Log4j 在应用程序中添加日志记录最…...

[Unity] 关于引入Google SDK以及使用的方法

在Unity中接入谷歌SDK&#xff08;如Google Play Games SDK或Firebase SDK等&#xff09;通常涉及几个关键步骤&#xff0c;包括下载SDK、导入Unity项目、配置项目设置、编写必要的代码以及测试集成。以下是一个基于Firebase SDK接入Unity的示例&#xff0c;同时涵盖了Google P…...

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的&#xff0c;还可以存链表、数组等等复杂数据结构 而且数据是在…...

第R4周:LSTM-火灾温度预测(pytorch版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 往期文章可查阅&#xff1a; 深度学习总结 任务说明&#xff1a;数据集中提供了火灾温度&#xff08;Tem1&#xff09;、一氧化碳浓度…...

基于SpringBoot和uniapp开发的医护上门系统上门护理小程序

项目分析 一、市场需求分析 人口老龄化趋势&#xff1a;随着全球及中国人口老龄化的加剧&#xff0c;老年人口数量显著增加&#xff0c;对医疗护理服务的需求也随之增长。老年人由于身体机能下降&#xff0c;更需要便捷、高效的医护服务&#xff0c;而医护上门服务恰好满足了这…...

js批量输入地址获取经纬度

使用js调用高德地图的接口批量输入地址获取经纬度。 以下的请求接口的key请换成你的key。 创建key&#xff1a;我的应用 | 高德控制台 &#xff0c;服务平台选择《Web服务》。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-…...

Python自动化测试实践中pytest用到的功能dependency和parametrize

Python自动化测试中pytest用到的功能 1、pytest之@pytest.mark.dependency装饰器设置测试用例之间的依赖关系 1.1说明: 1、这是一个pytest第三方插件,主要解决用例之间的依赖关系。如果依赖的上下文测试用例失败后续的用例会被标识为跳过执行,相当于执行了 pytest.mark.s…...

json-bigint处理前端精度丢失问题

问题描述&#xff1a;前后端调试过程中&#xff0c;有时候会遇到精度丢失的问题&#xff0c;比如后端给过来的id超过16位&#xff0c;就会出现精度丢失的情况&#xff0c;前端拿到的id与后端给过来的不一致。 解决方案&#xff1a; 1、安装 npm i json-bigint 2、在axios中配置…...

神经网络10-Temporal Fusion Transformer (TFT)

Temporal Fusion Transformer (TFT) 是一种专为时序数据建模而设计的深度学习模型&#xff0c;它结合了Transformer架构和其他技术&#xff0c;旨在有效地处理和预测时序数据中的复杂模式。TFT 于 2020 年由 Google Research 提出&#xff0c;旨在解决传统模型在时序预测中的一…...

django基于django的民族服饰数据分析系统的设计与实现

摘 要 随着网络科技的发展&#xff0c;利用大数据分析对民族服饰进行管理已势在必行&#xff1b;该平台将帮助企业更好地理解服饰市场的趋势&#xff0c;优化服装款式&#xff0c;提高服装的质量。 本文讲述了基于python语言开发&#xff0c;后台数据库选择MySQL进行数据的存储…...

html数据类型

数据类型是字面含义&#xff0c;表示各种数据的类型。在任何语言中都存在数据类型&#xff0c;因为数据是各式各样。 1.数值类型 number let a 1; let num 1.1; // 整数小数都是数字值 ​ // 数字肯定有个范围 正无穷大和负无穷大 // Infinity 正无穷大 // -Infinity 负…...