人工智能图像识别是人工智能领域的一个重要分支,它涉及计算机视觉、深度学习、机器学习等多个领域的知识和技术。图像识别主要是处理具有一定复杂性的信息。计算机采用与人类类似的图像识别原理,即对图像的重要特征进行分类和提取,并有效排除无用的多余特征,进而实现图像识别。一般而言,图像识别有四大类任务:
(1)分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
(2)定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。
(3)检测-Detection:解决“在哪里?是什么?”的问题,即定位出这个目标的位置并且知道目标物是什么。
(4)分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。
我们之前已经介绍了如何使用分类任务进行手写数字的分类。相信大家脑海中可能会产生如下疑问:
在深入探讨了图像分类任务及其面临的挑战之后,我们现在将目光转向一个更为复杂的计算机视觉问题——目标检测。
如果说分类任务是识别图像中主体内容的是什么?
的问题,那么目标检测则是进一步解答在哪里?
目标检测不仅需要识别出图像或视频流中存在哪些类型的物体,还需要精确定位每个物体的位置。这种能力对于许多实际应用场景至关重要,比如:
随着物联网(IoT)的发展以及边缘计算能力的增强,越来越多的目标检测应用开始直接在靠近数据源的边缘设备上运行。这不仅减少了数据传输延迟,保护了用户隐私,同时也减轻了云端服务器的压力。然而,在边缘端部署高效且准确的目标检测模型并非易事,它涉及到从选择合适的算法架构到针对特定硬件平台进行优化等一系列复杂的工作。
接下来,我们将详细介绍如何在资源受限的边缘设备上成功部署目标检测模型,探索其背后的原理和技术,并讨论解决该领域内常见挑战的方法。
在目标检测的任务中,有着许许多多的模型,如 Picodet、Faster R-CNN、YOLO、SSD等,它们都实现了检测目标并定位其位置的功能。我们主要介绍的是百度的Picodet模型,它是一种基于深度卷积网络(DNN)的轻量级目标检测模型,具有非常高的检测精度,可以在低算力设备进行实时的端到端推理检测。
目标检测在各个领域都有广泛的应用,然而,在移动端工业领域的实际应用中,对目标检测算法提出了更为苛刻的要求:需要实现高速度、高精度、小体积、易部署等特性。为应对这一挑战,百度于2021年末发布了一篇关于移动端性能卓越的实时目标检测网络 PP-PicoDet。PP-PicoDet 具有以下架构优点:
在此基础上,2022年初,PaddleDetction 再次发布了增强版本的 PP-PicoDet,在以下方面做出了改进:
PP-PicoDet 网络结构图如下所示:
基于大量实验,发现 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)。
Picodet 提出首个针对目标检测器的 one-shot 搜索的工作。目标检测模型搭配在分类上高性能的主干网络,可能会因为不同任务间的差异而性能下降。Picodet 没有去搜索一个较佳的分类器,而是在检测数据集上训练和搜索检测的超网络,从而介绍了大量计算并且达到检测而不是分类的最优。此框架仅需两步:(1)在检测数据集上训练 one-shot 超网,(2)使用 EA(evolutionary algorithm,进化算法)算法对训练好的超网络进行架构搜索。
使用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 中耦合预测头在没有降低通道数时表现更好。
卷积是一种数学运算,在计算机视觉中被广泛应用于特征提取。它通过一个小型矩阵(称为卷积核或滤波器)与输入图像的局部区域进行相乘并求和,生成新的特征图(Feature Map)。这个过程可以看作是用卷积核扫描整个输入图像,以捕捉图像中的模式,如边缘、纹理等。
卷积操作有几个关键参数:
卷积层输出特征图的尺寸计算:
其中,H为输出特征图的高度和宽度(假设输入为正方形图像),W为输入图像的高度和宽度,F为卷积核大小,P为填充,S为步长。
卷积的计算过程
逐深度卷积(Depthwise convolution,DWConv)与标准卷积的区别在于,深度卷积的卷积核为单通道模式,需要对输入的每一个通道进行卷积,这样就会得到和输入特征图通道数一致的输出特征图。即有输入特征图通道数=卷积核个数=输出特征图个数。
假设一个大小为64×64像素、3通道彩色图片,3个单通道卷积核分别进行卷积计算,输出3个单通道的特征图。所以,一个3通道的图像经过运算后生成了3个 Feature map,如下图所示。其中一个 Filter 只包含一个大小为3×3的 Kernel,卷积部分的参数量为:depthwise=3×3×3=27。
逐点卷积(Pointwise Convolution)就是 W/H 维度不变,改变 channel。根据深度卷积可知,输入特征图通道数=卷积核个数=输出特征图个数,这样会导致输出的特征图个数过少(或者说输出特征图的通道数过少,可看成是输出特征图个数为1,通道数为3),从而可能影响信息的有效性。此时,就需要进行逐点卷积。
逐点卷积(Pointwise Convolution,PWConv)实质上是用1x1的卷积核进行升维。在 GoogleNet 中大量使用1x1的卷积核,那里主要是用来降维。1x1的卷积核主要作用是对特征图进行升维和降维。
举一个例子,如下图所示,从深度卷积得到的3个单通道特征图,经过4个大小为1x1x3卷积核的卷积计算,输出4个特征图,而输出特征图的个数取决于 Filter 的个数。因此,卷积层的参数量为:
深度可分离卷积(Depthwise separable convolution)由逐深度卷积和逐点卷积组成,深度卷积用于提取空间特征,逐点卷积用于提取通道特征。深度可分离卷积在特征维度上分组卷积,对每个 channel 进行独立的逐深度卷积(depthwise convolution),并在输出前使用一个1x1卷积(pointwise convolution)将所有通道进行聚合。
当然,可以对卷积神经网络(CNN)的组成进行更详细的介绍。以下是基于上述五个关键组件的进一步扩展和说明:
(1)Leaky ReLU
Leaky ReLU(泄漏修正线性单元)是ReLU(修正线性单元)的变种,旨在解决标准ReLU函数在负值区域输出为零的问题,即所谓的“死神经元”问题。对于输入x小于0的情况,Leaky ReLU会给出一个小的非零梯度,这有助于训练过程中的梯度传播,特别是在网络较深时。
公式:
其中 α 是一个很小的正数,通常是0.01,用于控制负区间的斜率。
优点:
缺点:
(2)Parametric ReLU
Parametric ReLU(PReLU),即参数化的修正线性单元,是Leaky ReLU的一种扩展。与Leaky ReLU相比,PReLU允许负输入的斜率 α 是一个可学习的参数,这意味着它可以在训练过程中根据数据自动调整。这种灵活性使得PReLU能够更好地适应不同任务的需求。
公式:
其中 ?? 是针对每个神经元或共享给所有神经元的学习参数,用于控制负区间的斜率。
优点
缺点
(3)Softmax
Softmax函数是一种常用于多分类问题中的激活函数,它将一个含任意实数的K维向量。z 转换为另一个同样长度为K的概率分布向量 σ(z),每个元素都在0和1之间,并且所有元素之和等于1。这使得Softmax非常适合用作分类任务中最后的输出层,以生成各个类别的概率估计。
优点
缺点
梯度消失:对于远离正确答案的预测,Softmax加上交叉熵损失可能会导致非常小的梯度,从而影响训练速度,特别是在深层网络中。
对异常值敏感:由于采用了指数运算,Softmax对异常大的输入值非常敏感,这些异常值可能导致不理想的模型性能。
重叠池化(Overlapping Pooling):池化窗口之间有一定的重叠,能增加一些不变性,同时不会显著增加计算量。
全局池化(Global Pooling):对整个特征图应用池化操作,而不是局部区域。它可以在一定程度上替代全连接层,并减少过拟合。
这些组件的组合和优化构成了卷积神经网络的核心,并且随着计算机视觉领域的发展,新的技术和理论不断被提出,以进一步提升CNN的性能和泛化能力。例如,残差网络(ResNet)、密集连接网络(DenseNet)等创新设计都是为了克服深层网络训练中的挑战而提出的。
在边缘端设备部署目标检测模型,特别是像PP-PicoDet这样轻量级且高效的模型,涉及到多个步骤和技术考量。
以下是一些关键点和建议,可以帮助你在资源受限的环境中成功部署这样的模型:
在进行模型的部署之前,我们首先需要确认自己手上的模块的支持哪些算子、支持什么类型的量化(int4/int8/fp16/混合精度)、内存大小等参数,对于手上的板子有一个全面的了解。在进行部署时,我们常常将训练的模型转化成onnx中间文件,再根据硬件设备要求的转化成硬件要求的模型文件。
在本次实验中,我使用的模块是凌智视觉模块(Lockzhiner Vision Module) ,这个模块是福州市凌睿智捷电子有限公司联合百度飞桨倾力打造的一款高集成度人工智能视觉模块,专为边缘端人工智能和机器视觉应用而设计,模块的参数如下图所示。
这个模块有着一个很吸引人的特点与飞桨低代码开发工具 PaddleX 完美适配,配合飞桨星河社区 Al Studio, 可以实现一键训练;配合凌智视觉算法部署库,用户可以实现一键部署,减少我们在模型部署时遇到的疑难杂症。如果遇到问题,可以去厂家开源仓库提交问题。
凌智视觉模块Gitee链接
在 百度飞桨的 AiStudio 中,搜索【硬件部署】在凌智视觉模块上部署 PaddleDetection 模型如果说有自己制作数据的话,需要将数据上传,然后在修改全局配置项,修改数据集地址以及对应的类别数。
按照厂家提供的配置直接进行训练转换。
训练完成后,会自动生成一个rknn模型文件,
模型的推理结果如下图所示
更多回帖