作者: Sam(甄峰) sam_code@hotmail.com
0.
PULC方案简介:
图像分类是计算机视觉的基础算法之一。近年来骨干网络发展迅速,精度记录不断刷新。但实用性却有待提高。高精度模型体积大,运算慢。找到合适的模型后,还需要继续调参,费时费力。
PaddleClas为了解决以上问题,提出了实用轻量级图像分类解决方案(PULC, Practical
Ultra Lightweight Classification).
融合了骨干网络,数据增强,蒸馏等。可以自动训练得到轻量且高精度的图像分类模型。
1. PP-LCNet介绍:
在计算机视觉中,骨干网络的好坏直接影响视觉任务的好坏。这个评价包含推理速度和准确性。Paddle针对Intel
CPU以及其加速库MKLDNN设计了独特的骨干网络PP-LCNet.极大的提高了推理速度。
2.
PP-LCNet模型细节:
更好的激活函数
自从卷积神经网络使用了 ReLU 激活函数后,网络性能得到了大幅度提升,近些年 ReLU 激活函数的变体也相继出现,如
Leaky-ReLU、P-ReLU、ELU 等,2017 年,谷歌大脑团队通过搜索的方式得到了 swish
激活函数,该激活函数在轻量级网络上表现优异,在 2019 年,MobileNetV3 的作者将该激活函数进一步优化为
H-Swish,该激活函数去除了指数运算,速度更快,网络精度几乎不受影响。我们也经过很多实验发现该激活函数在轻量级网络上有优异的表现。所以在
PP-LCNet 中,我们选用了该激活函数。
合适的位置添加 SE 模块
SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模型的精度。但是在 Intel CPU
端,该模块同样会带来较大的延时,如何平衡精度和速度是我们要解决的一个问题。虽然在 MobileNetV3 等基于 NAS
搜索的网络中对 SE 模块的位置进行了搜索,但是并没有得出一般的结论,我们通过实验发现,SE
模块越靠近网络的尾部对模型精度的提升越大。
合适的位置添加更大的卷积核
在 MixNet
的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种
split-concat 范式的 MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。
GAP 后使用更大的 1x1 卷积层
在 GoogLeNet
之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致 GAP
后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的 1x1 卷积层(等同于 FC 层),GAP
后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。
2.2: PPLCNet模型:
在PPLCNet_x0_25.yaml中,指定了模型结构:
Arch:
name: PPLCNet_x0_25
具体模型结构在:
ppcls/arch/backbone/legendary_models/pplc_net.py中定义。
这里PaddleClas提供了一些backbone.
可以根据需要自行选择使用。如pp_lcnet_v2.py, pp_hgnet.py,
vgg.py, resnet.py等。
3.
PULC训练:
3.1: 数据准备:
PaddleClas使用txt格式的文件指定训练集和验证集。
格式为:
# 每一行采用"空格"分隔图像路径与标注
others\bg\noexpsqr1038_1.jpg 0
others\bg\noexpsqr1040_1.jpg 0
分别产生train.txt, val.txt作为训练集和验证集。
此外,建立: label_list.txt 描述分类名。
如:
other
fist
palm
在训练配置文件PPLCSmallNet_x0_25.yaml中指定train.txt和val.txt,label_list.txt文件。
3.2: 训练:
训练命令:
python ./tools/train.py -c
./myconfigs/PPLCSmallNet/PPLCSmallNet_x0_25.yaml
训练完成后,在output中,可以看到PPLCSmallNet_x0_25目录。
这是因为yaml中指定的:
output_dir: ./output/
Arch:
name: PPLCSmallNet_x0_25
其中,放有训练出的东西。
待研究:
SSLD预训练权重
EDA数据增强策略
SKL-UGI模型蒸馏
超参搜索
PaddleClas学习<二>图像分类介绍和训练
作者: Sam(甄峰) sam_code@hotmail.com
0. PULC方案简介:
图像分类是计算机视觉的基础算法之一。近年来骨干网络发展迅速,精度记录不断刷新。但实用性却有待提高。高精度模型体积大,运算慢。找到合适的模型后,还需要继续调参,费时费力。
PaddleClas为了解决以上问题,提出了实用轻量级图像分类解决方案(PULC, Practical Ultra Lightweight Classification). 融合了骨干网络,数据增强,蒸馏等。可以自动训练得到轻量且高精度的图像分类模型。
1. PP-LCNet介绍:
在计算机视觉中,骨干网络的好坏直接影响视觉任务的好坏。这个评价包含推理速度和准确性。Paddle针对Intel CPU以及其加速库MKLDNN设计了独特的骨干网络PP-LCNet.极大的提高了推理速度。
2. PP-LCNet模型细节:
更好的激活函数
自从卷积神经网络使用了 ReLU 激活函数后,网络性能得到了大幅度提升,近些年 ReLU 激活函数的变体也相继出现,如 Leaky-ReLU、P-ReLU、ELU 等,2017 年,谷歌大脑团队通过搜索的方式得到了 swish 激活函数,该激活函数在轻量级网络上表现优异,在 2019 年,MobileNetV3 的作者将该激活函数进一步优化为 H-Swish,该激活函数去除了指数运算,速度更快,网络精度几乎不受影响。我们也经过很多实验发现该激活函数在轻量级网络上有优异的表现。所以在 PP-LCNet 中,我们选用了该激活函数。
合适的位置添加 SE 模块
SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模型的精度。但是在 Intel CPU 端,该模块同样会带来较大的延时,如何平衡精度和速度是我们要解决的一个问题。虽然在 MobileNetV3 等基于 NAS 搜索的网络中对 SE 模块的位置进行了搜索,但是并没有得出一般的结论,我们通过实验发现,SE 模块越靠近网络的尾部对模型精度的提升越大。
合适的位置添加更大的卷积核
在 MixNet 的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种 split-concat 范式的 MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。
GAP 后使用更大的 1x1 卷积层
在 GoogLeNet 之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致 GAP 后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的 1x1 卷积层(等同于 FC 层),GAP 后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。
2.2: PPLCNet模型:
在PPLCNet_x0_25.yaml中,指定了模型结构:
Arch:
name: PPLCNet_x0_25
具体模型结构在:
ppcls/arch/backbone/legendary_models/pplc_net.py中定义。
这里PaddleClas提供了一些backbone. 可以根据需要自行选择使用。如pp_lcnet_v2.py, pp_hgnet.py, vgg.py, resnet.py等。
3. PULC训练:
3.1: 数据准备:
PaddleClas使用txt格式的文件指定训练集和验证集。
格式为:
# 每一行采用"空格"分隔图像路径与标注
others\bg\noexpsqr1038_1.jpg 0
others\bg\noexpsqr1040_1.jpg 0
分别产生train.txt, val.txt作为训练集和验证集。
此外,建立: label_list.txt 描述分类名。
如:
other
fist
palm
在训练配置文件PPLCSmallNet_x0_25.yaml中指定train.txt和val.txt,label_list.txt文件。
3.2: 训练:
训练命令:
python ./tools/train.py -c ./myconfigs/PPLCSmallNet/PPLCSmallNet_x0_25.yaml
训练完成后,在output中,可以看到PPLCSmallNet_x0_25目录。
这是因为yaml中指定的:
output_dir: ./output/
Arch:
name: PPLCSmallNet_x0_25
其中,放有训练出的东西。
待研究:
SSLD预训练权重
EDA数据增强策略
SKL-UGI模型蒸馏
超参搜索