【YOLOv8】安卓端部署-1-项目介绍
1 什么是YOLOv8YOLOv8 是由 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分割模型
https://i-blog.csdnimg.cn/direct/b973f2cb349b4823bbf3b2dd770ebb1c.png
YOLOv8的实例分割采用了YOLACT实例分割算法,当然和YOLACT的骨干网和颈部是不同的。
https://i-blog.csdnimg.cn/direct/4b7a8196b15a4ac2a649ab366749802c.png
YOLOv8中的分割模型输出包括两个部分,一个形状为 的 output0,另一个形状为 的 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论文中的示意图
https://i-blog.csdnimg.cn/direct/f8dcd2a21e8944b9a11f77267b7099be.png
https://i-blog.csdnimg.cn/direct/4a0f22487d2a45488fe5281df0b89294.png
2 环境搭建
介绍完YOLOv8后,我们来安装一下环境
2.1 软件安装
2.1.1 Visual Studio
安装Visual Studio 2022 下载Visual Studio 社区版
下载链接:https://visualstudio.microsoft.com/zh-hans/downloads/
https://i-blog.csdnimg.cn/direct/66e3566751054404bd34898ac03ffd80.png
注意:安装时可勾选“Python开辟”和“C++开辟”
2.1.2 下载和安装nvidia显卡驱动
起首要在设备管理器中查看你的显卡型号,比如在这里可以看到我的显卡型号为RTX 1060。
https://i-blog.csdnimg.cn/direct/d5158210003f4a56960a51f85eaa2eba.png
NVIDIA 驱动下载:https://www.nvidia.cn/Download/index.aspx?lang=cn 下载对应你的英伟达显卡驱动。
https://i-blog.csdnimg.cn/direct/2127a7cf2f25474b880e80a3c8daa6e7.png
下载之后就是简朴的下一步执行直到完成。 完成之后,在cmd中输入执行:
nvidia-smi
https://i-blog.csdnimg.cn/direct/cff98d661ba94839a1e21e4b11cb8a31.png
注:图中的 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
https://i-blog.csdnimg.cn/direct/e25bbdeb803641f0a43f2ed75a107fc1.png
下载后得到文件:cuda_11.8.0_522.06_windows.exe 执行该文件进行安装。
2.1.4 安装CUDA
(1) 将cuda运行安装,建议默认路径
https://i-blog.csdnimg.cn/direct/fa64b175472c4b3694757c1c0d512cbc.png
安装时可以勾选Visual Studio Integration
(2) 安装完成后设置环境变量
https://i-blog.csdnimg.cn/direct/931a3c32e6c44394ac7e9376281d5552.png
看到系统中多了CUDA_PATH和CUDA_PATH_V11_8两个环境变量。
2.1.5 下载cuDNN
cudnn下载地点:Index of /compute/cudnn/redist/cudnn/windows-x86_64 (nvidia.com)
https://i-blog.csdnimg.cn/direct/b1f3b311ca134ab0817a1276cf8a4875.png
https://i-blog.csdnimg.cn/direct/4b03c5fb4b2d4e0c9db9fe5884a0e624.png
需要有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选中后进行复制粘贴
https://i-blog.csdnimg.cn/direct/0297b2dc16ae4a59a95053e21ed9529c.png
2.1.7 CUDA安装测试
最后测试cuda是否配置成功
打开CMD执行:
nvcc -V
https://i-blog.csdnimg.cn/direct/23376bdcdf144504a859a28cbdc1f7f8.png
2.1.8 安装Anaconda
Anaconda 是一个用于科学盘算的 Python 发行版,支持 Linux, Mac, Windows, 包罗了浩繁盛行的科学盘算、数据分析的 Python 包。
1) 下载安装包 Anaconda
下载Windows版:https://www.anaconda.com/
2) 然后安装anaconda
https://i-blog.csdnimg.cn/direct/4cd7fc9e1f6d49c6aeca7c4bca1e39b3.png
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
https://i-blog.csdnimg.cn/direct/f982394ca6e249e58722173a50123da2.png
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
https://i-blog.csdnimg.cn/direct/2d62a8fe3bf4414a869f4f5a02deb494.png
预测结果在F:\Code\Java\JavaCode\Yolov8\ultralytics\runs\segment\predict
https://i-blog.csdnimg.cn/direct/4f021b574f4f4b3a84b74fd73c9aa01b.png
预测点复杂图形
https://i-blog.csdnimg.cn/direct/374ca91365914e1fad575b4e808565e7.png
实时预测摄像头:
yolo segment predict predict model=F:/Code/Java/JavaCode/Yolov8/ultralytics/ultralytics/weights/yolov8s-seg.pt source=0 show
https://i-blog.csdnimg.cn/direct/1f445f8b52f54575a64be1654fe6a26a.png
2.3 导出ONNX模型
2.3.1 修改模型
因为有些函数onnx并不支持,所以我们需要手动修改一下
1)修改文件1: F:\Code\Java\JavaCode\Yolov8\ultralytics\nn\modules\block.py中
class C2f(nn.Module)改动如下
https://i-blog.csdnimg.cn/direct/85d61c0dafb2472eae327c60f079c816.png
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.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)改动如下
https://i-blog.csdnimg.cn/direct/0fc7245eee934aac9320f64cd5969d7e.png
def forward(self, x):
"""Concatenates and returns predicted bounding boxes and class probabilities."""
shape = x.shape# BCHW
for i in range(self.nl):
x = torch.cat((self.cv2(x), self.cv3(x)), 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(,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.ptformat=onnx simplify=True opset=12
yolo export model=F:/Code/Java/JavaCode/Yolov8/ultralytics/ultralytics/weights/yolov8s-seg.ptformat=onnx simplify=True opset=12
https://i-blog.csdnimg.cn/direct/76bdaad9792c4d7abf157ebf59ccf4f8.png
https://i-blog.csdnimg.cn/direct/d0887cf3246c4cf99674bac4a7bee3f7.png
自己训练出的权重文件导出:
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/
打开我们刚刚生成的两个文件
https://i-blog.csdnimg.cn/direct/c88929693ce649349d5ecbdca3a4b7cc.png
2.4.2 手动转换
如果不想一键生成,可以自己安装
1)安装protobuf
下载protobuf-3.19.4安装包,并解压; 在VS2022的X64命令行下执行以下命令
注: 为解压的protobuf-3.19.4文件夹的根目次。
https://i-blog.csdnimg.cn/direct/7ced6968bde445a6bfc943d9c3ad242f.png
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
https://i-blog.csdnimg.cn/direct/85fdcfc35b244f32904e14fd21c81ffe.png
https://i-blog.csdnimg.cn/direct/4a6d05cf09d14b9db25a22861eb27fed.png
编译后可执行检查安装是否成功
protoc.exe --version
https://i-blog.csdnimg.cn/direct/c71f89f0836b4f64a45c9ca7f17b6e90.png
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 ..
https://i-blog.csdnimg.cn/direct/fd0b065a535a442baaa41c9b7e2b9960.png
https://i-blog.csdnimg.cn/direct/53334fdfa4c844939e3a514d1931994c.png
https://i-blog.csdnimg.cn/direct/bd24157dc6a64c10915d13b6b3df571a.png
编译后 D:\ncnn\build-vs2022\tools\onnx下有onnx2ncnn.exe
3) 生成ncnn文件
拷贝yolov8n-seg.onnx和yolov8s-seg.onnx文件到D:\ncnn\buildvs2022\tools\onnx\
https://i-blog.csdnimg.cn/direct/e4510409ab1e48c599c69cbf6f16366f.png
执行命令生成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
https://i-blog.csdnimg.cn/direct/eb7a9c358b1d438ba4799c2062e3e5ac.png
4)使用ncnn_optimize优化ncnn文件
产生新的param和bin文件:
ncnn\build-vs2022\tools路径下执行
先拷贝yolov8n-seg.bin和yolov8n-seg.param文件,以及yolov8s-seg.bin 和yolov8s-seg.param文件到此路径下
https://i-blog.csdnimg.cn/direct/5d19478f01db4eb6911149e0ea8a5320.png
执行命令:
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
https://i-blog.csdnimg.cn/direct/05e748aabad14ea9927eba4b09b86c0e.png
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
https://i-blog.csdnimg.cn/direct/7f440ac818ba430fa6158c8af9c2434e.png
检查build.gradle(app)文件
https://i-blog.csdnimg.cn/direct/12b30de5b3594a0da34f7cd98b7ea79f.png
在android下添加我们指定的ndk版本
ndkVersion "24.0.8215888"
添加 CMake 到文件 local.properties
https://i-blog.csdnimg.cn/direct/9eb070361bff488b9e5687505eddd5bd.png
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.
https://i-blog.csdnimg.cn/direct/6f3db3c392314921b1b478745287f611.png
同步Gradle成功
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]