【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 的主要特性
- 模型架构改进
- 自适应的网络架构:YOLOv8 在 Backbone 和 Neck 部分采用了新的设计,例如利用了 CSPNet 和 ConvNeXt 的特性,进一步优化了特征提取效率和推理速度。
- 新型的 Head 设计:YOLOv8 引入了新的预测 Head,支持不同任务(检测、分割、关键点检测等)的统一设计,简化了模型结构,并提高了预测性能。
- 支持多任务
- 目标检测:YOLOv8 支持经典的目标检测任务,即在图像中检测物体并返回边界框和类别标签。
- 实例分割:YOLOv8 集成了实例分割功能,能够精确地检测物体的轮廓,这在需要对复杂场景进行精确分割时非常有用。
- 关键点检测:YOLOv8 还支持关键点检测任务,适用于人体姿态估计和动作识别等应用场景。
- 优化的训练策略
- 自动数据增强(AutoAugment):YOLOv8 引入了自动化的数据增强策略,结合 Mosaic、MixUp 等技术,进一步提高了模型的泛化能力。
- 标签平滑(Label Smoothing):通过引入标签平滑技术,减少了过拟合现象,并改善了模型的训练效果。
- 先进的优化器支持:YOLOv8 默认支持 AdamW 优化器,并通过结合 Cosine Annealing 调整学习率,提升了训练效率。
- 高效的推理速度
- 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实例分割算法之计算掩码
-
首先,YOLACT 通过目标检测部分检测出图像中的物体,并获得每个物体的边界框坐标 (x, y, width, height) 以及每个类别的概率。
-
然后,YOLACT 从另一个输出中获取与每个物体相对应的掩码。这个输出是一个包含多个掩码原型的数组,每个掩码原型都是一个固定大小的二进制掩码,表示一个通用的物体形状。
-
接下来,根据目标检测的结果,选择与感兴趣物体相关的概率最高的掩码系数。最终掩码是通过从目标检测输出中找到对应物体的类别概率最高的索引来完成。
-
选定的掩码原型被进一步处理,将其插值到输入图像的尺寸上,以生成与物体实际形状更匹配的掩码。这是通过掩码原型的二进制掩码和物体边框的大小、比例等结合,进一步调整掩码形状来完成的。
-
最后,经过插值处理后的掩码将与物体的边界框一起输出,作为最终的实例分割结果。这个掩码将准确地标注物体在图像中的像素级别的位置和形状。
总结起来,YOLACT 通过将掩码原型插值到输入图像的尺寸上,结合目标检测结果,计算出与物体实际形状更匹配的掩码,并输出作为最终的实例分割掩码。这个过程在 YOLACT 在像素级别准确地分割和表示图像中的不同物体。
1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系
在 YOLACT 中,掩码原型和最终的掩码之间的关系说明:
-
掩码原型 (Mask Prototype):掩码原型是预定义的、通用的二进制掩码掩形,它们具有固定的尺寸和形状。在 YOLACT 中,掩码原型是一个由固定数量的二进制掩码组成的数组,每个掩码原型表示一种常见的物体形状。这些掩码原型可以用来构建,用于生成最终的掩码。
-
最终掩码(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(系数)作用1.…...
安卓手机root+magisk安装证书+抓取https请求
先讲一下有这篇文章的背景吧,在使用安卓手机fiddler抓包时,即使信任了证书,并且手机也安装了证书,但是还是无法捕获https请求的问题,最开始不知道原因,后来慢慢了解到现在有的app为了防止抓包,把…...
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 首先这篇文章有个地方我其实没太明白,它在title和行文的时候都写的是“ hybrid parallel-series resonator mode-…...
【软考】系统架构设计师-信息安全技术基础
信息安全核心知识点 信息安全5要素:机密性、完整性、可用性、可控性、审查性 信息安全范围:设备安全、数据安全、内容安全、行为安全 网络安全 网络安全的隐患体现在:物理安全性、软件安全漏洞、不兼容使用安全漏洞、选择合适的安全哲理 …...
kali搭建pikachu靶场
前言: 总所周知搭个网站需要有apachemysqlphp,Apache是一个开源的Web服务器软件, MySQL是一种关系型数据库管理系统(数据库),PHP是一种在服务器上执行的脚本语言 文章内容来自:【黑帽编程与攻…...
注解用于从 HTTP 请求中提取数据
在 Spring 框架中,PathVariable、RequestParam 和 RequestBody 等注解用于从 HTTP 请求中提取数据。具体来说: PathVariable:用于从 URL 路径中提取变量值。例如,在路径 /users/{id} 中,{id} 是一个路径变量。Request…...
(Linux)搭建静态网站——基于http/https协议的静态网站
简单了解nginx配置文件 1.下载并开启nginx服务 下载 [rootlocalhost ~]# dnf install nginx -y开启 [rootlocalhost ~]# systemctl restart nginx 1.(1)搭建静态网站——基于http协议的静态网站 实验1:搭建一个web服务器,访问该服务器时显示“hello w…...
【机器学习chp3】判别式分类器:线性判别函数、线性分类器、广义线性分类器、分段线性分类器
前言: 本文遗留问题:(1)对最小平方误差分类器的理解不清晰.(2)分段线性判别函数的局部训练法理解不清晰。 推荐文章1,其中有关于感知机的分析 【王木头从感知机到神经网络】-CSDN博客 推荐文…...
【学习】【HTML】HTML、XML、XHTML
HTML 什么是 HTML? HTML (HyperText Markup Language) 是一种用于创建和展示网页的标准标记语言。它由一系列的元素组成,这些元素通过标签的形式来告诉浏览器如何显示内容。 HTML 的基本结构是什么? <!DOCTYPE html> <html> …...
ARM中ZI-data段和RW-data段
ARM中ZI-data段和RW-data段 1、只定义全局变量,不使用,不占用内存空间2、 定义并初始化全局变量为0 占用ZI-Data区域3、定义并初始化全局变量非0 占用RW-Data区域4、增加的是一个int8的数据为什么,size增加不是15、定义的全局变量为0…...
关联度分析、灰色预测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无心跳的问题
从这篇文章接着向下看: uniapp plus-websocket 和stompjs连接教程 安卓ios手机端有效 - 简书 按照文章的方式,能够实现APP下stmopjs长连接。但是有一个问题,就是会频繁输出 res-创建连接-1- 跟踪连接,会发现连接都会在大约40s后…...
VScode学习前端-01
小问题合集: vscode按!有时候没反应,有时候出来,是因为------>必须在英文状态下输入! 把鼠标放在函数、变量等上面,会自动弹出提示,但挡住视线,有点不习惯。 打开file->pre…...
Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
突破自动驾驶瓶颈!KoMA:多智能体与大模型的完美融合
0.简介 本推文主要介绍了由来自北京航空航天大学的姜克谋、蔡轩和崔智勇教授等共同提出的一种名为KoMA的知识驱动的多智能体框架。论文《KoMA: Knowledge-driven Multi-agent Framework for Autonomous Driving with Large Language Models》提出了KoMA框架,通过结…...
YOLO入门教程(三)——训练自己YOLO11实例分割模型并预测【含教程源码+一键分类数据集 + 故障排查】
目录 引言前期准备Step0 环境部署1.安装OpenCV2.安装Pytorch3.安装Ultralytics Step1 打标训练Step2 格式转换Step3 整理训练集Step4 训练数据集4.1创建yaml文件4.2训练4.3预测4.4故障排查4.4.1OpenCV版本故障,把OpenCV版本升级到4.0以上4.4.2NumPy版本故障…...
【加入默语老师的私域】C#面试题
什么是依赖注入,如何实现? 依赖注入是一种设计模式。我们不是直接在另一个类(依赖类)中创建一个类的对象,而是将对象作为参数传递给依赖类的构造函数。它有助于编写松散耦合的代码,并有助于使代码更加模块…...
称重传感器指示器行业全面且深入的分析
称重传感器指示器是一种用于显示和解释称重传感器输出信号的设备,用于测量力、重量或压力。称重传感器是将物理力(如重量)转换为电信号的传感器,称重传感器指示器将该电信号转换为可读格式,通常以磅、公斤或牛顿等单位…...
NAT网络地址转换——Easy IP
NAT网络地址转换 Tip: EasylP没有地址池的概念,使用接口地址作为NAT转换的公有地址。EasylP适用于不具备固定公网IP地址的场景:如通过DHCP, PPPOE拨号获取地址的私有网络出口,可以直接使用获取到的动态地址进行转换。 本次实验模拟nat协议配置 AR1配置如下&…...
【Visual Studio系列教程】如何在 VS 上编程?
上一篇博客中,我们介绍了《什么是 Visual Studio?》。本文,我们来看第2篇《如何在 VS 上编程?》。阅读本文大约10 分钟。我们会向文件中添加代码,了解 Visual Studio 编写、导航和了解代码的简便方法。 本文假定&…...
Mybatis-Plus 多租户插件属性自动赋值
文章目录 1、Mybatis-Plus 多租户插件1.1、属性介绍1.2、使用多租户插件mavenymlThreadLocalUtil实现 定义,注入租户处理器插件测试domianservice & ServiceImplmapper 测试mapper.xml 方式 1.3、不使用多租户插件 2、实体对象的属性自动赋值使用1. 定义实体类2. 实现 Meta…...
AWTK-WIDGET-WEB-VIEW 实现笔记 (4) - Ubuntu
Ubuntu 上实现 AWTK-WIDGET-WEB-VIEW 开始以为很简单,后来发现是最麻烦的。因为 Ubuntu 上的 webview 库是 基于 GTK 的,而 AWTK 是基于 X11 的,两者的窗口系统不同,所以期间踩了几个大坑。 1. 编译 AWTK 在使用 Linux 的输入法时…...
Python入门(7)--高级函数特性详解
Python高级函数特性详解 🚀 目录 匿名函数(Lambda)装饰器的使用生成器与迭代器递归函数应用实战案例:文件批处理工具 1. 匿名函数(Lambda)深入解析 🎯 1.1 Lambda函数基础与进阶 1.1.1 基本…...
【数据库原理】理解数据库,基础知识
第一代:网状数据库;第二代:关系数据库;第三代:新一代数据库系统BigData 一、理解数据库 什么是数据:信息,对事物的存在方方式、运动状态及特征的描述。数据,记录信息的识别方式有数…...
VConsole——(H5调试工具)前端开发使用于手机端查看控制台和请求发送
因为开发钉钉H5微应用在手机上一直查看不到日志等,出现安卓和苹果上传图片一边是成功的,一边是失败的,所以找了这个,之前在开发微信小程序进行调试的时候能看到,之前没想到过,这次被人提点发现可以单独使用…...
论文分享 | FuzzLLM:一种用于发现大语言模型中越狱漏洞的通用模糊测试框架
大语言模型是当前人工智能领域的前沿研究方向,在安全性方面大语言模型存在一些挑战和问题。分享一篇发表于2024年ICASSP会议的论文FuzzLLM,它设计了一种模糊测试框架,利用模型的能力去测试模型对越狱攻击的防护水平。 论文摘要 大语言模型中…...
vmWare虚拟环境centos7安装Hadoop 伪分布式实践
背景:近期在研发大数据中台,需要研究Hadoop hive 的各种特性,需要搭建一个Hadoop的虚拟环境,本来想着使用dock ,但突然发现docker 公共仓库的镜像 被XX 了,无奈重新使用vm 搭建虚拟机。 大概经历了6个小时完…...
免费做微信链接的网站/免费制作网页的网站
题意:弱鸡,其实题意是1到i都变化。然后把所有的硬币都变到正面。 简单的模拟: 思路:本质就是记录相邻字符的有几组不同,比如11010,则就有3组不同,但是,这样变化出来的字符串是00000&…...
装修公司谁做网站/百度快照关键词推广
。 这是一个简单的累加程序,您可以使用以下代码实现: sum 0 for i in range(1, 10001):sum i print(sum)这个程序将从1加到10000,并输出累加的总和。...
预装wordpress然后/上海seo关键词优化
传送门 这个题是典型的除法分块,对题目中的式子进行变形: n∗k−∑ni1(k/i)∗i 发现k/i的值只有O(n√)种,那么就可以进行分块了。 代码: #include<cstdio> #include<algorithm> #define ll long long using namesp…...
美食门户网站建设目标/搜收录批量查询
转载:http://www.cnblogs.com/obama/p/3292335.html 作者: 曾见绝美的阳光 第一部分:TCP/IP相关知识点对TCP/IP的整体认链路层知识点IP层知识点运输层知识点应用层知识点(这些知识点都可以参考:http://www.cnblogs.co…...
基于wordpress学校系统/整站优化关键词推广
据悉,高斯GaussDB的特点有2个:①数据AI。主要讲的是这个软件产品采用人工智能技术融入分布式数据库的全生命周期,实现自运维、自管理、自调优、自诊断、自愈合五大功能。尤其是自调优性能明显,在交易、分析及混合负载场景下&#…...
wordpress 重定向循环/网络广告推广公司
背景 本文介绍ICML2021 I-BERT: Integer-only BERT Quantization 文章目的是对BERT进行更彻底的量化和整型计算; 作者认为之前的量化方案没有对gelu、softmax这些非线性操作进行量化计算(如下图1),即保持了float类型的计算&…...