面向边缘设备的实时目标检测算法的研究与实现

本文介绍了提升深度学习模型推理速度的方法,包括参数量化、剪枝、矩阵分解等,以适应边缘设备。NanoDet-Plus模型通过改进的标签匹配策略、特征融合、检测头和训练技巧实现了性能提升。文章还讨论了安卓端的部署流程,强调了模型转换和环境配置的重要性。
摘要由CSDN通过智能技术生成

面向边缘设备的实时目标检测算法

  • 提升推理速度的主要方法
    • 参数量化和剪枝
      • 参数量化
      • 剪枝
    • 压缩卷积滤波器和矩阵分解
      • 压缩卷积滤波器
      • 矩阵分解
    • 网络架构搜索
    • 知识蒸馏
  • 实现模型——NanoDet-Plus
    • 标签匹配策略的改进
    • 特征融合的改进
    • 检测头的改进
    • 训练Trick的改进
  • 模型训练及安卓端部署
    • 环境配置与推理
    • 模型训练
    • 安卓端部署

提升推理速度的主要方法

这里先简单介绍一下推理和训练的区别:

深度学习中的推理和训练是两个不同的过程。
推理是指利用已经训练好的深度学习模型对新的数据进行预测或分类。在推理过程中,输入数据经过模型的前向传播,计算出输出结果,然后根据输出结果进行分类或预测。
训练是指利用已有的数据集对深度学习模型进行参数调整的过程。在训练过程中,将输入数据和对应的标签送入模型进行前向传播,计算出输出结果,然后根据输出结果和标签计算损失函数,并利用反向传播算法对模型参数进行更新,以减小损失函数的值。
因此,推理和训练的区别在于推理是利用已有的模型对新数据进行预测,而训练是对模型进行参数调整以提高模型的准确性。

参考论文:《A Survey of Methods for Low-Power Deep Learning and Computer Vision》

参数量化和剪枝

深度神经网络被广泛应用于计算机视觉、自然语言处理、推荐搜索等领域。其模型内部大量有待训练的权重(weights)往往占用了大量的内存空间以及存储带宽,给DNN在一些嵌入式平台、移动端上的部署带来了很大的困难。此外,庞大的计算量也能耗变大,计算成本比较昂贵。为此,模型量化与剪枝(Quantization&Pruning)应运而生。其主要目标就是在尽可能不牺牲模型精度(甚至在一些场景能提升精度)的前提下,减小模型的内存消耗。

参数量化

参数量化技术可以将浮点数参数转换为整数或低精度浮点数,以显著减少模型的存储和计算复杂度。常见的参数量化方法包括定点量化、二进制量化和对称量化等。在这些方法中,对称量化是一种常用的策略,它通过限制模型参数在有限范围内,从而减少参数的位数和存储空间需求。
举个例子,我们可以将浮点数参数量化为8位整数,这样可以将模型的存储空间减少4倍以上。通过对参数进行量化,我们可以将原本占据大量存储空间的浮点数表示方式转换为更紧凑的整数表示,从而节省存储资源。此外,量化后的整数参数在计算过程中也能够大幅降低计算复杂度,加快模型的推理速度。
参数量化技术的应用带来了多方面的好处。首先,它可以使得模型更适用于计算资源受限的环境,例如移动设备或边缘计算平台。通过减少模型的存储需求和计算复杂度,参数量化使得目标检测算法可以在这些设备上高效运行。其次,参数量化也有助于模型的部署和传输。由于量化后的模型更小,它们可以更快速地上传和下载,加速了模型的部署和推理过程。
通常,参数量化与压缩一起使用,以进一步降低DNN的内存需求。Han等人首先将参数量化到离散的箱子中。然后使用霍夫曼编码来压缩这些箱子,使模型大小减小89%,而精度损失可以忽略不计,如图。类似地,HashedNet将DNN连接量化为哈希桶,这样分组到同一哈希桶的所有连接共享一个参数。然而,由于这些技术具有较高的训练成本,它们的采用受到了限制。三个阶段的压缩流水线:剪枝,量化和霍夫曼编码
参数量化的优点是当参数的位宽减少时,DNN的预测性能保持恒定。这是因为约束参数在训练过程中具有正则化作用。此外,在为深度神经网络设计硬件时,量化允许用移位或者同或运算取代耗电的乘法累积操作,从而减少电路面积和电量需求。缺点是采用量化技术的DNN需要多次重新训练,使得训练过程非常昂贵。必须降低训练成本,使这些技术更容易更实用。此外,DNN中的不同层对不同的特征敏感。所有层的恒定位宽可能会导致性能较差。

