当前位置: 首页 > 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;并有助于使代码更加模块…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...