PP-ShiTu: A Practical Lightweight Image Recognition System
-
图像识别,是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术,是应用深度学习算法的一种实践应用。图像的传统识别流程分为四个步骤:图像采集→图像预处理→特征提取→图像识别。在于特征提取阶段,利用传统的分类网络,需要提前在训练集中补充所需识别的类别的训练图片,一旦有新增的类别就需要对模型重新训练,无论是训练成本还是数据成本都很高。 -
Metric Learning可以借助一系列观测,根据不一样的任务来自主学习出针对某个特定任务的度量距离函数,通过计算两张图片之间的相似度,使得输入图片被归入到相似度大的图片类别中去,从而学习数据间的的距离或差异,有效地描述样本之间的相似度。相比于传统的识别网络是丢弃经典神经网络最后的softmax层,改成直接输出feature vector,去特征库里面按照Metric Learning寻找最近邻的类别作为匹配项。 -
拥有了强大的特征提取网络,一套完美的识别系统当然也少不了高效的检索模块。在PP-ShiTu中,PaddleClas使用了经过广泛验证并且能够适配于多端多平台的检索系统:faiss。 -
避免每次新增类别重新训练的困难,并且对于样本数量很少的类别,在拥有了较好的特征提取网络的前提下,能够直接将小样本数据补充进特征检索库,避免了训练集的大量数据要求,从而实现识别效果。 -
图像识别一共包含4个步骤
- 准备好需要识别的图片;
- 通过主体检测模型,定位主体所在位置;
- 利用metric learning进行特征提取;
- 经过检索快速匹配最相似结果。
Abstract
-
在不同的领域出现了大量的研究和技术,如人脸识别、行人和车辆重新识别、地标检索和产品识别。本文提出了一个实用的轻量级图像识别系统PP-ShiTu,它由主体检测、特征提取和向量搜索三个模块组成。 -
引入了度量学习、深度哈希、知识提取和模型量化等流行策略,以提高准确性和推理速度。 -
PP_ShiTu可以在不同的场景中很好地工作,并在混合数据集上训练一组模型。在不同的数据集和基准测试上的实验表明,该系统在不同的图像识别领域具有广泛的有效性。 -
PP-ShiTu引入目标检测、度量学习、图像检索等技术,并将每个模块性能最大化,才构建成了统一、通用的图像识别系统 -
图像识别任务实际产业落地过程中又面临很多实际难点:
- 识别类别数以万计!
- 细分类差别极其细微,实际图像角度多变刁钻
- 算法上线运行速度要求极高
Introduction
-
本文提出了一个实用的轻量级图像识别系统PP-ShiTu。介绍了一个通用的管道和实用的策略,包括PP-PicoDet、UDML、Arcmargin loss和DeepHash。 -
图像识别是计算机视觉的一项普遍任务。得益于深度学习的快速发展和巨大的市场需求,图像识别得到了迅速的发展,并发展成多个子领域。 -
PP-ShiTu中使用PP-PicoDet模型作为主体检测算法,PP-PicoDet模型性能和速度均达到业内SOTA的水平,为整个识别系统实现精准高效识别打下了坚实的基础。 -
在特征提取的训练阶段,PP-ShiTu通过使用度量学习,更好地解决高相似度物体的区分问题。不仅如此,PP-ShiTu所使用的骨干网络PP-LCNet作为业内SOTA模型,大幅度提升预测速度的同时,还提高了精度,并且可能直接支持多种应用方向和场景! -
许多应用程序使用类似的管道,例如人脸识别、行人和车辆重新识别、地标识别、产品识别等。此外,在一个应用程序中工作的策略通常对其他应用程序也是有效的。 -
将策略迁移到另一个应用程序时,成本很高。鉴于此,提出了PP-ShiTu图像识别系统来解决同一管道中的类似问题。下图展示了PP-ShiTu的框架。PP-ShiTu包含三个模块,即主体检测、特征提取和向量搜索。
- 首先,获取图像时,我们首先检测一个或多个主体区域找到图像的主要区域。
- 然后使用CNN模型从这些区域提取特征。特征是浮点数向量或二元向量。根据度量学习理论,特征意味着两个对象的相似性。两个特征之间的距离越短,原始两个对象就越相似。
- 最后,使用向量搜索算法在图库中找到与我们从图像中提取的特征最接近的特征,并使用相应的标签作为我们的识别结果。
-
除了构建通用管道,还在系统中引入了一些有效的策略。使用带有PP_LCNet主干的PP_Picodet作为主体检测模型的主干。采用具有度量学习策略的PP_LCNet,知识提炼策略在系统中得到了广泛的应用。使用SSLD蒸馏策略训练的主干,还使用SSLD训练特征提取模型。模型量化帮助减少模型的存储大小。使用DeepHash策略压缩特征,以加速向量搜索。烧蚀实验表明了上述策略的有效性。 -
还训练了主体检测模型和将多个数据集混合在一起的混合数据集特征提取模型。PP ShiTu在不同的场景下都能很好地工作,并在许多数据集和基准测试中获得有竞争力的结果。
Modules and Strategies
-
Mainbody Detection
-
主体检测技术是一种应用广泛的检测技术,指的是检测图像中所有前景物体。主体检测是整个识别任务的第一步,可以有效提高识别精度。 -
物体检测方法多种多样,如常用的两级探测器(FasterRCNN系列等)、单级探测器(YOLO、SSD等)、无锚探测器(PP PicoDet、FCOS等)等。PadleDetection为服务器端场景开发了PP-YOLOv2模型,为端端场景(CPU和移动设备)开发了PP-PicoDet模型,这两种模型在各自的场景中都是SOTA。 -
通过结合许多优化技巧,如Drop Block、Matrix NMS、IoU损耗等,PP-YOLOv2在准确性和效率上都超过了YOLOv5。PP_PicoDet以PP_LCNet为主干,并结合了许多其他检测器训练技巧,如PAN FPN、CSP Net、SimOTA,最终成为第一个在输入大小为416时在1M参数范围内mAP(0.5:0.95)超过COCO数据集0.30+的对象检测器。 -
轻量级图像识别系统需要一个轻量级的主体检测模型。因此,在PP_ShiTu中使用PP_PicoDet。 -
Lightweight CPU Network (PP-LCNet)
- 为了在英特尔CPU上获得更好的精度和速度权衡,在比较不同网络推断的基础上获得了一个基本网络,并添加了不同的方法来进一步提高该网络的精度,从而产生了PP_LCNet,它提供了一种更快速、更准确的识别算法,并启用了mkldnn。
-
- 上图为PP_LCNet网络结构。虚线框代表可选模块。茎部采用标准的3×3卷积。DepthSepConv表示深度可分离卷积,DW表示深度卷积,PW表示逐点卷积,GAP表示全局平均池。
- mkldnn:mkldnn是intel开发的开源项目,就是针对cpu上运行神经网络做了一些并行优化; 是用于深度神经网络的英特尔数学核心库,是一款面向深度学习应用的开源性能库。该库包括针对英特尔架构处理器和英特尔处理器显卡优化的神经网络的基本构建模块。
-
Better activation function
-
SE modules at appropriate positions
-
是一种对网络通道进行加权以获得更好功能的好方法,并被用于许多轻量级网络,如MobileNetV3。然而,在英特尔CPU上,SE模块会增加推理时间,因此无法将其用于整个网络。 -
事实上,通过大量实验发现越靠近网络的尾部,SE模块就越有效。因此,只需将SE模块添加到网络尾部附近的块中,就可以实现更好的精度速度平衡。SE模块中两层的激活功能是ReLU和H-Sigmoid有效。 -
SENet是Squeeze-and-Excitation Networks的简称,拿到了ImageNet2017分类比赛冠军,其效果得到了认可,其提出的SE模块思想简单,易于实现,并且很容易可以加载到现有的网络模型框架中。SENet主要是学习了channel之间的相关性,筛选出了针对通道的注意力,稍微增加了一点计算量,但是效果比较好。
-
-
其中Fsq(·)为压缩操作,这个操作就是一个全局平均池化(global average pooling)。经过压缩操作后特征图被压缩为1×1×C向量。 -
Fex(·,W)为激励操作**(Excitation)**:由两个全连接层组成,其中SERatio是一个缩放参数,这个参数的目的是为了减少通道个数从而降低计算量。
- 第一个全连接层有C*SERatio个神经元,输入为1×1×C,输出1×1×C×SERadio。
- 第二个全连接层有C个神经元,输入为1×1×C×SERadio,输出为1×1×C。
-
Fscale(·,·)为scale操作:在得到1×1×C向量之后,就可以对原来的特征图进行scale操作了。很简单,就是通道权重相乘,原有特征向量为W×H×C,将SE模块计算出来的各通道权重值分别和原特征图对应通道的二维矩阵相乘,得出的结果输出。 -
SE模块首先对卷积得到的特征图进行Squeeze操作,得到channel级的全局特征,然后对全局特征进行Excitation操作,学习各个channel间的关系,也得到不同channel的权重,最后乘以原来的特征图得到最终特征。 -
SE模块是在channel维度上做attention或者gating操作,这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制那些不重要的channel特征。另外一点是SE模块是通用的,这意味着其可以嵌入到现有的网络架构中。
-
Larger convolution kernels
- 卷积核的大小往往会影响网络的最终性能。在mixnet中分析了不同大小的卷积核对网络性能的影响,最终在网络的同一层中混合了不同大小的卷积核。然而,这种混合会减慢模型的推理速度,因此尝试增加卷积核的大小,但尽量减少推理时间的增加。最后,将网络尾部卷积核的大小设置为5×5。
-
Larger dimensional 1 × 1 conv layer after GAP
- 在PP_LCNet中,间隙后网络的输出维数较小,直接连接最终的分类层将失去特征的组合。为了使网络具有更强的匹配能力,在间隙层和最终分类层之间插入了一个1280维的1x1conv,这在不增加推理时间的情况下为模型提供了更多的存储空间。
-
PP-PicoDet
-
PP_PicoDet是PaddleDetection开发的一系列新的目标检测模型。对于主干模型,使用了上述PP_LCNet,这有助于提高检测器的推理速度和映射。 -
对anchor-free策略在轻量型目标检测模型中的应用进行了探索;对骨干结构进行了增强并设计了一种轻量型Neck结构以提升模型的特征提取能力;对label assignment策略与损失函数进行了改进以促进更稳定、更高效的训练。通过上述优化,构建了一类实时目标检测器PP-PicoDet,它在移动端设备上取得了非常优异的性能。 -
对于颈部,将CSP网络与PAN-FPN相结合,开发了一种称为CSP-PAN的新FPN结构,这有助于增强特征图提取能力。用SimOTA,并在网络训练过程中使用改进的GFocal loss功能。 此外,还对PP-PicoDet进行了一些经验改进。例如,在FPN中使用5x5内核的深度卷积,而不是3x3,因为它可以将mAP提高0.5%,并且几乎不影响推理速度。更多细节可以在网上看到。对于主体检测任务,所有对象都被视为前景,因此标签列表中只有一个名为前景的类。 -
- FPN 高维度向低维度传递语义信息(大目标更明确)
- PAN 低维度向高维度再传递一次语义信息(小目标也更明确)
-
在实际应用中,海量的图像、视频特征不仅会消耗巨大的存储空间,而且检索时间极长,给图像识别的最后一公里设下路障。PP-ShiTu则是结合DeepHash和度量学习,甚至在检索库特征数量大于10万时,依然使得所需的存储空间减少32倍,检索速度提高5倍以上。
- 度量学习(metric learning)研究如何在一个特定的任务上学习一个距离函数,使得该距离函数能够帮助基于近邻的算法(kNN、k-means等)取得较好的性能。
- 深度度量学习(deep metric learning)是度量学习的一种方法,它的目标是学习一个从原始特征到低维稠密的向量空间(称之为嵌入空间,embedding space)的映射,使得同类对象在嵌入空间上使用常用的距离函数(欧氏距离、cosine距离等)计算的距离比较近,而不同类的对象之间的距离则比较远。深度度量学习在计算机视觉领域取得了非常多的成功的应用,比如人脸识别、人脸验证、图像检索、签名验证、行人重识别等。
-
除此以外PP-ShiTu使用的向量搜索模块Faiss,可以更好地适应多平台的需求(Linux, Windows, MacOs),为实际应用提供灵活选择。
Feature Extraction
-
图像识别的主要问题是如何从模型中提取更好的特征。因此,特征提取的能力直接影响图像识别的性能。在特征提取的训练阶段,使用度量学习方法来学习图像的特征。
-
Additive Angular Margin Loss (ArcMargin loss)
-
度量学习试图将数据映射到一个嵌入空间,在这个空间中,相似的数据靠得很近,而不同的数据相隔很远。在度量学习中,特征的质量取决于损失、主干、数据质量和数量以及训练策略。损失是度量学习中最重要的部分。 -
度量学习的损失分为两种类型,即基于损失分类的损失和基于配对的损失。由于改进版的基于分类的损失更为稳健,这类损失已被越来越多地使用。在PP-ShiTu中,使用ArcMargin损耗,这是基于Softmax损耗的改进。Arcmargin的损失,该损失使角度空间中的分类极限最大化,从而更好地提取和组织特征。 -
L
=
?
1
N
∑
i
=
1
N
l
o
g
e
s
(
c
o
s
(
θ
y
i
+
m
)
)
e
s
(
c
o
s
(
θ
y
i
+
m
)
)
+
∑
j
=
1
,
j
≠
y
i
n
e
s
?
c
o
s
θ
j
L=-\frac{1}{N}\sum_{i=1}^{N}log\frac{e^{s(cos(\theta_{y_i}+m))}}{e^{s(cos(\theta_{y_i}+m))}+\sum_{j=1,j\neq{y_i}}^{n}e^{s*cos\theta_j}}
L=?N1?i=1∑N?loges(cos(θyi??+m))+∑j=1,j?=yi?n?es?cosθj?es(cos(θyi??+m))? -
其中θj是权重和特征之间的角度。批次大小和类别号分别为N和n。m是目标角度
θ
y
i
θ_{yi}
θyi?上的角裕度惩罚,s是特征尺度。
-
Unified-Deep Mutual Learning (U-DML)
> >
-
原始训练模型的做法是让模型的softmax分布与真实标签进行匹配,而知识蒸馏方法是让student模型与teacher模型的softmax分布进行匹配。后者比前者具有这样一个优势:经过训练后的原模型,其softmax分布包含有一定的知识——真实标签只能告诉我们,某个图像样本是一辆宝马,不是一辆垃圾车,也不是一颗萝卜;而经过训练的softmax可能会告诉我们,它最可能是一辆宝马,不大可能是一辆垃圾车,但绝不可能是一颗萝卜。 -
知识蒸馏得到的soft label相当于对数据集的有效信息进行了统计,保留了类间的关联信息,剔除部分无效的冗余信息。 相比于label smoothing,模型在数据集上训练得到的soft label更加可靠。 -
蒸馏过程使用了学生网络和教师网络之间的特征映射距离。在学生网络特征图上执行转换,以保持特征图对齐。 为了避免教师模型训练过程过于耗时,本文在DML的基础上,提出了U-DML,在提取过程中对特征映射进行监督。
-
-
蒸馏过程有两个网络:学生网络和教师网络。它们具有完全相同的网络结构和不同的初始权重。其目标是,对于相同的输入图像,两个网络可以得到相同的输出,不仅对于预测结果,而且对于特征映射。 -
总损失函数由三部分组成:
- 边际损失。由于这两个网络的颈部和头部都是从零开始训练的,所以可以利用弧裕度损失来实现网络的收敛;
- DML损失。两个网络的最终输出分布预计相同,因此需要DML损耗以确保两个网络之间分布的一致性;
- 特征损失 。这两个网络的结构是相同的,因此它们的特征映射应该是相同的,特征丢失可以用来约束两个网络的中间特征映射距离。
-
L
o
s
s
a
r
c
=
A
r
c
m
a
r
g
i
n
(
S
h
o
u
t
,
g
t
)
+
A
r
c
m
a
r
g
i
n
(
T
h
o
u
t
,
g
t
)
Loss_{arc}=Arcmargin(S_{hout},gt)+Arcmargin(T_{hout},gt)
Lossarc?=Arcmargin(Shout?,gt)+Arcmargin(Thout?,gt)
- 其中
S
h
o
u
t
S_{hout}
Shout?表示学生网络的头部输出,
T
h
o
u
t
T_{hout}
Thout?表示教师网络的头部输出。gt提供输入图像的GroundTruth标签。
-
DML loss:在DML中,每个子网络的参数分别更新。在这里,为了简化训练过程,计算两个子网络之间的KL散度损失,并同时更新所有参数。DML损失如下所示。
-
L
o
s
s
d
m
l
=
K
L
(
S
p
o
u
t
∣
∣
T
p
o
u
t
)
+
K
L
(
T
p
o
u
t
∣
∣
P
p
o
u
t
)
2
Loss_{dml}=\frac{KL(S_{pout}||T_{pout})+KL(T_{pout}||P_{pout})}{2}
Lossdml?=2KL(Spout?∣∣Tpout?)+KL(Tpout?∣∣Ppout?)? -
其中KL(p||q)表示p和q的KL散度。Spout和Tpout可计算:
S
p
o
u
t
=
S
o
f
t
m
a
x
(
S
h
o
u
t
)
,
S
p
o
u
t
=
S
o
f
t
m
a
x
(
S
h
o
u
t
)
S_{pout}=Softmax(S_{hout}),S_{pout}=Softmax(S_{hout})
Spout?=Softmax(Shout?),Spout?=Softmax(Shout?) -
Feature loss:在训练过程中,希望学生网络的主干输出与教师网络的主干输出相同。因此,与Overhaul类似,特征损失用于蒸馏过程。损失的计算方法:
L
o
s
s
f
e
a
t
=
L
2
(
S
b
o
u
t
,
T
b
o
u
t
)
Loss_{feat}=L2(S_{bout},T_{bout})
Lossfeat?=L2(Sbout?,Tbout?) 。其中
S
b
o
u
t
S_{bout}
Sbout?表示学生网络的主干输出,
T
b
o
u
t
T_{bout}
Tbout?表示教师网络的主干输出。这里使用了均方误差损失。值得注意的是,对于特征损失,不需要进行特征映射变换,因为用于计算损失的两个特征映射完全相同 -
U-DML训练过程的总损失:
L
o
s
s
t
o
t
a
l
=
L
o
s
s
a
r
c
+
l
o
s
s
d
m
l
+
L
o
s
s
f
e
a
t
Loss_{total}=Loss_{arc}+loss_{dml}+Loss_{feat}
Losstotal?=Lossarc?+lossdml?+Lossfeat?。
-
DeepHash
- 实际应用中,海量的检索图像和视频特征数据库不仅会消耗巨大的存储空间,而且会导致检索时间过长,在某些应用场景中是不可接受的。移动设备上的存储空间有限,这对海量功能存储提出了进一步的挑战。考虑到这一点,除了PP _Shitu的度量学习功能,我们还集成了DeepHash功能,这有助于减少存储并加快检索 .
- DeepHash研究如何利用deep神经网络获取具有代表性的二值特征,deep神经网络使用位存储二值特征,并采用Hamming距离来度量两个特征向量之间的距离。
- 采用优化的DSHSD算法来获得用于商品识别的实用二进制特征。与实值模型相比,检索精度可能略有下降,但当搜索库规模大于10万时,库特征的存储空间可减少32倍,检索速度可提高5倍以上。
Vector Search
- 在做PQ之前,首先需要指定一个参数M,这个M就是指定向量要被切分成多少段,所以M一定要能整除向量的维度,在上图中M=4,所以向量库的每一个向量就被切分成了4段,然后把所有向量的第一段取出来做Clustering得到256(假如)个簇心,再把所有向量的第二段取出来做Clustering得到256个簇心,直至对所有向量的第N段做完Clustering,从而最终得到了256*M个簇心,做完Clustering就开始对所有向量做Assign操作。
- 这里的Assign就是把原来的N维的向量映射到M个数字,以N=128,M=4为例,首先把向量切成四段,然后对于每一段向量,都可以找到对应的最近的簇心 ID,4段向量就对应了4个簇心 ID,一个128维的向量就变成了一个由4个ID组成的向量,这样就可以完成了Assign操作的过程。
- 完成了PQ的Pre-train,就可以看看如何基于PQ做向量检索了。
- 同样是以N=128,M=4为例,对于每一个查询向量,以相同的方法把128维分成4段32维向量,然后计算每一段向量与之前预训练好的簇心的距离,得到一个4*256的表,就可以开始计算查询向量与库里面的向量的距离,而PQ优化的点就在这里,在计算查询向量和向量库向量的距离的时候,向量库的向量已经被量化成M个簇心 ID,而查询向量的M段子向量与各自的256个簇心距离已经预计算好了,所以在计算两个向量的时候只用查M次表,比如的库里的某个向量被量化成了[124, 56, 132, 222], 那么首先查表得到查询向量第一段子向量与其ID为124的簇心的距离,然后再查表得到查询向量第二段子向量与其ID为56的簇心的距离。最后就可以得到四个距离d1、d2、d3、d4,查询向量跟库里向量的距离d = d1+d2+d3+d4。所以在提出的例子里面,使用PQ只用4×256次128维向量距离计算加上4xN次查表,而最原始的暴力计算则有N次128维向量距离计算,很显然随着向量个数N的增加,后者相较于前者会越来越耗时。
Experiments
- Datasets
- 使用了很多不同场景的公共数据集来训练我们的模型,在主体检测训练过程中,使用了5个公共数据集:Objects365、COCO2017、iCartoonFace、LogoDet-3k和RPC。
- General Recognition:使用7个公共数据集,包括Aliproduct、GLDv2、VeRI Wild、LogoDet-3K、iCartoonFace、SOP、Inshop。这些数据集还用于一般训练、模型提取和深度散列。
- Test set :为了评估PP_ShiTu的速度,发布了一个由查询图像集和特征库组成的测试集。从互联网上收集了200幅图像作为查询集。查询数据集可以在GitHub存储库中找到。对于gallery,结合使用Products10k和从互联网下载的一些常见物品,并使用image gallery构建功能库。查询集中的每个图像至少包含一个gallery中的对象。
- Ablation study
- PP_LCNet的消融研究:为了测试模型的泛化能力,在整个模型设计过程中使用了具有挑战性的数据集,如ImageNet-1k。PPLCNet和其他有竞争力的轻量级机型之间的精度和速度比较。PP_LCNet在速度和准确性方面都具有显著优势,即使与MobileNetV3这样的竞争非常激烈的网络相比也是如此。
- 比较最先进的轻量级网络的分类精度。在批量大小为1且启用了MKLDNN的Intelr Xeonr Gold 6148处理器上测试的延迟,线程数为10。 (mkldnn的作用是为cpu运行网络加速;)
- Ablation study for U-DML:基于通用的PP_LCNet-2.5x识别模型,对U-DML进行了消融研究,并进行了一些实验。该训练策略与基本PP-LCNet-2.5x识别模型训练过程几乎相同,只是采用了蒸馏损失。
- 没有微调模型训练过程中的任何超参数,例如损失率。更重要的是,与标准训练过程(最终训练损失为2.64)相比,蒸馏模型更易于推广,收敛时间更长(学生网络的最终训练损失为2.75)。随着时间的推移,蒸馏模型的性能会更好。
- Ablation study for DeepHash:在DSHSD算法的基础上,结合其他DeepHash方法进行了实验。基于MobileNetv3的不同策略的一些结果。可以看出,通过标签平滑,可以进一步提高二进制特征表示能力。
- Inference time latency on test set
- 在测试集上,比较了PP-ShiTu和服务器模型的推理速度。服务器模型在Packerclas上发布,并使用ResNet-50主干网进行检测和特征提取。两款模型F1成绩均为0.3306。在CPU和GPU服务器上测试的两个模型的延迟。
- PP-ShiTu和服务器模型在测试集上的推理时间。在批处理大小为1且启用了MKLDNN的模型上测试的延迟,线程数为10。
|