剪枝

剪枝是另一种常用的目标检测模型优化技术,它可以通过去除模型中不必要的参数来减少模型的存储和计算复杂度,从而提高模型的部署效率和性能。常见的参数剪枝方法包括结构化剪枝和非结构化剪枝。
结构化剪枝是一种将模型中整个卷积核或神经元组进行剪枝的方法,通常可以在保持模型精度的同时,大幅度减少模型的存储和计算复杂度。同时,还可以通过适当的剪枝率来平衡模型的精度和计算复杂度。
非结构化剪枝是一种将模型中单个参数进行剪枝的方法,通常可以在一定程度上减少模型的存储和计算复杂度。例如,可以通过删除模型中的一些小的权重或过滤器来减少模型的参数量。
剪枝连接
图中剪枝前网络层两端的连接太过于密集,然后根据其中连接的权重重新设计筛选标准,根据标准去除不符合标准的连接,即图中虚线部分,实现模型的压缩。
剪枝的优点是剪枝可以与量化和编码相结合,以获得显著的性能提升。当这三种技术同时使用时,VGG-16模型大小缩小到原始大小的2%。缺点是DNN剪枝相关的训练工作量是相当大的。当同时使用剪枝和量化时,训练时间增加了600%。当用稀疏性约束对DNN进行剪枝时,这个问题还会加剧。此外,只有在为稀疏矩阵使用特定硬件或特殊的数据结构时,剪枝的优势才会比较明显。通道级剪枝是对现有连接级剪枝技术的潜在改进,因为它可以在没有任何特殊数据结构的情况下执行,并且不会创建非预期的稀疏矩阵。利用自动识别不重要通道的技术,可以在不需要显著训练开销的情况下进行通道级剪枝。

压缩卷积滤波器和矩阵分解

在DNNs中卷积操作占了很大一部分,以AlexNet为例,其中的全连接层占了近89%的参数。因此若想降低DNNs的功耗,应当减少卷积层的计算量和全连接层的参数量。这也有两个技术方向,分别为:采用更小的卷积滤波器;将矩阵分解为参数量更小的矩阵。

压缩卷积滤波器

与较大的滤波器相比,较小的卷积滤波器拥有更少的参数,从而降低了计算的成本。然而,完全替换掉所有大的卷积层可能会影响深度神经网络的平移不变性,从而降低模型的准确性。因此,一些研究致力于识别那些冗余的滤波器,并尽可能的使用较小的滤波器来替代它们。SqueezeNet正是采用了这种压缩卷积滤波器技术技术,它将3×3的大卷积转换为1×1的小卷积,很大程度上减少参数数量。

压缩卷积滤波器的优点在于,瓶颈卷积滤波器显著降低了深度神经网络(DNN)的内存需求和延迟。对于大多数计算机视觉任务而言,这些方法能够达到目前的最佳性能。压缩卷积滤波器与剪枝和量化技术是相互独立的,因此这三种技术可以结合使用,进一步降低能源消耗。
然而,压缩卷积滤波器也存在一些缺点。已经证明在小型DNN中,1×1卷积的计算开销较大,导致精度下降。这主要是因为运算强度较低,无法有效利用硬件资源。通过有效管理内存,可以提高深度可分离卷积的运算效率。此外,通过优化缓存中参数的空间和时间局部性,可以减少内存访问次数,进一步改善性能。这些方法可以帮助克服压缩卷积滤波器所带来的限制,提升模型的性能和效率。

矩阵分解

通过将张量或矩阵分解为合积形式(sum-product form),可以将多维张量分解为更小的矩阵,从而有效地消除冗余计算。一些因子分解方法可以将深度神经网络模型的加速速度提高4倍以上,这是因为它们能够将矩阵分解为更密集的参数矩阵,并且能够避免非结构化稀疏乘法所带来的局部性问题。这些方法能够显著提升计算效率,并且在加速DNN模型的同时不会损失准确性。

