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

Merge branch 'newest' into fix_deploy_python_doc

...@@ -27,9 +27,10 @@ PreProcess: ...@@ -27,9 +27,10 @@ PreProcess:
- 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/
...@@ -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
...@@ -29,6 +29,3 @@ ...@@ -29,6 +29,3 @@
- 产业应用十问十答 - 产业应用十问十答
- 智能零售下的应用案例 - 智能零售下的应用案例
- 识别系统快速落地方案 - 识别系统快速落地方案
# 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
...@@ -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
...@@ -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 |
...@@ -404,4 +404,3 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例, ...@@ -404,4 +404,3 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
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)来完成相应的部署工作。
model_list.md
\ No newline at end of file
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. 模型评估
...@@ -71,7 +75,7 @@ python3 tools/infer.py \ ...@@ -71,7 +75,7 @@ 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']
``` ```
# 版本更新信息
----------
## 目录
* [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.
先完成此消息的编辑!
想要评论请 注册