提交 ff5f983c 编写于 作者: S sibo2rr

fix error

上级 b056b986
......@@ -48,8 +48,7 @@ PaddleClas 欢迎大家向 repo 中积极贡献代码,下面给出一些贡献
* 跳转到 [PaddleClas GitHub 首页](https://github.com/PaddlePaddle/PaddleClas),然后单击 Fork 按钮,生成自己目录下的仓库,比如 `https://github.com/USERNAME/PaddleClas`
<img src="../../images/quick_start/community/001_fork.png" width = "600" />
![](../../images/quick_start/community/001_fork.png)
* 将远程仓库 clone 到本地
......@@ -61,7 +60,7 @@ cd PaddleClas
clone 的地址可以从下面获取
<img src="../../images/quick_start/community/002_clone.png" width = "600" />
![](../../images/quick_start/community/002_clone.png)
<a name="1.2.2"></a>
#### 1.2.2 和远程仓库建立连接
......@@ -146,8 +145,7 @@ pre-commit
重复上述步骤,直到 pre-comit 格式检查不报错。如下所示。
<img src="../../images/quick_start/community/003_precommit_pass.png" width = "600" />
![](../../images/quick_start/community/003_precommit_pass.png)
使用下面的命令完成提交。
......@@ -178,10 +176,7 @@ git push origin new_branch
点击 new pull request,选择本地分支和目标分支,如下图所示。在 PR 的描述说明中,填写该 PR 所完成的功能。接下来等待 review,如果有需要修改的地方,参照上述步骤更新 origin 中的对应分支即可。
<div align="center">
<img src="../../images/quick_start/community/004_create_pr.png" width = "600" />
</div>
![](../../images/quick_start/community/004_create_pr.png)
<a name="1.2.9"></a>
#### 1.2.9 签署 CLA 协议和通过单元测试
......
......@@ -31,8 +31,7 @@
深度神经网络一般有较多的参数冗余,目前有几种主要的方法对模型进行压缩,减小其参数量。如裁剪、量化、知识蒸馏等,其中知识蒸馏是指使用教师模型(teacher model)去指导学生模型(student model)学习特定任务,保证小模型在参数量不变的情况下,得到比较大的性能提升,甚至获得与大模型相似的精度指标 [1]。 PaddleClas 融合已有的蒸馏方法 [2,3],提供了一种简单的半监督标签知识蒸馏方案(SSLD,Simple Semi-supervised Label Distillation),基于 ImageNet1k 分类数据集,在 ResNet_vd 以及 MobileNet 系列上的精度均有超过 3% 的绝对精度提升,具体指标如下图所示。
<img src="../../images/distillation/distillation_perform_s.jpg" width = "600" />
![](../../images/distillation/distillation_perform_s.jpg)
<a name="2"></a>
## 2. SSLD 蒸馏策略
......@@ -41,8 +40,7 @@
SSLD 的流程图如下图所示。
<img src="../../images/distillation/ppcls_distillation.png" width = "600" />
![](../../images/distillation/ppcls_distillation.png)
首先,我们从 ImageNet22k 中挖掘出了近 400 万张图片,同时与 ImageNet-1k 训练集整合在一起,得到了一个新的包含 500 万张图片的数据集。然后,我们将学生模型与教师模型组合成一个新的网络,该网络分别输出学生模型和教师模型的预测分布,与此同时,固定教师模型整个网络的梯度,而学生模型可以做正常的反向传播。最后,我们将两个模型的 logits 经过 softmax 激活函数转换为 soft label,并将二者的 soft label 做 JS 散度作为损失函数,用于蒸馏模型训练。下面以 MobileNetV3(该模型直接训练,精度为 75.3%)的知识蒸馏为例,介绍该方案的核心关键点(baseline 为 79.12% 的 ResNet50_vd 模型蒸馏 MobileNetV3,训练集为 ImageNet1k 训练集,loss 为 cross entropy loss,迭代轮数为 120epoch,精度指标为 75.6%)。
* 教师模型的选择。在进行知识蒸馏时,如果教师模型与学生模型的结构差异太大,蒸馏得到的结果反而不会有太大收益。相同结构下,精度更高的教师模型对结果也有很大影响。相比于 79.12% 的 ResNet50_vd 教师模型,使用 82.4% 的 ResNet50_vd 教师模型可以带来 0.4% 的绝对精度收益(`75.6%->76.0%`)。
......@@ -62,7 +60,7 @@ SSLD 的流程图如下图所示。
* SSLD 蒸馏方案的一大特色就是无需使用图像的真值标签,因此可以任意扩展数据集的大小,考虑到计算资源的限制,我们在这里仅基于 ImageNet22k 数据集对蒸馏任务的训练集进行扩充。在 SSLD 蒸馏任务中,我们使用了 `Top-k per class` 的数据采样方案 [3] 。具体步骤如下。
* 训练集去重。我们首先基于 SIFT 特征相似度匹配的方式对 ImageNet22k 数据集与 ImageNet1k 验证集进行去重,防止添加的 ImageNet22k 训练集中包含 ImageNet1k 验证集图像,最终去除了 4511 张相似图片。部分过滤的相似图片如下所示。
<img src="../../images/distillation/22k_1k_val_compare_w_sift.png" width = "600" />
![](../../images/distillation/22k_1k_val_compare_w_sift.png)
* 大数据集 soft label 获取,对于去重后的 ImageNet22k 数据集,我们使用 `ResNeXt101_32x16d_wsl` 模型进行预测,得到每张图片的 soft label 。
* Top-k 数据选择,ImageNet1k 数据共有 1000 类,对于每一类,找出属于该类并且得分最高的 `k` 张图片,最终得到一个数据量不超过 `1000*k` 的数据集(某些类上得到的图片数量可能少于 `k` 张)。
......
......@@ -44,15 +44,15 @@
常见服务器端模型的精度指标与其预测耗时的变化曲线如下图所示。
<img src="../../images/models/V100_benchmark/v100.fp32.bs1.main_fps_top1_s.png" width="800">
![](../../images/models/V100_benchmark/v100.fp32.bs1.main_fps_top1_s.png)
常见移动端模型的精度指标与其预测耗时的变化曲线如下图所示。
<img src="../../images/models/mobile_arm_top1.png" width="800">
![](../../images/models/mobile_arm_top1.png)
部分VisionTransformer模型的精度指标与其预测耗时的变化曲线如下图所示.
<img src="../../images/models/V100_benchmark/v100.fp32.bs1.visiontransformer.png" width="800">
![](../../images/models/V100_benchmark/v100.fp32.bs1.visiontransformer.png)
<a name="2"></a>
......
......@@ -19,20 +19,17 @@
**PACT 量化(PArameterized Clipping acTivation**是一种新的量化方法,该方法通过在量化激活值之前去掉一些离群点,将模型量化带来的精度损失降到最低,甚至比原模型准确率更高。提出方法的背景是作者发现:“在运用权重量化方案来量化 activation 时,激活值的量化结果和全精度结果相差较大”。作者发现,activation 的量化可能引起的误差很大(相较于 weight 基本在 0 到 1 范围内,activation 的值的范围是无限大的,这是 RELU 的结果),所以提出**截断式 RELU** 的激活函数。该截断的上界,即$α$ 是可学习的参数,这保证了每层能够通过训练学习到不一样的量化范围,最大程度降低量化带来的舍入误差。其中量化的示意图如下图所示,**PACT** 解决问题的方法是,不断裁剪激活值范围,使得激活值分布收窄,从而降低量化映射损失。**PACT** 通过对激活数值做裁剪,从而减少激活分布中的离群点,使量化模型能够得到一个更合理的量化 scale,降低量化损失。
<img src="../../images/algorithm_introduction/quantization.jpg" width = "600" />
![](../../images/algorithm_introduction/quantization.jpg)
**PACT** 量化公式如下:
<img src="../../images/algorithm_introduction/quantization_formula.png" width = "800" height="100"/>
![](../../images/algorithm_introduction/quantization_formula.png)
可以看出 PACT 思想是用上述量化代替 *ReLU* 函数,对大于零的部分进行一个截断操作,截断阈值为$a$。但是在*PaddleSlim*中对上述公式做了进一步的改进,其改进如下:
<img src="../../images/algorithm_introduction/quantization_formula_slim.png" width = "550" height="120"/>
![](../../images/algorithm_introduction/quantization_formula_slim.png)
经过如上改进后,在激活值和待量化的 OP(卷积,全连接等)之间插入 *PACT* 预处理,不只对大于 0 的分布进行截断,同时也对小于 0 的部分做同样的限制,从而更好地得到待量化的范围,降低量化损失。同时,截断阈值是一个可训练的参数,在量化训练过程中,模型会自动的找到一个合理的截断阈值,从而进一步降低量化精度损失。
......@@ -48,8 +45,7 @@
基于此,**FPGM**利用层中 filter 的几何中心特性,由于那些靠近中心的 filter 可以被其它的表达,因而可以将其剔除,从而避免了上面提到的两点剪枝条件,从信息的冗余度出发,而不是选择范数少的进行剪枝。下图展示了 **FPGM** 方法与之前方法的不同,具体细节请详看[论文](https://openaccess.thecvf.com/content_CVPR_2019/papers/He_Filter_Pruning_via_Geometric_Median_for_Deep_Convolutional_Neural_Networks_CVPR_2019_paper.pdf)
<img src="../../images/algorithm_introduction/fpgm.png" width = "600" />
![](../../images/algorithm_introduction/fpgm.png)
......
......@@ -28,8 +28,7 @@
**A**:
ResNet_va 至 vd 的结构如下图所示,ResNet 最早提出时为 va 结构,在降采样残差模块这个部分,在左边的特征变换通路中(Path A),第一个 1x1 卷积部分就行了降采样,从而导致信息丢失(卷积的 kernel size 为 1,stride 为 2,输入特征图中 有部分特征没有参与卷积的计算);在 vb 结构中,把降采样的步骤从最开始的第一个 1x1 卷积调整到中间的 3x3 卷积中,从而避免了信息丢失的问题,PaddleClas 中的 ResNet 模型默认就是 ResNet_vb;vc 结构则是将最开始这个 7x7 的卷积变成 3 个 3x3 的卷积,在感受野不变的情况下,计算量和存储大小几乎不变,而且实验证明精度相对于 vb 结构有所提升;vd 结构是修改了降采样残差模块右边的特征通路(Path B)。把降采样的过程由平均池化这个操作去替代了,这一系列的改进(va->vd),几乎没有带来新增的预测耗时,结合适当的训练策略,比如说标签平滑以及 mixup 数据增广,精度可以提升高达 2.7%。
<img src="../../images/faq/ResNet_vabcd_structure.png" width="800">
![](../../images/faq/ResNet_vabcd_structure.png)
### Q1.4 如果确定使用 ResNet 系列模型,怎么根据实际的场景需求选用不同的模型呢?
**A**:
......@@ -38,16 +37,13 @@ ResNet 系列模型中,相比于其他模型,ResNet_vd 模型在预测速度
* 精度-预测速度变化曲线
<img src="../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.png" width="800">
![](../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.png)
* 精度-params 变化曲线
<img src="../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.params.png" width="800">
![](../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.params.png)
* 精度-flops 变化曲线
<img src="../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.flops.png" width="800">
![](../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.flops.png)
### Q1.5 在网络中的 block 里 conv-bn-relu 是固定的形式吗?
**A**: 在 batch-norm 出现之前,主流的卷积神经网络的固定形式是 conv-relu。在现阶段的卷积神经网络中,conv-bn-relu 是大部分网络中 block 的固定形式,这样的设计是相对鲁棒的结构,此外,DenseNet 中的 block 选用的是 bn-relu-conv 的形式,ResNet-V2 中也使用的是这种组合方式。在 MobileNetV2 中,为了不丢失信息,部分 block 中间的层没有使用 relu 激活函数,选用的是 conv-bn 的形式。
......@@ -156,14 +152,14 @@ AMP:
* 然而 *HRNet* 的作者认为这种逐步降低空间分辨率的设计思想并不适合目标检测(图像区域层次的分类任务)、语义分割(图像像素层次的分类任务)等场景,因为空间分辨率在逐步降低的过程中,会丢失很多信息,最终学习得到的特征难以表达原始图像在高空间分辨率的信息,而区域层次分类任务和像素层次分类任务都对空间精度十分敏感。
* 因此 *HRNet* 的作者提出了并联不同空间分辨率特征图的思想,与此相对,*VGG* 等神经网络则是通过不同的卷积池化层来串联不同空间分辨率的特征图。并且,*HRNet* 通过连接同等深度、不同空间分辨率的特征图,使得不同空间分辨率特征图的信息可以得到充分交换,具体的网络结构如下图所示。
<img src="../../images/faq/HRNet.png" width="800">
<img alt="../../images/faq/HRNet.png" src="../../images/faq/HRNet.png" width="800">
### Q4.3: 在 HRNet 中,对于不同空间分辨率的特征图之间,是如何建立连接的?
**A**:
* 首先,在 *HRNet* 中,对特征图使用 *stride**2**3 × 3* 卷积,可以得到低空间分辨率但是为度更高的特征图;而对低空间分辨率特征图先使用 *1 × 1* 卷积进行通道数匹配,再使用最近邻插值的方式进行上采样,即可得到与高空间分辨率特征图相同空间分辨率、通道数的特征图;而对于相同空间分辨率的特征图,直接进行恒等映射即可。具体如下图所示。
<img src="../../images/faq/HRNet_block.png" width="800">
![](../../images/faq/HRNet_block.png)
### Q4.4: 模型中的“SE”表示什么意思?
......@@ -172,8 +168,7 @@ AMP:
### Q4.5: SE 结构具体如何实现的?
<img src="../../images/faq/SE_structure.png" width="800">
![](../../images/faq/SE_structure.png)
**A**:
* *SE*结构具体如上图所示,首先,*Ftr* 表示常规的卷积操作,*X**U* 则是 *Ftr* 的输入与输出的特征图,在得到特征图*U*后,使用 *Fsq**Fex* 操作求得 *scale* 向量,*scale* 向量维度为 *C*,与 *U* 通道数相同,因此可以通过乘积的方式作用到 *U* 上,进而得到 *X~*
* 具体地,*Fsq**Global Average Pooling* 操作,*SENet* 作者将其称之为 *Squeeze*,因为该操作可以将 *U**C × H × W* 压缩到 *C × 1 × 1*,对 *Fsq* 的输出再做 *Fex* 操作。
......
......@@ -98,23 +98,23 @@ ACNet 意为“Asymmetric Convolution Block”,即为非对称卷积模块,
在训练中,通过 ACB 结构,模型的网络宽度得到了提高,利用 `1*d``d*1` 的两个非对称卷积核提取得到更多的特征用于丰富 `d*d` 卷积核提取的特征图的信息。而在推理阶段,这种设计思想并没有带来额外的参数与计算开销。如下图所示,分别是用于训练阶段和部署推理阶段的卷积核形式。
<img src="../../images/faq/TrainingtimeACNet.png" width="400">
![](../../images/faq/TrainingtimeACNet.png)
<img src="../../images/faq/DeployedACNet.png" width="400">
![](../../images/faq/DeployedACNet.png)
文章作者的实验表明,通过在原有网络模型训练中使用 ACNet 结构可以显著提高模型能力,原作者对此有如下解释:
1. 实验表明,对于一个 `d*d` 的卷积核,相对于消除卷积核角落位置(如上图中卷积核的 `corners` 位置)的参数而言,消除骨架位置(如上图中卷积核的 `skeleton` 位置)的参数会给模型精度带来更大的影响,因此卷积核骨架位置的参数要更为重要,而 ACB 结构中的两个非对称卷积核增强了方形卷积核骨架位置参数的权重,使之作用更为显著。这种相加是否会因正负数抵消作用而减弱骨架位置的参数作用,作者通过实验发现,网络的训练总是会向着提高骨架位置参数作用的方向发展,并没有出现正负数抵消而减弱的现象。
2. 非对称卷积核对于翻转的图像具有更强的鲁棒性,如下图所示,水平的非对称卷积核对于上下翻转的图像具有更强的鲁棒性。对于翻转前后图像中语义上的同一位置,非对称卷积核提取的特征图是相同的,这一点要强于方形卷积核。
<img src="../../images/faq/HorizontalKernel.png" width="400">
![](../../images/faq/HorizontalKernel.png)
### Q3.3: RepVGG 的创新点主要在哪里?
**A**
通过 Q3.1 与 Q3.2,我们可以大胆想到,是否可以借鉴 ACNet 将训练阶段与推理阶段解耦,并且训练阶段使用多分支结构,推理阶段使用 Plain 结构,这也就是 RepVGG 的创新点。下图为 ResNet、RepVGG 训练和推理阶段网络结构的对比。
<img src="../../images/faq/RepVGG.png" width="400">
![](../../images/faq/RepVGG.png)
首先训练阶段的 RepVGG 采用多分支结构,可以看作是在传统 VGG 网络的基础上,增加了 `1*1` 卷积和恒等映射的残差结构,而推理阶段的 RepVGG 则退化为 VGG 结构。训练阶段 RepVGG 到推理阶段 RepVGG 的网络结构转换使用“结构重参数化”技术实现。
......@@ -125,7 +125,7 @@ ACNet 意为“Asymmetric Convolution Block”,即为非对称卷积模块,
**A**
通过上面的了解,可以简单理解 RepVGG 是更为极端的 ACNet。ACNet 中的 re-parameters 操作如下图所示:
<img src="../../images/faq/ACNetReParams.png" width="400">
![](../../images/faq/ACNetReParams.png)
观察上图,以其中的 `conv2` 为例,该非对称卷积可以视为 `3*3` 的方形卷积核,只不过该方形卷积核的上下六个参数为 `0``conv3` 同理。并且,`conv1``conv2``conv3` 的结果相加,等同于三个卷积核相加再做卷积,以 `Conv` 表示卷积操作,`+`表示矩阵的加法操作,则:`Conv1(A)+Conv2(A)+Conv3(A) == Convk(A)`,其中 `Conv1``Conv2``Conv3` 的卷积核分别为 `Kernel1``kernel2``kernel3`,而 `Convk` 的卷积核为 `Kernel1 + kernel2 + kernel3`
......@@ -137,7 +137,7 @@ RepVGG 网络与 ACNet 同理,只不过 ACNet 的 `1*d` 非对称卷积变成
影响模型计算速度的因素有很多,参数量只是其中之一。具体来说,在不考虑硬件差异的前提下,模型的计算速度可以参考以下几个方面:
1. 参数量:用于衡量模型的参数数量,模型的参数量越大,模型在计算时对内存(显存)的容量要求一般也更高。但内存(显存)占用大小不完全取决于参数量。如下图中,假设输入特征图内存占用大小为 `1` 个单位,对于左侧的残差结构而言,由于需要记录两个分支的运算结果,然后再相加,因此该结构在计算时的内存峰值占用是右侧 Plain 结构的两倍。
<img src="../../images/faq/MemoryOccupation.png" width="400">
![](../../images/faq/MemoryOccupation.png)
2. 浮点运算数量(FLOPs):注意与每秒浮点运算次数(FLOPS)相区分。FLOPs 可以简单理解为计算量,通常用来衡量一个模型的计算复杂度。
以常见的卷积操作为例,在不考虑 batch size、激活函数、stride 操作、bias 的前提下,假设 input future map 尺寸为 `Min*Min`,通道数为 `Cin`,output future map 尺寸为 `Mout*Mout`,通道数为 `Cout`,conv kernel 尺寸为 `K*K`,则进行一次卷积的 FLOPs 可以通过下述方式计算:
......@@ -185,17 +185,17 @@ RepVGG 网络与 ACNet 同理,只不过 ACNet 的 `1*d` 非对称卷积变成
* (1)不定长度的顺序输入,因为它是 RNN 结构,一句话,单词数不一样。如果是 NLP 场景,换词的顺序不太过于影响语义,但是图像换了不同区域的位置,不同区域连接顺序不同,将造成极大理解偏差。
* (2)单个 patch 位置信息通过变换成一个维度固定的向量,Encoder 输入是 patch 像素信息 embedding,与一些固定位置的向量 concate,合成一个维度固定的向量和位置信息在其中。
<img src="../../images/faq/Transformer_input.png" width="400">
![](../../images/faq/Transformer_input.png)
3. 考虑以下问题:怎样将一张图片传给 encoder?
* 如下图所示。假设输入图片是[224,224,3],按照顺序从左到右,从上到下,切分成很多个 patch,patch 大小可以为[p,p,3](p 取值可以是 16,32),对其使用 Linear Projection of Flattened Patches 模块转成特征向量,并 concat 一个位置向量,传入 Encoder 中。
<img src="../../images/faq/ViT_structure.png" width="400">
![](../../images/faq/ViT_structure.png)
4. 如上图,给定一个 `H×W×C` 的图像以及区块大小 P,可以把图像划分为 `N``P×P×C` 的区块,`N=H×W/(P×P)`。得到区块后要使用线性变换转为 D 维特征向量,再加上位置编码向量即可。和 BERT 类似,ViT 在序列之前也加入了一个分类标志位,记为 `[CLS]`。ViT 输入序列 `z` 如下面的公式所示,其中 `x` 表示一个图像区块。
<img src="../../images/faq/ViT.png" width="400">
![](../../images/faq/ViT.png)
5. ViT 模型和 Transformer 基本一样,输入序列传入 ViT,然后利用 `[CLS]` 标志位的最终输出特征进行分类。ViT 主要由 MSA(多头自注意力)和 MLP(两层使用 GELU 激活函数的全连接网络)组成,在 MSA 和 MLP 之前加上 LayerNorm 和残差连接。
......
......@@ -113,7 +113,7 @@ w_t+1 = w_t - v_t+1
```
其中,`m` 即为动量 `momentum`,表示累积动量的加权值,一般取 `0.9`,当取值小于 `1` 时,则越早期的梯度对当前的影响越小,例如,当动量参数 `m``0.9` 时,在 `t` 时刻,`t-5` 的梯度加权值为 `0.9 ^ 5 = 0.59049`,而 `t-2` 时刻的梯度加权值为 `0.9 ^ 2 = 0.81`。因此,太过“久远”的梯度信息对当前的参考意义很小,而“最近”的历史梯度信息对当前影响更大,这也是符合直觉的。
<img src="../../images/faq/momentum.jpeg" width="400">
![](../../images/faq/momentum.jpeg)
通过引入动量的概念,在参数更新时考虑了历史更新的影响,因此可以加快收敛速度,也改善了 `SGD` 优化器带来的损失(cost、loss)震荡问题。
......
......@@ -36,6 +36,7 @@
## 3. 通用识别模型
在 PP-Shitu 中, 我们采用 [PP_LCNet_x2_5](../models/PP-LCNet.md) 作为骨干网络 Neck 部分选用 Linear Layer, Head 部分选用 [ArcMargin](../../../ppcls/arch/gears/arcmargin.py),Loss 部分选用 CELoss,详细的配置文件见[通用识别配置文件](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml)。其中,训练数据为如下 7 个公开数据集的汇总:
| 数据集 | 数据量 | 类别数 | 场景 | 数据集地址 |
| :------------: | :-------------: | :-------: | :-------: | :--------: |
| Aliproduct | 2498771 | 50030 | 商品 | [地址](https://retailvisionworkshop.github.io/recognition_challenge_2020/) |
......@@ -48,9 +49,11 @@
| **Total** | **5M** | **185K** | ---- | ---- |
最终的模型效果如下表所示:
| 模型 | Aliproduct | VeRI-Wild | LogoDet-3K | iCartoonFace | SOP | Inshop | Latency(ms) |
| :----------: | :---------: | :-------: | :-------: | :--------: | :--------: | :--------: | :--------: |
PP-LCNet-2.5x | 0.839 | 0.888 | 0.861 | 0.841 | 0.793 | 0.892 | 5.0
PP-LCNet-2.5x | 0.839 | 0.888 | 0.861 | 0.841 | 0.793 | 0.892 | 5.0
* 采用的评测指标为:`Recall@1`
* 速度评测机器的 CPU 具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz`
* 速度指标的评测条件为: 开启 MKLDNN, 线程数设置为 10
......
......@@ -134,7 +134,7 @@ pip install -r requirements.txt
我们使用 `configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml` 配置进行训练,配置文件摘要如下:
<img src='../../images/det/PaddleDetection_config.png' width='400'/>
![](../../images/det/PaddleDetection_config.png)
从上图看到 `ppyolov2_r50vd_dcn_365e_coco.yml` 配置需要依赖其他的配置文件,这些配置文件的含义如下:
......
......@@ -9,7 +9,7 @@
值得注意的是,为了更好是适配性,目前版本,`PaddleClas` 中暂时**只使用 CPU 进行向量检索**
<img src="../../images/structure.jpg" width = "800" />
![](../../images/structure.jpg)
如上图中所示,向量检索部分,在整个 `PP-ShiTu` 系统中有两部分内容
......
......@@ -293,6 +293,6 @@ sh tools/run.sh
* 最终屏幕上会输出结果,如下图所示。
<img src="../../images/inference_deployment/cpp_infer_result.png" width="600">
![](../../images/inference_deployment/cpp_infer_result.png)
其中 `class id` 表示置信度最高的类别对应的 id,score 表示图片属于该类别的概率。
......@@ -270,7 +270,7 @@ export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH
运行效果如下:
<img src="../../images/inference_deployment/lite_demo_result.png" width="600">
![](../../images/inference_deployment/lite_demo_result.png)
<a name="3"></a>
## 3. FAQ
......
......@@ -40,7 +40,7 @@ pip3 install dist/*
## 2. 快速开始
* 使用 `ResNet50` 模型,以下图(`PaddleClas/docs/images/inference_deployment/whl_demo.jpg`)为例进行说明。
<img src="../../images/inference_deployment/whl_demo.jpg" width = "400" />
![](../../images/inference_deployment/whl_demo.jpg)
* 在 Python 代码中使用
......
......@@ -15,6 +15,6 @@
- 数据增广:支持 AutoAugment 、 Cutout 、 Cutmix 等 8 种数据增广算法详细介绍、代码复现和在统一实验环境下的效果评估。
<img src="../../images/recognition.gif" width = "400" />
![](../../images/recognition.gif)
更多关于图像识别快速体验、算法详解、模型训练评估与预测部署方法,请参考[首页 README 文档教程](../../../README_ch.md)
......@@ -29,14 +29,13 @@
## 2. 介绍
近年来,有很多轻量级的骨干网络问世,尤其最近两年,各种 NAS 搜索出的网络层出不穷,这些网络要么主打 FLOPs 或者 Params 上的优势,要么主打 ARM 设备上的推理速度的优势,很少有网络专门针对 Intel CPU 做特定的优化,导致这些网络在 Intel CPU 端的推理速度并不是很完美。基于此,我们针对 Intel CPU 设备以及其加速库 MKLDNN 设计了特定的骨干网络 PP-LCNet,比起其他的轻量级的 SOTA 模型,该骨干网络可以在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。与其他模型的对比图如下。
<img src="../../images/PP-LCNet/PP-LCNet-Acc.png" width="500" height="400"/>
![](../../images/PP-LCNet/PP-LCNet-Acc.png)
<a name="3"></a>
## 3. 方法
网络结构整体如下图所示。
<img src="../../images/PP-LCNet/PP-LCNet.png" width="700" height="400"/>
![](../../images/PP-LCNet/PP-LCNet.png)
我们经过大量的实验发现,在基于 Intel CPU 设备上,尤其当启用 MKLDNN 加速库后,很多看似不太耗时的操作反而会增加延时,比如 elementwise-add 操作、split-concat 结构等。所以最终我们选用了结构尽可能精简、速度尽可能快的 block 组成我们的 BaseNet(类似 MobileNetV1)。基于 BaseNet,我们通过实验,总结了四条几乎不增加延时但是可以提升模型精度的方法,融合这四条策略,我们组合成了 PP-LCNet。下面对这四条策略一一介绍:
<a name="3.1"></a>
......
......@@ -20,11 +20,9 @@
* Intel CPU 的评估环境基于 Intel(R) Xeon(R) Gold 6148。
* GPU 评估环境基于 V100 和 TensorRT。
<img src="../../images/models/V100_benchmark/v100.fp32.bs1.main_fps_top1_s.png" width="800">
![](../../images/models/V100_benchmark/v100.fp32.bs1.main_fps_top1_s.png)
<img src="../../images/models/mobile_arm_top1.png" width="800">
<img src="../../images/models/V100_benchmark/v100.fp32.bs1.visiontransformer.png" width="800">
![](../../images/models/V100_benchmark/v100.fp32.bs1.visiontransformer.png)
> 如果您觉得此文档对您有帮助,欢迎 star 我们的项目:[https://github.com/PaddlePaddle/PaddleClas](https://github.com/PaddlePaddle/PaddleClas)
......
......@@ -5,6 +5,5 @@
:maxdepth: 2
config_description.md
train_strategy.md
classification.md
recognition.md
......@@ -10,7 +10,7 @@
其中特征库,需要利用已经标注好的图像数据集提前建立。完整的图像识别系统,如下图所示
<img src="../../images/structure.jpg" width = "600" />
![](../../images/structure.jpg)
体验整体图像识别系统,或查看特征库建立方法,详见[图像识别快速开始文档](../quick_start/quick_start_recognition.md)。其中,图像识别快速开始文档主要讲解整体流程的使用过程。以下内容,主要对上述三个步骤的训练部分进行介绍。
首先,请参考[安装指南](../installation/install_paddleclas.md)配置运行环境。
......
......@@ -51,4 +51,4 @@ python3 tools/train.py -c config.yaml
在启动 VisualDL 后,即可在浏览器中查看训练过程,输入地址 `127.0.0.1:8840`
<img src="../../images/VisualDL/train_loss.png" width="400">
![](../../images/VisualDL/train_loss.png)
......@@ -78,7 +78,7 @@ unzip flowers102.zip
flowers102数据集的图像文件存放在 `dataset/flowers102/jpg` 目录中,图像示例如下:
<img src="../../images/quick_start/Examples-Flower-102.png" width = "800" />
![](../../images/quick_start/Examples-Flower-102.png)
返回 `PaddleClas` 根目录:
......@@ -151,7 +151,7 @@ python tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml
训练完成后,验证集的`Top1 Acc`曲线如下所示,最高准确率为0.2735。训练精度曲线下图所示
<img src="../../images/quick_start/r50_vd_acc.png" width = "800" />
![](../../images/quick_start/r50_vd_acc.png)
<a name='4.2.2'></a>
......@@ -167,7 +167,7 @@ python tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml -o Arch.pr
验证集的 `Top1 Acc` 曲线如下所示,最高准确率为 `0.9402`,加载预训练模型之后,flowers102 数据集精度大幅提升,绝对精度涨幅超过 65%。
<img src="../../images/quick_start/r50_vd_pretrained_acc.png" width = "800" />
![](../../images/quick_start/r50_vd_pretrained_acc.png)
<a name='5'></a>
......
......@@ -161,7 +161,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.u
待检索图像如下所示。
<img src="../../images/recognition/drink_data_demo/test_images/nongfu_spring.jpeg" width = "400" />
![](../../images/recognition/drink_data_demo/test_images/nongfu_spring.jpeg)
最终输出结果如下。
......@@ -174,7 +174,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.u
检测的可视化结果也保存在 `output` 文件夹下,对于本张图像,识别结果可视化如下所示。
<img src="../../images/recognition/drink_data_demo/output/nongfu_spring.jpeg" width = "400" />
![](../../images/recognition/drink_data_demo/output/nongfu_spring.jpeg)
<a name="基于文件夹的批量识别"></a>
......@@ -223,7 +223,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.i
待检索图像如下所示。
<img src="../../images/recognition/drink_data_demo/test_images/mosilian.jpeg" width = "400" />
![](../../images/recognition/drink_data_demo/test_images/mosilian.jpeg)
输出结果为空。
......@@ -274,7 +274,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.i
最终识别结果为`光明_莫斯利安`,识别正确,识别结果可视化如下所示。
<img src="../../images/recognition/drink_data_demo/output/mosilian.jpeg" width = "400" />
![](../../images/recognition/drink_data_demo/output/mosilian.jpeg)
<a name="4"></a>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册