矩阵分解的优点是可以降低DNN的计算成本,无论在卷积层还是全连接层都可以使用相同的因子分解。缺点是由于缺乏理论解释,因此很难解释为什么一些分解(例如CPD、BMD)能够获得较高的精度,而其他分解却不能;另外,与矩阵分解相关的计算常常与模型获得的性能增益相当,造成收益与损耗抵消。此外,矩阵分解很难在大型DNN模型中实现,因为随着深度增加,分解超参数会呈指数增长,训练时间主要耗费在寻找正确的分解超参。

网络架构搜索

在设计低功耗计算机视觉应用程序时,有许多不同的DNN架构和优化技术需要考虑。当存在许多架构可能性时,通常很难手动找到针对特定任务的最佳DNN。网络架构搜索(Network Architecture Search,NAS)是一种针对各种任务自动设计DNN架构的技术。NAS使用循环神经网络控制器,并使用强化学习来组成候选DNN架构。这些候选架构经过训练,然后用验证集进行测试。验证精度被用作奖励函数,然后优化控制器的下一个候选架构。NASNet和AmoebaNet[33]证明了NAS获得最先进精度的有效性。为了自动为移动设备找到高效的DNN,Tan等人提出了MNasNet。该技术在控制器中使用多目标奖励函数来找到一个DNN架构,该架构达到了当部署在目标移动设备上时所需的精度和延迟要求。

网络架构搜索的优点是不需要人工干预的情况下搜索所有可能的架构空间,自动平衡准确性、内存和延迟之间的权衡。缺点是NAS算法的计算需求使得搜索针对大型数据集进行优化的架构变得困难。为了找到满足性能要求的架构,每个候选架构必须经过训练(以检查准确性)并在目标设备上运行(以检查延迟/能耗)以生成奖励函数。训练和测量每个候选架构的性能所花费的时间成本是很高的。为了减少训练时间,候选DNN可以与不同的数据子集并行训练。从不同的数据子集获得的梯度可以合并,产生一个训练好的DNN。然而,这样的并行训练技术通常会导致精度较低。

知识蒸馏

在2014年,Hinton提出了知识蒸馏(Knowledge Distillation)的概念。相较于知识迁移,知识蒸馏的训练过程更为简单。在知识蒸馏中,使用了一种"学生-教师"的模式,其中小型DNN模型充当学生,而一组特定的DNN模型则充当教师。通过训练学生模型,使其模仿教师模型的输出,从而让小型DNN模型能够完成整体任务。
然而,在Hinton的工作中,小型DNN模型的准确度相应下降了一些。为了进一步提高小型DNN模型的精度,Li等人采用了一种方法,即通过最小化教师模型和学生模型特征向量之间的欧氏距离来进行特征模拟,并通过建议采样来实现特征的生成体系结构。在这个过程中,区域建议网络生成候选ROI(Region of Interest),然后使用这些候选ROI从特征映射中提取特征。
这种方法允许小型DNN模型从教师模型中获得更丰富的知识,并且通过欧氏距离的最小化,学生模型可以更好地模拟教师模型的特征表示。借助区域建议网络和候选ROI,可以在图像中提取出具有重要信息的区域,并用于特征提取和模型训练。

实现模型——NanoDet-Plus

接下来来到本文的重头戏,移动端实时检测模型NanoDet的升级版NanoDet-Plus,致敬作者RangiLyu,作者源代码如下:链接: nanodet-plus
NanoDet-plus是一个单阶段的anchor-free模型,其设计基于FCOS模型,并加入了动态标签分配策略/GFL loss和辅助训练模块,整体网络结构如图3.1所示。主干网络还是沿用了单阶段的ShuffleNet V2,如图3.2。
NanoDet-Plus整体结构示意图

图3.1 NanoDet-Plus整体结构示意图

ShuffleNet V2同V1版本一样也是基于残差思想的设计优化,如图3.2,与V1版本不同的是ShuffleNet V2在Stride=1的输入特征矩阵之后增加了一个通道分割的操作,也就是将特征矩阵拆分成两个通道的分支网络,使得卷积层两侧通道数不变,实现模型速度的提升。然后在图3.3(a)中取消了分组卷积操作,因为原论文中提出过多的分组卷积会是模型速度变慢。接着将随机混合操作Channel Shuffle放到特征级联融合Contate之后,最后将V1版本的累加操作换成了特征级联融合操作。
shufflenet v1

图3.2 shufflenet v1

shufflenet v2

图3.3 shufflenet v2

标签匹配策略的改进

