提交 206c8901 编写于 作者: H HydrogenSulfate

Merge branch 'newest' into fix_deploy_python_doc

...@@ -25,11 +25,12 @@ PreProcess: ...@@ -25,11 +25,12 @@ PreProcess:
order: '' order: ''
channel_num: 3 channel_num: 3
- ToCHWImage: - ToCHWImage:
PostProcess: PostProcess:
main_indicator: MultiLabelTopk main_indicator: MultiLabelThreshOutput
MultiLabelTopk: MultiLabelThreshOutput:
topk: 5 threshold: 0.5
class_id_map_file: None class_id_map_file: "../ppcls/utils/NUS-WIDE-SCENE_label_list.txt"
delimiter: " "
SavePreLabel: SavePreLabel:
save_dir: ./pre_label/ save_dir: ./pre_label/
\ No newline at end of file
...@@ -82,10 +82,11 @@ class ThreshOutput(object): ...@@ -82,10 +82,11 @@ class ThreshOutput(object):
class Topk(object): class Topk(object):
def __init__(self, topk=1, class_id_map_file=None): def __init__(self, topk=1, class_id_map_file=None, delimiter=None):
assert isinstance(topk, (int, )) assert isinstance(topk, (int, ))
self.class_id_map = self.parse_class_id_map(class_id_map_file)
self.topk = topk self.topk = topk
self.class_id_map = self.parse_class_id_map(class_id_map_file)
self.delimiter = delimiter if delimiter is not None else " "
def parse_class_id_map(self, class_id_map_file): def parse_class_id_map(self, class_id_map_file):
if class_id_map_file is None: if class_id_map_file is None:
...@@ -102,21 +103,20 @@ class Topk(object): ...@@ -102,21 +103,20 @@ class Topk(object):
with open(class_id_map_file, "r") as fin: with open(class_id_map_file, "r") as fin:
lines = fin.readlines() lines = fin.readlines()
for line in lines: for line in lines:
partition = line.split("\n")[0].partition(" ") partition = line.split("\n")[0].partition(self.delimiter)
class_id_map[int(partition[0])] = str(partition[-1]) class_id_map[int(partition[0])] = str(partition[-1])
except Exception as ex: except Exception as ex:
print(ex) print(ex)
class_id_map = None class_id_map = None
return class_id_map return class_id_map
def __call__(self, x, file_names=None, multilabel=False): def __call__(self, x, file_names=None):
if file_names is not None: if file_names is not None:
assert x.shape[0] == len(file_names) assert x.shape[0] == len(file_names)
y = [] y = []
for idx, probs in enumerate(x): for idx, probs in enumerate(x):
index = probs.argsort(axis=0)[-self.topk:][::-1].astype( index = probs.argsort(axis=0)[-self.topk:][::-1].astype(
"int32") if not multilabel else np.where( "int32")
probs >= 0.5)[0].astype("int32")
clas_id_list = [] clas_id_list = []
score_list = [] score_list = []
label_name_list = [] label_name_list = []
...@@ -138,12 +138,56 @@ class Topk(object): ...@@ -138,12 +138,56 @@ class Topk(object):
return y return y
class MultiLabelTopk(Topk): class MultiLabelThreshOutput(object):
def __init__(self, topk=1, class_id_map_file=None): def __init__(self, threshold=0.5, class_id_map_file=None, delimiter=None):
super().__init__() self.threshold = threshold
self.delimiter = delimiter if delimiter is not None else " "
self.class_id_map = self.parse_class_id_map(class_id_map_file)
def parse_class_id_map(self, class_id_map_file):
if class_id_map_file is None:
return None
if not os.path.exists(class_id_map_file):
print(
"Warning: If want to use your own label_dict, please input legal path!\nOtherwise label_names will be empty!"
)
return None
try:
class_id_map = {}
with open(class_id_map_file, "r") as fin:
lines = fin.readlines()
for line in lines:
partition = line.split("\n")[0].partition(self.delimiter)
class_id_map[int(partition[0])] = str(partition[-1])
except Exception as ex:
print(ex)
class_id_map = None
return class_id_map
def __call__(self, x, file_names=None): def __call__(self, x, file_names=None):
return super().__call__(x, file_names, multilabel=True) y = []
for idx, probs in enumerate(x):
index = np.where(probs >= self.threshold)[0].astype("int32")
clas_id_list = []
score_list = []
label_name_list = []
for i in index:
clas_id_list.append(i.item())
score_list.append(probs[i].item())
if self.class_id_map is not None:
label_name_list.append(self.class_id_map[i.item()])
result = {
"class_ids": clas_id_list,
"scores": np.around(
score_list, decimals=5).tolist(),
"label_names": label_name_list
}
if file_names is not None:
result["file_name"] = file_names[idx]
y.append(result)
return y
class SavePreLabel(object): class SavePreLabel(object):
......
...@@ -51,6 +51,9 @@ python3 -m paddle.distributed.launch \ ...@@ -51,6 +51,9 @@ python3 -m paddle.distributed.launch \
After training 10 epochs, the best correctness of the validation set should be around 0.95. After training 10 epochs, the best correctness of the validation set should be around 0.95.
**Note:**
1. Currently, the loss function for multi-label classification only supports `MultiLabelLoss` (BCE Loss).
2. Currently, the evaluation metrics of multi-label classification support `Accuracy_Score` and `HammingDistance`. Please look forward to the support of other evaluation metrics.
<a name="3"></a> <a name="3"></a>
## 3. Model Evaluation ## 3. Model Evaluation
...@@ -74,7 +77,7 @@ python3 tools/infer.py \ ...@@ -74,7 +77,7 @@ python3 tools/infer.py \
Obtain an output silimar to the following: Obtain an output silimar to the following:
``` ```
[{'class_ids': [6, 13, 17, 23, 26, 30], 'scores': [0.95683, 0.5567, 0.55211, 0.99088, 0.5943, 0.78767], 'file_name': './deploy/images/0517_2715693311.jpg', 'label_names': []}] [{'class_ids': [6, 13, 17, 23, 30], 'scores': [0.98217, 0.78129, 0.64377, 0.9942, 0.96109], 'label_names': ['clouds', 'lake', 'ocean', 'sky', 'water'], 'file_name': 'deploy/images/0517_2715693311.jpg'}]
``` ```
...@@ -107,11 +110,14 @@ Inference and prediction through predictive engines: ...@@ -107,11 +110,14 @@ Inference and prediction through predictive engines:
``` ```
python3 python/predict_cls.py \ python3 python/predict_cls.py \
-c configs/inference_multilabel_cls.yaml -c configs/inference_cls_multilabel.yaml
``` ```
The predicted pictures are as follows:
Obtain an output silimar to the following: ![](../../images/quick_start/multi_label_demo.png)
After executing the inference command, obtain an output silimar to the following:
``` ```
0517_2715693311.jpg: class id(s): [6, 13, 17, 23, 26, 30], score(s): [0.96, 0.56, 0.55, 0.99, 0.59, 0.79], label_name(s): [] 0517_2715693311.jpg: class id(s): [6, 13, 17, 23, 30], score(s): [0.98, 0.78, 0.64, 0.99, 0.96], label_name(s): ['clouds', 'lake', 'ocean', 'sky', 'water']
``` ```
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
#SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
# 识别模型转分类模型
PaddleClas 提供了 `gallery2fc.py` 工具,帮助大家将识别模型转为分类模型。目前该工具仅支持转换量化后模型,因此建议使用 PaddleClas 提供的 `general_PPLCNet_x2_5_pretrained_v1.0_quant` 预训练模型,该模型为量化后的通用识别模型,backbone 为 PPLCNet_x2_5。
如需使用其他模型,关于量化的具体操作请参考文档 [模型量化](./model_prune_quantization.md)
## 一、模型转换说明
### 1.1 准备底库数据、预训练模型
#### 1. 底库数据集
首先需要准备好底库数据,下面以 PaddleClas 提供的饮料数据集(drink_dataset_v1.0)为例进行说明,饮料数据集获取方法:
```shell
cd PaddleClas/
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v1.0.tar
tar -xf drink_dataset_v1.0.tar
```
饮料数据集的底库图片路径为 `drink_dataset_v1.0/gallery/`,底库图片列表可在 `drink_dataset_v1.0/gallery/drink_label.txt` 中查看,关于底库数据格式说明,请参考文档[数据集格式说明](../data_preparation/recognition_dataset.md#1-数据集格式说明)
#### 2. 预训练模型
在开始转换模型前,需要准备好预训练模型,下面以量化后的 `general_PPLCNet_x2_5` 模型为例,下载预训练模型:
```shell
cd PaddleClas/pretrained/
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/general_PPLCNet_x2_5_pretrained_v1.0_quant.pdparams
```
### 1.2 准备配置文件
在进行模型转换时,需要通过配置文件定义所需参数,本例中所用配置文件为 `ppcls/configs/GeneralRecognition/Gallery2FC_PPLCNet_x2_5.yaml`,对于配置文件字段的说明,如下所示:
* Global:
* pretrained_model: 预训练模型路径,无需包含 `.pdparams` 后缀名;
* image_shape: 模型输入数据尺寸,无需包含 batch size 维度;
* save_inference_dir: 转换后模型的保存路径;
* Arch: 模型结构相关定义,可参考 [配置说明](../models_training/config_description.md#3-%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9E%8B)
* IndexProcess: 底库数据集相关定义
* image_root: 底库数据集路径;
* data_file: 底库数据集列表文件路径;
### 1.3 模型转换
在完成上述准备工作后,即可进行模型转换,命令如下所示:
```python
python ppcls/utils/gallery2fc.py -c ppcls/configs/GeneralRecognition/Gallery2FC_PPLCNet_x2_5.yaml
```
在上述命令执行完成后,转换并导出的模型保存在目录 `./inference/general_PPLCNet_x2_5_quant/` 下。在推理部署时,需要注意的是,模型的输出结果通常有多个,应选取分类结果作为模型输出,需要注意区分。
高级教程
================================
.. toctree::
:maxdepth: 2
DataAugmentation.md
knowledge_distillation.md
model_prune_quantization.md
code_overview.md
how_to_contribute.md
算法介绍
================================
.. toctree::
:maxdepth: 2
image_classification.md
metric_learning.md
knowledge_distillation.md
model_prune_quantization.md
ImageNet_models.md
DataAugmentation.md
...@@ -16,19 +16,16 @@ ...@@ -16,19 +16,16 @@
- Metric Learning——更鲁棒的检索特征 - Metric Learning——更鲁棒的检索特征
- Logo识别等方向延展 - Logo识别等方向延展
- [超轻量图像识别系统概览](https://aistudio.baidu.com/aistudio/education/lessonvideo/1890318) - [超轻量图像识别系统概览](https://aistudio.baidu.com/aistudio/education/lessonvideo/1890318)
- 图像识别技术选型策略 - 图像识别技术选型策略
- 推理速度提升8倍的秘籍 - 推理速度提升8倍的秘籍
- 四大典型行业应用案例 - 四大典型行业应用案例
- [SOTA模型炼丹秘诀](https://aistudio.baidu.com/aistudio/education/lessonvideo/1890323) - [SOTA模型炼丹秘诀](https://aistudio.baidu.com/aistudio/education/lessonvideo/1890323)
- CPU定制模型PP-LCNet优化思路 - CPU定制模型PP-LCNet优化思路
- Vison Transformer模型的应用拓展 - Vison Transformer模型的应用拓展
- [商品识别产业痛点剖析](https://aistudio.baidu.com/aistudio/education/lessonvideo/1896890) - [商品识别产业痛点剖析](https://aistudio.baidu.com/aistudio/education/lessonvideo/1896890)
- 特征提取技术详解 - 特征提取技术详解
- 向量快速检索揭秘 - 向量快速检索揭秘
- [手把手教你玩转图像识别](https://aistudio.baidu.com/aistudio/education/lessonvideo/1911507) - [手把手教你玩转图像识别](https://aistudio.baidu.com/aistudio/education/lessonvideo/1911507)
- 产业应用十问十答 - 产业应用十问十答
- 智能零售下的应用案例 - 智能零售下的应用案例
- 识别系统快速落地方案 - 识别系统快速落地方案
# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
import sphinx_rtd_theme
from recommonmark.parser import CommonMarkParser
#import sphinx-markdown-tables
# -- Project information -----------------------------------------------------
project = 'PaddleClas'
copyright = '2021, PaddleClas'
author = 'PaddleClas'
# The full version, including alpha/beta/rc tags
release = '2.3.0'
# -- General configuration ---------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
source_parsers = {
'.md': CommonMarkParser,
}
source_suffix = ['.rst', '.md']
extensions = [
'recommonmark',
'sphinx_markdown_tables'
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = 'zh_CN'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = "sphinx_rtd_theme"
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
数据准备
================================
.. toctree::
:maxdepth: 2
recognition_dataset.md
classification_dataset.md
...@@ -90,7 +90,7 @@ ...@@ -90,7 +90,7 @@
在打开图像库或者新建图像库完成后,可以使用导入图像功能,即导入用户自己生成好的图像库。具体有支持两种导入格式 在打开图像库或者新建图像库完成后,可以使用导入图像功能,即导入用户自己生成好的图像库。具体有支持两种导入格式
- image_list格式:打开具体的`.txt`文件。`.txt`文件中每一行格式: `image_path label`。跟据文件路径及label导入 - image_list格式:打开具体的`.txt`文件。`.txt`文件中每一行格式: `image_path label`。跟据文件路径及label导入
- 多文件夹格式:打开`具体文件夹`,此文件夹下存储多个子文件夹,每个子文件夹名字为`label_name`,每个子文件夹中存储对应的图像数据。 - 多文件夹格式:打开`具体文件夹`,此文件夹下存储多个子文件夹,每个子文件夹名字为`label_name`,每个子文件夹中存储对应的图像数据。
<a name="1.4"></a> <a name="1.4"></a>
...@@ -150,10 +150,10 @@ python index_manager.py -c ../configs/inference_drink.yaml ...@@ -150,10 +150,10 @@ python index_manager.py -c ../configs/inference_drink.yaml
```shell ```shell
index_root/ # 库存储目录 index_root/ # 库存储目录
|-- image_list.txt # 图像列表,每行:image_path label。由前端生成及修改,后端只读 |-- image_list.txt # 图像列表,每行:image_path label。由前端生成及修改,后端只读
|-- images # 图像存储目录,由前端生成及增删查等操作。后端只读 |-- images # 图像存储目录,由前端生成及增删查等操作。后端只读
| |-- md5.jpg | |-- md5.jpg
| |-- md5.jpg | |-- md5.jpg
| |-- …… | |-- ……
|-- features.pkl # 建库之后,保存的embedding向量,后端生成,前端无需操作 |-- features.pkl # 建库之后,保存的embedding向量,后端生成,前端无需操作
|-- index # 真正的生成的index库存储目录,后端生成及操作,前端无需操作。 |-- index # 真正的生成的index库存储目录,后端生成及操作,前端无需操作。
...@@ -192,4 +192,3 @@ index_root/ # 库存储目录 ...@@ -192,4 +192,3 @@ index_root/ # 库存储目录
- 问题4: 报错 图像与index库不一致 - 问题4: 报错 图像与index库不一致
答:可能用户自己修改了image_list.txt,修改完成后,请及时更新index库,保证其一致。 答:可能用户自己修改了image_list.txt,修改完成后,请及时更新index库,保证其一致。
FAQ系列
================================
.. toctree::
:maxdepth: 2
faq_2021_s2.md
faq_2021_s1.md
faq_2020_s1.md
faq_selected_30.md
图像识别流程
================================
.. toctree::
:maxdepth: 2
mainbody_detection.md
feature_extraction.md
vector_search.md
欢迎使用PaddleClas图像分类库!
================================
.. toctree::
:maxdepth: 1
introduction/index
installation/index
quick_start/index
image_recognition_pipeline/index
data_preparation/index
models_training/index
inference_deployment/index
models/index
algorithm_introduction/index
advanced_tutorials/index
others/index
faq_series/index
推理部署
================================
.. toctree::
:maxdepth: 2
export_model.md
python_deploy.md
cpp_deploy.md
paddle_serving_deploy.md
paddle_hub_serving_deploy.md
paddle_lite_deploy.md
whl_deploy.md
cpp_deploy_on_windows.md
安装
================================
.. toctree::
:maxdepth: 2
install_paddle.md
install_paddleclas.md
## PaddleClas 功能特性
飞桨图像识别套件 PaddleClas 是飞桨为工业界和学术界所准备的一个图像识别任务的工具集,助力使用者训练出更好的视觉模型和应用落地。具体地,它包含以下几个核心特性。
- 实用的图像识别系统:集成了目标检测、特征学习、图像检索等模块,广泛适用于各类图像识别任务。
提供商品识别、车辆识别、 logo 识别和动漫人物识别等 4 个场景应用示例。
- 丰富的预训练模型库:提供了 36 个系列共 175 个 ImageNet 预训练模型,其中 7 个精选系列模型支持结构快速修改。
- 全面易用的特征学习组件:集成 arcmargin, triplet loss 等 12 度量学习方法,通过配置文件即可随意组合切换。
- SSLD 知识蒸馏: 14 个分类预训练模型,精度普遍提升 3% 以上;其中 ResNet50_vd 模型在 ImageNet-1k 数据集上的 Top-1 精度达到了 84.0%,Res2Net200_vd 预训练模型 Top-1 精度高达 85.1% 。
- 数据增广:支持 AutoAugment 、 Cutout 、 Cutmix 等 8 种数据增广算法详细介绍、代码复现和在统一实验环境下的效果评估。
![](../../images/recognition.gif)
更多关于图像识别快速体验、算法详解、模型训练评估与预测部署方法,请参考[首页 README 文档教程](../../../README_ch.md)
介绍
================================
.. toctree::
:maxdepth: 2
function_intro.md
more_demo/index
## 动漫人物图片识别效果图
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069080-a821e0b7-8a10-4946-bf05-ff093cc16064.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069100-7539d292-1bd8-4655-8a6d-d1f2238bd618.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069103-f91359d4-1197-4a6e-b2f7-434c76a6b704.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069108-ad54ae1d-610d-4cfa-9cd6-8ee8d280d61d.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069114-3c771434-84a8-4e58-961e-d35edfbfe5ef.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069119-e8d85be5-da87-4125-ae8b-9fd4cac139d9.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069124-98c30894-4837-4f2f-8399-3d3ebadfd0a1.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069125-a9edf115-33a1-48bf-9e4f-7edbc4269a1e.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069129-98553a25-00e2-4f0f-9b44-dfc4e4f6b6d1.png " width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069131-f7649bb2-255c-4725-a635-799b8b4d815a.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069135-acb69b89-55db-41ac-9846-e2536ef3d955.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069137-1f0abfdb-6608-432e-bd40-c8e1ab86ef8b.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069140-18c6a439-f117-498d-9cdb-ade71cc2c248.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069145-80452f86-afcf-42b5-8423-328cca9e4750.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069154-63a25c1c-b448-44c2-8baf-eb31952c5476.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069156-1b881c6b-5680-4f9a-aef1-2491af50675d.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069161-8759f3d4-8456-43ea-bf54-99a646d5a109.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069167-937aa847-c661-431c-b3dc-5a3c890b31cd.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069170-43d0dce4-6c62-485d-adf4-364c8467c251.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069175-70bc9e50-b833-4a2a-8a3f-c0775dac49c2.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069179-d01f8a0f-4383-4b08-b064-4e6bb006e745.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069184-d423a84c-c9dd-4125-9dc7-397cae21efc9.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069188-fc4deb80-38a2-4c50-9a29-30cee4c8e374.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069193-77a19ee8-b1e2-4c27-9016-3440a1547470.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069196-5f050524-ac08-4831-89f5-9e9e3ce085c1.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069200-4f963171-c790-4f43-8ca3-2e701ad3731c.jpeg" width = "400" /> </div>
介绍
================================
.. toctree::
:maxdepth: 2
cartoon.md
logo.md
more_demo.md
product.md
vehicle.md
## 商标图片识别效果图
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096687-5b562e2d-0653-4be6-861d-1936a4440df2.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096698-4b95eb4b-6638-47dc-ae48-7b40744a31ba.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096701-4a4b2bd9-85f2-4d55-be4b-be6ab5e0fb81.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096706-ef4ad024-7284-4cb3-975a-779fd06b96f5.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096710-620b0495-cc83-4501-a104-dfe20afb53d2.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096713-48e629aa-c637-4603-b005-18570fa94d6d.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096715-709957f2-50bb-4edb-a6e4-e7d5601872c7.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096717-a74744cc-4fb8-4e78-b1cb-20409582ca52.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096721-d4af003c-7945-4591-9e47-4e428dc2628c.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096726-460af6ab-8595-4fb4-9960-4c66b18bee1e.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096728-81494000-92b5-40ad-a6a7-606dae3548a3.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096731-2e980977-9ee6-4e29-bdf7-8397820f70e8.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096732-7d425b45-6b04-4984-948d-278da13dd802.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096735-a9c85c14-5965-4529-a235-ce00035bd7ab.jpg " width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096736-3182efc6-ba43-4cde-9397-88a131f4fed8.jpg " width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096737-91e6fa24-1eb5-4aba-9271-5a3722cbe35b.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096740-f440f89b-5f95-493a-b087-00c7cd3481ef.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096747-31b924e3-ffb2-45ab-872e-4ff923ed04f1.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096752-1f98c937-5d83-4c29-b495-01971b5fb258.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096756-a994c7e2-b9e7-40ba-9934-78c10666217b.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096757-879749e0-9e04-4d1e-a07b-6a4322975a84.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096761-5b682ce8-4f83-4fbb-bfb7-df749912aa8b.png " width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096767-e8f701eb-d0e8-4304-b031-e2bff8c199f3.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096778-ec2ad374-b9fc-427e-9e8b-8e5d2afc6394.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096783-9ec5e04d-19e3-463d-ad9d-7a26202bbb9c.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096788-44f04979-18ca-4ba6-b833-7489b344ffff.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096791-6989451e-157c-4101-8b54-7578b05eb7c9.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096796-cc4477cf-016c-4b19-86c3-61824704ecf5.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096798-ba33ee0d-45b8-48ad-a8fa-14cd643a6976.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096805-e29a2ba8-4785-4ca6-9e0d-596fad6ce8dc.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096812-7d8c57a5-fbae-4496-8144-3b40ac74fef0.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096816-50f0ac3d-f2eb-4011-a34e-58e2e215b7b0.jpg " width = "400" /> </div>
## 识别效果展示
- 商品识别
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277277-7b29f596-35f6-4f00-8d2b-0ef0be57a090.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277291-f7d2b2a1-5790-4f5b-a0e6-f5c52d04a69a.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277300-8ce0d5ce-e0ca-46ea-bb9a-74df0df66ae3.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277308-14a097bd-2bcd-41ce-a9e6-5e9cd0bd8b08.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277311-208ae574-a708-46e2-a41e-c639322913b1.jpg" width = "400" /> </div>
[更多效果图](product.md)
- 动漫人物识别
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069108-ad54ae1d-610d-4cfa-9cd6-8ee8d280d61d.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069100-7539d292-1bd8-4655-8a6d-d1f2238bd618.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069080-a821e0b7-8a10-4946-bf05-ff093cc16064.jpeg" width = "400" /> </div>
[更多效果图](cartoon.md)
- logo识别
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096687-5b562e2d-0653-4be6-861d-1936a4440df2.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096701-4a4b2bd9-85f2-4d55-be4b-be6ab5e0fb81.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096706-ef4ad024-7284-4cb3-975a-779fd06b96f5.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096713-48e629aa-c637-4603-b005-18570fa94d6d.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096752-1f98c937-5d83-4c29-b495-01971b5fb258.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096767-e8f701eb-d0e8-4304-b031-e2bff8c199f3.jpeg" width = "400" /> </div>
[更多效果图](logo.md)
- 车辆识别
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243899-c60f0a51-db9b-438a-9f2d-0d2893c200bb.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243905-7eeb938d-d88f-4540-a667-06e08dcf1f55.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243911-735a6ec0-a624-4965-b3cd-2b9f52fa8d65.jpeg" width = "400" /> </div>
[更多效果图](vehicle.md)
## 商品图片识别效果图
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277277-7b29f596-35f6-4f00-8d2b-0ef0be57a090.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277287-7bdad02a-8e3c-4e04-861c-95a5dae1f3c6.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277291-f7d2b2a1-5790-4f5b-a0e6-f5c52d04a69a.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277294-80aaab94-5109-41be-97f8-3ada73118963.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277296-2a8d7846-cd2e-454e-8b72-46233da09451.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277300-8ce0d5ce-e0ca-46ea-bb9a-74df0df66ae3.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277302-25c973eb-f9aa-42ce-b9e9-66cee738c241.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277303-3d3460da-c6aa-4994-b585-17bc9f3df504.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277306-20cbef71-cc58-4ae1-965b-4806e82988a9.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277308-14a097bd-2bcd-41ce-a9e6-5e9cd0bd8b08.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277309-be092d1c-6513-472c-8b7f-685f4353ae5b.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277311-208ae574-a708-46e2-a41e-c639322913b1.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277314-72901737-5ef5-4a23-820b-1db58c5e6ca0.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277318-aef4080c-24f2-4d92-be3c-45b500b75584.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277320-8046d0df-1256-41ce-a8d6-6d2c1292462c.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277321-e3864473-6a8e-485f-81f2-562b902d6cff.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277324-0aacc27f-699a-437b-bac0-4a20c90b47b1.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277328-8d28f754-8645-4c05-a9a6-0312bbe2f890.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277333-59da1513-e7e5-455c-ab73-7a3162216923.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277335-454c0423-5398-4348-aaab-e2652fd08999.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277338-a7d09c28-1b86-4cf5-bd79-99d51c5b5311.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277343-9c456d21-8018-4cd5-9c0b-cc7c087fac69.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277345-2ef780f1-d7c9-4cf2-a370-f220a052eb71.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277347-baa4b870-7fca-4d4c-8528-fad720270024.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277351-e0691080-ede4-49ae-9075-d36a41cebf25.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277354-509f8f85-f171-44e9-8ca1-4c3cae77b5fb.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277357-39d572b8-60ee-44db-9e0e-2c0ea2be2ed3.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277359-6caf33f6-2a38-48e5-b349-f4dd1ef2566b.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277362-260daa87-1db7-4f89-ba9c-1b32876fd3b6.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277366-14cfd2f9-d044-4288-843e-463a1816163e.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277368-b0e96341-e030-4e4d-8010-6f7c3bc94d2f.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277370-1f26e4e5-9988-4427-a035-44bfd9d472d6.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277372-27e60b60-cd5c-4b05-ae38-2e9524c627f3.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277374-bd292bb2-e1f9-4d5f-aa49-d67ac571d01b.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277377-b0b8cdb9-8196-4598-ae47-b615914bf6bf.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277382-fc89d18a-a57b-4331-adbb-bda3584fb122.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277386-d676467c-9846-4051-8192-b3e089d01cdc.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277390-83f66d3f-c415-47e6-b651-6b51fbe59bbf.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277394-9895d654-3163-4dd9-882c-ac5a893e2ad3.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277396-9e5e3aa3-6d9e-40ab-a325-2edea452156d.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277399-b92e2092-eabd-45c8-bf36-b2e238167892.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277404-285f943a-de70-48b8-9545-53e229b7350d.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277406-0b7ec434-f064-4985-80f3-c00735b3e32d.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277408-4f9b8b19-42c2-4ba4-bf6d-b95ababe0313.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277409-6df0faf7-71b7-4c9a-a875-36ae7ee7129d.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277411-9c2b364a-749d-465e-a85d-29a69e9ff3ef.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277413-c54a462c-dd3b-4ad0-985d-ef0ec1f216ec.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277414-6d922055-cd59-4f84-b5b6-651209d6336a.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277417-78e1322e-4039-4232-b217-1be4f207f804.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277419-181822a3-bae6-4c4f-9959-59e991c2df6c.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277422-76f09d84-cb47-4332-aa88-a12458cd8993.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277424-a72203b5-1a99-4464-a39c-245f7a891f25.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277429-521ac9a6-e4c3-4c74-9c5b-8e8dd6cddf34.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277433-4f9fb9c8-7930-4303-b54e-a6eace347923.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277434-f3aa3565-a2c5-4c1c-ab44-930a8b073b5f.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277437-90cf1cd7-6a62-4ac4-ac85-3aa534e50cee.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277439-54e168bc-9518-429e-9e97-cb9ca5e811c9.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277441-a3c277d7-c889-4556-b74a-400cadf8b771.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277442-22a0cd38-acd8-4b5a-8e59-c4bea852fb79.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277444-ea662034-c17f-47ba-9ea3-694d3cb0c880.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277448-a71f4a0a-c3cc-4432-a803-843b7c65307f.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277449-0b3a2e98-3e09-4bd6-be32-c35f44154e8a.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277452-e36ccc63-8e39-4973-a336-4ace855d25e6.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277454-bddd9527-b189-4771-ab9e-52085db5a44d.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277455-7ea277ba-bc75-48db-9567-40e1acb56f02.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277460-0f5ee4dc-5ece-45d5-8ef9-666f1be41b76.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277461-37cab773-6341-4c91-b1f4-780d530eab3b.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277465-8f53ef9d-0465-4a90-afac-b1dd3c970b72.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277467-655ddabe-cbe0-4d1f-a30e-c2965428e8d7.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277470-4587e905-3fc8-4dad-84ee-0844ba4d2474.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277473-a155944f-efe3-492a-babc-2f3fe700a99b.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277475-c95ab821-f5ae-427a-8721-8991f9c7f29f.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277479-55b59855-2ed6-4526-9481-6b92b25fef97.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277484-556f0e4c-007b-4f6a-b21f-c485f630cbcb.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277486-a39eb069-bc13-415e-b936-ba294216dfac.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277487-80952841-6a76-4fb3-8049-fe15ce8f7cfb.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277491-e892a6a8-6f9a-46c7-83e0-261cfb92d276.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277494-520f483e-654d-4399-9684-1fcd9778b76e.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277496-54b1ada5-e6a6-4654-a8a6-739511cec750.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277500-ff7e2afd-9cd7-484a-bd1e-362226f5197f.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277501-94489261-bea5-4492-bf3e-98cc8aaa7a7f.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277504-567a32bc-a573-4154-a9cd-6acbec923768.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277506-e893d4d5-43ce-4df1-9f08-3cdf6a8c7e2c.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277509-5766629f-bb92-4552-b34a-647e29b9a89b.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277511-8821708b-09f0-4aab-86dd-40ae3794697a.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277515-ed6a0dff-bd91-4233-a9af-e2744df7c7e0.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277519-1883d6a1-9348-4514-8924-dde27dd38704.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277524-b9d8515c-4df2-410a-b4a6-da098cb9da61.jpg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277526-52a9c666-a799-4921-b371-41d97d7d9242.jpg" width = "400" /> </div>
## 车辆图片识别效果图
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243899-c60f0a51-db9b-438a-9f2d-0d2893c200bb.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243904-fdbe2e01-dc7c-449a-8e9e-baea4f85fee4.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243905-7eeb938d-d88f-4540-a667-06e08dcf1f55.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243908-c7f1e3ea-92a7-429b-888c-732b9ec5398f.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243911-735a6ec0-a624-4965-b3cd-2b9f52fa8d65.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243913-baec489a-5463-472b-b5d1-418bcd4eb978.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243916-f50dfcdd-2d5f-48f9-876f-dbc05f4afa30.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243920-7a65ec82-8312-421e-985a-c394f11af28f.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243922-458e6dca-fb80-4baf-951e-9651080dc242.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243926-5df3036b-9ea1-441c-b30a-b4f847df25ab.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243927-7673d94a-fbb0-4a92-a3f3-c879a432a7db.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243928-91082855-c5a7-4a3f-aeea-7a2e51e43183.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243929-88fe7efa-b212-4105-af2f-2248a6cb2877.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243933-49e71d02-8228-40ec-99b2-3ed862bf4ba5.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243935-530fbfa3-0d34-4d9d-bd59-2fde5659f7e5.jpeg" width = "400" /> </div>
<div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243940-d289fc7d-d343-4aa5-a807-9ce09a241ccd.jpeg" width = "400" /> </div>
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd
...@@ -22,7 +22,7 @@ DLA(Deep Layer Aggregation)。 视觉识别需要丰富的表示形式,其范 ...@@ -22,7 +22,7 @@ DLA(Deep Layer Aggregation)。 视觉识别需要丰富的表示形式,其范
| DLA46x_c | 1.1 | 0.5 | 64.36 | 86.01 | | DLA46x_c | 1.1 | 0.5 | 64.36 | 86.01 |
| DLA60 | 22.0 | 4.2 | 76.10 | 92.92 | | DLA60 | 22.0 | 4.2 | 76.10 | 92.92 |
| DLA60x | 17.4 | 3.5 | 77.53 | 93.78 | | DLA60x | 17.4 | 3.5 | 77.53 | 93.78 |
| DLA60x_c | 1.3 | 0.6 | 66.45 | 87.54 | | DLA60x_c | 1.3 | 0.6 | 66.45 | 87.54 |
| DLA102 | 33.3 | 7.2 | 78.93 | 94.52 | | DLA102 | 33.3 | 7.2 | 78.93 | 94.52 |
| DLA102x | 26.4 | 5.9 | 78.10 | 94.00 | | DLA102x | 26.4 | 5.9 | 78.10 | 94.00 |
| DLA102x2 | 41.4 | 9.3 | 78.85 | 94.45 | | DLA102x2 | 41.4 | 9.3 | 78.85 | 94.45 |
...@@ -42,4 +42,4 @@ DLA(Deep Layer Aggregation)。 视觉识别需要丰富的表示形式,其范 ...@@ -42,4 +42,4 @@ DLA(Deep Layer Aggregation)。 视觉识别需要丰富的表示形式,其范
| DLA46_c | 224 | 256 | 1.06 | 2.08 | 3.23 | | DLA46_c | 224 | 256 | 1.06 | 2.08 | 3.23 |
| DLA60 | 224 | 256 | 2.78 | 5.36 | 8.29 | | DLA60 | 224 | 256 | 2.78 | 5.36 | 8.29 |
| DLA60x_c | 224 | 256 | 1.79 | 3.68 | 5.19 | | DLA60x_c | 224 | 256 | 1.79 | 3.68 | 5.19 |
| DLA60x | 224 | 256 | 5.98 | 9.24 | 12.52 | | DLA60x | 224 | 256 | 5.98 | 9.24 | 12.52 |
\ No newline at end of file
...@@ -32,4 +32,3 @@ HarDNet(Harmonic DenseNet)是 2019 年由国立清华大学提出的一种 ...@@ -32,4 +32,3 @@ HarDNet(Harmonic DenseNet)是 2019 年由国立清华大学提出的一种
| HarDNet85 | 224 | 256 | 6.24 | 14.85 | 20.57 | | HarDNet85 | 224 | 256 | 6.24 | 14.85 | 20.57 |
| HarDNet39_ds | 224 | 256 | 1.40 | 2.30 | 3.33 | | HarDNet39_ds | 224 | 256 | 1.40 | 2.30 | 3.33 |
| HarDNet68_ds | 224 | 256 | 2.26 | 3.34 | 5.06 | | HarDNet68_ds | 224 | 256 | 2.26 | 3.34 | 5.06 |
...@@ -65,7 +65,7 @@ PP-HGNet 目前提供的模型的精度、速度指标及预训练权重链接 ...@@ -65,7 +65,7 @@ PP-HGNet 目前提供的模型的精度、速度指标及预训练权重链接
| PPHGNet_base_ssld | 85.00| 97.35 | 5.97 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPHGNet_base_ssld_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPHGNet_base_ssld_infer.tar) | | PPHGNet_base_ssld | 85.00| 97.35 | 5.97 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPHGNet_base_ssld_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPHGNet_base_ssld_infer.tar) |
**备注:** **备注:**
* 1. `_ssld` 表示使用 `SSLD 蒸馏`后的模型。关于 `SSLD蒸馏` 的内容,详情 [SSLD 蒸馏](../advanced_tutorials/knowledge_distillation.md) * 1. `_ssld` 表示使用 `SSLD 蒸馏`后的模型。关于 `SSLD蒸馏` 的内容,详情 [SSLD 蒸馏](../advanced_tutorials/knowledge_distillation.md)
* 2. PP-HGNet 更多模型指标及权重,敬请期待。 * 2. PP-HGNet 更多模型指标及权重,敬请期待。
...@@ -89,8 +89,8 @@ PP-HGNet 与其他模型的比较如下,其中测试机器为 NVIDIA® Tesla® ...@@ -89,8 +89,8 @@ PP-HGNet 与其他模型的比较如下,其中测试机器为 NVIDIA® Tesla®
| ResNeXt101_32x48d_wsl | 85.37 | 97.69 | 55.07 | | ResNeXt101_32x48d_wsl | 85.37 | 97.69 | 55.07 |
| SwinTransformer_base | 85.2 | 97.5 | 13.53 | | SwinTransformer_base | 85.2 | 97.5 | 13.53 |
| <b>PPHGNet_base_ssld<b> | <b>85.00<b>| <b>97.35<b> | <b>5.97<b> | | <b>PPHGNet_base_ssld<b> | <b>85.00<b>| <b>97.35<b> | <b>5.97<b> |
<a name="2"></a> <a name="2"></a>
## 2. 模型快速体验 ## 2. 模型快速体验
...@@ -123,26 +123,26 @@ python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple ...@@ -123,26 +123,26 @@ python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip3 install paddleclas pip3 install paddleclas
``` ```
<a name="2.3"></a> <a name="2.3"></a>
### 2.3 预测 ### 2.3 预测
* 在命令行中使用 PPHGNet_small 的权重快速预测 * 在命令行中使用 PPHGNet_small 的权重快速预测
```bash ```bash
paddleclas --model_name=PPHGNet_small --infer_imgs="docs/images/inference_deployment/whl_demo.jpg" paddleclas --model_name=PPHGNet_small --infer_imgs="docs/images/inference_deployment/whl_demo.jpg"
``` ```
结果如下: 结果如下:
``` ```
>>> result >>> result
class_ids: [8, 7, 86, 82, 81], scores: [0.71479, 0.08682, 0.00806, 0.0023, 0.00121], label_names: ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'ptarmigan'], filename: docs/images/inference_deployment/whl_demo.jpg class_ids: [8, 7, 86, 82, 81], scores: [0.71479, 0.08682, 0.00806, 0.0023, 0.00121], label_names: ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'ptarmigan'], filename: docs/images/inference_deployment/whl_demo.jpg
Predict complete! Predict complete!
``` ```
**备注**: 更换 PPHGNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `PPHGNet_tiny` 时,只需要将 `--model_name=PPHGNet_small` 改为 `--model_name=PPHGNet_tiny` 即可。
**备注**: 更换 PPHGNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `PPHGNet_tiny` 时,只需要将 `--model_name=PPHGNet_small` 改为 `--model_name=PPHGNet_tiny` 即可。
* 在 Python 代码中预测 * 在 Python 代码中预测
```python ```python
from paddleclas import PaddleClas from paddleclas import PaddleClas
...@@ -159,19 +159,19 @@ print(next(result)) ...@@ -159,19 +159,19 @@ print(next(result))
>>> result >>> result
[{'class_ids': [8, 7, 86, 82, 81], 'scores': [0.71479, 0.08682, 0.00806, 0.0023, 0.00121], 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'ptarmigan'], 'filename': 'docs/images/inference_deployment/whl_demo.jpg'}] [{'class_ids': [8, 7, 86, 82, 81], 'scores': [0.71479, 0.08682, 0.00806, 0.0023, 0.00121], 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'ptarmigan'], 'filename': 'docs/images/inference_deployment/whl_demo.jpg'}]
``` ```
<a name="3"></a> <a name="3"></a>
## 3. 模型训练、评估和预测 ## 3. 模型训练、评估和预测
<a name="3.1"></a> <a name="3.1"></a>
### 3.1 环境配置 ### 3.1 环境配置
* 安装:请先参考文档[环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。 * 安装:请先参考文档[环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
<a name="3.2"></a> <a name="3.2"></a>
### 3.2 数据准备 ### 3.2 数据准备
...@@ -200,15 +200,15 @@ cd path_to_PaddleClas ...@@ -200,15 +200,15 @@ cd path_to_PaddleClas
``` ```
其中 `train/``val/` 分别为训练集和验证集。`train_list.txt``val_list.txt` 分别为训练集和验证集的标签文件。 其中 `train/``val/` 分别为训练集和验证集。`train_list.txt``val_list.txt` 分别为训练集和验证集的标签文件。
**备注:** **备注:**
* 关于 `train_list.txt``val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) * 关于 `train_list.txt``val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明)
<a name="3.3"></a> <a name="3.3"></a>
### 3.3 模型训练 ### 3.3 模型训练
`ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml` 中提供了 PPHGNet_small 训练配置,可以通过如下脚本启动训练: `ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml` 中提供了 PPHGNet_small 训练配置,可以通过如下脚本启动训练:
...@@ -218,11 +218,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 ...@@ -218,11 +218,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \ python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \ --gpus="0,1,2,3" \
tools/train.py \ tools/train.py \
-c ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml -c ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml
``` ```
**备注:** **备注:**
* 当前精度最佳的模型会保存在 `output/PPHGNet_small/best_model.pdparams` * 当前精度最佳的模型会保存在 `output/PPHGNet_small/best_model.pdparams`
...@@ -249,7 +249,7 @@ python3 tools/eval.py \ ...@@ -249,7 +249,7 @@ python3 tools/eval.py \
```python ```python
python3 tools/infer.py \ python3 tools/infer.py \
-c ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml \ -c ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml \
-o Global.pretrained_model=output/PPHGNet_small/best_model -o Global.pretrained_model=output/PPHGNet_small/best_model
``` ```
输出结果如下: 输出结果如下:
...@@ -258,30 +258,30 @@ python3 tools/infer.py \ ...@@ -258,30 +258,30 @@ python3 tools/infer.py \
[{'class_ids': [8, 7, 86, 82, 81], 'scores': [0.71479, 0.08682, 0.00806, 0.0023, 0.00121], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'ptarmigan']}] [{'class_ids': [8, 7, 86, 82, 81], 'scores': [0.71479, 0.08682, 0.00806, 0.0023, 0.00121], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'ptarmigan']}]
``` ```
**备注:** **备注:**
* 这里`-o Global.pretrained_model="output/PPHGNet_small/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。 * 这里`-o Global.pretrained_model="output/PPHGNet_small/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
* 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。 * 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。
* 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。 * 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。
<a name="4"></a> <a name="4"></a>
## 4. 模型推理部署 ## 4. 模型推理部署
<a name="4.1"></a> <a name="4.1"></a>
### 4.1 推理模型准备 ### 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 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,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)的方式。 当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择[直接下载 inference 模型](#6.1.2)的方式。
<a name="4.1.1"></a> <a name="4.1.1"></a>
### 4.1.1 基于训练得到的权重导出 inference 模型 ### 4.1.1 基于训练得到的权重导出 inference 模型
...@@ -303,7 +303,7 @@ python3 tools/export_model.py \ ...@@ -303,7 +303,7 @@ python3 tools/export_model.py \
``` ```
<a name="4.1.2"></a> <a name="4.1.2"></a>
### 4.1.2 直接下载 inference 模型 ### 4.1.2 直接下载 inference 模型
...@@ -324,7 +324,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPHGNet ...@@ -324,7 +324,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPHGNet
│ └── inference.pdmodel │ └── inference.pdmodel
``` ```
<a name="4.2"></a> <a name="4.2"></a>
### 4.2 基于 Python 预测引擎推理 ### 4.2 基于 Python 预测引擎推理
...@@ -375,33 +375,32 @@ ILSVRC2012_val_00030010.jpeg: class id(s): [80, 83, 136, 23, 93], score(s): [0.8 ...@@ -375,33 +375,32 @@ ILSVRC2012_val_00030010.jpeg: class id(s): [80, 83, 136, 23, 93], score(s): [0.8
``` ```
<a name="4.3"></a> <a name="4.3"></a>
### 4.3 基于 C++ 预测引擎推理 ### 4.3 基于 C++ 预测引擎推理
PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。 PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
<a name="4.4"></a> <a name="4.4"></a>
### 4.4 服务化部署 ### 4.4 服务化部署
Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving) 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)来完成相应的部署工作。 PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
<a name="4.5"></a> <a name="4.5"></a>
### 4.5 端侧部署 ### 4.5 端侧部署
Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite) Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)
PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。 PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
<a name="4.6"></a> <a name="4.6"></a>
### 4.6 Paddle2ONNX 模型转换与预测 ### 4.6 Paddle2ONNX 模型转换与预测
Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX) Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)
PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。 PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
- [4.5 端侧部署](#4.5) - [4.5 端侧部署](#4.5)
- [4.6 Paddle2ONNX 模型转换与预测](#4.6) - [4.6 Paddle2ONNX 模型转换与预测](#4.6)
- [5. 引用](#5) - [5. 引用](#5)
<a name="1"></a> <a name="1"></a>
...@@ -83,7 +83,7 @@ SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模 ...@@ -83,7 +83,7 @@ SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模
最终,PP-LCNet 中的 SE 模块的位置选用了表格中第三行的方案。 最终,PP-LCNet 中的 SE 模块的位置选用了表格中第三行的方案。
<a name="1.2.3"></a> <a name="1.2.3"></a>
#### 1.2.3 合适的位置添加更大的卷积核 #### 1.2.3 合适的位置添加更大的卷积核
在 MixNet 的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种 split-concat 范式的 MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。我们通过实验总结了一些更大的卷积核在不同位置的作用,类似 SE 模块的位置,更大的卷积核在网络的中后部作用更明显,下表展示了 5x5 卷积核的位置对精度的影响: 在 MixNet 的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种 split-concat 范式的 MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。我们通过实验总结了一些更大的卷积核在不同位置的作用,类似 SE 模块的位置,更大的卷积核在网络的中后部作用更明显,下表展示了 5x5 卷积核的位置对精度的影响:
...@@ -96,9 +96,9 @@ SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模 ...@@ -96,9 +96,9 @@ SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模
实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet 最终选用了表格中第三行的方案。 实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet 最终选用了表格中第三行的方案。
<a name="1.2.4"></a> <a name="1.2.4"></a>
#### 1.2.4 GAP 后使用更大的 1x1 卷积层 #### 1.2.4 GAP 后使用更大的 1x1 卷积层
在 GoogLeNet 之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致 GAP 后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的 1x1 卷积层(等同于 FC 层),GAP 后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。 在 GoogLeNet 之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致 GAP 后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的 1x1 卷积层(等同于 FC 层),GAP 后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。
...@@ -113,17 +113,17 @@ BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步 ...@@ -113,17 +113,17 @@ BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步
| <b>1<b> | <b>1<b> | <b>1<b> | <b>1<b> | <b>63.14<b> | <b>2.05<b> | | <b>1<b> | <b>1<b> | <b>1<b> | <b>1<b> | <b>63.14<b> | <b>2.05<b> |
<a name="1.3"></a> <a name="1.3"></a>
### 1.3 实验结果 ### 1.3 实验结果
<a name="1.3.1"></a> <a name="1.3.1"></a>
#### 1.3.1 图像分类 #### 1.3.1 图像分类
图像分类我们选用了 ImageNet 数据集,相比目前主流的轻量级网络,PP-LCNet 在相同精度下可以获得更快的推理速度。当使用百度自研的 SSLD 蒸馏策略后,精度进一步提升,在 Intel cpu 端约 5ms 的推理速度下 ImageNet 的 Top-1 Acc 超过了 80%。 图像分类我们选用了 ImageNet 数据集,相比目前主流的轻量级网络,PP-LCNet 在相同精度下可以获得更快的推理速度。当使用百度自研的 SSLD 蒸馏策略后,精度进一步提升,在 Intel cpu 端约 5ms 的推理速度下 ImageNet 的 Top-1 Acc 超过了 80%。
| Model | Params(M) | FLOPs(M) | Top-1 Acc(\%) | Top-5 Acc(\%) | Latency(ms) | 预训练模型下载地址 | inference模型下载地址 | | Model | Params(M) | FLOPs(M) | Top-1 Acc(\%) | Top-5 Acc(\%) | Latency(ms) | 预训练模型下载地址 | inference模型下载地址 |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| PPLCNet_x0_25 | 1.5 | 18 | 51.86 | 75.65 | 1.74 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_25_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x0_25_infer.tar) | | PPLCNet_x0_25 | 1.5 | 18 | 51.86 | 75.65 | 1.74 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_25_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x0_25_infer.tar) |
| PPLCNet_x0_35 | 1.6 | 29 | 58.09 | 80.83 | 1.92 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_35_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x0_35_infer.tar) | | PPLCNet_x0_35 | 1.6 | 29 | 58.09 | 80.83 | 1.92 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_35_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x0_35_infer.tar) |
| PPLCNet_x0_5 | 1.9 | 47 | 63.14 | 84.66 | 2.05 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_5_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x0_5_infer.tar) | | PPLCNet_x0_5 | 1.9 | 47 | 63.14 | 84.66 | 2.05 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_5_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x0_5_infer.tar) |
...@@ -156,7 +156,7 @@ BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步 ...@@ -156,7 +156,7 @@ BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步
| <b>PPLCNet_x1_0<b> |<b> 3.0<b> | <b>161<b> | <b>71.32<b> | <b>90.03<b> | <b>2.46<b> | | <b>PPLCNet_x1_0<b> |<b> 3.0<b> | <b>161<b> | <b>71.32<b> | <b>90.03<b> | <b>2.46<b> |
<a name="1.3.2"></a> <a name="1.3.2"></a>
#### 1.3.2 目标检测 #### 1.3.2 目标检测
目标检测的方法我们选用了百度自研的 PicoDet,该方法主打轻量级目标检测场景,下表展示了在 COCO 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的结果的比较,无论在精度还是速度上,PP-LCNet 的优势都非常明显。 目标检测的方法我们选用了百度自研的 PicoDet,该方法主打轻量级目标检测场景,下表展示了在 COCO 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的结果的比较,无论在精度还是速度上,PP-LCNet 的优势都非常明显。
...@@ -169,7 +169,7 @@ MobileNetV3_large_x0_75 | 25.8 | 11.1 | ...@@ -169,7 +169,7 @@ MobileNetV3_large_x0_75 | 25.8 | 11.1 |
<b>PPLCNet_x1_0<b> | <b>26.9<b> | <b>7.9<b> | <b>PPLCNet_x1_0<b> | <b>26.9<b> | <b>7.9<b> |
<a name="1.3.3"></a> <a name="1.3.3"></a>
#### 1.3.3 语义分割 #### 1.3.3 语义分割
语义分割的方法我们选用了 DeeplabV3+,下表展示了在 Cityscapes 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的比较,在精度和速度方面,PP-LCNet 的优势同样明显。 语义分割的方法我们选用了 DeeplabV3+,下表展示了在 Cityscapes 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的比较,在精度和速度方面,PP-LCNet 的优势同样明显。
...@@ -186,8 +186,8 @@ MobileNetV3_large_x0_75 | 64.53 | 151 | ...@@ -186,8 +186,8 @@ MobileNetV3_large_x0_75 | 64.53 | 151 |
## 1.4 Benchmark ## 1.4 Benchmark
<a name="1.4.1"></a> <a name="1.4.1"></a>
#### 1.4.1 基于 Intel Xeon Gold 6148 的预测速度 #### 1.4.1 基于 Intel Xeon Gold 6148 的预测速度
| Model | Latency(ms)<br/>bs=1, thread=10 | | Model | Latency(ms)<br/>bs=1, thread=10 |
|:--:|:--:| |:--:|:--:|
...@@ -199,11 +199,11 @@ MobileNetV3_large_x0_75 | 64.53 | 151 | ...@@ -199,11 +199,11 @@ MobileNetV3_large_x0_75 | 64.53 | 151 |
| PPLCNet_x1_5 | 3.19 | | PPLCNet_x1_5 | 3.19 |
| PPLCNet_x2_0 | 4.27 | | PPLCNet_x2_0 | 4.27 |
| PPLCNet_x2_5 | 5.39 | | PPLCNet_x2_5 | 5.39 |
**备注:** 精度类型为 FP32,推理过程使用 MKLDNN。 **备注:** 精度类型为 FP32,推理过程使用 MKLDNN。
<a name="1.4.2"></a> <a name="1.4.2"></a>
#### 1.4.2 基于 V100 GPU 的预测速度 #### 1.4.2 基于 V100 GPU 的预测速度
| Models | Latency(ms)<br>bs=1 | Latency(ms)<br/>bs=4 | Latency(ms)<br/>bs=8 | | Models | Latency(ms)<br>bs=1 | Latency(ms)<br/>bs=4 | Latency(ms)<br/>bs=8 |
...@@ -215,7 +215,7 @@ MobileNetV3_large_x0_75 | 64.53 | 151 | ...@@ -215,7 +215,7 @@ MobileNetV3_large_x0_75 | 64.53 | 151 |
| PPLCNet_x1_0 | 0.73 | 1.64 | 2.53 | | PPLCNet_x1_0 | 0.73 | 1.64 | 2.53 |
| PPLCNet_x1_5 | 0.82 | 2.06 | 3.12 | | PPLCNet_x1_5 | 0.82 | 2.06 | 3.12 |
| PPLCNet_x2_0 | 0.94 | 2.58 | 4.08 | | PPLCNet_x2_0 | 0.94 | 2.58 | 4.08 |
**备注:** 精度类型为 FP32,推理过程使用 TensorRT。 **备注:** 精度类型为 FP32,推理过程使用 TensorRT。
<a name="1.4.3"></a> <a name="1.4.3"></a>
...@@ -232,15 +232,15 @@ MobileNetV3_large_x0_75 | 64.53 | 151 | ...@@ -232,15 +232,15 @@ MobileNetV3_large_x0_75 | 64.53 | 151 |
| PPLCNet_x1_5 | 20.55 | 12.26 | 7.54 | | PPLCNet_x1_5 | 20.55 | 12.26 | 7.54 |
| PPLCNet_x2_0 | 33.79 | 20.17 | 12.10 | | PPLCNet_x2_0 | 33.79 | 20.17 | 12.10 |
| PPLCNet_x2_5 | 49.89 | 29.60 | 17.82 | | PPLCNet_x2_5 | 49.89 | 29.60 | 17.82 |
**备注:** 精度类型为 FP32。 **备注:** 精度类型为 FP32。
<a name="2"></a> <a name="2"></a>
## 2. 模型快速体验 ## 2. 模型快速体验
<a name="2.1"></a> <a name="2.1"></a>
### 2.1 安装 paddlepaddle ### 2.1 安装 paddlepaddle
- 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装 - 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装
...@@ -266,27 +266,27 @@ python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple ...@@ -266,27 +266,27 @@ python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
``` ```
pip3 install paddleclas pip3 install paddleclas
``` ```
<a name="2.3"></a> <a name="2.3"></a>
### 2.3 预测 ### 2.3 预测
* 在命令行中使用 PPLCNet_x1_0 的权重快速预测 * 在命令行中使用 PPLCNet_x1_0 的权重快速预测
```bash ```bash
paddleclas --model_name=PPLCNet_x1_0 --infer_imgs="docs/images/inference_deployment/whl_demo.jpg" paddleclas --model_name=PPLCNet_x1_0 --infer_imgs="docs/images/inference_deployment/whl_demo.jpg"
``` ```
结果如下: 结果如下:
``` ```
>>> result >>> result
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'], filename: docs/images/inference_deployment/whl_demo.jpg 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'], filename: docs/images/inference_deployment/whl_demo.jpg
Predict complete! Predict complete!
``` ```
**备注**: 更换 PPLCNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `PPLCNet_x2_0` 时,只需要将 `--model_name=PPLCNet_x1_0` 改为 `--model_name=PPLCNet_x2_0` 即可。 **备注**: 更换 PPLCNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `PPLCNet_x2_0` 时,只需要将 `--model_name=PPLCNet_x1_0` 改为 `--model_name=PPLCNet_x2_0` 即可。
* 在 Python 代码中预测 * 在 Python 代码中预测
```python ```python
from paddleclas import PaddleClas from paddleclas import PaddleClas
...@@ -303,18 +303,18 @@ print(next(result)) ...@@ -303,18 +303,18 @@ print(next(result))
>>> result >>> result
[{'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'], 'filename': 'docs/images/inference_deployment/whl_demo.jpg'}] [{'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'], 'filename': 'docs/images/inference_deployment/whl_demo.jpg'}]
``` ```
<a name="3"></a> <a name="3"></a>
## 3. 模型训练、评估和预测 ## 3. 模型训练、评估和预测
<a name="3.1"></a> <a name="3.1"></a>
### 3.1 环境配置 ### 3.1 环境配置
* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。 * 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
<a name="3.2"></a> <a name="3.2"></a>
### 3.2 数据准备 ### 3.2 数据准备
...@@ -343,15 +343,15 @@ cd path_to_PaddleClas ...@@ -343,15 +343,15 @@ cd path_to_PaddleClas
``` ```
其中 `train/``val/` 分别为训练集和验证集。`train_list.txt``val_list.txt` 分别为训练集和验证集的标签文件。 其中 `train/``val/` 分别为训练集和验证集。`train_list.txt``val_list.txt` 分别为训练集和验证集的标签文件。
**备注:** **备注:**
* 关于 `train_list.txt``val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) * 关于 `train_list.txt``val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明)
<a name="3.3"></a> <a name="3.3"></a>
### 3.3 模型训练 ### 3.3 模型训练
`ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml` 中提供了 PPLCNet_x1_0 训练配置,可以通过如下脚本启动训练: `ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml` 中提供了 PPLCNet_x1_0 训练配置,可以通过如下脚本启动训练:
...@@ -361,11 +361,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 ...@@ -361,11 +361,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \ python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \ --gpus="0,1,2,3" \
tools/train.py \ tools/train.py \
-c ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml -c ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml
``` ```
**备注:** **备注:**
* 当前精度最佳的模型会保存在 `output/PPLCNet_x1_0/best_model.pdparams` * 当前精度最佳的模型会保存在 `output/PPLCNet_x1_0/best_model.pdparams`
...@@ -392,7 +392,7 @@ python3 tools/eval.py \ ...@@ -392,7 +392,7 @@ python3 tools/eval.py \
```python ```python
python3 tools/infer.py \ python3 tools/infer.py \
-c ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml \ -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
``` ```
输出结果如下: 输出结果如下:
...@@ -401,30 +401,30 @@ python3 tools/infer.py \ ...@@ -401,30 +401,30 @@ python3 tools/infer.py \
[{'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']}] [{'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"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。 * 这里`-o Global.pretrained_model="output/PPLCNet_x1_0/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
* 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。 * 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。
* 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。 * 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。
<a name="4"></a> <a name="4"></a>
## 4. 模型推理部署 ## 4. 模型推理部署
<a name="4.1"></a> <a name="4.1"></a>
### 4.1 推理模型准备 ### 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 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,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)的方式。 当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择[直接下载 inference 模型](#6.1.2)的方式。
<a name="4.1.1"></a> <a name="4.1.1"></a>
### 4.1.1 基于训练得到的权重导出 inference 模型 ### 4.1.1 基于训练得到的权重导出 inference 模型
...@@ -446,7 +446,7 @@ python3 tools/export_model.py \ ...@@ -446,7 +446,7 @@ python3 tools/export_model.py \
``` ```
<a name="4.1.2"></a> <a name="4.1.2"></a>
### 4.1.2 直接下载 inference 模型 ### 4.1.2 直接下载 inference 模型
...@@ -467,7 +467,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet ...@@ -467,7 +467,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet
│ └── inference.pdmodel │ └── inference.pdmodel
``` ```
<a name="4.2"></a> <a name="4.2"></a>
### 4.2 基于 Python 预测引擎推理 ### 4.2 基于 Python 预测引擎推理
...@@ -518,37 +518,37 @@ ILSVRC2012_val_00030010.jpeg: class id(s): [80, 23, 93, 81, 99], score(s): [0.87 ...@@ -518,37 +518,37 @@ ILSVRC2012_val_00030010.jpeg: class id(s): [80, 23, 93, 81, 99], score(s): [0.87
``` ```
<a name="4.3"></a> <a name="4.3"></a>
### 4.3 基于 C++ 预测引擎推理 ### 4.3 基于 C++ 预测引擎推理
PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。 PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
<a name="4.4"></a> <a name="4.4"></a>
### 4.4 服务化部署 ### 4.4 服务化部署
Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving) 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)来完成相应的部署工作。 PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
<a name="4.5"></a> <a name="4.5"></a>
### 4.5 端侧部署 ### 4.5 端侧部署
Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite) Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)
PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。 PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
<a name="4.6"></a> <a name="4.6"></a>
### 4.6 Paddle2ONNX 模型转换与预测 ### 4.6 Paddle2ONNX 模型转换与预测
Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/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)来完成相应的部署工作。 PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](@shuilong)来完成相应的部署工作。
<a name="5"></a> <a name="5"></a>
## 5. 引用 ## 5. 引用
...@@ -556,7 +556,7 @@ PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模 ...@@ -556,7 +556,7 @@ PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模
如果你的论文用到了 PP-LCNet 的方法,请添加如下 cite: 如果你的论文用到了 PP-LCNet 的方法,请添加如下 cite:
``` ```
@misc{cui2021pplcnet, @misc{cui2021pplcnet,
title={PP-LCNet: A Lightweight CPU Convolutional Neural Network}, title={PP-LCNet: A Lightweight CPU Convolutional Neural Network},
author={Cheng Cui and Tingquan Gao and Shengyu Wei and Yuning Du and Ruoyu Guo and Shuilong Dong and Bin Lu and Ying Zhou and Xueying Lv and Qiwen Liu and Xiaoguang Hu and Dianhai Yu and Yanjun Ma}, author={Cheng Cui and Tingquan Gao and Shengyu Wei and Yuning Du and Ruoyu Guo and Shuilong Dong and Bin Lu and Ying Zhou and Xueying Lv and Qiwen Liu and Xiaoguang Hu and Dianhai Yu and Yanjun Ma},
year={2021}, year={2021},
eprint={2109.15099}, eprint={2109.15099},
......
model_list.md
\ No newline at end of file
...@@ -32,4 +32,4 @@ ...@@ -32,4 +32,4 @@
| RedNet38 | 224 | 256 | 6.24 | 21.39 | 41.26 | | RedNet38 | 224 | 256 | 6.24 | 21.39 | 41.26 |
| RedNet50 | 224 | 256 | 8.04 | 27.71 | 53.73 | | RedNet50 | 224 | 256 | 8.04 | 27.71 | 53.73 |
| RedNet101 | 224 | 256 | 13.07 | 44.12 | 83.28 | | RedNet101 | 224 | 256 | 13.07 | 44.12 | 83.28 |
| RedNet152 | 224 | 256 | 18.66 | 63.27 | 119.48 | | RedNet152 | 224 | 256 | 18.66 | 63.27 | 119.48 |
\ No newline at end of file
...@@ -126,12 +126,12 @@ PaddleClas 提供的 ResNet 系列的模型包括 ResNet50,ResNet50_vd,ResNe ...@@ -126,12 +126,12 @@ PaddleClas 提供的 ResNet 系列的模型包括 ResNet50,ResNet50_vd,ResNe
**备注:** 推理过程使用 TensorRT。 **备注:** 推理过程使用 TensorRT。
<a name="2"></a> <a name="2"></a>
## 2. 模型快速体验 ## 2. 模型快速体验
<a name="2.1"></a> <a name="2.1"></a>
### 2.1 安装 paddlepaddle ### 2.1 安装 paddlepaddle
- 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装 - 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装
...@@ -157,26 +157,26 @@ python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple ...@@ -157,26 +157,26 @@ python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
``` ```
pip3 install paddleclas pip3 install paddleclas
``` ```
<a name="2.3"></a> <a name="2.3"></a>
### 2.3 预测 ### 2.3 预测
* 在命令行中使用 ResNet50 的权重快速预测 * 在命令行中使用 ResNet50 的权重快速预测
```bash ```bash
paddleclas --model_name=ResNet50 --infer_imgs="docs/images/inference_deployment/whl_demo.jpg" paddleclas --model_name=ResNet50 --infer_imgs="docs/images/inference_deployment/whl_demo.jpg"
``` ```
结果如下: 结果如下:
``` ```
>>> result >>> result
class_ids: [8, 7, 86, 82, 80], scores: [0.97968, 0.02028, 3e-05, 1e-05, 0.0], label_names: ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'black grouse'], filename: docs/images/inference_deployment/whl_demo.jpg class_ids: [8, 7, 86, 82, 80], scores: [0.97968, 0.02028, 3e-05, 1e-05, 0.0], label_names: ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'black grouse'], filename: docs/images/inference_deployment/whl_demo.jpg
Predict complete! Predict complete!
``` ```
**备注**: 更换 ResNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `ResNet18` 时,只需要将 `--model_name=ResNet50` 改为 `--model_name=ResNet18` 即可。
**备注**: 更换 ResNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `ResNet18` 时,只需要将 `--model_name=ResNet50` 改为 `--model_name=ResNet18` 即可。
* 在 Python 代码中预测 * 在 Python 代码中预测
```python ```python
from paddleclas import PaddleClas from paddleclas import PaddleClas
...@@ -195,17 +195,17 @@ print(next(result)) ...@@ -195,17 +195,17 @@ print(next(result))
``` ```
<a name="3"></a> <a name="3"></a>
## 3. 模型训练、评估和预测 ## 3. 模型训练、评估和预测
<a name="3.1"></a> <a name="3.1"></a>
### 3.1 环境配置 ### 3.1 环境配置
* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。 * 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
<a name="3.2"></a> <a name="3.2"></a>
### 3.2 数据准备 ### 3.2 数据准备
...@@ -234,15 +234,15 @@ cd path_to_PaddleClas ...@@ -234,15 +234,15 @@ cd path_to_PaddleClas
``` ```
其中 `train/``val/` 分别为训练集和验证集。`train_list.txt``val_list.txt` 分别为训练集和验证集的标签文件。 其中 `train/``val/` 分别为训练集和验证集。`train_list.txt``val_list.txt` 分别为训练集和验证集的标签文件。
**备注:** **备注:**
* 关于 `train_list.txt``val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) * 关于 `train_list.txt``val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明)
<a name="3.3"></a> <a name="3.3"></a>
### 3.3 模型训练 ### 3.3 模型训练
`ppcls/configs/ImageNet/ResNet/ResNet50.yaml` 中提供了 ResNet50 训练配置,可以通过如下脚本启动训练: `ppcls/configs/ImageNet/ResNet/ResNet50.yaml` 中提供了 ResNet50 训练配置,可以通过如下脚本启动训练:
...@@ -252,11 +252,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 ...@@ -252,11 +252,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \ python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \ --gpus="0,1,2,3" \
tools/train.py \ tools/train.py \
-c ppcls/configs/ImageNet/ResNet/ResNet50.yaml -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml
``` ```
**备注:** **备注:**
* 当前精度最佳的模型会保存在 `output/ResNet50/best_model.pdparams` * 当前精度最佳的模型会保存在 `output/ResNet50/best_model.pdparams`
...@@ -283,7 +283,7 @@ python3 tools/eval.py \ ...@@ -283,7 +283,7 @@ python3 tools/eval.py \
```python ```python
python3 tools/infer.py \ python3 tools/infer.py \
-c ppcls/configs/ImageNet/ResNet/ResNet50.yaml \ -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml \
-o Global.pretrained_model=output/ResNet50/best_model -o Global.pretrained_model=output/ResNet50/best_model
``` ```
输出结果如下: 输出结果如下:
...@@ -292,30 +292,30 @@ python3 tools/infer.py \ ...@@ -292,30 +292,30 @@ python3 tools/infer.py \
[{'class_ids': [8, 7, 86, 82, 80], 'scores': [0.97968, 0.02028, 3e-05, 1e-05, 0.0], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'black grouse']}] [{'class_ids': [8, 7, 86, 82, 80], 'scores': [0.97968, 0.02028, 3e-05, 1e-05, 0.0], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'black grouse']}]
``` ```
**备注:** **备注:**
* 这里`-o Global.pretrained_model="output/ResNet50/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。 * 这里`-o Global.pretrained_model="output/ResNet50/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
* 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。 * 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。
* 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。 * 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。
<a name="4"></a> <a name="4"></a>
## 4. 模型推理部署 ## 4. 模型推理部署
<a name="4.1"></a> <a name="4.1"></a>
### 4.1 推理模型准备 ### 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 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,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)的方式。 当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择[直接下载 inference 模型](#6.1.2)的方式。
<a name="4.1.1"></a> <a name="4.1.1"></a>
### 4.1.1 基于训练得到的权重导出 inference 模型 ### 4.1.1 基于训练得到的权重导出 inference 模型
...@@ -337,7 +337,7 @@ python3 tools/export_model.py \ ...@@ -337,7 +337,7 @@ python3 tools/export_model.py \
``` ```
<a name="4.1.2"></a> <a name="4.1.2"></a>
### 4.1.2 直接下载 inference 模型 ### 4.1.2 直接下载 inference 模型
...@@ -358,7 +358,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet5 ...@@ -358,7 +358,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet5
│ └── inference.pdmodel │ └── inference.pdmodel
``` ```
<a name="4.2"></a> <a name="4.2"></a>
### 4.2 基于 Python 预测引擎推理 ### 4.2 基于 Python 预测引擎推理
...@@ -409,32 +409,32 @@ ILSVRC2012_val_00030010.jpeg: class id(s): [80, 23, 83, 93, 136], score(s): [1.0 ...@@ -409,32 +409,32 @@ ILSVRC2012_val_00030010.jpeg: class id(s): [80, 23, 83, 93, 136], score(s): [1.0
``` ```
<a name="4.3"></a> <a name="4.3"></a>
### 4.3 基于 C++ 预测引擎推理 ### 4.3 基于 C++ 预测引擎推理
PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。 PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
<a name="4.4"></a> <a name="4.4"></a>
### 4.4 服务化部署 ### 4.4 服务化部署
Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving) 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)来完成相应的部署工作。 PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
<a name="4.5"></a> <a name="4.5"></a>
### 4.5 端侧部署 ### 4.5 端侧部署
Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite) Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)
PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。 PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
<a name="4.6"></a> <a name="4.6"></a>
### 4.6 Paddle2ONNX 模型转换与预测 ### 4.6 Paddle2ONNX 模型转换与预测
Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/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)来完成相应的部署工作。 PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](@shuilong)来完成相应的部署工作。
model_list.md
\ No newline at end of file
模型库
================================
.. toctree::
:maxdepth: 2
DPN_DenseNet.md
models_intro.md
RepVGG.md
EfficientNet_and_ResNeXt101_wsl.md
ViT_and_DeiT.md
SwinTransformer.md
Others.md
SEResNext_and_Res2Net.md
ESNet.md
HRNet.md
ReXNet.md
Inception.md
TNT.md
RedNet.md
DLA.md
ResNeSt_RegNet.md
PP-LCNet.md
HarDNet.md
ResNet_and_vd.md
LeViT.md
Mobile.md
MixNet.md
Twins.md
模型训练
================================
.. toctree::
:maxdepth: 2
config_description.md
classification.md
recognition.md
train_strategy.md
其他
================================
.. toctree::
:maxdepth: 2
transfer_learning.md
train_with_DALI.md
VisualDL.md
train_on_xpu.md
feature_visiualization.md
paddle_mobile_inference.md
course_link.md
competition_support.md
update_history.md
versions.md
# 版本更新信息
----------
## 目录
* [1. v2.3](#1)
* [2. v2.2](#2)
<a name='1'></a>
## 1. v2.3
- 模型更新
- 添加轻量化模型预训练权重,包括检测模型、特征模型
- 发布 PP-LCNet 系列模型,此系列模型是专门在 CPU 上设计运行的自研模型
- SwinTransformer、Twins、Deit 支持从 scrach 直接训练,达到论文精度
- 框架基础能力
- 添加 DeepHash 模块,支持特征模型直接输出二值特征
- 添加 PKSampler,特征模型不能多机多卡的训练的问题
- 支持 PaddleSlim:支持分类模型、特征模型的量化、裁剪训练及离线量化功能
- Legendary models 支持模型中间结果输出
- 支持多标签分类训练
- 预测部署
- 使用 Faiss 替换原有特征检索库,提升平台适配性
- 支持 PaddleServing:支持分类模型、图像识别流程的部署
- 推荐库版本
- python 版本:3.7
- PaddlePaddle 版本:2.1.3
- PaddleSlim 版本:2.2.0
- PaddleServing 版本:0.6.1
<a name='2'></a>
## 2. v2.2
- 模型更新
- 添加 LeViT、Twins、TNT、DLA、HardNet、RedNet、SwinTransfomer 模型
- 框架基础能力
- 将分类模型分为两类
- legendary models:引入 TheseusLayer 基类,及增加了修改网络功能接口,同时支持网络截断输出功能
- model zoo:其他普通分类模型
- 添加 Metric Learning 算法支持
- 添加多种相关 Loss 算法,及基础网络模块 gears(支持与 backbone、loss 组合)方便使用
- 同时支持普通分类及 metric learning 相关任务训练
- 支持静态图训练
- 分类训练支持 dali 加速
- 支持 fp16 训练
- 应用更新
- 添加商品识别、车辆识别(车辆细粒度分类、车辆 ReID)、logo 识别、动漫人物识别应用具体案例及相关模型
- 添加图像识别完整 pipeline,包含检测模块、特征提取模块、向量检索模块
- 预测部署
- 添加百度自研向量检索模块 Mobius,支持图像识别系统预测部署
- 图像识别,建立特征库支持 batch_size>1
- 文档更新
- 添加图像识别相关文档
- 修复之前文档 bug
- 推荐库版本
- python 版本:3.7
- PaddlePaddle:2.1.2
快速开始
================================
.. toctree::
:maxdepth: 2
quick_start_classification_new_user.md
quick_start_classification_professional.md
quick_start_recognition.md
quick_start_multilabel_classification.md
...@@ -50,6 +50,10 @@ python3 -m paddle.distributed.launch \ ...@@ -50,6 +50,10 @@ python3 -m paddle.distributed.launch \
训练 10 epoch 之后,验证集最好的正确率应该在 0.95 左右。 训练 10 epoch 之后,验证集最好的正确率应该在 0.95 左右。
**注意:**
1. 目前多标签分类的损失函数仅支持`MultiLabelLoss`(BCE Loss)。
2. 目前多标签分类的评估指标支持`AccuracyScore``HammingDistance`,其他评估指标敬请期待。
<a name="3"></a> <a name="3"></a>
## 3. 模型评估 ## 3. 模型评估
...@@ -70,8 +74,8 @@ python3 tools/infer.py \ ...@@ -70,8 +74,8 @@ python3 tools/infer.py \
``` ```
得到类似下面的输出: 得到类似下面的输出:
``` ```
[{'class_ids': [6, 13, 17, 23, 26, 30], 'scores': [0.95683, 0.5567, 0.55211, 0.99088, 0.5943, 0.78767], 'file_name': './deploy/images/0517_2715693311.jpg', 'label_names': []}] [{'class_ids': [6, 13, 17, 23, 30], 'scores': [0.98217, 0.78129, 0.64377, 0.9942, 0.96109], 'label_names': ['clouds', 'lake', 'ocean', 'sky', 'water'], 'file_name': 'deploy/images/0517_2715693311.jpg'}]
``` ```
<a name="5"></a> <a name="5"></a>
...@@ -100,10 +104,13 @@ cd ./deploy ...@@ -100,10 +104,13 @@ cd ./deploy
``` ```
python3 python/predict_cls.py \ python3 python/predict_cls.py \
-c configs/inference_multilabel_cls.yaml -c configs/inference_cls_multilabel.yaml
``` ```
推理图片如下:
得到类似下面的输出: ![](../../images/quick_start/multi_label_demo.png)
执行推理命令后,得到类似下面的输出:
``` ```
0517_2715693311.jpg: class id(s): [6, 13, 17, 23, 26, 30], score(s): [0.96, 0.56, 0.55, 0.99, 0.59, 0.79], label_name(s): [] 0517_2715693311.jpg: class id(s): [6, 13, 17, 23, 30], score(s): [0.98, 0.78, 0.64, 0.99, 0.96], label_name(s): ['clouds', 'lake', 'ocean', 'sky', 'water']
``` ```
...@@ -88,9 +88,9 @@ ...@@ -88,9 +88,9 @@
完成上述内容后,放置于`dataset`目录下,文件结构如下: 完成上述内容后,放置于`dataset`目录下,文件结构如下:
``` ```
data/ data/
├── images # 放置所有图片 ├── images # 放置所有图片
├── phone_label_list.txt # 标签文件 ├── phone_label_list.txt # 标签文件
├── phone_train_list.txt # 训练列表,包含图片及其对应类型 ├── phone_train_list.txt # 训练列表,包含图片及其对应类型
└── phone_val_list.txt # 测试列表,包含图片及其对应类型 └── phone_val_list.txt # 测试列表,包含图片及其对应类型
``` ```
...@@ -104,7 +104,7 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 ...@@ -104,7 +104,7 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \ python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \ --gpus="0,1,2,3" \
tools/train.py \ tools/train.py \
-c ./ppcls/configs/practical_models/PPHGNet_tiny_calling_halfbody.yaml \ -c ./ppcls/configs/practical_models/PPHGNet_tiny_calling_halfbody.yaml \
-o Arch.pretrained=True -o Arch.pretrained=True
``` ```
其中 `Arch.pretrained``True`表示使用预训练权重帮助训练。 其中 `Arch.pretrained``True`表示使用预训练权重帮助训练。
......
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
## 目录 ## 目录
- [1. 特征模型二值特征训练](#1) - [1. 特征模型二值特征训练](#1)
- [1.1 PP-ShiTu特征提取模型二值训练](#1.1) - [1.1 PP-ShiTu特征提取模型二值训练](#1.1)
- [1.2 其他特征模型二值训练](#1.2) - [1.2 其他特征模型二值训练](#1.2)
- [2. 检索算法配置](#2) - [2. 检索算法配置](#2)
<a name="1"></a> <a name="1"></a>
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
## 目录 ## 目录
* [1. 前言](#1) * [1. 前言](#1)
* [2. 昆仑训练](#2) * [2. 昆仑训练](#2)
* [2.1 ResNet50](#2.1) * [2.1 ResNet50](#2.1)
* [2.2 MobileNetV3](#2.2) * [2.2 MobileNetV3](#2.2)
* [2.3 HRNet](#2.3) * [2.3 HRNet](#2.3)
* [2.4 VGG16/19](#2.4) * [2.4 VGG16/19](#2.4)
<a name='1'></a> <a name='1'></a>
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
- [3. 识别模型](#3) - [3. 识别模型](#3)
- [3.1 结构(Arch)](#3.1) - [3.1 结构(Arch)](#3.1)
- [3.2 评估指标(Metric)](#3.2) - [3.2 评估指标(Metric)](#3.2)
<a name="1"></a> <a name="1"></a>
### 1.分类模型 ### 1.分类模型
......
...@@ -147,7 +147,7 @@ PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策 ...@@ -147,7 +147,7 @@ PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策
`AotoAugment` 的图像增广方式的配置如下。`AutoAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。 `AotoAugment` 的图像增广方式的配置如下。`AutoAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
```yaml ```yaml
transform_ops: transform_ops:
- DecodeImage: - DecodeImage:
to_rgb: True to_rgb: True
...@@ -192,7 +192,7 @@ PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策 ...@@ -192,7 +192,7 @@ PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策
`RandAugment` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `num_layers``magnitude`,默认的数值分别是 `2``5``RandAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。 `RandAugment` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `num_layers``magnitude`,默认的数值分别是 `2``5``RandAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
```yaml ```yaml
transform_ops: transform_ops:
- DecodeImage: - DecodeImage:
to_rgb: True to_rgb: True
...@@ -229,7 +229,7 @@ PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策 ...@@ -229,7 +229,7 @@ PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策
`TimmAutoAugment` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `config_str``interpolation``img_size`,默认的数值分别是 `rand-m9-mstd0.5-inc1``bicubic``224``TimmAutoAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。 `TimmAutoAugment` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `config_str``interpolation``img_size`,默认的数值分别是 `rand-m9-mstd0.5-inc1``bicubic``224``TimmAutoAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
```yaml ```yaml
transform_ops: transform_ops:
- DecodeImage: - DecodeImage:
to_rgb: True to_rgb: True
...@@ -604,14 +604,14 @@ Mixup 是最先提出的图像混叠增广方案,其原理简单、方便实 ...@@ -604,14 +604,14 @@ Mixup 是最先提出的图像混叠增广方案,其原理简单、方便实
<a name="2"></a> <a name="2"></a>
## 2. 模型训练、评估和预测 ## 2. 模型训练、评估和预测
<a name="2.1"></a> <a name="2.1"></a>
### 2.1 环境配置 ### 2.1 环境配置
* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。 * 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
<a name="2.2"></a> <a name="2.2"></a>
### 2.2 数据准备 ### 2.2 数据准备
...@@ -640,15 +640,15 @@ cd path_to_PaddleClas ...@@ -640,15 +640,15 @@ cd path_to_PaddleClas
``` ```
其中 `train/``val/` 分别为训练集和验证集。`train_list.txt``val_list.txt` 分别为训练集和验证集的标签文件。 其中 `train/``val/` 分别为训练集和验证集。`train_list.txt``val_list.txt` 分别为训练集和验证集的标签文件。
**备注:** **备注:**
* 关于 `train_list.txt``val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) * 关于 `train_list.txt``val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明)
<a name="2.3"></a> <a name="2.3"></a>
### 2.3 模型训练 ### 2.3 模型训练
`ppcls/configs/ImageNet/DataAugment` 中提供了基于 ResNet50 的不同的数据增强的训练配置,这里以使用 `AutoAugment` 为例,介绍数据增强的使用方法。可以通过如下脚本启动训练: `ppcls/configs/ImageNet/DataAugment` 中提供了基于 ResNet50 的不同的数据增强的训练配置,这里以使用 `AutoAugment` 为例,介绍数据增强的使用方法。可以通过如下脚本启动训练:
...@@ -658,11 +658,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 ...@@ -658,11 +658,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \ python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \ --gpus="0,1,2,3" \
tools/train.py \ tools/train.py \
-c ppcls/configs/ImageNet/DataAugment/ResNet50_AutoAugment.yaml -c ppcls/configs/ImageNet/DataAugment/ResNet50_AutoAugment.yaml
``` ```
**备注:** **备注:**
* 1.当前精度最佳的模型会保存在 `output/ResNet50/best_model.pdparams` * 1.当前精度最佳的模型会保存在 `output/ResNet50/best_model.pdparams`
* 2.如需更改数据增强类型,只需要替换`ppcls/configs/ImageNet/DataAugment`中的其他的配置文件即可。 * 2.如需更改数据增强类型,只需要替换`ppcls/configs/ImageNet/DataAugment`中的其他的配置文件即可。
...@@ -695,7 +695,7 @@ python3 tools/eval.py \ ...@@ -695,7 +695,7 @@ python3 tools/eval.py \
```python ```python
python3 tools/infer.py \ python3 tools/infer.py \
-c ppcls/configs/ImageNet/DataAugment/ResNet50_AutoAugment.yaml \ -c ppcls/configs/ImageNet/DataAugment/ResNet50_AutoAugment.yaml \
-o Global.pretrained_model=output/ResNet50/best_model -o Global.pretrained_model=output/ResNet50/best_model
``` ```
输出结果如下: 输出结果如下:
...@@ -704,12 +704,12 @@ python3 tools/infer.py \ ...@@ -704,12 +704,12 @@ python3 tools/infer.py \
[{'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']}] [{'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/ResNet50/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。 * 这里`-o Global.pretrained_model="output/ResNet50/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
* 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。 * 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。
* 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。 * 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。
......
# 版本更新信息
----------
## 目录
* [1. v2.3](#1)
* [2. v2.2](#2)
<a name='1'></a>
## 1. v2.3
- 模型更新
- 添加轻量化模型预训练权重,包括检测模型、特征模型
- 发布 PP-LCNet 系列模型,此系列模型是专门在 CPU 上设计运行的自研模型
- SwinTransformer、Twins、Deit 支持从 scrach 直接训练,达到论文精度
- 框架基础能力
- 添加 DeepHash 模块,支持特征模型直接输出二值特征
- 添加 PKSampler,特征模型不能多机多卡的训练的问题
- 支持 PaddleSlim:支持分类模型、特征模型的量化、裁剪训练及离线量化功能
- Legendary models 支持模型中间结果输出
- 支持多标签分类训练
- 预测部署
- 使用 Faiss 替换原有特征检索库,提升平台适配性
- 支持 PaddleServing:支持分类模型、图像识别流程的部署
- 推荐库版本
- python 版本:3.7
- PaddlePaddle 版本:2.1.3
- PaddleSlim 版本:2.2.0
- PaddleServing 版本:0.6.1
<a name='2'></a>
## 2. v2.2
- 模型更新
- 添加 LeViT、Twins、TNT、DLA、HardNet、RedNet、SwinTransfomer 模型
- 框架基础能力
- 将分类模型分为两类
- legendary models:引入 TheseusLayer 基类,及增加了修改网络功能接口,同时支持网络截断输出功能
- model zoo:其他普通分类模型
- 添加 Metric Learning 算法支持
- 添加多种相关 Loss 算法,及基础网络模块 gears(支持与 backbone、loss 组合)方便使用
- 同时支持普通分类及 metric learning 相关任务训练
- 支持静态图训练
- 分类训练支持 dali 加速
- 支持 fp16 训练
- 应用更新
- 添加商品识别、车辆识别(车辆细粒度分类、车辆 ReID)、logo 识别、动漫人物识别应用具体案例及相关模型
- 添加图像识别完整 pipeline,包含检测模块、特征提取模块、向量检索模块
- 预测部署
- 添加百度自研向量检索模块 Mobius,支持图像识别系统预测部署
- 图像识别,建立特征库支持 batch_size>1
- 文档更新
- 添加图像识别相关文档
- 修复之前文档 bug
- 推荐库版本
- python 版本:3.7
- PaddlePaddle:2.1.2
# 更新日志 # 更新日志
- 2022.4.21 新增 CVPR2022 oral论文 [MixFormer](https://arxiv.org/pdf/2204.02557.pdf) 相关[代码](https://github.com/PaddlePaddle/PaddleClas/pull/1820/files) - 2022.4.21 新增 CVPR2022 oral论文 [MixFormer](https://arxiv.org/pdf/2204.02557.pdf) 相关[代码](https://github.com/PaddlePaddle/PaddleClas/pull/1820/files)
......
...@@ -99,7 +99,7 @@ DataLoader: ...@@ -99,7 +99,7 @@ DataLoader:
use_shared_memory: True use_shared_memory: True
Infer: Infer:
infer_imgs: ./deploy/images/0517_2715693311.jpg infer_imgs: deploy/images/0517_2715693311.jpg
batch_size: 10 batch_size: 10
transforms: transforms:
- DecodeImage: - DecodeImage:
...@@ -116,9 +116,10 @@ Infer: ...@@ -116,9 +116,10 @@ Infer:
order: '' order: ''
- ToCHWImage: - ToCHWImage:
PostProcess: PostProcess:
name: MultiLabelTopk name: MultiLabelThreshOutput
topk: 5 threshold: 0.5
class_id_map_file: None class_id_map_file: "ppcls/utils/NUS-WIDE-SCENE_label_list.txt"
delimiter: " "
Metric: Metric:
Train: Train:
......
...@@ -53,14 +53,14 @@ class PKSampler(DistributedBatchSampler): ...@@ -53,14 +53,14 @@ class PKSampler(DistributedBatchSampler):
f"PKSampler configs error, sample_per_id({sample_per_id}) must be a divisor of batch_size({batch_size})." f"PKSampler configs error, sample_per_id({sample_per_id}) must be a divisor of batch_size({batch_size})."
assert hasattr(self.dataset, assert hasattr(self.dataset,
"labels"), "Dataset must have labels attribute." "labels"), "Dataset must have labels attribute."
self.sample_per_label = sample_per_id self.sample_per_id = sample_per_id
self.label_dict = defaultdict(list) self.label_dict = defaultdict(list)
self.sample_method = sample_method self.sample_method = sample_method
for idx, label in enumerate(self.dataset.labels): for idx, label in enumerate(self.dataset.labels):
self.label_dict[label].append(idx) self.label_dict[label].append(idx)
self.label_list = list(self.label_dict) self.label_list = list(self.label_dict)
assert len(self.label_list) * self.sample_per_label > self.batch_size, \ assert len(self.label_list) * self.sample_per_id >= self.batch_size, \
"batch size should be smaller than " f"batch size({self.batch_size}) should not be bigger than than #classes({len(self.label_list)})*sample_per_id({self.sample_per_id})"
if self.sample_method == "id_avg_prob": if self.sample_method == "id_avg_prob":
self.prob_list = np.array([1 / len(self.label_list)] * self.prob_list = np.array([1 / len(self.label_list)] *
len(self.label_list)) len(self.label_list))
...@@ -94,7 +94,7 @@ class PKSampler(DistributedBatchSampler): ...@@ -94,7 +94,7 @@ class PKSampler(DistributedBatchSampler):
format(diff)) format(diff))
def __iter__(self): def __iter__(self):
label_per_batch = self.batch_size // self.sample_per_label label_per_batch = self.batch_size // self.sample_per_id
for _ in range(len(self)): for _ in range(len(self)):
batch_index = [] batch_index = []
batch_label_list = np.random.choice( batch_label_list = np.random.choice(
...@@ -104,17 +104,17 @@ class PKSampler(DistributedBatchSampler): ...@@ -104,17 +104,17 @@ class PKSampler(DistributedBatchSampler):
p=self.prob_list) p=self.prob_list)
for label_i in batch_label_list: for label_i in batch_label_list:
label_i_indexes = self.label_dict[label_i] label_i_indexes = self.label_dict[label_i]
if self.sample_per_label <= len(label_i_indexes): if self.sample_per_id <= len(label_i_indexes):
batch_index.extend( batch_index.extend(
np.random.choice( np.random.choice(
label_i_indexes, label_i_indexes,
size=self.sample_per_label, size=self.sample_per_id,
replace=False)) replace=False))
else: else:
batch_index.extend( batch_index.extend(
np.random.choice( np.random.choice(
label_i_indexes, label_i_indexes,
size=self.sample_per_label, size=self.sample_per_id,
replace=True)) replace=True))
if not self.drop_last or len(batch_index) == self.batch_size: if not self.drop_last or len(batch_index) == self.batch_size:
yield batch_index yield batch_index
...@@ -16,9 +16,10 @@ import importlib ...@@ -16,9 +16,10 @@ import importlib
from . import topk, threshoutput from . import topk, threshoutput
from .topk import Topk, MultiLabelTopk from .topk import Topk
from .threshoutput import ThreshOutput from .threshoutput import ThreshOutput, MultiLabelThreshOutput
from .attr_rec import VehicleAttribute, PersonAttribute, TableAttribute from .attr_rec import VehicleAttribute, PersonAttribute
def build_postprocess(config): def build_postprocess(config):
......
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import os
import numpy as np
import paddle.nn.functional as F import paddle.nn.functional as F
...@@ -34,3 +36,55 @@ class ThreshOutput(object): ...@@ -34,3 +36,55 @@ class ThreshOutput(object):
result["file_name"] = file_names[idx] result["file_name"] = file_names[idx]
y.append(result) y.append(result)
return y return y
class MultiLabelThreshOutput(object):
def __init__(self, threshold=0.5, class_id_map_file=None, delimiter=None):
self.threshold = threshold
self.delimiter = delimiter if delimiter is not None else " "
self.class_id_map = self.parse_class_id_map(class_id_map_file)
def parse_class_id_map(self, class_id_map_file):
if class_id_map_file is None:
return None
if not os.path.exists(class_id_map_file):
print(
"Warning: If want to use your own label_dict, please input legal path!\nOtherwise label_names will be empty!"
)
return None
try:
class_id_map = {}
with open(class_id_map_file, "r") as fin:
lines = fin.readlines()
for line in lines:
partition = line.split("\n")[0].partition(self.delimiter)
class_id_map[int(partition[0])] = str(partition[-1])
except Exception as ex:
print(ex)
class_id_map = None
return class_id_map
def __call__(self, x, file_names=None):
y = []
x = F.sigmoid(x).numpy()
for idx, probs in enumerate(x):
index = np.where(probs >= self.threshold)[0].astype("int32")
clas_id_list = []
score_list = []
label_name_list = []
for i in index:
clas_id_list.append(i.item())
score_list.append(probs[i].item())
if self.class_id_map is not None:
label_name_list.append(self.class_id_map[i.item()])
result = {
"class_ids": clas_id_list,
"scores": np.around(
score_list, decimals=5).tolist(),
"label_names": label_name_list
}
if file_names is not None:
result["file_name"] = file_names[idx]
y.append(result)
return y
...@@ -46,19 +46,18 @@ class Topk(object): ...@@ -46,19 +46,18 @@ class Topk(object):
class_id_map = None class_id_map = None
return class_id_map return class_id_map
def __call__(self, x, file_names=None, multilabel=False): def __call__(self, x, file_names=None):
if isinstance(x, dict): if isinstance(x, dict):
x = x['logits'] x = x['logits']
assert isinstance(x, paddle.Tensor) assert isinstance(x, paddle.Tensor)
if file_names is not None: if file_names is not None:
assert x.shape[0] == len(file_names) assert x.shape[0] == len(file_names)
x = F.softmax(x, axis=-1) if not multilabel else F.sigmoid(x) x = F.softmax(x, axis=-1)
x = x.numpy() x = x.numpy()
y = [] y = []
for idx, probs in enumerate(x): for idx, probs in enumerate(x):
index = probs.argsort(axis=0)[-self.topk:][::-1].astype( index = probs.argsort(axis=0)[-self.topk:][::-1].astype(
"int32") if not multilabel else np.where( "int32")
probs >= 0.5)[0].astype("int32")
clas_id_list = [] clas_id_list = []
score_list = [] score_list = []
label_name_list = [] label_name_list = []
...@@ -79,10 +78,3 @@ class Topk(object): ...@@ -79,10 +78,3 @@ class Topk(object):
y.append(result) y.append(result)
return y return y
class MultiLabelTopk(Topk):
def __init__(self, topk=1, class_id_map_file=None):
super().__init__()
def __call__(self, x, file_names=None):
return super().__call__(x, file_names, multilabel=True)
...@@ -502,7 +502,7 @@ class Engine(object): ...@@ -502,7 +502,7 @@ class Engine(object):
assert self.mode == "export" assert self.mode == "export"
use_multilabel = self.config["Global"].get( use_multilabel = self.config["Global"].get(
"use_multilabel", "use_multilabel",
False) and "ATTRMetric" in self.config["Metric"]["Eval"][0] False) or "ATTRMetric" in self.config["Metric"]["Eval"][0]
model = ExportModel(self.config["Arch"], self.model, use_multilabel) model = ExportModel(self.config["Arch"], self.model, use_multilabel)
if self.config["Global"]["pretrained_model"] is not None: if self.config["Global"]["pretrained_model"] is not None:
load_dygraph_pretrain(model.base_model, load_dygraph_pretrain(model.base_model,
......
0 airport
1 beach
2 bridge
3 buildings
4 castle
5 cityscape
6 clouds
7 frost
8 garden
9 glacier
10 grass
11 harbor
12 house
13 lake
14 moon
15 mountain
16 nighttime
17 ocean
18 plants
19 railroad
20 rainbow
21 reflection
22 road
23 sky
24 snow
25 street
26 sunset
27 temple
28 town
29 valley
30 water
31 waterfall
32 window
...@@ -115,3 +115,4 @@ bash test_tipc/test_train_inference_python.sh ./test_tipc/configs/MobileNetV3/Mo ...@@ -115,3 +115,4 @@ bash test_tipc/test_train_inference_python.sh ./test_tipc/configs/MobileNetV3/Mo
- [test_serving_infer_python 使用](docs/test_serving_infer_python.md):测试python serving功能。 - [test_serving_infer_python 使用](docs/test_serving_infer_python.md):测试python serving功能。
- [test_serving_infer_cpp 使用](docs/test_serving_infer_cpp.md):测试cpp serving功能。 - [test_serving_infer_cpp 使用](docs/test_serving_infer_cpp.md):测试cpp serving功能。
- [test_train_fleet_inference_python 使用](./docs/test_train_fleet_inference_python.md):测试基于Python的多机多卡训练与推理等基本功能。 - [test_train_fleet_inference_python 使用](./docs/test_train_fleet_inference_python.md):测试基于Python的多机多卡训练与推理等基本功能。
- [benchmark_train 使用](./docs/benchmark_train.md):测试基于Python的训练benchmark等基本功能。
...@@ -51,7 +51,7 @@ inference:python/predict_rec.py -c configs/inference_rec.yaml ...@@ -51,7 +51,7 @@ inference:python/predict_rec.py -c configs/inference_rec.yaml
null:null null:null
null:null null:null
===========================train_benchmark_params========================== ===========================train_benchmark_params==========================
batch_size:256 batch_size:128
fp_items:fp32|fp16 fp_items:fp32|fp16
epoch:1 epoch:1
--profiler_options:batch_range=[10,20];state=GPU;tracer_option=Default;profile_path=model.profile --profiler_options:batch_range=[10,20];state=GPU;tracer_option=Default;profile_path=model.profile
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册