PULC_train.md 6.3 KB
Newer Older
W
weishengyu 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
## 超轻量图像分类方案PULC
### 0. PULC方案简介
图像分类是计算机视觉的基础算法之一,是企业应用中最常见的算法,也是许多CV应用的重要组成部分。
近年来,骨干网络模型发展迅速,Imagenet的精度纪录被不断刷新。然而,这些模型在实用场景的表现有时却不尽如人意。
一方面,精度高的模型往往体积大,运算慢,常常难以满足实际部署需求;另一方面,选择了合适的模型之后,往往还需要经验丰富的工程师进行调参,
费时费力。PaddleClas为了解决企业应用难题,让分类模型的训练和调参更加容易,总结推出了实用轻量图像分类解决方案PULC。
PULC融合了骨干网络、数据增广、蒸馏等多种前沿算法,可以自动训练得到轻量且高精度的图像分类模型。
方案在人、车、OCR等方向的多个场景中均验证有效,用超轻量模型就可实现与SwinTransformer模型接近的精度,预测速度提高50倍。
<div align="center">
<img src="https://user-images.githubusercontent.com/19523330/172054976-e12d2c9b-439f-469d-b520-56bb5c3e6215.png"/>
</div>

方案主要包括4部分,分别是:PP-LCNet轻量级骨干网络、SSLD预训练权重、数据增强策略集成和SKL-UGI知识蒸馏算法。此外,我们还采用了超参搜索的方法,高效优化训练中的超参数。
下面,我们以有人/无人场景为例,对方案进行说明。

**注**:针对一些特定场景,我们提供了基础的训练文档供参考,例如[有人/无人分类模型](PULC_person_exists.md)等,您可以在[这里]()找到这些文档。
如果这些文档中的方法不能满足您的需求,或者您需要自定义训练任务,您可以参考本文档。

### 1. 数据准备
#### 1.1 数据集格式说明

PaddleClas 使用 `txt` 格式文件指定训练集和测试集,以有人无人场景为例,其中 `train_list.txt``val_list.txt` 的格式形如:

```shell
# 每一行采用"空格"分隔图像路径与标注
train/1.jpg 0
train/10.jpg 1
...
```
如果您想获取更多常用分类数据集的信息,可以参考文档[常见分类说明](../data_preparation/classification_dataset.md)

// todo@cuicheng v2.4.1 1.2有人无人场景数据获取代码。整理obj365数据提取的数据并说明。


#### 1.2 标注文件生成
如果您已经有实际场景中的数据,那么按照上节的格式进行标注即可。这里,我们提供了一个快速生成数据的脚本,您只需要将不同类别的数据分别放在文件夹中,运行脚本即可生成标注文件。 
// todo 数据脚本。 

### 2. 使用标准分类配置进行训练
#### 2.1 骨干网络PP-LCNet
PULC采用了轻量骨干网络PP-LCNet,相比同精度竞品速度快50%,您可以在[这里](../models/PP-LCNet.md)找到详细介绍。
直接使用PP-LCNet训练的命令为:

**todo**

为了方便性能对比,我们也提供了大模型SwinTransformer和轻量模型MobileNet的配置文件,您可以使用命令训练:

**todo**

训练得到的模型精度对比如下表。从中可以看出,LCNet的速度比SwinTransformer快很多,但是精度也略低。
下面我们通过一系列优化来提高PP-LCNet模型的精度。

#### 2.2 SSLD预训练权重
SSLD是百度自研的半监督蒸馏算法,在ImageNet数据集上,模型精度可以提升3-7个点,您可以在[这里](../algorithm_introduction/#2)找到详细介绍。
我们发现,使用SSLD预训练权重,可以提升应用分类模型的精度。此外,使用SSLD预训练权重也有助于其他策略精度提升。
此外,根据**todo**,在训练中使用略低一点的分辨率,可以有效提升模型精度。同时,我们也对学习率进行了优化。
基于以上三点改进,我们训练得到模型精度为**todo**,提升**todo**

#### 2.3 EDA数据增广策略
数据增广是视觉算法中常用的优化策略,可以对模型精度有明显提升。除了传统的RandomCrop,RandomFlip等方法之外,我们还应用了RandomAugment和RandomErasing。
您可以在[这里](../advanced_tutorials/DataAugmentation.md)找到详细介绍。
由于这两种数据增强对图片的修改较大,使任务变难,在一些小数据集上可能会导致模型欠拟合,我们将这两种方法启用的概率设为10%。
基于以上改进,我们训练得到模型精度为**todo**,提升**todo**

#### 2.4 SKL-UGI模型蒸馏
模型蒸馏是一种可以有效提升小模型精度的方法,您可以在[这里](todo@ruoyu)找到详细介绍。
我们选择ResNet101作为教师模型进行蒸馏。
**todo @cuicheng,对lr_mult进行说明**
基于以上改进,我们训练得到模型精度为**todo**,提升:**todo。
#### 2.5 总结
经过以上方法优化,PP-LCNet最终精度达到**todo**,达到了大模型的精度水平。我们将实验结果总结如下表:
**todo**
我们在其他9个场景中也使用了同样的优化策略,得到如下结果:
**todo**

从结果可以看出,PULC优化方法在多个应用场景中均可提升模型精度。虽然并非每种方法都有正向收益,但是使用PULC可以大大减少模型优化的工作量,快速得到精度较高的模型。

### 3. 超参搜索
在上述训练过程中,我们调节了学习率、数据增广方法开启概率、分阶段学习率倍数等参数。
这些参数在不同场景中最优值可能并不相同。我们提供了一个快速超参搜索的脚本,将超参调优的过程自动化。
这个脚本会遍历搜索值列表中的参数来替代默认配置中的参数,依次训练,最终选择精度最高的模型所对应的参数作为搜索结果。

#### 3.1 基于默认配置搜索
配置文件[search.yaml](todo)定义了有人/无人场景超参搜索的配置,使用命令**todo**,可以使用默认的超参数搜索配置进行训练,最终可得训练结果为:
**todo**
#### 3.2 自定义搜索配置
您也可以根据训练结果或调参经验,修改超参搜索的配置。
修改**todo**字段,可以修改学习率搜索值列表;

修改**todo**字段,可以修改RandAugment开启概率的搜索值列表;

修改**todo**字段,可以修改RnadomErasing开启概率的搜索值列表;

修改**todo**字段,可以修改lr_mult搜索值列表;

修改**todo**字段,可以修改教师模型的搜索列表。