标签匹配策略(Label Assignment)是目标检测模型训练中最关键的问题之一。现今目标检测的主要工作热点之一是全局动态匹配策略,其中一些例子包括DETR采用匈牙利匹配算法进行双边匹配,OTA利用Sinkhorn迭代解决最优传输问题的匹配,以及YOLOX使用OTA的近似算法SimOTA进行标签匹配。这些匹配策略在大型模型上取得了出色的效果。然而,将基于Matching Cost的动态匹配应用于轻量级检测模型时,却出现了大型模型所没有的一些问题。
基于Matching Cost的动态匹配是指直接利用模型检测头的输出,计算每个Ground Truth与其之间的匹配代价。该代价通常由分类损失和回归损失构成。在特征图上的所有点(N个)的预测值与所有Ground Truth(M个)之间计算得出一个大小为N×M的矩阵,称为Cost Matrix。基于这个Cost Matrix,可以采用二分图匹配、传输优化或者直接选取TopK等方法来进行动态匹配。与之前基于Anchor算法的IOU匹配相比,这种策略的最大不同在于它不再仅依赖于静态的先验信息,而是利用当前的预测结果动态寻找最优的匹配。因此,只要模型的预测更准确,匹配算法得出的结果也会更加出色。
因为神经网络天生具备抗噪能力,即使在随机初始化时,将一些点随机分配给模型进行训练,只要这些点位于相应的GT框内,模型也能逐渐适应最容易学习到的特征。因此,在除了DETR这种稀疏预测之外的密集目标检测中,动态标签匹配都会加入一些位置约束。例如,OTA和SimOTA都使用一个5x5的中心区域来限制匹配的自由度。这些位置约束有助于提高匹配的准确性和稳定性。
但动态匹配在小模型上却存在一些问题,由于小型模型的检测头很轻量,在NanoDet中仅使用两个深度可分离卷积模块同时进行分类和回归预测,与大型模型中使用4组256通道的3×3卷积进行分类和回归分别预测相比差别很大。于是我们自然而然的想到可以用本文第二章所述的知识蒸馏方法使用教师网络预测的结果来计算标签匹配,然后指导学生网络进行训练。与旷视在CVPR 2021提出的IQDet不同,NanoDet-Plus设计了更轻量的AGM辅助训练模块配合动态软标签分配策略Dynamic Soft Label Assigner(DSLA)用于解决轻量化模型中的最优标签匹配问题。
AGM(Auxiliary Guidance Module)辅助训练模块在结构上非常简洁,只由4组3×3的卷积层组成。它使用GN(Group Normalization)作为标准化层,并在不同的特征图之间共享大模型的检测头参数。因此,相较于一个深度可分离卷积的教师模型,AGM所需的资源要少得多。
AGM模块在训练过程结束后会被舍弃,不会对推理速度产生影响。这使得它成为一个非常理想的辅助模块。通过在训练期间引入AGM模块,可以帮助模型更好地学习和理解目标的特征,并提高目标检测的性能。由于AGM模块仅包含少量的卷积层,并且参数共享,所以它的计算成本较低。这种设计使得模型在训练过程中能够得到有效的辅助指导,同时不会显著增加模型的复杂度或推理时间。
使用AGM预测的分类概率和检测框会送入DSLA模块计算Matching Cost
Cost函数由三部分组成:classification cost,regression cost以及distance cost:
C c l s = C E ( P , Y s o f t ) × ( Y s o f t − P ) 2 C{\small cls} =CE(P,Y{\small soft} )\times (Y{\small soft} -P)^{2} Ccls=CE(P,Ysoft)×(YsoftP)2
C r e g = − l o g ( I O U ) C{\small reg} =-log(\mathit{IOU} ) Creg=log(IOU)
C d i s = α ∣ x p r e d − x g t ∣ − β C{\small dis} =\alpha ^{\left | x{\scriptsize pred} -x{\scriptsize gt} \right |-\beta } Cdis=αxpredxgtβ
最终的代价函数就变成了:
C = C c l s + λ C r e g + C d i s C=C{\small cls} +\lambda C{\small reg} +C{\small dis} C=Ccls+λCreg+Cdis
其中加上Cdis可以使AGM在前期收敛的更快,适合用在微调模型的场景。在加入了AGM和DSLA之后,NanoDet-Plus在MS COCO数据集上提升了2.1mAP。

特征融合的改进

