diff --git a/deploy/configs/inference_cls.yaml b/deploy/configs/inference_cls.yaml index fc0f0fe67..d9181278c 100644 --- a/deploy/configs/inference_cls.yaml +++ b/deploy/configs/inference_cls.yaml @@ -1,5 +1,5 @@ Global: - infer_imgs: "./images/ILSVRC2012_val_00000010.jpeg" + infer_imgs: "./images/ImageNet/ILSVRC2012_val_00000010.jpeg" inference_model_dir: "./models" batch_size: 1 use_gpu: True @@ -32,4 +32,4 @@ PostProcess: topk: 5 class_id_map_file: "../ppcls/utils/imagenet1k_label_list.txt" SavePreLabel: - save_dir: ./pre_label/ \ No newline at end of file + save_dir: ./pre_label/ diff --git a/deploy/configs/inference_cls_ch4.yaml b/deploy/configs/inference_cls_ch4.yaml index 9b740ed82..85f9acb29 100644 --- a/deploy/configs/inference_cls_ch4.yaml +++ b/deploy/configs/inference_cls_ch4.yaml @@ -1,5 +1,5 @@ Global: - infer_imgs: "./images/ILSVRC2012_val_00000010.jpeg" + infer_imgs: "./images/ImageNet/ILSVRC2012_val_00000010.jpeg" inference_model_dir: "./models" batch_size: 1 use_gpu: True @@ -32,4 +32,4 @@ PostProcess: topk: 5 class_id_map_file: "../ppcls/utils/imagenet1k_label_list.txt" SavePreLabel: - save_dir: ./pre_label/ \ No newline at end of file + save_dir: ./pre_label/ diff --git a/deploy/images/ILSVRC2012_val_00000010.jpeg b/deploy/images/ImageNet/ILSVRC2012_val_00000010.jpeg similarity index 100% rename from deploy/images/ILSVRC2012_val_00000010.jpeg rename to deploy/images/ImageNet/ILSVRC2012_val_00000010.jpeg diff --git a/deploy/images/ILSVRC2012_val_00010010.jpeg b/deploy/images/ImageNet/ILSVRC2012_val_00010010.jpeg similarity index 100% rename from deploy/images/ILSVRC2012_val_00010010.jpeg rename to deploy/images/ImageNet/ILSVRC2012_val_00010010.jpeg diff --git a/deploy/images/ILSVRC2012_val_00020010.jpeg b/deploy/images/ImageNet/ILSVRC2012_val_00020010.jpeg similarity index 100% rename from deploy/images/ILSVRC2012_val_00020010.jpeg rename to deploy/images/ImageNet/ILSVRC2012_val_00020010.jpeg diff --git a/deploy/images/ILSVRC2012_val_00030010.jpeg b/deploy/images/ImageNet/ILSVRC2012_val_00030010.jpeg similarity index 100% rename from deploy/images/ILSVRC2012_val_00030010.jpeg rename to deploy/images/ImageNet/ILSVRC2012_val_00030010.jpeg diff --git a/docs/zh_CN/models/PP-LCNet.md b/docs/zh_CN/models/PP-LCNet.md index 7fea973d4..d8d23cb74 100644 --- a/docs/zh_CN/models/PP-LCNet.md +++ b/docs/zh_CN/models/PP-LCNet.md @@ -3,48 +3,70 @@ ## 目录 -- [1. 摘要](#1) -- [2. 介绍](#2) -- [3. 方法](#3) - - [3.1 更好的激活函数](#3.1) - - [3.2 合适的位置添加 SE 模块](#3.2) - - [3.3 合适的位置添加更大的卷积核](#3.3) - - [3.4 GAP 后使用更大的 1x1 卷积层](#3.4) -- [4. 实验部分](#4) - - [4.1 图像分类](#4.1) - - [4.2 目标检测](#4.2) - - [4.3 语义分割](#4.3) -- [5. 基于 V100 GPU 的预测速度](#5) -- [6. 基于 SD855 的预测速度](#6) -- [7. 总结](#7) -- [8. 引用](#8) +- [1. 模型和应用场景介绍](#1) + - [1.1 模型简介](#1.1) + - [1.2 模型细节](#1.2) + - [1.2.1 更好的激活函数](#1.2.1) + - [1.2.2 合适的位置添加 SE 模块](#1.2.2) + - [1.2.3 合适的位置添加更大的卷积核](#1.2.3) + - [1.2.4 GAP 后使用更大的 1x1 卷积层](#1.2.4) + - [1.3 实验结果](#1.3) + - [1.4 Benchmark](#1.4) + - [1.4.1 基于Intel Xeon Gold 6148 的预测速度](#1.4.1) + - [1.4.2 基于 V100 GPU 的预测速度](#1.4.2) + - [1.4.3 基于 SD855 的预测速度](#1.4.3) +- [2. 模型快速体验](#2) + - [2.1 安装 paddleclas](#2.1) + - [2.2 预测](#2.2) +- [3. 模型训练、评估和预测](#3) + - [3.1 环境配置](#3.1) + - [3.2 数据准备](#3.2) + - [3.3 模型训练](#3.3) + - [3.4 模型评估](#3.4) + - [3.5 模型预测](#3.5) +- [4. 模型推理部署](#4) + - [4.1 推理模型准备](#4.1) + - [4.1.1 基于训练得到的权重导出 inference 模型](#4.1.1) + - [4.1.2 直接下载 inference 模型](#4.1.2) + - [4.2 基于 Python 预测引擎推理](#4.2) + - [4.2.1 预测单张图像](#4.2.1) + - [4.2.2 基于文件夹的批量预测](#4.2.2) + - [4.3 基于 C++ 预测引擎推理](#4.3) + - [4.4 服务化部署](#4.4) + - [4.5 端侧部署](#4.5) + - [4.6 Paddle2ONNX 模型转换与预测](#4.6) +- [5. 引用](#5) + + -## 1. 摘要 +## 1. 模型和应用场景介绍 + +### 1.1 模型和应用场景简介 在计算机视觉领域中,骨干网络的好坏直接影响到整个视觉任务的结果。在之前的一些工作中,相关的研究者普遍将 FLOPs 或者 Params 作为优化目的,但是在工业界真实落地的场景中,推理速度才是考量模型好坏的重要指标,然而,推理速度和准确性很难兼得。考虑到工业界有很多基于 Intel CPU 的应用,所以我们本次的工作旨在使骨干网络更好的适应 Intel CPU,从而得到一个速度更快、准确率更高的轻量级骨干网络,与此同时,目标检测、语义分割等下游视觉任务的性能也同样得到提升。 - -## 2. 介绍 - 近年来,有很多轻量级的骨干网络问世,尤其最近两年,各种 NAS 搜索出的网络层出不穷,这些网络要么主打 FLOPs 或者 Params 上的优势,要么主打 ARM 设备上的推理速度的优势,很少有网络专门针对 Intel CPU 做特定的优化,导致这些网络在 Intel CPU 端的推理速度并不是很完美。基于此,我们针对 Intel CPU 设备以及其加速库 MKLDNN 设计了特定的骨干网络 PP-LCNet,比起其他的轻量级的 SOTA 模型,该骨干网络可以在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。与其他模型的对比图如下。 ![](../../images/PP-LCNet/PP-LCNet-Acc.png) - -## 3. 方法 + + +### 1.2 模型细节 网络结构整体如下图所示。 ![](../../images/PP-LCNet/PP-LCNet.png) 我们经过大量的实验发现,在基于 Intel CPU 设备上,尤其当启用 MKLDNN 加速库后,很多看似不太耗时的操作反而会增加延时,比如 elementwise-add 操作、split-concat 结构等。所以最终我们选用了结构尽可能精简、速度尽可能快的 block 组成我们的 BaseNet(类似 MobileNetV1)。基于 BaseNet,我们通过实验,总结了四条几乎不增加延时但是可以提升模型精度的方法,融合这四条策略,我们组合成了 PP-LCNet。下面对这四条策略一一介绍: - -### 3.1 更好的激活函数 + + +#### 1.2.1 更好的激活函数 自从卷积神经网络使用了 ReLU 激活函数后,网络性能得到了大幅度提升,近些年 ReLU 激活函数的变体也相继出现,如 Leaky-ReLU、P-ReLU、ELU 等,2017 年,谷歌大脑团队通过搜索的方式得到了 swish 激活函数,该激活函数在轻量级网络上表现优异,在 2019 年,MobileNetV3 的作者将该激活函数进一步优化为 H-Swish,该激活函数去除了指数运算,速度更快,网络精度几乎不受影响。我们也经过很多实验发现该激活函数在轻量级网络上有优异的表现。所以在 PP-LCNet 中,我们选用了该激活函数。 - -### 3.2 合适的位置添加 SE 模块 + + +#### 1.2.2 合适的位置添加 SE 模块 SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模型的精度。但是在 Intel CPU 端,该模块同样会带来较大的延时,如何平衡精度和速度是我们要解决的一个问题。虽然在 MobileNetV3 等基于 NAS 搜索的网络中对 SE 模块的位置进行了搜索,但是并没有得出一般的结论,我们通过实验发现,SE 模块越靠近网络的尾部对模型精度的提升越大。下表也展示了我们的一些实验结果: @@ -59,8 +81,9 @@ SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模 最终,PP-LCNet 中的 SE 模块的位置选用了表格中第三行的方案。 - -### 3.3 合适的位置添加更大的卷积核 + + +#### 1.2.3 合适的位置添加更大的卷积核 在 MixNet 的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种 split-concat 范式的 MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。我们通过实验总结了一些更大的卷积核在不同位置的作用,类似 SE 模块的位置,更大的卷积核在网络的中后部作用更明显,下表展示了 5x5 卷积核的位置对精度的影响: @@ -73,8 +96,9 @@ SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模 实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet 最终选用了表格中第三行的方案。 - -### 3.4 GAP 后使用更大的 1x1 卷积层 + + +#### 1.2.4 GAP 后使用更大的 1x1 卷积层 在 GoogLeNet 之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致 GAP 后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的 1x1 卷积层(等同于 FC 层),GAP 后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。 BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步说明了每个方案对结果的影响: @@ -87,11 +111,13 @@ BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步 | 1 | 1 | 1 | 0 | 59.91 | 1.85 | | 1 | 1 | 1 | 1 | 63.14 | 2.05 | - -## 4. 实验部分 + + +### 1.3 实验结果 - -### 4.1 图像分类 + + +#### 1.3.1 图像分类 图像分类我们选用了 ImageNet 数据集,相比目前主流的轻量级网络,PP-LCNet 在相同精度下可以获得更快的推理速度。当使用百度自研的 SSLD 蒸馏策略后,精度进一步提升,在 Intel cpu 端约 5ms 的推理速度下 ImageNet 的 Top-1 Acc 超过了 80%。 @@ -128,8 +154,9 @@ BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步 | MobileNetV3_small_x1_25 | 3.6 | 100 | 70.67 | 89.51 | 3.95 | | PPLCNet_x1_0 | 3.0 | 161 | 71.32 | 90.03 | 2.46 | - -### 4.2 目标检测 + + +#### 1.3.2 目标检测 目标检测的方法我们选用了百度自研的 PicoDet,该方法主打轻量级目标检测场景,下表展示了在 COCO 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的结果的比较,无论在精度还是速度上,PP-LCNet 的优势都非常明显。 @@ -140,8 +167,9 @@ MobileNetV3_large_x0_35 | 19.2 | 8.1 | MobileNetV3_large_x0_75 | 25.8 | 11.1 | PPLCNet_x1_0 | 26.9 | 7.9 | - -### 4.3 语义分割 + + +#### 1.3.3 语义分割 语义分割的方法我们选用了 DeeplabV3+,下表展示了在 Cityscapes 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的比较,在精度和速度方面,PP-LCNet 的优势同样明显。 @@ -152,23 +180,46 @@ MobileNetV3_large_x0_5 | 55.42 | 135 | MobileNetV3_large_x0_75 | 64.53 | 151 | PPLCNet_x1_0 | 66.03 | 96 | - + -## 5. 基于 V100 GPU 的预测速度 +## 1.4 Benchmark -| Models | Crop Size | Resize Short Size | FP32
Batch Size=1
(ms) | FP32
Batch Size=1\4
(ms) | FP32
Batch Size=8
(ms) | -| ------------- | --------- | ----------------- | ---------------------------- | -------------------------------- | ------------------------------ | -| PPLCNet_x0_25 | 224 | 256 | 0.72 | 1.17 | 1.71 | -| PPLCNet_x0_35 | 224 | 256 | 0.69 | 1.21 | 1.82 | -| PPLCNet_x0_5 | 224 | 256 | 0.70 | 1.32 | 1.94 | -| PPLCNet_x0_75 | 224 | 256 | 0.71 | 1.49 | 2.19 | -| PPLCNet_x1_0 | 224 | 256 | 0.73 | 1.64 | 2.53 | -| PPLCNet_x1_5 | 224 | 256 | 0.82 | 2.06 | 3.12 | -| PPLCNet_x2_0 | 224 | 256 | 0.94 | 2.58 | 4.08 | + + +#### 1.4.1 基于Intel Xeon Gold 6148 的预测速度 - +| Model | Intel Xeon Gold 6148 time(ms)
bs=1, thread=10 | +|-------|-------------| +| PPLCNet_x0_25 | 1.74 | +| PPLCNet_x0_35 | 1.92 | +| PPLCNet_x0_5 | 2.05 | +| PPLCNet_x0_75 | 2.29 | +| PPLCNet_x1_0 | 2.46 | +| PPLCNet_x1_5 | 3.19 | +| PPLCNet_x2_0 | 4.27 | +| PPLCNet_x2_5 | 5.39 | + +**备注:** 推理过程使用MKLDNN。 -## 6. 基于 SD855 的预测速度 + + +#### 1.4.2 基于 V100 GPU 的预测速度 + +| Models | FP32
Batch Size=1
(ms) | FP32
Batch Size=1\4
(ms) | FP32
Batch Size=8
(ms) | +| ------------- | ---------------------------- | -------------------------------- | ------------------------------ | +| PPLCNet_x0_25 | 0.72 | 1.17 | 1.71 | +| PPLCNet_x0_35 | 0.69 | 1.21 | 1.82 | +| PPLCNet_x0_5 | 0.70 | 1.32 | 1.94 | +| PPLCNet_x0_75 | 0.71 | 1.49 | 2.19 | +| PPLCNet_x1_0 | 0.73 | 1.64 | 2.53 | +| PPLCNet_x1_5 | 0.82 | 2.06 | 3.12 | +| PPLCNet_x2_0 | 0.94 | 2.58 | 4.08 | + +**备注:** 推理过程使用 TensorRT。 + + + +#### 1.4.3 基于 SD855 的预测速度 | Models | SD855 time(ms)
bs=1, thread=1 | SD855 time(ms)
bs=1, thread=2 | SD855 time(ms)
bs=1, thread=4 | | ------------- | -------------------------------- | --------------------------------- | --------------------------------- | @@ -181,15 +232,287 @@ MobileNetV3_large_x0_75 | 64.53 | 151 | | PPLCNet_x2_0 | 33.79 | 20.17 | 12.10 | | PPLCNet_x2_5 | 49.89 | 29.60 | 17.82 | - + + +## 2. 模型快速体验 -## 7. 总结 + + +### 2.1 安装 paddleclas + +使用如下命令快速安装 paddleclas + +``` +pip3 install paddleclas +``` + + +### 2.2 预测 -PP-LCNet 没有像学术界那样死扣极致的 FLOPs 与 Params,而是着眼于分析如何添加对 Intel CPU 友好的模块来提升模型的性能,这样可以更好的平衡准确率和推理时间,其中的实验结论也很适合其他网络结构设计的研究者,同时也为 NAS 搜索研究者提供了更小的搜索空间和一般结论。最终的 PP-LCNet 在产业界也可以更好的落地和应用。 +使用 PPLCNet_x1_0 的权重快速预测 + +```bash +paddleclas --model_name=PPLCNet_x1_0 --infer_imgs="docs/images/inference_deployment/whl_demo.jpg" +``` + +结果如下: +``` +>>> result +filename: docs/images/inference_deployment/whl_demo.jpg, top-5, class_ids: [8, 7, 86, 81, 85], scores: [0.91347, 0.03779, 0.0036, 0.00117, 0.00112], label_names: ['hen', 'cock', 'partridge', 'ptarmigan', 'quail'] +Predict complete! +``` + +**备注:** + +* 更换 PPLCNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `PPLCNet_x2_0` 时,只需要将 `--model_name=PPLCNet_x1_0` 改为 `--model_name=PPLCNet_x2_0` 即可。 - + + +## 3. 模型训练、评估和预测 + + -## 8. 引用 +### 3.1 环境配置 + +* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。 + + + +### 3.2 数据准备 + +请在[ImageNet 官网](https://www.image-net.org/)准备 ImageNet-1k 相关的数据。 + + +进入 PaddleClas 目录。 + +``` +cd path_to_PaddleClas +``` + +进入 `dataset/` 目录,将下载好的数据命名为 `ILSVRC2012` ,存放于此。 `ILSVRC2012` 目录中具有以下数据: + +``` +├── train +│   ├── n01440764 +│   │   ├── n01440764_10026.JPEG +│   │   ├── n01440764_10027.JPEG +├── train_list.txt +... +├── val +│   ├── ILSVRC2012_val_00000001.JPEG +│   ├── ILSVRC2012_val_00000002.JPEG +├── val_list.txt + +其中 `train/` 和 `val/` 分别为训练集和验证集。`train_list.txt` 和 `val_list.txt` 分别为训练集和验证集的标签文件。 + +**备注:** + +* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。 + + + + +### 3.3 模型训练 + + +在 `ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml` 中提供了 PPLCNet_x1_0 训练配置,可以通过如下脚本启动训练: + +```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/ImageNet/PPLCNet/PPLCNet_x1_0.yaml +``` + + +**备注:** + +* 当前精度最佳的模型会保存在 `output/PPLCNet_x1_0/best_model.pdparams` + + + +### 3.4 模型评估 + +训练好模型之后,可以通过以下命令实现对模型指标的评估。 + +```bash +python3 tools/eval.py \ + -c ppcls/configs/ImageNet/PPLCNet/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/ImageNet/PPLCNet/PPLCNet_x1_0.yaml \ + -o Global.pretrained_model=output/PPLCNet_x1_0/best_model +``` + +输出结果如下: + +``` +[{'class_ids': [8, 7, 86, 81, 85], 'scores': [0.91347, 0.03779, 0.0036, 0.00117, 0.00112], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ptarmigan', 'quail']}] +``` + +**备注:** + +* 这里`-o Global.pretrained_model="output/PPLCNet_x1_0/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。 + +* 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。 + +* 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。 + + + + + +## 4. 模型推理部署 + + + +### 4.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)的方式。 + + + + +### 4.1.1 基于训练得到的权重导出 inference 模型 + +此处,我们提供了将权重和模型转换的脚本,执行该脚本可以得到对应的 inference 模型: + +```bash +python3 tools/export_model.py \ + -c ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml \ + -o Global.pretrained_model=output/PPLCNet_x1_0/best_model \ + -o Global.save_inference_dir=deploy/models/PPLCNet_x1_0_infer +``` +执行完该脚本后会在 `deploy/models/` 下生成 `PPLCNet_x1_0_infer` 文件夹,`models` 文件夹下应有如下文件结构: + +``` +├── PPLCNet_x1_0_infer +│ ├── inference.pdiparams +│ ├── inference.pdiparams.info +│ └── inference.pdmodel +``` + + + + +### 4.1.2 直接下载 inference 模型 + +[4.1.1 小节](#4.1.1)提供了导出 inference 模型的方法,此处也提供了该场景可以下载的 inference 模型,可以直接下载体验。 + +``` +cd deploy/models +# 下载 inference 模型并解压 +wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x1_0_infer.tar && tar -xf PPLCNet_x1_0_infer.tar +``` + +解压完毕后,`models` 文件夹下应有如下文件结构: + +``` +├── PPLCNet_x1_0_infer +│ ├── inference.pdiparams +│ ├── inference.pdiparams.info +│ └── inference.pdmodel +``` + + + +### 4.2 基于 Python 预测引擎推理 + + + + +#### 4.2.1 预测单张图像 + +返回 `deploy` 目录: + +``` +cd ../ +``` + +运行下面的命令,对图像 `./images/ImageNet/ILSVRC2012_val_00000010.jpeg` 进行有人/无人分类。 + +```shell +# 使用下面的命令使用 GPU 进行预测 +python3 python/predict_cls.py -c configs/inference_cls.yaml -o Global.inference_model_dir=models/PPLCNet_x1_0_infer +# 使用下面的命令使用 CPU 进行预测 +python3 python/predict_cls.py -c configs/inference_cls.yaml -o Global.inference_model_dir=models/PPLCNet_x1_0_infer -o Global.use_gpu=False +``` + +输出结果如下。 + +``` +ILSVRC2012_val_00000010.jpeg: class id(s): [153, 265, 204, 283, 229], score(s): [0.61, 0.11, 0.05, 0.03, 0.02], label_name(s): ['Maltese dog, Maltese terrier, Maltese', 'toy poodle', 'Lhasa, Lhasa apso', 'Persian cat', 'Old English sheepdog, bobtail'] +``` + + + +#### 4.2.2 基于文件夹的批量预测 + +如果希望预测文件夹内的图像,可以直接修改配置文件中的 `Global.infer_imgs` 字段,也可以通过下面的 `-o` 参数修改对应的配置。 + +```shell +# 使用下面的命令使用 GPU 进行预测,如果希望使用 CPU 预测,可以在命令后面添加 -o Global.use_gpu=False +python3 python/predict_cls.py -c configs/inference_cls.yaml -o Global.inference_model_dir=models/PPLCNet_x1_0_infer -o Global.infer_imgs=images/ImageNet/ +``` + +终端中会输出该文件夹内所有图像的分类结果,如下所示。 + +``` +ILSVRC2012_val_00000010.jpeg: class id(s): [153, 265, 204, 283, 229], score(s): [0.61, 0.11, 0.05, 0.03, 0.02], label_name(s): ['Maltese dog, Maltese terrier, Maltese', 'toy poodle', 'Lhasa, Lhasa apso', 'Persian cat', 'Old English sheepdog, bobtail'] +ILSVRC2012_val_00010010.jpeg: class id(s): [695, 551, 507, 531, 419], score(s): [0.11, 0.06, 0.03, 0.03, 0.03], label_name(s): ['padlock', 'face powder', 'combination lock', 'digital watch', 'Band Aid'] +ILSVRC2012_val_00020010.jpeg: class id(s): [178, 211, 209, 210, 236], score(s): [0.87, 0.03, 0.01, 0.00, 0.00], label_name(s): ['Weimaraner', 'vizsla, Hungarian pointer', 'Chesapeake Bay retriever', 'German short-haired pointer', 'Doberman, Doberman pinscher'] +ILSVRC2012_val_00030010.jpeg: class id(s): [80, 23, 93, 81, 99], score(s): [0.87, 0.01, 0.01, 0.01, 0.00], label_name(s): ['black grouse', 'vulture', 'hornbill', 'ptarmigan', 'goose'] +``` + + + + +### 4.3 基于 C++ 预测引擎推理 + +PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。 + + + +### 4.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)来完成相应的部署工作。 + + + +### 4.5 端侧部署 + +Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。 + +PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。 + + + +### 4.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)来完成相应的部署工作。 + + + + +## 5. 引用 如果你的论文用到了 PP-LCNet 的方法,请添加如下 cite: ```