当前位置: 首页 > 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.…...

安卓手机root+magisk安装证书+抓取https请求

先讲一下有这篇文章的背景吧&#xff0c;在使用安卓手机fiddler抓包时&#xff0c;即使信任了证书&#xff0c;并且手机也安装了证书&#xff0c;但是还是无法捕获https请求的问题&#xff0c;最开始不知道原因&#xff0c;后来慢慢了解到现在有的app为了防止抓包&#xff0c;把…...

11.20 深度学习-pytorch包和属性的基础语法

import torch import numpy as np def sci_close(): # 关闭pytorch 数据打印出来时科学计数法 torch.set_printoptions(sci_modeFalse) pass return 0 def create_tensor(): # 创建张量 t1torch.tensor(5) # 一阶张量 阶数看你传入的矩阵是多少阶的 这个是标量 不是一阶 一阶…...

SpringMVC域对象共享数据

目录 一.向 request 域对象共享数据 1.1使用ServletAPI向request域对象共享数据 1.2使用ModelAndView向request域对象共享数据 1.3使用Model向request域对象共享数据 1.4使用map向request域对象共享数据 1.5使用ModelMap向request域对象共享数据 二.Model、ModelMap、Ma…...

每日论文23-24ESSERC 6.4-16.1Ghz混合并联-串联谐振器

《A 6.4-to-16.1GHz Hybrid Parallel-Series Resonator Mode-Switching Oscillator with 206.6dBc/Hz FoMT at 1MHz Offset in 40nm CMOS》 24ESSERC 首先这篇文章有个地方我其实没太明白&#xff0c;它在title和行文的时候都写的是“ hybrid parallel-series resonator mode-…...

【软考】系统架构设计师-信息安全技术基础

信息安全核心知识点 信息安全5要素&#xff1a;机密性、完整性、可用性、可控性、审查性 信息安全范围&#xff1a;设备安全、数据安全、内容安全、行为安全 网络安全 网络安全的隐患体现在&#xff1a;物理安全性、软件安全漏洞、不兼容使用安全漏洞、选择合适的安全哲理 …...

kali搭建pikachu靶场

前言&#xff1a; 总所周知搭个网站需要有apachemysqlphp&#xff0c;Apache是一个开源的Web服务器软件&#xff0c; MySQL是一种关系型数据库管理系统&#xff08;数据库&#xff09;&#xff0c;PHP是一种在服务器上执行的脚本语言 文章内容来自&#xff1a;【黑帽编程与攻…...

注解用于从 HTTP 请求中提取数据

在 Spring 框架中&#xff0c;PathVariable、RequestParam 和 RequestBody 等注解用于从 HTTP 请求中提取数据。具体来说&#xff1a; PathVariable&#xff1a;用于从 URL 路径中提取变量值。例如&#xff0c;在路径 /users/{id} 中&#xff0c;{id} 是一个路径变量。Request…...

(Linux)搭建静态网站——基于http/https协议的静态网站

简单了解nginx配置文件 1.下载并开启nginx服务 下载 [rootlocalhost ~]# dnf install nginx -y开启 [rootlocalhost ~]# systemctl restart nginx 1.(1)搭建静态网站——基于http协议的静态网站 实验1&#xff1a;搭建一个web服务器&#xff0c;访问该服务器时显示“hello w…...

【机器学习chp3】判别式分类器:线性判别函数、线性分类器、广义线性分类器、分段线性分类器

前言&#xff1a; 本文遗留问题&#xff1a;&#xff08;1&#xff09;对最小平方误差分类器的理解不清晰.&#xff08;2&#xff09;分段线性判别函数的局部训练法理解不清晰。 推荐文章1&#xff0c;其中有关于感知机的分析 【王木头从感知机到神经网络】-CSDN博客 推荐文…...

【学习】【HTML】HTML、XML、XHTML

HTML 什么是 HTML&#xff1f; HTML (HyperText Markup Language) 是一种用于创建和展示网页的标准标记语言。它由一系列的元素组成&#xff0c;这些元素通过标签的形式来告诉浏览器如何显示内容。 HTML 的基本结构是什么&#xff1f; <!DOCTYPE html> <html> …...

ARM中ZI-data段和RW-data段

ARM中ZI-data段和RW-data段 1、只定义全局变量&#xff0c;不使用&#xff0c;不占用内存空间2、 定义并初始化全局变量为0 占用ZI-Data区域3、定义并初始化全局变量非0 占用RW-Data区域4、增加的是一个int8的数据为什么&#xff0c;size增加不是15、定义的全局变量为0&#xf…...

关联度分析、灰色预测GM(1,1)、GM(1,1)残差模型——基于Python实现

关联度分析 import numpy as np import pandas as pd #关联度分析 #参考序列 Y_0[170,174,197,216.4,235.8] #被比较序列 Y_1[195.4,189.9,187.2,205,222.7] Y_2[308,310,295,346,367]#初始化序列 X_0np.array(Y_0)/Y_0[0] X_1np.array(Y_1)/Y_1[0] X_2np.array(Y_2)/Y_2[0]#计…...

linux常用命令(网络相关)

目录 1. ping - 检查网络连通性 参数 示例 2. ifconfig - 配置网络接口 参数 示例 3. ip - 显示和操作路由、网络设备、接口等 参数 示例 4. netstat - 显示网络连接、路由表、接口统计等信息 参数 示例 5. ss - 更快的netstat替代品 参数 示例 6. nslookup - …...

【uni-app多端】修复stmopjs下plus-websocket无心跳的问题

从这篇文章接着向下看&#xff1a; uniapp plus-websocket 和stompjs连接教程 安卓ios手机端有效 - 简书 按照文章的方式&#xff0c;能够实现APP下stmopjs长连接。但是有一个问题&#xff0c;就是会频繁输出 res-创建连接-1- 跟踪连接&#xff0c;会发现连接都会在大约40s后…...

VScode学习前端-01

小问题合集&#xff1a; vscode按&#xff01;有时候没反应&#xff0c;有时候出来&#xff0c;是因为------>必须在英文状态下输入&#xff01; 把鼠标放在函数、变量等上面&#xff0c;会自动弹出提示&#xff0c;但挡住视线&#xff0c;有点不习惯。 打开file->pre…...

Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段

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

突破自动驾驶瓶颈!KoMA:多智能体与大模型的完美融合

0.简介 本推文主要介绍了由来自北京航空航天大学的姜克谋、蔡轩和崔智勇教授等共同提出的一种名为KoMA的知识驱动的多智能体框架。论文《KoMA: Knowledge-driven Multi-agent Framework for Autonomous Driving with Large Language Models》提出了KoMA框架&#xff0c;通过结…...

YOLO入门教程(三)——训练自己YOLO11实例分割模型并预测【含教程源码+一键分类数据集 + 故障排查】

目录 引言前期准备Step0 环境部署1.安装OpenCV2.安装Pytorch3.安装Ultralytics Step1 打标训练Step2 格式转换Step3 整理训练集Step4 训练数据集4.1创建yaml文件4.2训练4.3预测4.4故障排查4.4.1OpenCV版本故障&#xff0c;把OpenCV版本升级到4.0以上4.4.2NumPy版本故障&#xf…...

【加入默语老师的私域】C#面试题

什么是依赖注入&#xff0c;如何实现&#xff1f; 依赖注入是一种设计模式。我们不是直接在另一个类&#xff08;依赖类&#xff09;中创建一个类的对象&#xff0c;而是将对象作为参数传递给依赖类的构造函数。它有助于编写松散耦合的代码&#xff0c;并有助于使代码更加模块…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...