NanoDet-Plus在设计中借鉴了2021年提出的轻量化模型YOLOX、PicoDet以及之前的YOLOv5的一些关键思想。这些模型都采用了CSP-PAN作为特征金字塔模块,用于处理多层间的特征融合。然而,NanoDet-Plus选择了GhostNet中的GhostBlock作为特征融合模块。
GhostBlock的基本结构由一组1×1的卷积和一组3×3的depthwise卷积组成。相比之前的模型,GhostBlock的参数量和计算量都更小,这使得模型更加轻量化。最终的Ghost-PAN模块仅含有190k个参数,在ARM平台上的推理延时仅增加了1毫秒。通过引入Ghost-PAN,NanoDet-Plus的mAP提升了2%。
GhostBlock的特点在于其高效的参数利用和计算效率。通过使用1×1的卷积层,GhostBlock可以有效地减少通道数,降低模型的计算复杂度。同时,采用depthwise卷积进一步减少了参数量,提高了模型的轻量化程度。

检测头的改进

在ThunderNet的论文中,作者提出了一种改进检测头的方法,即将深度可分离卷积的depthwise部分从3×3改变为5×5。这种改变可以在只增加少量参数的情况下提高检测头的感受野和检测性能。
受到这一改进的启发,NanoDet-Plus也采用了相同的思路,将depthwise部分的卷积核大小从3×3修改为5×5。通过增加卷积核的尺寸,模型可以更好地捕捉到目标的上下文信息和细节特征,从而提高目标检测的准确性和鲁棒性。
这种改变并没有带来大量的额外参数,因此可以在保持轻量级模型结构的同时,显著增强检测头的能力。通过增加感受野,模型能够更好地理解目标的整体上下文,并更准确地进行定位和分类。

训练Trick的改进

以前的轻量化目标检测模型通常使用传统的SGD+momentum+MultiStepLr方法进行训练。对于经验丰富的人工智能训练师来说,SGD方法是比较适合的选择,它可以与MultiStepLr结合使用,在训练的第一阶段采用较大的学习率进行长时间的训练,然后通过学习率的衰减来实现更好的收敛效果。然而,对于缺乏足够经验的新手来说,这种方法很容易导致模型无法收敛。
因此,NanoDet-Plus对优化器和学习率衰减策略进行了改进。首先,优化器从SGD+momentum转为更快收敛且对超参数不敏感的Adam优化器。Adam优化器在一些情况下可以更好地优化模型参数,使其更快地达到较好的性能。这种改变可以让新手在训练过程中更容易获得较好的结果。
其次,学习率衰减策略从MultiStepLr改为CosineAnnealingLR。CosineAnnealingLR采用余弦函数的形式对学习率进行衰减,可以更加平滑地降低学习率,避免了突变造成的训练不稳定性。这种策略有助于提高模型的鲁棒性和泛化能力。
此外,在反向传播计算梯度时,NanoDet-Plus还引入了梯度裁剪。梯度裁剪的目的是限制梯度的大小,避免梯度爆炸的问题,从而稳定训练过程。这项改进可以减少梯度的变动范围,使得训练更加平稳。

模型训练及安卓端部署

本次实验使用目标检测领域最负盛名的数据集Microsoft COCO数据集,包括了超过330000张图片,涵盖了80个物体类别,具有丰富的视觉内容和挑战。

训练过程参考博客:NanoDet训练、检测及安卓部署

环境配置与推理

首先,需要配置相关环境,在python命令端输入pip install -r requirements.txt,相关配置参考如下:

