1、简介
人工智能图像识别是人工智能领域的一个重要分支,它涉及计算机视觉、深度学习、机器学习等多个领域的知识和技术。图像识别主要是处理具有一定复杂性的信息。计算机采用与人类类似的图像识别原理,即对图像的重要特征进行分类和提取,并有效排除无用的多余特征,进而实现图像识别。一般而言,图像识别有四大类任务:
(1)分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
(2)定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。
(3)检测-Detection:解决“在哪里?是什么?”的问题,即定位出这个目标的位置并且知道目标物是什么。
(4)分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。
我们之前已经介绍了如何使用分类任务进行手写数字的分类。相信大家脑海中可能会产生如下疑问:
- 数据依赖性强:分类模型的表现通常依赖于大量的标注数据进行训练。获取高质量、大规模的数据集既耗时又昂贵。
- 泛化能力有限:模型可能在训练数据上表现良好,但在遇到未曾见过的数据(例如不同环境、光照条件、角度等)时性能可能会下降。
- 对异常值敏感:如果训练集中包含异常值或者噪声数据,这可能导致模型学习到不正确的模式,从而影响其准确性。
- 类别不平衡问题:当某些类别的样本数远多于其他类别时,分类器可能会偏向多数类别,导致少数类别的预测精度较低。
- 过拟合风险:复杂的模型容易在训练数据上过拟合,即学到了训练数据中的特定特征而不是一般化的规律,从而降低了模型在新数据上的泛化能力。
- 对抗攻击易感性:图像分类模型容易受到精心设计的对抗样本的影响,这些样本在人类看来几乎与原始图像相同,但却会导致模型做出错误的分类。
- 背景干扰:在自然场景中,目标物体周围复杂的背景信息可能会干扰分类结果,使得分类器难以专注于真正重要的区域。
在深入探讨了图像分类任务及其面临的挑战之后,我们现在将目光转向一个更为复杂的计算机视觉问题——目标检测。
如果说分类任务是识别图像中主体内容的是什么?
的问题,那么目标检测则是进一步解答在哪里?
目标检测不仅需要识别出图像或视频流中存在哪些类型的物体,还需要精确定位每个物体的位置。这种能力对于许多实际应用场景至关重要,比如:
- 自动驾驶汽车需要准确地识别并定位行人、其他车辆和交通标志;
- 安防监控系统依赖于实时检测异常活动的具体位置;
- 而在零售环境中,智能货架可以通过检测商品来管理库存;
随着物联网(IoT)的发展以及边缘计算能力的增强,越来越多的目标检测应用开始直接在靠近数据源的边缘设备上运行。这不仅减少了数据传输延迟,保护了用户隐私,同时也减轻了云端服务器的压力。然而,在边缘端部署高效且准确的目标检测模型并非易事,它涉及到从选择合适的算法架构到针对特定硬件平台进行优化等一系列复杂的工作。
接下来,我们将详细介绍如何在资源受限的边缘设备上成功部署目标检测模型,探索其背后的原理和技术,并讨论解决该领域内常见挑战的方法。
2 目标检测模型介绍
在目标检测的任务中,有着许许多多的模型,如 Picodet、Faster R-CNN、YOLO、SSD等,它们都实现了检测目标并定位其位置的功能。我们主要介绍的是百度的Picodet模型,它是一种基于深度卷积网络(DNN)的轻量级目标检测模型,具有非常高的检测精度,可以在低算力设备进行实时的端到端推理检测。
2.1 Picodet模型介绍
目标检测在各个领域都有广泛的应用,然而,在移动端工业领域的实际应用中,对目标检测算法提出了更为苛刻的要求:需要实现高速度、高精度、小体积、易部署等特性。为应对这一挑战,百度于2021年末发布了一篇关于移动端性能卓越的实时目标检测网络 PP-PicoDet。PP-PicoDet 具有以下架构优点:
- 网络架构优化: PP-PicoDet 基于 ShuffleNetV2 进行改进,引入了 SE 模块和 Ghost 模块,同时采用神经网络搜索(NAS)技术,最终形成了 ESNet(Enhanced ShuffleNet)作为骨干网络,以在移动端保证高效性能。
- 采样策略和标签分配: 使用 SimOTA 采样策略,动态变换标签分配方式,并采用VFL+GloU替代CELoss+IoU作为损失函数,从而提高模型的训练效果。
- 激活函数和学习率策略: 将 H-Swish 替代 Relu 作为激活函数,采用 cosine 学习率衰减策略,以提高模型的学习能力和泛化性能。
- 硬件友好性: 在骁龙865等硬件平台上表现出色,并支持快速导出为 ONNX 格式,使得模型在硬件部署时更加友好和高效。
在此基础上,2022年初,PaddleDetction 再次发布了增强版本的 PP-PicoDet,在以下方面做出了改进:
- 引入 TAL 及 ETA Head,优化 PAN 等结构,精度提升2个点以上
- 优化 CPU 端预测速度,同时训练速度提升一倍
- 导出模型将后处理包含在网络中,预测直接输出 box 结果,无需二次开发,迁移成本更低,端到端预测速度提升10%-20%。
2.2 模型结构
PP-PicoDet 网络结构图如下所示:
- Backbone:基于 shuffleNetV2 改进,ESNet,输出 C3,C4,C5 特征图进入 neck;
- Neck:CSP-PAN,接受 C3,C4,C5输入,输出 P3,P4,P5,P6;
2.2.1 BackBone
基于大量实验,发现 ShuffleNetV2 比移动设备上的其他网络更稳健。为了进一步提高 ShuffleNet V2 的性能,遵循 PP-LCNet 的一些方法来增强网络结构并构建一个新的骨干网,即增强型 ShuffleNet(ESNet)。下图详细描述了 ESNet 的 ES 块。SE 模块在加权网络通道以获得更好的功能方面做得很好。因此,将 SE 模块添加到所有块中。与MobileNetV3 一样,SE 模块两层的激活函数分别是 ReLU 和 H-Sigmoid。信道混洗提供了 ShuffleNetV2 信道的交换信息,但它会导致融合特征的丢失。为了解决这个问题,当步幅为2时,添加了深度卷积和逐点卷积来整合不同的信道信息(图 a)。GhostNet 的作者提出了一种新的 Ghost 模块,该模块可以用更少的参数生成更多的特征图,以提高网络的学习能力。在步幅设置为1的块中添加 Ghost 模块,以进一步提高 ESNet 的性能(图b)。
2.2.2 Neural Architecture Search(NAS)
Picodet 提出首个针对目标检测器的 one-shot 搜索的工作。目标检测模型搭配在分类上高性能的主干网络,可能会因为不同任务间的差异而性能下降。Picodet 没有去搜索一个较佳的分类器,而是在检测数据集上训练和搜索检测的超网络,从而介绍了大量计算并且达到检测而不是分类的最优。此框架仅需两步:(1)在检测数据集上训练 one-shot 超网,(2)使用 EA(evolutionary algorithm,进化算法)算法对训练好的超网络进行架构搜索。
2.2.3 CSP-PAN and Detector Head
使用PAN结构来获得多层特征图以及 CSP 结构来进行相邻特征图间的特征连接和融合。在原始的 CSP-PAN 中,每个输出特征图的通道数与来自主干网络的输入特征图保持相同。对于移动设备来说,这样大通道数的结构具有昂贵的计算成本。为了解决这个问题,本文用1 × 1 卷积使所有特征图中的通道数与最小的通道数相等,(也就是都设为96)。通过 CSP 结构实现 top-down 和 bottom-up 的特征融合。缩小的特征使得计算成本更低且不损失准确性。此外,在原有 CSP-PAN 的顶部加入了一个特征图尺度分支来检测更多物体。与此同时,所有除了1 × 1 卷积外的卷积层都使用深度可分离卷积(Depthwise Separable Convolution)。深度可分离卷积使用5 × 5 卷积扩大感受野。这种结构在使用很少参数的情况下给精度带来了大幅度提升。模块的具体结构如下图所示。
在检测头中,使用 Depthwise Separable Convolution和5 × 5 卷积来扩大感受野。深度可分离卷积的数量可以被设置为2、4或更多。Neck 和 head 部分都有四个尺度分支。其中 head 部分的通道数与 neck 部分保持一致,并将分类和回归分支耦合在一起,在 Picodet 中耦合预测头在没有降低通道数时表现更好。
2.3 神经网络的相关知识点
2.3.1 卷积的基本概念
卷积是一种数学运算,在计算机视觉中被广泛应用于特征提取。它通过一个小型矩阵(称为卷积核或滤波器)与输入图像的局部区域进行相乘并求和,生成新的特征图(Feature Map)。这个过程可以看作是用卷积核扫描整个输入图像,以捕捉图像中的模式,如边缘、纹理等。
卷积操作有几个关键参数:
- 卷积核(Kernel):也被叫做滤波器(filter),假设卷积核的高和宽分别为?ℎ和??,则将称为?ℎ×??卷积,比如3×3卷积,就是指卷积核的高为3, 宽为3。卷积核中数值为对图像中与卷积核同样大小的子块像素点进行卷积计算时所采用的权重。
- 填充(Padding): 填充(Padding)是在卷积神经网络(CNN)中为输入张量的边缘添加额外的像素,以控制输出特征图的大小并保持输入图像的空间尺寸。填充有助于保留输入图像边缘的信息,并在卷积运算中避免空间尺寸的过度缩小。
- 步长(Stride): 步长(Stride)是卷积操作中的一个参数,决定了卷积核在输入图像上滑动的步幅。具体来说,步长定义了卷积核每次滑动的距离。它控制了卷积运算中卷积核在输入图像上移动的距离,从而影响输出特征图的大小。
卷积层输出特征图的尺寸计算:
其中,H为输出特征图的高度和宽度(假设输入为正方形图像),W为输入图像的高度和宽度,F为卷积核大小,P为填充,S为步长。
卷积的计算过程
2.3.2 逐深度卷积
逐深度卷积(Depthwise convolution,DWConv)与标准卷积的区别在于,深度卷积的卷积核为单通道模式,需要对输入的每一个通道进行卷积,这样就会得到和输入特征图通道数一致的输出特征图。即有输入特征图通道数=卷积核个数=输出特征图个数。
假设一个大小为64×64像素、3通道彩色图片,3个单通道卷积核分别进行卷积计算,输出3个单通道的特征图。所以,一个3通道的图像经过运算后生成了3个 Feature map,如下图所示。其中一个 Filter 只包含一个大小为3×3的 Kernel,卷积部分的参数量为:depthwise=3×3×3=27。
2.3.3 逐点卷积
逐点卷积(Pointwise Convolution)就是 W/H 维度不变,改变 channel。根据深度卷积可知,输入特征图通道数=卷积核个数=输出特征图个数,这样会导致输出的特征图个数过少(或者说输出特征图的通道数过少,可看成是输出特征图个数为1,通道数为3),从而可能影响信息的有效性。此时,就需要进行逐点卷积。
逐点卷积(Pointwise Convolution,PWConv)实质上是用1x1的卷积核进行升维。在 GoogleNet 中大量使用1x1的卷积核,那里主要是用来降维。1x1的卷积核主要作用是对特征图进行升维和降维。
举一个例子,如下图所示,从深度卷积得到的3个单通道特征图,经过4个大小为1x1x3卷积核的卷积计算,输出4个特征图,而输出特征图的个数取决于 Filter 的个数。因此,卷积层的参数量为:
2.3.4 深度可分离卷积
深度可分离卷积(Depthwise separable convolution)由逐深度卷积和逐点卷积组成,深度卷积用于提取空间特征,逐点卷积用于提取通道特征。深度可分离卷积在特征维度上分组卷积,对每个 channel 进行独立的逐深度卷积(depthwise convolution),并在输出前使用一个1x1卷积(pointwise convolution)将所有通道进行聚合。
2.3.5 卷积神经网络的组成
当然,可以对卷积神经网络(CNN)的组成进行更详细的介绍。以下是基于上述五个关键组件的进一步扩展和说明:
2.3.5.1 卷积层(Convolutional Layer)
- 多通道输入:在处理彩色图像时,每个像素有三个通道(红、绿、蓝),即三维输入数据。卷积核也相应地是三维的,以匹配输入数据的深度。
- 多滤波器:通常一个卷积层包含多个不同的滤波器,它们共同工作来捕捉输入数据的不同特征。每一个滤波器都会生成一个称为“特征图”或“激活图”的输出。
- 共享权重:所有位置使用相同的卷积核参数,这不仅减少了模型参数的数量,还使得模型能够学习到平移不变的特征。
2.3.5.2 激活层(Activation Layer)
(1)Leaky ReLU
Leaky ReLU(泄漏修正线性单元)是ReLU(修正线性单元)的变种,旨在解决标准ReLU函数在负值区域输出为零的问题,即所谓的“死神经元”问题。对于输入x小于0的情况,Leaky ReLU会给出一个小的非零梯度,这有助于训练过程中的梯度传播,特别是在网络较深时。
公式:
其中 α 是一个很小的正数,通常是0.01,用于控制负区间的斜率。
优点:
- 缓解死区问题:与传统的ReLU不同,Leaky ReLU对于所有输入都有非零梯度,这意味着它可以在一定程度上避免神经元“死亡”的情况。
- 加速收敛:由于在所有区域都有梯度,Leaky ReLU可以加速某些类型模型的训练过程。
- 保留稀疏激活:与ReLU类似,Leaky ReLU仍然能够促进稀疏激活,这对模型的学习是有利的。
缺点:
- 性能提升有限:尽管Leaky ReLU解决了ReLU的一些问题,但在实践中,它的表现并不总是优于其他改进版本的ReLU函数,如PReLU或ELU。
- 超参数选择: α 的选择可能需要一些试验和错误来找到最适合特定任务的值。不合适的 ? 可能会导致不良的训练动态。
总的来说,Leaky ReLU是一个简单而有效的激活函数,它可以改善某些情况下传统ReLU的局限性。然而,在选择激活函数时,应该根据具体的应用场景和实验结果来决定最合适的选项。
(2)Parametric ReLU
Parametric ReLU(PReLU),即参数化的修正线性单元,是Leaky ReLU的一种扩展。与Leaky ReLU相比,PReLU允许负输入的斜率 α 是一个可学习的参数,这意味着它可以在训练过程中根据数据自动调整。这种灵活性使得PReLU能够更好地适应不同任务的需求。
公式:
其中 ?? 是针对每个神经元或共享给所有神经元的学习参数,用于控制负区间的斜率。
优点
- 自适应学习: α 参数可以被优化算法自动调整,因此PReLU可以更灵活地适应不同的数据分布。
- 缓解死区问题:如同Leaky ReLU一样,PReLU也避免了传统ReLU中“死神经元”的问题,因为对于任何输入都有非零梯度。
- 可能更好的表现:在某些情况下,PReLU可以比标准ReLU和Leaky ReLU提供更好的性能,因为它可以根据具体任务来调整激活函数的形状。
- 保留稀疏激活:类似于其他ReLU变体,PReLU仍然能够在正输入区域促进稀疏激活,这对模型的学习是有利的。
缺点
- 增加模型复杂度:由于引入了额外的可学习参数 α,这增加了模型的复杂性和需要优化的参数数量。
- 潜在过拟合风险:更多的可学习参数意味着模型有更大的能力去记忆训练数据,从而可能导致过拟合,特别是在小规模数据集上。
- 训练时间延长:因为需要额外的时间来学习 α 参数,这可能会导致训练过程稍微变慢。
(3)Softmax
Softmax函数是一种常用于多分类问题中的激活函数,它将一个含任意实数的K维向量。z 转换为另一个同样长度为K的概率分布向量 σ(z),每个元素都在0和1之间,并且所有元素之和等于1。这使得Softmax非常适合用作分类任务中最后的输出层,以生成各个类别的概率估计。
优点
- 产生概率分布:Softmax可以将模型的原始输出转换成一个合理的概率分布,这对于解释性和决策制定非常有用。
- 支持多分类:与二元分类问题不同,Softmax自然地扩展到了多分类场景,适用于需要区分多个类别的任务。
- 计算简单:其形式相对简单,易于实现,并且在现代深度学习框架中都有高效的实现。
- 结合交叉熵损失函数:当与交叉熵损失一起使用时,Softmax能提供一个平滑、可微分的目标函数,有利于梯度下降优化过程。
缺点
-
梯度消失:对于远离正确答案的预测,Softmax加上交叉熵损失可能会导致非常小的梯度,从而影响训练速度,特别是在深层网络中。
-
对异常值敏感:由于采用了指数运算,Softmax对异常大的输入值非常敏感,这些异常值可能导致不理想的模型性能。
2.3.5.3 池化层(Pooling Layer)
-
重叠池化(Overlapping Pooling):池化窗口之间有一定的重叠,能增加一些不变性,同时不会显著增加计算量。
-
全局池化(Global Pooling):对整个特征图应用池化操作,而不是局部区域。它可以在一定程度上替代全连接层,并减少过拟合。
2.3.5.4 批归一化层(Batch Normalization Layer)
- 训练与推理:在训练阶段,批归一化使用每一批次的数据来估计均值和方差;而在推理阶段,则使用运行时统计(通常是移动平均)。
- γ和β参数:除了标准化外,批归一化还引入了两个可学习参数γ(缩放)和β(偏移),使网络能够在需要时恢复原始的激活尺度和位置。
2.3.5.5 全连接层(Fully Connected Layer, FC Layer)
- Dropout技术:为了防止过拟合,在全连接层中经常采用dropout方法,随机丢弃一部分神经元,强迫网络学习更加鲁棒的特征表示。
- 稀疏连接:作为全连接层的一种替代方案,某些架构尝试使用稀疏连接来减少参数数量并提高效率,比如通过只连接特定模式下的神经元。
- 动态架构调整:现代的一些研究探索了动态改变网络结构的可能性,例如根据输入样本的复杂度自动调整FC层的大小或配置。
这些组件的组合和优化构成了卷积神经网络的核心,并且随着计算机视觉领域的发展,新的技术和理论不断被提出,以进一步提升CNN的性能和泛化能力。例如,残差网络(ResNet)、密集连接网络(DenseNet)等创新设计都是为了克服深层网络训练中的挑战而提出的。
3 边缘端设备部署
在边缘端设备部署目标检测模型,特别是像PP-PicoDet这样轻量级且高效的模型,涉及到多个步骤和技术考量。
以下是一些关键点和建议,可以帮助你在资源受限的环境中成功部署这样的模型:
3.1 准备工作
在进行模型的部署之前,我们首先需要确认自己手上的模块的支持哪些算子、支持什么类型的量化(int4/int8/fp16/混合精度)、内存大小等参数,对于手上的板子有一个全面的了解。在进行部署时,我们常常将训练的模型转化成onnx中间文件,再根据硬件设备要求的转化成硬件要求的模型文件。
在本次实验中,我使用的模块是凌智视觉模块(Lockzhiner Vision Module) ,这个模块是福州市凌睿智捷电子有限公司联合百度飞桨倾力打造的一款高集成度人工智能视觉模块,专为边缘端人工智能和机器视觉应用而设计,模块的参数如下图所示。
这个模块有着一个很吸引人的特点与飞桨低代码开发工具 PaddleX 完美适配,配合飞桨星河社区 Al Studio, 可以实现一键训练;配合凌智视觉算法部署库,用户可以实现一键部署,减少我们在模型部署时遇到的疑难杂症。如果遇到问题,可以去厂家开源仓库提交问题。
凌智视觉模块Gitee链接
3.2 模型转换
在 百度飞桨的 AiStudio 中,搜索【硬件部署】在凌智视觉模块上部署 PaddleDetection 模型如果说有自己制作数据的话,需要将数据上传,然后在修改全局配置项,修改数据集地址以及对应的类别数。
按照厂家提供的配置直接进行训练转换。
训练完成后,会自动生成一个rknn模型文件,
3.3 部署结果
模型的推理结果如下图所示