From 199c2b985ed963a7e8c60d17553f50e18dab8b49 Mon Sep 17 00:00:00 2001 From: weishengyu Date: Fri, 10 Jun 2022 14:30:31 +0800 Subject: [PATCH 1/4] add car_exists doc --- docs/zh_CN/PULC/PULC_car_exists.md | 450 +++++++++++++++++++++++++++++ 1 file changed, 450 insertions(+) create mode 100644 docs/zh_CN/PULC/PULC_car_exists.md diff --git a/docs/zh_CN/PULC/PULC_car_exists.md b/docs/zh_CN/PULC/PULC_car_exists.md new file mode 100644 index 000000000..edeb1ed10 --- /dev/null +++ b/docs/zh_CN/PULC/PULC_car_exists.md @@ -0,0 +1,450 @@ +# PULC 有人/无人分类模型 + +------ + + +## 目录 + +- [1. 模型和应用场景介绍](#1) +- [2. 模型快速体验](#2) + - [2.1 安装 paddleclas](#2.1) + - [2.2 预测](#2.2) +- [3. 模型训练、评估和预测](#3) + - [3.1 环境配置](#3.1) + - [3.2 数据准备](#3.2) + - [3.2.1 数据集来源](#3.2.1) + - [3.2.2 数据集获取](#3.2.2) + - [3.3 模型训练](#3.3) + - [3.4 模型评估](#3.4) + - [3.5 模型预测](#3.5) +- [4. 模型压缩](#4) + - [4.1 SKL-UGI 知识蒸馏](#4.1) + - [4.1.1 教师模型训练](#4.1.1) + - [4.1.2 蒸馏训练](#4.1.2) +- [5. 超参搜索](#5) +- [6. 模型推理部署](#6) + - [6.1 推理模型准备](#6.1) + - [6.1.1 基于训练得到的权重导出 inference 模型](#6.1.1) + - [6.1.2 直接下载 inference 模型](#6.1.2) + - [6.2 基于 Python 预测引擎推理](#6.2) + - [6.2.1 预测单张图像](#6.2.1) + - [6.2.2 基于文件夹的批量预测](#6.2.2) + - [6.3 基于 C++ 预测引擎推理](#6.3) + - [6.4 服务化部署](#6.4) + - [6.5 端侧部署](#6.5) + - [6.6 Paddle2ONNX 模型转换与预测](#6.6) + + + + +## 1. 模型和应用场景介绍 + +该案例提供了用户使用 PaddleClas 的超轻量图像分类方案(PULC,Practical Ultra Lightweight Classification)快速构建轻量级、高精度、可落地的有人/无人的分类模型。该模型可以广泛应用于如监控场景、人员进出管控场景、海量数据过滤场景等。 + +下表列出了判断图片中是否有人的二分类模型的相关指标,前两行展现了使用 SwinTranformer_tiny 和 MobileNetV3_small_x0_35 作为 backbone 训练得到的模型的相关指标,第三行至第六行依次展现了替换 backbone 为 PPLCNet_x1_0、使用 SSLD 预训练模型、使用 SSLD 预训练模型 + EDA 策略、使用 SSLD 预训练模型 + EDA 策略 + SKL-UGI 知识蒸馏策略训练得到的模型的相关指标。 + + +| 模型 | Tpr(%) | 延时(ms) | 存储(M) | 策略 | +|-------|-----------|----------|---------------|---------------| +| SwinTranformer_tiny | 95.69 | 95.30 | 107 | 使用 ImageNet 预训练模型 | +| MobileNetV3_small_x0_35 | 68.25 | 2.85 | 1.6 | 使用 ImageNet 预训练模型 | +| PPLCNet_x1_0 | 89.57 | 2.12 | 6.5 | 使用 ImageNet 预训练模型 | +| PPLCNet_x1_0 | 92.10 | 2.12 | 6.5 | 使用 SSLD 预训练模型 | +| PPLCNet_x1_0 | 93.43 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略| +| PPLCNet_x1_0 | 95.60 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略+SKL-UGI 知识蒸馏策略| + +从表中可以看出,backbone 为 SwinTranformer_tiny 时精度较高,但是推理速度较慢。将 backboone 替换为轻量级模型 MobileNetV3_small_x0_35 后,速度可以大幅提升,但是会导致精度大幅下降。将 backbone 替换为速度更快的 PPLCNet_x1_0 时,精度较 MobileNetV3_small_x0_35 高 20 多个百分点,与此同时速度依旧可以快 20% 以上。在此基础上,使用 SSLD 预训练模型后,在不改变推理速度的前提下,精度可以提升约 2.6 个百分点,进一步地,当融合EDA策略后,精度可以再提升 1.3 个百分点,最后,在使用 SKL-UGI 知识蒸馏后,精度可以继续提升 2.2 个百分点。此时,PPLCNet_x1_0 达到了 SwinTranformer_tiny 模型的精度,但是速度快 40 多倍。关于 PULC 的训练方法和推理部署方法将在下面详细介绍。 + +**备注:** + +* `Tpr`指标的介绍可以参考 [3.2 小节](#3.2)的备注部分,延时是基于 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 测试得到,开启 MKLDNN 加速策略,线程数为10。 +* 关于 PPLCNet 的介绍可以参考 [PPLCNet 介绍](../models/PP-LCNet.md),相关论文可以查阅[PPLCNet paper](https://arxiv.org/abs/2109.15099)。 + + + + +## 2. 模型快速体验 + + + +### 2.1 安装 paddleclas + +使用如下命令快速安装 paddlepaddle, paddleclas + +``` +pip3 install paddlepaddle paddleclas +``` + + +### 2.2 预测 + +* 使用命令行快速预测 + +```bash +paddleclas --model_name=car_exists --infer_imgs=deploy/images/PULC/person_exists/objects365_01780782.jpg +``` + +结果如下: +``` +>>> result +class_ids: [0], scores: [0.9955421453341842], label_names: ['nobody'], filename: deploy/images/PULC/person_exists/objects365_01780782.jpg +Predict complete! +``` + +**备注**: 更换其他预测的数据时,只需要改变 `--infer_imgs=xx` 中的字段即可,支持传入整个文件夹。 + + +* 在 Python 代码中预测 +```python +import paddleclas +model = paddleclas.PaddleClas(model_name="car_exists") +result = model.predict(input_data="deploy/images/PULC/person_exists/objects365_01780782.jpg") +print(next(result)) +``` + +**备注**:`model.predict()` 为可迭代对象(`generator`),因此需要使用 `next()` 函数或 `for` 循环对其迭代调用。每次调用将以 `batch_size` 为单位进行一次预测,并返回预测结果, 默认 `batch_size` 为 1,如果需要更改 `batch_size`,实例化模型时,需要指定 `batch_size`,如 `model = paddleclas.PaddleClas(model_name="person_exists", batch_size=2)`, 使用默认的代码返回结果示例如下: + +``` +>>> result +[{'class_ids': [0], 'scores': [0.9955421453341842], 'label_names': ['nobody'], 'filename': 'PaddleClas/deploy/images/PULC/person_exists/objects365_01780782.jpg'}] +``` + + + +## 3. 模型训练、评估和预测 + + + +### 3.1 环境配置 + +* 安装:请先参考文档[环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。 + + + +### 3.2 数据准备 + + + +#### 3.2.1 数据集来源 + +本案例中所使用的所有数据集均为开源数据,`train`和`val` 集合均为[Objects365 数据](https://www.objects365.org/overview.html)的训练集的子集,`ImageNet_val` 为[ImageNet-1k 数据](https://www.image-net.org/)的验证集。 + + + +#### 3.2.2 数据集获取 + +在公开数据集的基础上经过后处理即可得到本案例需要的数据,具体处理方法如下: + +- 训练集合,本案例处理了 Objects365 数据训练集的标注文件,如果某张图含有“人”的标签,且这个框的面积在整张图中的比例大于 10%,即认为该张图中含有车,如果某张图中没有“车”的标签,则认为该张图中不含有车。经过处理后,得到 92964 条可用数据,其中有人的数据有 39813 条,无人的数据 53151 条。 + +- 验证集合,从 Object365 数据中随机抽取一小部分数据,使用在 MS-COCO 上训练得到的较好的模型预测这些数据,将预测结果和数据的标注文件取交集,将交集的结果按照得到训练集的方法筛选出验证集合。经过处理后,得到 27820 条可用数据。其中有人的数据有 2255 条,无人的数据有 25565 条。 + +处理后的数据集部分数据可视化如下: + +![](../../images/PULC/docs/car_exists_data_demo.png) + +此处提供了经过上述方法处理好的数据,可以直接下载得到。 + + +进入 PaddleClas 目录。 + +``` +cd path_to_PaddleClas +``` + +进入 `dataset/` 目录,下载并解压有车/无车场景的数据。 + +```shell +cd dataset +wget https://paddleclas.bj.bcebos.com/data/PULC/person_exists.tar +tar -xf person_exists.tar +cd ../ +``` + +执行上述命令后,`dataset/` 下存在 `person_exists` 目录,该目录中具有以下数据: + +``` + +├── train +│   ├── 000000000009.jpg +│   ├── 000000000025.jpg +... +├── val +│   ├── objects365_01780637.jpg +│   ├── objects365_01780640.jpg +... +├── ImageNet_val +│   ├── ILSVRC2012_val_00000001.JPEG +│   ├── ILSVRC2012_val_00000002.JPEG +... +├── train_list.txt +├── train_list.txt.debug +├── train_list_for_distill.txt +├── val_list.txt +└── val_list.txt.debug +``` + +其中 `train/` 和 `val/` 分别为训练集和验证集。`train_list.txt` 和 `val_list.txt` 分别为训练集和验证集的标签文件,`train_list.txt.debug` 和 `val_list.txt.debug` 分别为训练集和验证集的 `debug` 标签文件,其分别是 `train_list.txt` 和 `val_list.txt` 的子集,用该文件可以快速体验本案例的流程。`ImageNet_val/` 是 ImageNet-1k 的验证集,该集合和 `train` 集合的混合数据用于本案例的 `SKL-UGI知识蒸馏策略`,对应的训练标签文件为 `train_list_for_distill.txt` 。 + +**备注:** + +* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考 [PaddleClas 分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。 + +* 关于如何得到蒸馏的标签文件可以参考[知识蒸馏标签获得方法](@ruoyu)。 + + + + +### 3.3 模型训练 + + +在 `ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml` 中提供了基于该场景的训练配置,可以通过如下脚本启动训练: + +```shell +export CUDA_VISIBLE_DEVICES=0,1,2,3 +python3 -m paddle.distributed.launch \ + --gpus="0,1,2,3" \ + tools/train.py \ + -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml +``` + +验证集的最佳指标在 `0.94-0.95` 之间(数据集较小,容易造成波动)。 + +**备注:** + +* 此时使用的指标为Tpr,该指标描述了在假正类率(Fpr)小于某一个指标时的真正类率(Tpr),是产业中二分类问题常用的指标之一。在本案例中,Fpr 为千分之一。关于 Fpr 和 Tpr 的更多介绍,可以参考[这里](https://baike.baidu.com/item/AUC/19282953)。 + +* 在eval时,会打印出来当前最佳的 TprAtFpr 指标,具体地,其会打印当前的 `Fpr`、`Tpr` 值,以及当前的 `threshold`值,`Tpr` 值反映了在当前 `Fpr` 值下的召回率,该值越高,代表模型越好。`threshold` 表示当前最佳 `Fpr` 所对应的分类阈值,可用于后续模型部署落地等。 + + + +### 3.4 模型评估 + +训练好模型之后,可以通过以下命令实现对模型指标的评估。 + +```bash +python3 tools/eval.py \ + -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \ + -o Global.pretrained_model="output/PPLCNet_x1_0/best_model" +``` + +其中 `-o Global.pretrained_model="output/PPLCNet_x1_0/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。 + + + +### 3.5 模型预测 + +模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测: + +```python +python3 tools/infer.py \ + -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \ + -o Global.pretrained_model=output/PPLCNet_x1_0/best_model \ +``` + +输出结果如下: + +``` +[{'class_ids': [0], 'scores': [0.9878496769815683], 'label_names': ['nobody'], 'file_name': './dataset/person_exists/val/objects365_01780637.jpg'}] +``` + +**备注:** + +* 这里`-o Global.pretrained_model="output/PPLCNet_x1_0/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。 + +* 默认是对 `deploy/images/PULC/person_exists/objects365_02035329.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。 + +* 二分类默认的阈值为0.5, 如果需要指定阈值,可以重写 `Infer.PostProcess.threshold` ,如`-o Infer.PostProcess.threshold=0.9794`,该值需要根据实际场景来确定,此处的 `0.9794` 是在该场景中的 `val` 数据集在千分之一 Fpr 下得到的最佳 Tpr 所得到的。 + + + + +## 4. 模型压缩 + + + +### 4.1 SKL-UGI 知识蒸馏 + +SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](@ruoyu)。 + + + +#### 4.1.1 教师模型训练 + +复用 `ppcls/configs/PULC/person_exists/PPLCNet/PPLCNet_x1_0.yaml` 中的超参数,训练教师模型,训练脚本如下: + +```shell +export CUDA_VISIBLE_DEVICES=0,1,2,3 +python3 -m paddle.distributed.launch \ + --gpus="0,1,2,3" \ + tools/train.py \ + -c ./ppcls/configs/PULC/person_exists/PPLCNet/PPLCNet_x1_0.yaml \ + -o Arch.name=ResNet101_vd +``` + +验证集的最佳指标为 `0.96-0.98` 之间,当前教师模型最好的权重保存在 `output/ResNet101_vd/best_model.pdparams`。 + + + +#### 4.1.2 蒸馏训练 + +配置文件`ppcls/configs/PULC/person_exists/PPLCNet_x1_0_distillation.yaml`提供了`SKL-UGI知识蒸馏策略`的配置。该配置将`ResNet101_vd`当作教师模型,`PPLCNet_x1_0`当作学生模型,使用ImageNet数据集的验证集作为新增的无标签数据。训练脚本如下: + +```shell +export CUDA_VISIBLE_DEVICES=0,1,2,3 +python3 -m paddle.distributed.launch \ + --gpus="0,1,2,3" \ + tools/train.py \ + -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0_distillation.yaml \ + -o Arch.models.0.Teacher.pretrained=output/ResNet101_vd/best_model +``` + +验证集的最佳指标为 `0.95-0.97` 之间,当前模型最好的权重保存在 `output/DistillationModel/best_model_student.pdparams`。 + + + + +## 5. 超参搜索 + +在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `SHAS 超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[SHAS 超参数搜索策略](#TODO)来获得更好的训练超参数。 + +**备注:** 此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。如果没有更换数据集,可以忽略此节内容。 + + + +## 6. 模型推理部署 + + + +### 6.1 推理模型准备 + +Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用 MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于 Paddle Inference 推理引擎的介绍,可以参考 [Paddle Inference官网教程](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/infer/inference/inference_cn.html)。 + +当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择[直接下载 inference 模型](#6.1.2)的方式。 + + + +### 6.1.1 基于训练得到的权重导出 inference 模型 + +此处,我们提供了将权重和模型转换的脚本,执行该脚本可以得到对应的 inference 模型: + +```bash +python3 tools/export_model.py \ + -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \ + -o Global.pretrained_model=output/DistillationModel/best_model_student \ + -o Global.save_inference_dir=deploy/models/PPLCNet_x1_0_person_exists_infer +``` +执行完该脚本后会在 `deploy/models/` 下生成 `PPLCNet_x1_0_person_exists_infer` 文件夹,`models` 文件夹下应有如下文件结构: + +``` +├── PPLCNet_x1_0_person_exists_infer +│ ├── inference.pdiparams +│ ├── inference.pdiparams.info +│ └── inference.pdmodel +``` + +**备注:** 此处的最佳权重是经过知识蒸馏后的权重路径,如果没有执行知识蒸馏的步骤,最佳模型保存在`output/PPLCNet_x1_0/best_model.pdparams`中。 + + + +### 6.1.2 直接下载 inference 模型 + +[6.1.1 小节](#6.1.1)提供了导出 inference 模型的方法,此处也提供了该场景可以下载的 inference 模型,可以直接下载体验。 + +``` +cd deploy/models +# 下载 inference 模型并解压 +wget https://paddleclas.bj.bcebos.com/models/PULC/person_exists_infer.tar && tar -xf person_exists_infer.tar +``` + +解压完毕后,`models` 文件夹下应有如下文件结构: + +``` +├── person_exists_infer +│ ├── inference.pdiparams +│ ├── inference.pdiparams.info +│ └── inference.pdmodel +``` + + + +### 6.2 基于 Python 预测引擎推理 + + + + +#### 6.2.1 预测单张图像 + +返回 `deploy` 目录: + +``` +cd ../ +``` + +运行下面的命令,对图像 `./images/PULC/person_exists/objects365_02035329.jpg` 进行有人/无人分类。 + +```shell +# 使用下面的命令使用 GPU 进行预测 +python3.7 python/predict_cls.py -c configs/PULC/person_exists/inference_person_exists.yaml +# 使用下面的命令使用 CPU 进行预测 +python3.7 python/predict_cls.py -c configs/PULC/person_exists/inference_person_exists.yaml -o Global.use_gpu=False +``` + +输出结果如下。 + +``` +objects365_02035329.jpg: class id(s): [1], score(s): [1.00], label_name(s): ['someone'] +``` + + +**备注:** 二分类默认的阈值为0.5, 如果需要指定阈值,可以重写 `Infer.PostProcess.threshold` ,如`-o Infer.PostProcess.threshold=0.9794`,该值需要根据实际场景来确定,此处的 `0.9794` 是在该场景中的 `val` 数据集在千分之一 Fpr 下得到的最佳 Tpr 所得到的。该阈值的确定方法可以参考[3.3节](#3.3)备注部分。 + + + +#### 6.2.2 基于文件夹的批量预测 + +如果希望预测文件夹内的图像,可以直接修改配置文件中的 `Global.infer_imgs` 字段,也可以通过下面的 `-o` 参数修改对应的配置。 + +```shell +# 使用下面的命令使用 GPU 进行预测,如果希望使用 CPU 预测,可以在命令后面添加 -o Global.use_gpu=False +python3.7 python/predict_cls.py -c configs/PULC/person_exists/inference_person_exists.yaml -o Global.infer_imgs="./images/PULC/person_exists/" +``` + +终端中会输出该文件夹内所有图像的分类结果,如下所示。 + +``` +objects365_01780782.jpg: class id(s): [0], score(s): [1.00], label_name(s): ['nobody'] +objects365_02035329.jpg: class id(s): [1], score(s): [1.00], label_name(s): ['someone'] +``` + +其中,`someone` 表示该图里存在人,`nobody` 表示该图里不存在人。 + + + +### 6.3 基于 C++ 预测引擎推理 + +PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。 + + + +### 6.4 服务化部署 + +Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。 + +PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。 + + + +### 6.5 端侧部署 + +Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。 + +PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。 + + + +### 6.6 Paddle2ONNX 模型转换与预测 + +Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。 + +PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](@shuilong)来完成相应的部署工作。 From a3c154fae2ab7af79b7bf39208fc1ff1add39c05 Mon Sep 17 00:00:00 2001 From: weishengyu Date: Mon, 13 Jun 2022 01:21:25 +0800 Subject: [PATCH 2/4] add car_config --- .../PULC/docs/car_exists_data_demo.jpeg | Bin 0 -> 160880 bytes docs/zh_CN/PULC/PULC_car_exists.md | 93 +++++----- .../car_exists/MobileNetV3_small_x0_35.yaml | 139 ++++++++++++++ .../configs/PULC/car_exists/PPLCNet_x1_0.yaml | 152 ++++++++++++++++ .../car_exists/PPLCNet_x1_0_distillation.yaml | 169 ++++++++++++++++++ .../PULC/car_exists/PPLCNet_x1_0_search.yaml | 152 ++++++++++++++++ ...inTransformer_tiny_patch4_window7_224.yaml | 169 ++++++++++++++++++ ppcls/configs/PULC/car_exists/search.yaml | 40 +++++ 8 files changed, 866 insertions(+), 48 deletions(-) create mode 100644 docs/images/PULC/docs/car_exists_data_demo.jpeg create mode 100644 ppcls/configs/PULC/car_exists/MobileNetV3_small_x0_35.yaml create mode 100644 ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml create mode 100644 ppcls/configs/PULC/car_exists/PPLCNet_x1_0_distillation.yaml create mode 100644 ppcls/configs/PULC/car_exists/PPLCNet_x1_0_search.yaml create mode 100644 ppcls/configs/PULC/car_exists/SwinTransformer_tiny_patch4_window7_224.yaml create mode 100644 ppcls/configs/PULC/car_exists/search.yaml diff --git a/docs/images/PULC/docs/car_exists_data_demo.jpeg b/docs/images/PULC/docs/car_exists_data_demo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9959954b6b8bf27589e1d2081f86c6078d16e2c1 GIT binary patch literal 160880 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 z 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 ipMwzPWNji!h2OtaERdM`vJzpCQUBgKJ)x!m^u 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 z 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 V<>vWYiRbZa$3pxEr6wOG{|}`XWzPTr literal 0 HcmV?d00001 diff --git a/docs/zh_CN/PULC/PULC_car_exists.md b/docs/zh_CN/PULC/PULC_car_exists.md index edeb1ed10..5812d1d45 100644 --- a/docs/zh_CN/PULC/PULC_car_exists.md +++ b/docs/zh_CN/PULC/PULC_car_exists.md @@ -41,19 +41,19 @@ 该案例提供了用户使用 PaddleClas 的超轻量图像分类方案(PULC,Practical Ultra Lightweight Classification)快速构建轻量级、高精度、可落地的有人/无人的分类模型。该模型可以广泛应用于如监控场景、人员进出管控场景、海量数据过滤场景等。 -下表列出了判断图片中是否有人的二分类模型的相关指标,前两行展现了使用 SwinTranformer_tiny 和 MobileNetV3_small_x0_35 作为 backbone 训练得到的模型的相关指标,第三行至第六行依次展现了替换 backbone 为 PPLCNet_x1_0、使用 SSLD 预训练模型、使用 SSLD 预训练模型 + EDA 策略、使用 SSLD 预训练模型 + EDA 策略 + SKL-UGI 知识蒸馏策略训练得到的模型的相关指标。 +下表列出了判断图片中是否有车的二分类模型的相关指标,前两行展现了使用 SwinTranformer_tiny 和 MobileNetV3_small_x0_35 作为 backbone 训练得到的模型的相关指标,第三行至第六行依次展现了替换 backbone 为 PPLCNet_x1_0、使用 SSLD 预训练模型、使用 SSLD 预训练模型 + EDA 策略、使用 SSLD 预训练模型 + EDA 策略 + SKL-UGI 知识蒸馏策略训练得到的模型的相关指标。 -| 模型 | Tpr(%) | 延时(ms) | 存储(M) | 策略 | -|-------|-----------|----------|---------------|---------------| -| SwinTranformer_tiny | 95.69 | 95.30 | 107 | 使用 ImageNet 预训练模型 | -| MobileNetV3_small_x0_35 | 68.25 | 2.85 | 1.6 | 使用 ImageNet 预训练模型 | -| PPLCNet_x1_0 | 89.57 | 2.12 | 6.5 | 使用 ImageNet 预训练模型 | -| PPLCNet_x1_0 | 92.10 | 2.12 | 6.5 | 使用 SSLD 预训练模型 | -| PPLCNet_x1_0 | 93.43 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略| -| PPLCNet_x1_0 | 95.60 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略+SKL-UGI 知识蒸馏策略| +| 模型 | Tpr(%)@Fpr0.01 | 延时(ms) | 存储(M) | 策略 | +|-------|----------------|----------|---------------|---------------| +| SwinTranformer_tiny | 97.71 | 95.30 | 107 | 使用 ImageNet 预训练模型 | +| MobileNetV3_small_x0_35 | 81.23 | 2.85 | 1.6 | 使用 ImageNet 预训练模型 | +| PPLCNet_x1_0 | 81.23 | 2.12 | 6.5 | 使用 ImageNet 预训练模型 | +| PPLCNet_x1_0 | 95.48 | 2.12 | 6.5 | 使用 SSLD 预训练模型 | +| PPLCNet_x1_0 | 95.48 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略| +| PPLCNet_x1_0 | 95.72 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略+SKL-UGI 知识蒸馏策略| -从表中可以看出,backbone 为 SwinTranformer_tiny 时精度较高,但是推理速度较慢。将 backboone 替换为轻量级模型 MobileNetV3_small_x0_35 后,速度可以大幅提升,但是会导致精度大幅下降。将 backbone 替换为速度更快的 PPLCNet_x1_0 时,精度较 MobileNetV3_small_x0_35 高 20 多个百分点,与此同时速度依旧可以快 20% 以上。在此基础上,使用 SSLD 预训练模型后,在不改变推理速度的前提下,精度可以提升约 2.6 个百分点,进一步地,当融合EDA策略后,精度可以再提升 1.3 个百分点,最后,在使用 SKL-UGI 知识蒸馏后,精度可以继续提升 2.2 个百分点。此时,PPLCNet_x1_0 达到了 SwinTranformer_tiny 模型的精度,但是速度快 40 多倍。关于 PULC 的训练方法和推理部署方法将在下面详细介绍。 +从表中可以看出,backbone 为 SwinTranformer_tiny 时精度较高,但是推理速度较慢。将 backboone 替换为轻量级模型 MobileNetV3_small_x0_35 后,速度可以大幅提升,但是会导致精度大幅下降。将 backbone 替换为速度更快的 PPLCNet_x1_0 时,精度较 MobileNetV3_small_x0_35 高 20 多个百分点,与此同时速度依旧可以快 20% 以上。在此基础上,使用 SSLD 预训练模型后,在不改变推理速度的前提下,精度可以提升约 2.6 个百分点,进一步地,在使用 SKL-UGI 知识蒸馏后,精度可以继续提升 0.24 个百分点。此时,PPLCNet_x1_0 达到了 SwinTranformer_tiny 模型的精度,但是速度快 40 多倍。关于 PULC 的训练方法和推理部署方法将在下面详细介绍。 **备注:** @@ -81,13 +81,13 @@ pip3 install paddlepaddle paddleclas * 使用命令行快速预测 ```bash -paddleclas --model_name=car_exists --infer_imgs=deploy/images/PULC/person_exists/objects365_01780782.jpg +paddleclas --model_name=car_exists --infer_imgs=deploy/images/PULC/car_exists/objects365_00001507.jpeg ``` 结果如下: ``` >>> result -class_ids: [0], scores: [0.9955421453341842], label_names: ['nobody'], filename: deploy/images/PULC/person_exists/objects365_01780782.jpg +class_ids: [1], scores: [0.9740616], label_names: ['contains_vehicle'], filename: deploy/images/PULC/car_exists/objects365_00001507.jpeg Predict complete! ``` @@ -98,7 +98,7 @@ Predict complete! ```python import paddleclas model = paddleclas.PaddleClas(model_name="car_exists") -result = model.predict(input_data="deploy/images/PULC/person_exists/objects365_01780782.jpg") +result = model.predict(input_data="deploy/images/PULC/car_exists/objects365_00001507.jpeg") print(next(result)) ``` @@ -106,7 +106,7 @@ print(next(result)) ``` >>> result -[{'class_ids': [0], 'scores': [0.9955421453341842], 'label_names': ['nobody'], 'filename': 'PaddleClas/deploy/images/PULC/person_exists/objects365_01780782.jpg'}] +[{'class_ids': [1], 'scores': [0.9740616], 'label_names': ['contains_vehicle'], 'filename': 'deploy/images/PULC/car_exists/objects365_00001507.jpeg'}] ``` @@ -135,13 +135,15 @@ print(next(result)) 在公开数据集的基础上经过后处理即可得到本案例需要的数据,具体处理方法如下: -- 训练集合,本案例处理了 Objects365 数据训练集的标注文件,如果某张图含有“人”的标签,且这个框的面积在整张图中的比例大于 10%,即认为该张图中含有车,如果某张图中没有“车”的标签,则认为该张图中不含有车。经过处理后,得到 92964 条可用数据,其中有人的数据有 39813 条,无人的数据 53151 条。 +- 训练集合,本案例处理了 Objects365 数据训练集的标注文件,如果某张图含有“car”的标签,且这个框的面积在整张图中的比例大于 10%,即认为该张图中含有车,如果某张图中没有任何与交通工具,例如car、bus等相关的的标签,则认为该张图中不含有车。经过处理后,得到 108629 条可用数据,其中有车的数据有 27422 条,无车的数据 81207 条。 -- 验证集合,从 Object365 数据中随机抽取一小部分数据,使用在 MS-COCO 上训练得到的较好的模型预测这些数据,将预测结果和数据的标注文件取交集,将交集的结果按照得到训练集的方法筛选出验证集合。经过处理后,得到 27820 条可用数据。其中有人的数据有 2255 条,无人的数据有 25565 条。 +- 验证集合,处理方法与训练集相同,数据来源与 Objects365 数据集的验证集。为了测试结果准确,验证集经过人工校正,去除了一些可能存在标注错误的图像。 + +* 注:由于objects365的标签并不是完全互斥的,例如F1赛车可能是 "F1 Formula",也可能被标称"car"。为了减轻干扰,我们仅保留"car"标签作为有车,而将不含任何交通工具的图作为无车。 处理后的数据集部分数据可视化如下: -![](../../images/PULC/docs/car_exists_data_demo.png) +![](../../images/PULC/docs/car_exists_data_demo.jpeg) 此处提供了经过上述方法处理好的数据,可以直接下载得到。 @@ -156,23 +158,18 @@ cd path_to_PaddleClas ```shell cd dataset -wget https://paddleclas.bj.bcebos.com/data/PULC/person_exists.tar -tar -xf person_exists.tar +wget https://paddleclas.bj.bcebos.com/data/PULC/car_exists.tar +tar -xf car_exists.tar cd ../ ``` -执行上述命令后,`dataset/` 下存在 `person_exists` 目录,该目录中具有以下数据: +执行上述命令后,`dataset/` 下存在 `car_exists` 目录,该目录中具有以下数据: ``` -├── train -│   ├── 000000000009.jpg -│   ├── 000000000025.jpg -... -├── val -│   ├── objects365_01780637.jpg -│   ├── objects365_01780640.jpg -... +├── objects365_car +│   ├── objects365_00000039.jpg +│   ├── objects365_00000099.jpg ├── ImageNet_val │   ├── ILSVRC2012_val_00000001.JPEG │   ├── ILSVRC2012_val_00000002.JPEG @@ -205,14 +202,14 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 python3 -m paddle.distributed.launch \ --gpus="0,1,2,3" \ tools/train.py \ - -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml + -c ./ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml ``` -验证集的最佳指标在 `0.94-0.95` 之间(数据集较小,容易造成波动)。 +验证集的最佳指标在 `0.95-0.96` 之间(数据集较小,容易造成波动)。 **备注:** -* 此时使用的指标为Tpr,该指标描述了在假正类率(Fpr)小于某一个指标时的真正类率(Tpr),是产业中二分类问题常用的指标之一。在本案例中,Fpr 为千分之一。关于 Fpr 和 Tpr 的更多介绍,可以参考[这里](https://baike.baidu.com/item/AUC/19282953)。 +* 此时使用的指标为Tpr,该指标描述了在假正类率(Fpr)小于某一个指标时的真正类率(Tpr),是产业中二分类问题常用的指标之一。在本案例中,Fpr 为 1/100 。关于 Fpr 和 Tpr 的更多介绍,可以参考[这里](https://baike.baidu.com/item/AUC/19282953)。 * 在eval时,会打印出来当前最佳的 TprAtFpr 指标,具体地,其会打印当前的 `Fpr`、`Tpr` 值,以及当前的 `threshold`值,`Tpr` 值反映了在当前 `Fpr` 值下的召回率,该值越高,代表模型越好。`threshold` 表示当前最佳 `Fpr` 所对应的分类阈值,可用于后续模型部署落地等。 @@ -224,7 +221,7 @@ python3 -m paddle.distributed.launch \ ```bash python3 tools/eval.py \ - -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \ + -c ./ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml \ -o Global.pretrained_model="output/PPLCNet_x1_0/best_model" ``` @@ -238,21 +235,21 @@ python3 tools/eval.py \ ```python python3 tools/infer.py \ - -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \ + -c ./ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml \ -o Global.pretrained_model=output/PPLCNet_x1_0/best_model \ ``` 输出结果如下: ``` -[{'class_ids': [0], 'scores': [0.9878496769815683], 'label_names': ['nobody'], 'file_name': './dataset/person_exists/val/objects365_01780637.jpg'}] +[{'class_ids': [1], 'scores': [0.9740616], 'label_names': ['contains_vehicle'], 'filename': 'deploy/images/PULC/car_exists/objects365_00001507.jpeg'}] ``` **备注:** * 这里`-o Global.pretrained_model="output/PPLCNet_x1_0/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。 -* 默认是对 `deploy/images/PULC/person_exists/objects365_02035329.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。 +* 默认是对 `deploy/images/PULC/car_exists/objects365_00001507.jpeg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。 * 二分类默认的阈值为0.5, 如果需要指定阈值,可以重写 `Infer.PostProcess.threshold` ,如`-o Infer.PostProcess.threshold=0.9794`,该值需要根据实际场景来确定,此处的 `0.9794` 是在该场景中的 `val` 数据集在千分之一 Fpr 下得到的最佳 Tpr 所得到的。 @@ -278,7 +275,7 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 python3 -m paddle.distributed.launch \ --gpus="0,1,2,3" \ tools/train.py \ - -c ./ppcls/configs/PULC/person_exists/PPLCNet/PPLCNet_x1_0.yaml \ + -c ./ppcls/configs/PULC/car_exists/PPLCNet/PPLCNet_x1_0.yaml \ -o Arch.name=ResNet101_vd ``` @@ -295,7 +292,7 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 python3 -m paddle.distributed.launch \ --gpus="0,1,2,3" \ tools/train.py \ - -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0_distillation.yaml \ + -c ./ppcls/configs/PULC/car_exists/PPLCNet_x1_0_distillation.yaml \ -o Arch.models.0.Teacher.pretrained=output/ResNet101_vd/best_model ``` @@ -330,14 +327,14 @@ Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端 ```bash python3 tools/export_model.py \ - -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \ + -c ./ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml \ -o Global.pretrained_model=output/DistillationModel/best_model_student \ - -o Global.save_inference_dir=deploy/models/PPLCNet_x1_0_person_exists_infer + -o Global.save_inference_dir=deploy/models/PPLCNet_x1_0_car_exists_infer ``` -执行完该脚本后会在 `deploy/models/` 下生成 `PPLCNet_x1_0_person_exists_infer` 文件夹,`models` 文件夹下应有如下文件结构: +执行完该脚本后会在 `deploy/models/` 下生成 `PPLCNet_x1_0_car_exists_infer` 文件夹,`models` 文件夹下应有如下文件结构: ``` -├── PPLCNet_x1_0_person_exists_infer +├── PPLCNet_x1_0_car_exists_infer │ ├── inference.pdiparams │ ├── inference.pdiparams.info │ └── inference.pdmodel @@ -354,13 +351,13 @@ python3 tools/export_model.py \ ``` cd deploy/models # 下载 inference 模型并解压 -wget https://paddleclas.bj.bcebos.com/models/PULC/person_exists_infer.tar && tar -xf person_exists_infer.tar +wget https://paddleclas.bj.bcebos.com/models/PULC/car_exists_infer.tar && tar -xf car_exists_infer.tar ``` 解压完毕后,`models` 文件夹下应有如下文件结构: ``` -├── person_exists_infer +├── car_exists_infer │ ├── inference.pdiparams │ ├── inference.pdiparams.info │ └── inference.pdmodel @@ -381,13 +378,13 @@ wget https://paddleclas.bj.bcebos.com/models/PULC/person_exists_infer.tar && tar cd ../ ``` -运行下面的命令,对图像 `./images/PULC/person_exists/objects365_02035329.jpg` 进行有人/无人分类。 +运行下面的命令,对图像 `./images/PULC/car_exists/objects365_00001507.jpeg` 进行有人/无人分类。 ```shell # 使用下面的命令使用 GPU 进行预测 -python3.7 python/predict_cls.py -c configs/PULC/person_exists/inference_person_exists.yaml +python3.7 python/predict_cls.py -c configs/PULC/car_exists/inference_car_exists.yaml # 使用下面的命令使用 CPU 进行预测 -python3.7 python/predict_cls.py -c configs/PULC/person_exists/inference_person_exists.yaml -o Global.use_gpu=False +python3.7 python/predict_cls.py -c configs/PULC/car_exists/inference_car_exists.yaml -o Global.use_gpu=False ``` 输出结果如下。 @@ -407,7 +404,7 @@ objects365_02035329.jpg: class id(s): [1], score(s): [1.00], label_name(s): ['so ```shell # 使用下面的命令使用 GPU 进行预测,如果希望使用 CPU 预测,可以在命令后面添加 -o Global.use_gpu=False -python3.7 python/predict_cls.py -c configs/PULC/person_exists/inference_person_exists.yaml -o Global.infer_imgs="./images/PULC/person_exists/" +python3.7 python/predict_cls.py -c configs/PULC/car_exists/inference_car_exists.yaml -o Global.infer_imgs="./images/PULC/car_exists/" ``` 终端中会输出该文件夹内所有图像的分类结果,如下所示。 @@ -417,7 +414,7 @@ objects365_01780782.jpg: class id(s): [0], score(s): [1.00], label_name(s): ['no objects365_02035329.jpg: class id(s): [1], score(s): [1.00], label_name(s): ['someone'] ``` -其中,`someone` 表示该图里存在人,`nobody` 表示该图里不存在人。 +其中,`contains_car` 表示该图里存在车,`nocar` 表示该图里不存在车。 diff --git a/ppcls/configs/PULC/car_exists/MobileNetV3_small_x0_35.yaml b/ppcls/configs/PULC/car_exists/MobileNetV3_small_x0_35.yaml new file mode 100644 index 000000000..8b7c24f59 --- /dev/null +++ b/ppcls/configs/PULC/car_exists/MobileNetV3_small_x0_35.yaml @@ -0,0 +1,139 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + start_eval_epoch: 10 + epochs: 20 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + use_dali: False + +# model architecture +Arch: + name: MobileNetV3_small_x0_35 + class_num: 2 + pretrained: True + use_sync_bn: True + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + epsilon: 0.1 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: Momentum + momentum: 0.9 + lr: + name: Cosine + learning_rate: 0.05 + warmup_epoch: 5 + regularizer: + name: 'L2' + coeff: 0.00001 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists/ + cls_label_path: ./dataset/car_exists/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + - RandFlipImage: + flip_code: 1 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + + sampler: + name: DistributedBatchSampler + batch_size: 512 + drop_last: False + shuffle: True + loader: + num_workers: 8 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists/ + cls_label_path: ./dataset/car_exists/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 64 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: deploy/images/PULC/car_exists/objects365_00001507.jpeg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: ThreshOutput + threshold: 0.5 + label_0: nobody + label_1: someone + +Metric: + Train: + - TopkAcc: + topk: [1, 2] + Eval: + - TprAtFpr: + max_fpr: 0.01 + - TopkAcc: + topk: [1, 2] diff --git a/ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml b/ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml new file mode 100644 index 000000000..cd74e5b5b --- /dev/null +++ b/ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml @@ -0,0 +1,152 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + start_eval_epoch: 10 + epochs: 20 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + use_dali: False + + +# model architecture +Arch: + name: PPLCNet_x1_0 + class_num: 2 + pretrained: True + use_ssld: True + use_sync_bn: True + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: Momentum + momentum: 0.9 + lr: + name: Cosine + learning_rate: 0.0125 + warmup_epoch: 5 + regularizer: + name: 'L2' + coeff: 0.00004 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists/ + cls_label_path: ./dataset/car_exists/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 192 + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + prob: 0.5 + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 192 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.5 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + sampler: + name: DistributedBatchSampler + batch_size: 64 + drop_last: False + shuffle: True + loader: + num_workers: 8 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists + cls_label_path: ./dataset/car_exists/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 64 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: deploy/images/PULC/car_exists/objects365_00001507.jpeg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: ThreshOutput + threshold: 0.9 + label_0: nobody + label_1: someone + +Metric: + Train: + - TopkAcc: + topk: [1, 2] + Eval: + - TprAtFpr: + max_fpr: 0.01 + - TopkAcc: + topk: [1, 2] diff --git a/ppcls/configs/PULC/car_exists/PPLCNet_x1_0_distillation.yaml b/ppcls/configs/PULC/car_exists/PPLCNet_x1_0_distillation.yaml new file mode 100644 index 000000000..0f968d13d --- /dev/null +++ b/ppcls/configs/PULC/car_exists/PPLCNet_x1_0_distillation.yaml @@ -0,0 +1,169 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output + device: gpu + save_interval: 1 + eval_during_train: True + start_eval_epoch: 1 + eval_interval: 1 + epochs: 20 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + use_dali: False + +# model architecture +Arch: + name: "DistillationModel" + class_num: &class_num 2 + # if not null, its lengths should be same as models + pretrained_list: + # if not null, its lengths should be same as models + freeze_params_list: + - True + - False + use_sync_bn: True + models: + - Teacher: + name: ResNet101_vd + class_num: *class_num + - Student: + name: PPLCNet_x1_0 + class_num: *class_num + pretrained: True + use_ssld: True + + infer_model_name: "Student" + +# loss function config for traing/eval process +Loss: + Train: + - DistillationDMLLoss: + weight: 1.0 + model_name_pairs: + - ["Student", "Teacher"] + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: Momentum + momentum: 0.9 + lr: + name: Cosine + learning_rate: 0.01 + warmup_epoch: 5 + regularizer: + name: 'L2' + coeff: 0.00004 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists/ + cls_label_path: ./dataset/car_exists/train_list_for_distill.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 192 + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + prob: 0.0 + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 192 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.1 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + sampler: + name: DistributedBatchSampler + batch_size: 64 + drop_last: False + shuffle: True + loader: + num_workers: 16 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists/ + cls_label_path: ./dataset/car_exists/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 64 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: deploy/images/PULC/car_exists/objects365_00001507.jpeg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: ThreshOutput + threshold: 0.5 + label_0: nobody + label_1: someone + +Metric: + Train: + - DistillationTopkAcc: + model_key: "Student" + topk: [1, 2] + Eval: + - TprAtFpr: + max_fpr: 0.01 + - TopkAcc: + topk: [1, 2] diff --git a/ppcls/configs/PULC/car_exists/PPLCNet_x1_0_search.yaml b/ppcls/configs/PULC/car_exists/PPLCNet_x1_0_search.yaml new file mode 100644 index 000000000..e54f74ad9 --- /dev/null +++ b/ppcls/configs/PULC/car_exists/PPLCNet_x1_0_search.yaml @@ -0,0 +1,152 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + start_eval_epoch: 10 + epochs: 20 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + use_dali: False + + +# model architecture +Arch: + name: PPLCNet_x1_0 + class_num: 2 + pretrained: True + use_ssld: True + use_sync_bn: True + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: Momentum + momentum: 0.9 + lr: + name: Cosine + learning_rate: 0.01 + warmup_epoch: 5 + regularizer: + name: 'L2' + coeff: 0.00004 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists/ + cls_label_path: ./dataset/car_exists/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + prob: 0.0 + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.0 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + sampler: + name: DistributedBatchSampler + batch_size: 64 + drop_last: False + shuffle: True + loader: + num_workers: 8 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists/ + cls_label_path: ./dataset/car_exists/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 64 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: deploy/images/PULC/car_exists/objects365_00001507.jpeg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: ThreshOutput + threshold: 0.5 + label_0: nobody + label_1: someone + +Metric: + Train: + - TopkAcc: + topk: [1, 2] + Eval: + - TprAtFpr: + max_fpr: 0.01 + - TopkAcc: + topk: [1, 2] diff --git a/ppcls/configs/PULC/car_exists/SwinTransformer_tiny_patch4_window7_224.yaml b/ppcls/configs/PULC/car_exists/SwinTransformer_tiny_patch4_window7_224.yaml new file mode 100644 index 000000000..d5ed1414f --- /dev/null +++ b/ppcls/configs/PULC/car_exists/SwinTransformer_tiny_patch4_window7_224.yaml @@ -0,0 +1,169 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + start_eval_epoch: 10 + epochs: 20 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + use_dali: False + +# mixed precision training +AMP: + scale_loss: 128.0 + use_dynamic_loss_scaling: True + # O1: mixed fp16 + level: O1 + +# model architecture +Arch: + name: SwinTransformer_tiny_patch4_window7_224 + class_num: 2 + pretrained: True + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + epsilon: 0.1 + Eval: + - CELoss: + weight: 1.0 + +Optimizer: + name: AdamW + beta1: 0.9 + beta2: 0.999 + epsilon: 1e-8 + weight_decay: 0.05 + no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm + one_dim_param_no_weight_decay: True + lr: + name: Cosine + learning_rate: 1e-4 + eta_min: 2e-6 + warmup_epoch: 5 + warmup_start_lr: 2e-7 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists/ + cls_label_path: ./dataset/car_exists/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + interpolation: bicubic + backend: pil + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.25 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + batch_transform_ops: + - OpSampler: + MixupOperator: + alpha: 0.8 + prob: 0.5 + CutmixOperator: + alpha: 1.0 + prob: 0.5 + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: True + loader: + num_workers: 8 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/car_exists/ + cls_label_path: ./dataset/car_exists/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 64 + drop_last: False + shuffle: False + loader: + num_workers: 8 + use_shared_memory: True + +Infer: + infer_imgs: deploy/images/PULC/car_exists/objects365_00001507.jpeg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: ThreshOutput + threshold: 0.5 + label_0: nobody + label_1: someone + +Metric: + Train: + - TopkAcc: + topk: [1, 2] + Eval: + - TprAtFpr: + max_fpr: 0.01 + - TopkAcc: + topk: [1, 2] diff --git a/ppcls/configs/PULC/car_exists/search.yaml b/ppcls/configs/PULC/car_exists/search.yaml new file mode 100644 index 000000000..820337c02 --- /dev/null +++ b/ppcls/configs/PULC/car_exists/search.yaml @@ -0,0 +1,40 @@ +base_config_file: ppcls/configs/PULC/person_exists/PPLCNet_x1_0_search.yaml +distill_config_file: ppcls/configs/PULC/person_exists/PPLCNet_x1_0_distillation.yaml + +gpus: 0,1,2,3 +output_dir: output/search_person_cls +search_times: 1 +search_dict: + - search_key: lrs + replace_config: + - Optimizer.lr.learning_rate + search_values: [0.0075, 0.01, 0.0125] + - search_key: resolutions + replace_config: + - DataLoader.Train.dataset.transform_ops.1.RandCropImage.size + - DataLoader.Train.dataset.transform_ops.3.TimmAutoAugment.img_size + search_values: [176, 192, 224] + - search_key: ra_probs + replace_config: + - DataLoader.Train.dataset.transform_ops.3.TimmAutoAugment.prob + search_values: [0.0, 0.1, 0.5] + - search_key: re_probs + replace_config: + - DataLoader.Train.dataset.transform_ops.5.RandomErasing.EPSILON + search_values: [0.0, 0.1, 0.5] + - search_key: lr_mult_list + replace_config: + - Arch.lr_mult_list + search_values: + - [0.0, 0.2, 0.4, 0.6, 0.8, 1.0] + - [0.0, 0.4, 0.4, 0.8, 0.8, 1.0] + - [1.0, 1.0, 1.0, 1.0, 1.0, 1.0] +teacher: + rm_keys: + - Arch.lr_mult_list + search_values: + - ResNet101_vd + - ResNet50_vd +final_replace: + Arch.lr_mult_list: Arch.models.1.Student.lr_mult_list + From eae30201a3b4003cdcada3c45f354d7b290cb9c3 Mon Sep 17 00:00:00 2001 From: weishengyu Date: Mon, 13 Jun 2022 02:24:28 +0800 Subject: [PATCH 3/4] dbg --- docs/zh_CN/PULC/PULC_car_exists.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/zh_CN/PULC/PULC_car_exists.md b/docs/zh_CN/PULC/PULC_car_exists.md index 5812d1d45..6bbb0767f 100644 --- a/docs/zh_CN/PULC/PULC_car_exists.md +++ b/docs/zh_CN/PULC/PULC_car_exists.md @@ -48,12 +48,12 @@ |-------|----------------|----------|---------------|---------------| | SwinTranformer_tiny | 97.71 | 95.30 | 107 | 使用 ImageNet 预训练模型 | | MobileNetV3_small_x0_35 | 81.23 | 2.85 | 1.6 | 使用 ImageNet 预训练模型 | -| PPLCNet_x1_0 | 81.23 | 2.12 | 6.5 | 使用 ImageNet 预训练模型 | +| PPLCNet_x1_0 | 94.72 | 2.12 | 6.5 | 使用 ImageNet 预训练模型 | | PPLCNet_x1_0 | 95.48 | 2.12 | 6.5 | 使用 SSLD 预训练模型 | | PPLCNet_x1_0 | 95.48 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略| | PPLCNet_x1_0 | 95.72 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略+SKL-UGI 知识蒸馏策略| -从表中可以看出,backbone 为 SwinTranformer_tiny 时精度较高,但是推理速度较慢。将 backboone 替换为轻量级模型 MobileNetV3_small_x0_35 后,速度可以大幅提升,但是会导致精度大幅下降。将 backbone 替换为速度更快的 PPLCNet_x1_0 时,精度较 MobileNetV3_small_x0_35 高 20 多个百分点,与此同时速度依旧可以快 20% 以上。在此基础上,使用 SSLD 预训练模型后,在不改变推理速度的前提下,精度可以提升约 2.6 个百分点,进一步地,在使用 SKL-UGI 知识蒸馏后,精度可以继续提升 0.24 个百分点。此时,PPLCNet_x1_0 达到了 SwinTranformer_tiny 模型的精度,但是速度快 40 多倍。关于 PULC 的训练方法和推理部署方法将在下面详细介绍。 +从表中可以看出,backbone 为 SwinTranformer_tiny 时精度较高,但是推理速度较慢。将 backboone 替换为轻量级模型 MobileNetV3_small_x0_35 后,速度可以大幅提升,但是会导致精度大幅下降。将 backbone 替换为速度更快的 PPLCNet_x1_0 时,精度较 MobileNetV3_small_x0_35 高 13 个百分点,与此同时速度依旧可以快 20% 以上。在此基础上,使用 SSLD 预训练模型后,在不改变推理速度的前提下,精度可以提升约 0.7 个百分点,进一步地,在使用 SKL-UGI 知识蒸馏后,精度可以继续提升 0.24 个百分点。此时,PPLCNet_x1_0 达到了接近 SwinTranformer_tiny 模型的精度,但是速度快 40 多倍。关于 PULC 的训练方法和推理部署方法将在下面详细介绍。 **备注:** @@ -275,7 +275,7 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 python3 -m paddle.distributed.launch \ --gpus="0,1,2,3" \ tools/train.py \ - -c ./ppcls/configs/PULC/car_exists/PPLCNet/PPLCNet_x1_0.yaml \ + -c ./ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml \ -o Arch.name=ResNet101_vd ``` From 41a3a676e180be0d4e84db10cbb70002d5379c20 Mon Sep 17 00:00:00 2001 From: weishengyu Date: Mon, 13 Jun 2022 03:16:46 +0800 Subject: [PATCH 4/4] dbg --- ..._exists.yaml => inference_car_exists.yaml} | 0 docs/zh_CN/PULC/PULC_car_exists.md | 24 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) rename deploy/configs/PULC/car_exists/{inference_person_exists.yaml => inference_car_exists.yaml} (100%) diff --git a/deploy/configs/PULC/car_exists/inference_person_exists.yaml b/deploy/configs/PULC/car_exists/inference_car_exists.yaml similarity index 100% rename from deploy/configs/PULC/car_exists/inference_person_exists.yaml rename to deploy/configs/PULC/car_exists/inference_car_exists.yaml diff --git a/docs/zh_CN/PULC/PULC_car_exists.md b/docs/zh_CN/PULC/PULC_car_exists.md index 6bbb0767f..718213f48 100644 --- a/docs/zh_CN/PULC/PULC_car_exists.md +++ b/docs/zh_CN/PULC/PULC_car_exists.md @@ -51,9 +51,9 @@ | PPLCNet_x1_0 | 94.72 | 2.12 | 6.5 | 使用 ImageNet 预训练模型 | | PPLCNet_x1_0 | 95.48 | 2.12 | 6.5 | 使用 SSLD 预训练模型 | | PPLCNet_x1_0 | 95.48 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略| -| PPLCNet_x1_0 | 95.72 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略+SKL-UGI 知识蒸馏策略| +| PPLCNet_x1_0 | 95.92 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略+SKL-UGI 知识蒸馏策略| -从表中可以看出,backbone 为 SwinTranformer_tiny 时精度较高,但是推理速度较慢。将 backboone 替换为轻量级模型 MobileNetV3_small_x0_35 后,速度可以大幅提升,但是会导致精度大幅下降。将 backbone 替换为速度更快的 PPLCNet_x1_0 时,精度较 MobileNetV3_small_x0_35 高 13 个百分点,与此同时速度依旧可以快 20% 以上。在此基础上,使用 SSLD 预训练模型后,在不改变推理速度的前提下,精度可以提升约 0.7 个百分点,进一步地,在使用 SKL-UGI 知识蒸馏后,精度可以继续提升 0.24 个百分点。此时,PPLCNet_x1_0 达到了接近 SwinTranformer_tiny 模型的精度,但是速度快 40 多倍。关于 PULC 的训练方法和推理部署方法将在下面详细介绍。 +从表中可以看出,backbone 为 SwinTranformer_tiny 时精度较高,但是推理速度较慢。将 backboone 替换为轻量级模型 MobileNetV3_small_x0_35 后,速度可以大幅提升,但是会导致精度大幅下降。将 backbone 替换为速度更快的 PPLCNet_x1_0 时,精度较 MobileNetV3_small_x0_35 高 13 个百分点,与此同时速度依旧可以快 20% 以上。在此基础上,使用 SSLD 预训练模型后,在不改变推理速度的前提下,精度可以提升约 0.7 个百分点,进一步地,在使用 SKL-UGI 知识蒸馏后,精度可以继续提升 0.44 个百分点。此时,PPLCNet_x1_0 达到了接近 SwinTranformer_tiny 模型的精度,但是速度快 40 多倍。关于 PULC 的训练方法和推理部署方法将在下面详细介绍。 **备注:** @@ -87,7 +87,7 @@ paddleclas --model_name=car_exists --infer_imgs=deploy/images/PULC/car_exists/ob 结果如下: ``` >>> result -class_ids: [1], scores: [0.9740616], label_names: ['contains_vehicle'], filename: deploy/images/PULC/car_exists/objects365_00001507.jpeg +class_ids: [1], scores: [0.9871138], label_names: ['contains_vehicle'], filename: deploy/images/PULC/car_exists/objects365_00001507.jpeg Predict complete! ``` @@ -102,11 +102,11 @@ result = model.predict(input_data="deploy/images/PULC/car_exists/objects365_0000 print(next(result)) ``` -**备注**:`model.predict()` 为可迭代对象(`generator`),因此需要使用 `next()` 函数或 `for` 循环对其迭代调用。每次调用将以 `batch_size` 为单位进行一次预测,并返回预测结果, 默认 `batch_size` 为 1,如果需要更改 `batch_size`,实例化模型时,需要指定 `batch_size`,如 `model = paddleclas.PaddleClas(model_name="person_exists", batch_size=2)`, 使用默认的代码返回结果示例如下: +**备注**:`model.predict()` 为可迭代对象(`generator`),因此需要使用 `next()` 函数或 `for` 循环对其迭代调用。每次调用将以 `batch_size` 为单位进行一次预测,并返回预测结果, 默认 `batch_size` 为 1,如果需要更改 `batch_size`,实例化模型时,需要指定 `batch_size`,如 `model = paddleclas.PaddleClas(model_name="car_exists", batch_size=2)`, 使用默认的代码返回结果示例如下: ``` >>> result -[{'class_ids': [1], 'scores': [0.9740616], 'label_names': ['contains_vehicle'], 'filename': 'deploy/images/PULC/car_exists/objects365_00001507.jpeg'}] +[{'class_ids': [1], 'scores': [0.9871138], 'label_names': ['contains_vehicle'], 'filename': 'deploy/images/PULC/car_exists/objects365_00001507.jpeg'}] ``` @@ -236,13 +236,13 @@ python3 tools/eval.py \ ```python python3 tools/infer.py \ -c ./ppcls/configs/PULC/car_exists/PPLCNet_x1_0.yaml \ - -o Global.pretrained_model=output/PPLCNet_x1_0/best_model \ + -o Global.pretrained_model=output/PPLCNet_x1_0/best_model ``` 输出结果如下: ``` -[{'class_ids': [1], 'scores': [0.9740616], 'label_names': ['contains_vehicle'], 'filename': 'deploy/images/PULC/car_exists/objects365_00001507.jpeg'}] +[{'class_ids': [1], 'scores': [0.9871138], 'label_names': ['contains_vehicle'], 'filename': 'deploy/images/PULC/car_exists/objects365_00001507.jpeg'}] ``` **备注:** @@ -268,7 +268,7 @@ SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方 #### 4.1.1 教师模型训练 -复用 `ppcls/configs/PULC/person_exists/PPLCNet/PPLCNet_x1_0.yaml` 中的超参数,训练教师模型,训练脚本如下: +复用 `ppcls/configs/PULC/car_exists/PPLCNet/PPLCNet_x1_0.yaml` 中的超参数,训练教师模型,训练脚本如下: ```shell export CUDA_VISIBLE_DEVICES=0,1,2,3 @@ -285,7 +285,7 @@ python3 -m paddle.distributed.launch \ #### 4.1.2 蒸馏训练 -配置文件`ppcls/configs/PULC/person_exists/PPLCNet_x1_0_distillation.yaml`提供了`SKL-UGI知识蒸馏策略`的配置。该配置将`ResNet101_vd`当作教师模型,`PPLCNet_x1_0`当作学生模型,使用ImageNet数据集的验证集作为新增的无标签数据。训练脚本如下: +配置文件`ppcls/configs/PULC/car_exists/PPLCNet_x1_0_distillation.yaml`提供了`SKL-UGI知识蒸馏策略`的配置。该配置将`ResNet101_vd`当作教师模型,`PPLCNet_x1_0`当作学生模型,使用ImageNet数据集的验证集作为新增的无标签数据。训练脚本如下: ```shell export CUDA_VISIBLE_DEVICES=0,1,2,3 @@ -390,7 +390,7 @@ python3.7 python/predict_cls.py -c configs/PULC/car_exists/inference_car_exists. 输出结果如下。 ``` -objects365_02035329.jpg: class id(s): [1], score(s): [1.00], label_name(s): ['someone'] +objects365_00001507.jpeg: class id(s): [1], score(s): [0.99], label_name(s): ['contains_car'] ``` @@ -410,8 +410,8 @@ python3.7 python/predict_cls.py -c configs/PULC/car_exists/inference_car_exists. 终端中会输出该文件夹内所有图像的分类结果,如下所示。 ``` -objects365_01780782.jpg: class id(s): [0], score(s): [1.00], label_name(s): ['nobody'] -objects365_02035329.jpg: class id(s): [1], score(s): [1.00], label_name(s): ['someone'] +objects365_00001507.jpeg: class id(s): [1], score(s): [0.99], label_name(s): ['contains_car'] +objects365_00001521.jpeg: class id(s): [0], score(s): [0.99], label_name(s): ['nocar'] ``` 其中,`contains_car` 表示该图里存在车,`nocar` 表示该图里不存在车。