配置:
win10
1650显卡
	conda 22.9.0
	cuda 11.1 (指令nvcc -V)
	先在anaconda prompt创建一个python==3.9.16 的环境
	使用conda create -n py_3.12 Cython matplotlib numpy omegaconf=2.0.1 onnx onnx-simplifier opencv-python pyaml pycocotools pytorch-lightning=1.9.0 tabulate tensorboard termcolor torch=1.10 torchmetrics torchvision tqdm python=3.9
	尝试安装所有包
	这部分conda没用自动找到,需要手动挨个安装
	  - onnx-simplifier
	  - opencv-python
	  - pytorch-lightning=1.9.0
	  - torch=1.10
	  - omegaconf==2.0.1
	  - pycocotools	
	使用以下指令尝试安装:
	conda install conda install -c necla-ml onnx-simplifier --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/	
	因为可能需要用pip,所以将这个现在建好的虚拟环境克隆,在新的克隆环境内继续安装包的操作
	(克隆指令 conda create -n py_3.12_new --clone py_3.12 )	
	使用以下指令尝试安装:
	pip install opencv-python
	conda install -c https://conda.anaconda.org/menpo opencv
	conda install -c conda-forge pytorch-lightning
	pip install omegaconf==2.0.1
	conda install -c conda-forge pycocotools
		安装torch和torchvision一定注意要与自己的CUDA版本匹配,并且这两个组件也要按照官网的推荐去装(用官网给的指令一遍装了就对了,注意torchvision==0.11.0+cu111只有linux版本,所以不要安装他以及他对应的torch)
	我的torch版本是v1.9.1(根据自己的电脑版本下载)
	我使用的安装指令:
	pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 -f https://download.pytorch.org/whl/torch_stable.html
	如果遇到死机
	原因是之前下载了pytorch,但是由于权限原因没有安装pytorch,需要做两点改动,在pip install之间加上--no-cache-dir,命令的最后加上--user
	pip --no-cache-dir install torch==1.8.2+cu111 torchvision==0.9.2+cu111 torchaudio===0.8.2 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html --user

很重要的一点:在推理前需要加载依赖,命令行输入python setup.py develop
然后需要准备配置文件并放在config文件夹,我使用的是nanodet-plus-m_416.yml,接着下载预训练权重,我使用的是nanodet-plus-m_416.pth,放在model文件夹下。
准备好这些之后就可以进行推理了,在demo/demo.py文件中修改相关文件路径:
在这里插入图片描述
然后运行demo.py文件

推理不仅可以体验模型,还可以检查环境是否配置成功,如果成功推理出结果,接下来就可以训练模型了。

模型训练

参考博客:深度学习:使用nanodet训练自己制作的数据集并测试模型,通俗易懂,适合小白
打开tools/train.py,修改里面的配置文件路径,同推理:
在这里插入图片描述
然后打开配置文件,修改参数

配置文件中包含了模型的各种参数,包括主干网络,fpn,检测头,数据集信息以及训练参数。

这里的路径是模型训练好之后的保存路径。
在这里插入图片描述
然后再data中修改数据集路径:
在这里插入图片描述
接着修改训练参数
在这里插入图片描述
这里要注意:如果你的训练设备不够,把workers_per_gpu改成1,把batchsize改小,但最好是2的次方,不然会爆显存或者其他的奇怪问题。

我本地显卡是1650,训练300个epoch大约需要20天,如果按此训练我的堡垒要报废,所以网上找了一张运算卡,NVIDIA RTX A5000,训练100个epoch约38小时后得到模型。
如下图,在训练了80个epoch后mAP趋于稳定,模型逐渐收敛。
在这里插入图片描述
训练好的模型文件保存在workspace/nanodet-plus-m_416/model_best/nanodet_model_best.pth,然后我们就可以使用训练好的模型进行推理,步骤同上面的推理。

安卓端部署

致敬作者nihui,源代码链接:nanodet安卓端部署
基本上按照源码中的步骤来就行,不会出错,我这里简单复述一下。

  1. 首先下载作者整理好的模型文件,使用腾讯退出的ncnn推理引擎:
    在这里插入图片描述然后在jni/CMakeLists.txt中修改版本号。

  2. 本项目基于opencv,所以还要下载移动端opencv工具包,如上图第二个文件夹。

  3. 接着下载好Android Studio并配置环境,参考博客:Android Studio入门教程

  4. 然后连接手机并开启手机开发者模式,这里需要注意,不同手机或者不同的数据线也会影响连接,我的红米手机充电线不可以连接,找了旧手机华为的数据线就可以,这波华为上大分。

  5. 连接好手机后便在Android Studio中运行项目,然后就可以在手机中看到安装软件的提示,安装好就大功告成,效果如下:
    在这里插入图片描述

可以看到在我的手机上实时检测速度可以稳定在30FPS以上,实现实时检测。

这里需要说明一下,本文安卓端部署并没有使用第三部分训练出来的模型,如果需要使用自己的模型需要把.pth文件先转换成onnx文件,接着转换成ncnn类型文件,参考博客:NanoDet训练、测试 以及使用ncnn部署Jetson Nano 进行目标检测和串口数据转发

创作不易,请勿搬用,谢谢~

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值