Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleClas
提交
c2e71180
P
PaddleClas
项目概览
PaddlePaddle
/
PaddleClas
大约 1 年 前同步成功
通知
115
Star
4999
Fork
1114
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
19
列表
看板
标记
里程碑
合并请求
6
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleClas
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
19
Issue
19
列表
看板
标记
里程碑
合并请求
6
合并请求
6
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
c2e71180
编写于
11月 01, 2021
作者:
B
Bin Lu
提交者:
stephon
11月 01, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update feature_extraction.md
上级
c8e387f5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
39 addition
and
23 deletion
+39
-23
docs/zh_CN/image_recognition_pipeline/feature_extraction.md
docs/zh_CN/image_recognition_pipeline/feature_extraction.md
+39
-23
未找到文件。
docs/zh_CN/image_recognition_pipeline/feature_extraction.md
浏览文件 @
c2e71180
# 特征提取
## 1. 特征提取简介
特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的
[
向量检索
](
./vector_search.md
)
。好的特征需要具备相似度保持性,即在特征空间中,相似度高的图片对其特征相似度要比较高(距离比较近);相似度低的图片,其特征相似度要比较小(距离比较远)。依据应用场景的不同, 我们可以选用不同长度的实值特征(real-valued feature)或者是二值特征(binary feature)。顾名思义,实值特征的每个元素都是一个实数,而二值特征每个元素为非0即1(或者表示为-1和1),二者的差异见下表所示。
![
image
](
https://user-images.githubusercontent.com/17264083/139409293-772ffc53-2bee-4736-8fa2-32d99a916572
.png
)
![
image
](
../images/compare
.png
)
[
Deep Metric Learning
](
../algorithm_introduction/metric_learning.md
)
和 DeepHash分别用以研究如何通过深度学习的方法获得好的实值和二值特征表示。本文主要介绍如何使用PaddleClas构建一个特征学习网络, 如何进行训练、评估和推理。
## 2. 网络结构
![](
./framework.png
)
![](
.
./images
/framework.png
)
为了图像识别任务的灵活定制,我们将整个网络分为Backbone, Neck, Head以及Loss部分,整体结构如上图所示,下面分别介绍各自的功能:
-
Backbone: 指定所使用的骨干网络。值得注意的是,PaddleClas提供的基于ImageNet的预训练模型,最后一层的输出为1000, 我们需要依据所需的特征维度定制最后一层的输出。
-
Neck: 用以特征增强及特征维度变换
;
这儿的Neck,可以是一个简单的Linear Layer,用来做特征维度变换;也可以是较复杂的FPN结构,用以做特征增强。
-
Head: 用来将feature转化为logits
; 除了常用的Fc Layer外,我们还提供了cosmargin, arcmargin, circlemargin
模块
-
Loss: 指定所
所用的Loss函数; Loss是特征提取能力的关键, Deep Metric Learing和Deep Hash很多的研究工作都聚焦在loss设计上。
我们将Loss设计为组合loss的形式, 可以方便得将Classification Loss和Similarity Preserving Loss组合在一起
-
Backbone: 指定所使用的骨干网络。
值得注意的是,PaddleClas提供的基于ImageNet的预训练模型,最后一层的输出为1000, 我们需要依据所需的特征维度定制最后一层的输出。
-
Neck: 用以特征增强及特征维度变换
。
这儿的Neck,可以是一个简单的Linear Layer,用来做特征维度变换;也可以是较复杂的FPN结构,用以做特征增强。
-
Head: 用来将feature转化为logits
。 除了常用的Fc Layer外,还可以替换为cosmargin, arcmargin, circlemargin等
模块
-
Loss: 指定所
使用的Loss函数。
我们将Loss设计为组合loss的形式, 可以方便得将Classification Loss和Similarity Preserving Loss组合在一起
## 3. 配置文件介绍
下面以
商品识别模型
为例,介绍配置文件的含义:
下面以
通用图像识别
为例,介绍配置文件的含义:
## 网络结构
```
Arch:
...
...
@@ -39,13 +39,13 @@ Arch:
margin: 0.2
scale: 30
```
-
**name**
: 模型的名字
,
有别于PaddleClas提供的标准分类模型,定制化的识别模型,统一命名为RecModel
-
**infer_output_key**
: 推理时需要用到的Tensor的key
, 训练模型下,网络会以字典的形式输出features和logits. 识别任务中,推理时只需要用到features即可
-
**infer_output_key**
: 推理时是否需要加softmax。为了和分类任务的统一
,
分类任务推理时需要加softmax操作,识别任务不需要
-
**Backbone**
: 骨干网络
, 此处选用的是经过SSLD蒸馏之后的
预训练模型
-
**BackboneStopLayer**
:
该处用以指示在何处截断网络,关于TheseLayer的用法,请参考文档xxx
-
**Neck**
: 用以进行特征维度转换
,此处输出
512维的特征向量
-
**Head**
:
采用ArcMargin, 此处
可以依据训练数据修改类别数class_num, 以及超参数margin和scale
-
**name**
: 模型的名字
。
有别于PaddleClas提供的标准分类模型,定制化的识别模型,统一命名为RecModel
-
**infer_output_key**
: 推理时需要用到的Tensor的key
名。 训练模型时,网络会以字典的形式输出features和logits。识别任务中,推理时只需要用到features
-
**infer_output_key**
: 推理时是否需要加softmax。为了和分类任务的统一
后处理;
分类任务推理时需要加softmax操作,识别任务不需要
-
**Backbone**
: 骨干网络
。 此处选用的是经过SSLD蒸馏之后的PPLCNet_x2_5
预训练模型
-
**BackboneStopLayer**
:
网络截断指示。用以去除预训练模型的最后一层Linear, 方便后续定制特征增强功能和特征维度变化
-
**Neck**
: 用以进行特征维度转换
。 此处输出为
512维的特征向量
-
**Head**
:
用来将feature转化为logits。 此处采用ArcMargin,
可以依据训练数据修改类别数class_num, 以及超参数margin和scale
## Loss构成
### 单Loss示例
...
...
@@ -58,7 +58,7 @@ Loss:
- CELoss:
weight: 1.0
```
可以看到
此处选用的是CELoss, 结合Head部分的ArcMargin, 因此使用的是
[
ArcFace
](
https://arxiv.org/abs/1801.07698
)
中的算法
此处选用的是CELoss, 结合Head部分的ArcMargin, 因此使用的是
[
ArcFace
](
https://arxiv.org/abs/1801.07698
)
中的算法
### 组合Loss示例
```
...
...
@@ -73,12 +73,28 @@ Loss:
- CELoss:
weight: 1.0
```
可以看到
此处选用的是CELoss和TripletLoss的一个组合,两者的比例为1:1.
此处选用的是CELoss和TripletLoss的一个组合,两者的比例为1:1.
# 4.训练、评估、推理
下面以
`ppcls/configs/Products/ResNet50_vd_SOP.yaml`
为例,介绍模型的训练、评估、推理过程
## 4.1 数据准备
首先,下载SOP数据集, 数据链接: https://cvgl.stanford.edu/projects/lifted_struct/
首先,下载
[
SOP
](
https://cvgl.stanford.edu/projects/lifted_struct/
)
数据集, 数据文件结构如下所示:
```
.
├── bicycle_final
├── bicycle_final.txt
├── cabinet_final
├── cabinet_final.txt
├── chair_final
......
├── Ebay_final.txt
├── Ebay_info.txt
├── Ebay_test.txt
├── Ebay_train.txt
├── fan_final
......
├── LICENSE
```
## 4.2 训练
-
单机单卡训练
...
...
@@ -91,30 +107,30 @@ python -m paddle.distributed.launch
--gpus="0,1,2,3" tools/train.py
-c ppcls/configs/ResNet50_vd_SOP.yaml
```
训练完成之后,会在
`output`
目录下生成
`best_model`
训练完成之后,会在
`output`
目录下生成
`best_model`
模型文件。
## 4.3 评估
-
单卡评估
```
python tools/eval.py -c ppcls/configs/ResNet50_vd_SOP.yaml -o Global.pretrained_model="output/ReModel/best_model"
python tools/eval.py -c ppcls/configs/ResNet50_vd_SOP.yaml -o Global.pretrained_model="output/Re
c
Model/best_model"
```
-
多卡评估
```
python -m paddle.distributed.launch
--gpus="0,1,2,3" tools/eval.py
-c ppcls/configs/ResNet50_vd_SOP.yaml
-o Global.pretrained_model="output/ReModel/best_model"
-o Global.pretrained_model="output/Re
c
Model/best_model"
```
## 4.4 推理
推理过程包括两个步骤: 1
) 导出推理模型; 2)
获取特征向量
推理过程包括两个步骤: 1
)导出推理模型, 2)
获取特征向量
### 4.4.1 导出推理模型
```
python tools/export_model -c ppcls/configs/ResNet50_vd_SOP.yaml -o Global.pretrained_model="output/ReModel/best_model"
python tools/export_model -c ppcls/configs/ResNet50_vd_SOP.yaml -o Global.pretrained_model="output/Re
c
Model/best_model"
```
生成的推理模型位于
`inference`
目录,名字为
`inference.pd*`
### 4.4.2 获取特征向量
```
cd deploy
python python/
inference_rec.py -c configs/inference_product.yaml -o rec_inference_model_dir="../inference
/inference"
python python/
predict_rec.py -c configs/inference_rec.yaml -o rec_inference_model_dir="..
/inference"
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录