merge devevelop
commit
0b1481402b
|
@ -7,7 +7,7 @@
|
|||
飞桨图像识别套件PaddleClas是飞桨为工业界和学术界所准备的一个图像识别任务的工具集,助力使用者训练出更好的视觉模型和应用落地。
|
||||
|
||||
**近期更新**
|
||||
- 2022.4.21 新增 CVPR2022 oral论文 [MixFormmer](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)。
|
||||
- 2022.1.27 全面升级文档;新增[PaddleServing C++ pipeline部署方式](./deploy/paddleserving)和[18M图像识别安卓部署Demo](./deploy/lite_shitu)。
|
||||
- 2021.11.1 发布[PP-ShiTu技术报告](https://arxiv.org/pdf/2111.00775.pdf),新增饮料识别demo
|
||||
- 2021.10.23 发布轻量级图像识别系统PP-ShiTu,CPU上0.2s即可完成在10w+库的图像识别。
|
||||
|
|
|
@ -8,7 +8,7 @@ PaddleClas is an image recognition toolset for industry and academia, helping us
|
|||
|
||||
**Recent updates**
|
||||
|
||||
- 2022.4.21 Added the related [code](https://github.com/PaddlePaddle/PaddleClas/pull/1820/files) of the CVPR2022 oral paper [MixFormmer](https://arxiv.org/pdf/2204.02557.pdf).
|
||||
- 2022.4.21 Added the related [code](https://github.com/PaddlePaddle/PaddleClas/pull/1820/files) of the CVPR2022 oral paper [MixFormer](https://arxiv.org/pdf/2204.02557.pdf).
|
||||
|
||||
- 2021.09.17 Add PP-LCNet series model developed by PaddleClas, these models show strong competitiveness on Intel CPUs.
|
||||
For the introduction of PP-LCNet, please refer to [paper](https://arxiv.org/pdf/2109.15099.pdf) or [PP-LCNet model introduction](docs/en/models/PP-LCNet_en.md). The metrics and pretrained model are available [here](docs/en/ImageNet_models_en.md).
|
||||
|
|
|
@ -92,9 +92,9 @@ PaddleClas 提供了转换并优化后的推理模型,可以直接参考下方
|
|||
```shell
|
||||
# 进入lite_ppshitu目录
|
||||
cd $PaddleClas/deploy/lite_shitu
|
||||
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/lite/ppshitu_lite_models_v1.0.tar
|
||||
tar -xf ppshitu_lite_models_v1.0.tar
|
||||
rm -f ppshitu_lite_models_v1.0.tar
|
||||
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/lite/ppshitu_lite_models_v1.1.tar
|
||||
tar -xf ppshitu_lite_models_v1.1.tar
|
||||
rm -f ppshitu_lite_models_v1.1.tar
|
||||
```
|
||||
|
||||
#### 2.1.2 使用其他模型
|
||||
|
@ -173,15 +173,11 @@ cp $code_path/PaddleDetection/inference/picodet_lcnet_x2_5_640_mainbody/mainbody
|
|||
|
||||
2. 转换识别模型
|
||||
|
||||
请先参考 [识别模型转分类模型](../../docs/zh_CN/advanced_tutorials/gallery2fc.md) 完成识别模型到分类模型的转换。
|
||||
在得到 inference 推理模型(后缀名为 `.pdmodel`、`.pdiparams`)以及 `label.txt` 后,再使用 PaddleLite opt 工具完成模型优化,命令如下:
|
||||
|
||||
```shell
|
||||
# 转换为Paddle-Lite模型
|
||||
paddle_lite_opt --model_file=inference/inference.pdmodel --param_file=inference/inference.pdiparams --optimize_out=inference/rec
|
||||
# 将模型、label文件拷贝到lite_shitu下
|
||||
# 将模型文件拷贝到lite_shitu下
|
||||
cp inference/rec.nb deploy/lite_shitu/models/
|
||||
cp inference/label.txt deploy/lite_shitu/models/
|
||||
cd deploy/lite_shitu
|
||||
```
|
||||
|
||||
|
@ -191,10 +187,10 @@ cd deploy/lite_shitu
|
|||
|
||||
```shell
|
||||
# 如果测试单张图像
|
||||
python generate_json_config.py --det_model_path ppshitu_lite_models_v1.0/mainbody_PPLCNet_x2_5_640_quant_v1.0_lite.nb --rec_model_path ppshitu_lite_models_v1.0/general_PPLCNet_x2_5_lite_v1.0_infer.nb --img_path images/demo.jpg
|
||||
python generate_json_config.py --det_model_path ppshitu_lite_models_v1.1/mainbody_PPLCNet_x2_5_640_quant_v1.1_lite.nb --rec_model_path ppshitu_lite_models_v1.1/general_PPLCNet_x2_5_lite_v1.1_infer.nb --img_path images/demo.jpg
|
||||
# or
|
||||
# 如果测试多张图像
|
||||
python generate_json_config.py --det_model_path ppshitu_lite_models_v1.0/mainbody_PPLCNet_x2_5_640_quant_v1.0_lite.nb --rec_model_path ppshitu_lite_models_v1.0/general_PPLCNet_x2_5_lite_v1.0_infer.nb --img_dir images
|
||||
python generate_json_config.py --det_model_path ppshitu_lite_models_v1.1/mainbody_PPLCNet_x2_5_640_quant_v1.1_lite.nb --rec_model_path ppshitu_lite_models_v1.1/general_PPLCNet_x2_5_lite_v1.1_infer.nb --img_dir images
|
||||
# 执行完成后,会在lit_shitu下生成shitu_config.json配置文件
|
||||
```
|
||||
|
||||
|
@ -263,7 +259,7 @@ make ARM_ABI=arm8
|
|||
|
||||
```shell
|
||||
mkdir deploy
|
||||
mv ppshitu_lite_models_v1.0 deploy/
|
||||
mv ppshitu_lite_models_v1.1 deploy/
|
||||
mv drink_dataset_v1.0 deploy/
|
||||
mv images deploy/
|
||||
mv shitu_config.json deploy/
|
||||
|
@ -277,12 +273,12 @@ cp ../../../cxx/lib/libpaddle_light_api_shared.so deploy/
|
|||
|
||||
```shell
|
||||
deploy/
|
||||
|-- ppshitu_lite_models_v1.0/
|
||||
| |--mainbody_PPLCNet_x2_5_lite_v1.0_infer.nb 优化后的主体检测模型文件
|
||||
| |--general_PPLCNet_x2_5_quant_v1.0_lite.nb 优化后的识别模型文件
|
||||
|-- ppshitu_lite_models_v1.1/
|
||||
| |--mainbody_PPLCNet_x2_5_640_quant_v1.1_lite.nb 优化后的主体检测模型文件
|
||||
| |--general_PPLCNet_x2_5_lite_v1.1_infer.nb 优化后的识别模型文件
|
||||
|-- images/
|
||||
| |--demo.jpg 图片文件
|
||||
|-- drink_dataset_v1.0/ 瓶装饮料demo数据
|
||||
|-- drink_dataset_v1.0/ 瓶装饮料demo数据
|
||||
| |--index 检索index目录
|
||||
|-- pp_shitu 生成的移动端执行文件
|
||||
|-- shitu_config.json 执行时参数配置文件
|
||||
|
|
|
@ -42,11 +42,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed cls_token .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 1.25e-4
|
||||
eta_min: 1.25e-6
|
||||
learning_rate: 2.5e-4
|
||||
eta_min: 2.5e-6
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 1.25e-7
|
||||
warmup_start_lr: 2.5e-7
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -42,11 +42,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed cls_token .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 6.25e-5
|
||||
eta_min: 6.25e-7
|
||||
learning_rate: 1.25e-4
|
||||
eta_min: 1.25e-6
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 6.25e-8
|
||||
warmup_start_lr: 1.25e-7
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -42,11 +42,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed cls_token .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 1.25e-4
|
||||
eta_min: 1.25e-6
|
||||
learning_rate: 2.5e-4
|
||||
eta_min: 2.5e-6
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 1.25e-7
|
||||
warmup_start_lr: 2.5e-7
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -42,11 +42,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed cls_token .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 3.125e-5
|
||||
eta_min: 3.125e-7
|
||||
learning_rate: 6.25e-5
|
||||
eta_min: 6.25e-7
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 3.125e-8
|
||||
warmup_start_lr: 6.25e-8
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -42,11 +42,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed cls_token .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 2.5e-4
|
||||
eta_min: 2.5e-6
|
||||
learning_rate: 5e-4
|
||||
eta_min: 5e-6
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 2.5e-7
|
||||
warmup_start_lr: 5e-7
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -42,11 +42,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed cls_token .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 5e-6
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 5e-7
|
||||
warmup_start_lr: 1e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -40,11 +40,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token pos_embed dist_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
learning_rate: 2e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
# data loader for train and eval
|
||||
DataLoader:
|
||||
|
|
|
@ -40,11 +40,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token pos_embed dist_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
learning_rate: 2e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
# data loader for train and eval
|
||||
DataLoader:
|
||||
|
|
|
@ -40,11 +40,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token pos_embed dist_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
learning_rate: 2e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
# data loader for train and eval
|
||||
DataLoader:
|
||||
|
|
|
@ -40,11 +40,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token pos_embed dist_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
learning_rate: 2e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
# data loader for train and eval
|
||||
DataLoader:
|
||||
|
|
|
@ -41,10 +41,10 @@ Optimizer:
|
|||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
name: Cosine
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
learning_rate: 2e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
# data loader for train and eval
|
||||
DataLoader:
|
||||
|
|
|
@ -40,11 +40,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token pos_embed dist_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
learning_rate: 2e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
# data loader for train and eval
|
||||
DataLoader:
|
||||
|
|
|
@ -40,11 +40,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token pos_embed dist_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
learning_rate: 2e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
# data loader for train and eval
|
||||
DataLoader:
|
||||
|
|
|
@ -40,11 +40,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token pos_embed dist_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
learning_rate: 2e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
# data loader for train and eval
|
||||
DataLoader:
|
||||
|
|
|
@ -49,9 +49,8 @@ Loss:
|
|||
model_name_pairs:
|
||||
- ["Student", "Teacher"]
|
||||
Eval:
|
||||
- DistillationGTCELoss:
|
||||
- CELoss:
|
||||
weight: 1.0
|
||||
model_names: ["Student"]
|
||||
|
||||
|
||||
Optimizer:
|
||||
|
|
|
@ -88,10 +88,8 @@ Loss:
|
|||
s_shapes: *s_shapes
|
||||
t_shapes: *t_shapes
|
||||
Eval:
|
||||
- DistillationGTCELoss:
|
||||
- CELoss:
|
||||
weight: 1.0
|
||||
model_names: ["Student"]
|
||||
|
||||
|
||||
Optimizer:
|
||||
name: Momentum
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed1 pos_embed2 pos_embed3 pos_embed4 cls_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 5e-6
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 5e-7
|
||||
warmup_start_lr: 1e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed1 pos_embed2 pos_embed3 pos_embed4 cls_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 5e-6
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 5e-7
|
||||
warmup_start_lr: 1e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed1 pos_embed2 pos_embed3 pos_embed4 cls_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 5e-6
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 5e-7
|
||||
warmup_start_lr: 1e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed1 pos_embed2 pos_embed3 pos_embed4 cls_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 5e-6
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 5e-7
|
||||
warmup_start_lr: 1e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -44,11 +44,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed1 pos_embed2 pos_embed3 pos_embed4 cls_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 5e-6
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 5e-7
|
||||
warmup_start_lr: 1e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -44,11 +44,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed1 pos_embed2 pos_embed3 pos_embed4 cls_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 5e-6
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 5e-7
|
||||
warmup_start_lr: 1e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -44,11 +44,12 @@ Optimizer:
|
|||
no_weight_decay_name: pos_embed1 pos_embed2 pos_embed3 pos_embed4 cls_token
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 5e-6
|
||||
learning_rate: 1e-3
|
||||
eta_min: 1e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 5e-7
|
||||
warmup_start_lr: 1e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -41,11 +41,12 @@ Optimizer:
|
|||
no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -41,11 +41,12 @@ Optimizer:
|
|||
no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -41,11 +41,12 @@ Optimizer:
|
|||
no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -41,11 +41,12 @@ Optimizer:
|
|||
no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -41,11 +41,12 @@ Optimizer:
|
|||
no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -41,11 +41,12 @@ Optimizer:
|
|||
no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 20
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token proj.0.weight proj.1.weight proj.2.weight proj.3.weight pos_block
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token proj.0.weight proj.1.weight proj.2.weight proj.3.weight pos_block
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token proj.0.weight proj.1.weight proj.2.weight proj.3.weight pos_block
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token proj.0.weight proj.1.weight proj.2.weight proj.3.weight pos_block
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token proj.0.weight proj.1.weight proj.2.weight proj.3.weight pos_block
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -43,11 +43,12 @@ Optimizer:
|
|||
no_weight_decay_name: norm cls_token proj.0.weight proj.1.weight proj.2.weight proj.3.weight pos_block
|
||||
one_dim_param_no_weight_decay: True
|
||||
lr:
|
||||
# for 8 cards
|
||||
name: Cosine
|
||||
learning_rate: 5e-4
|
||||
eta_min: 1e-5
|
||||
learning_rate: 1e-3
|
||||
eta_min: 2e-5
|
||||
warmup_epoch: 5
|
||||
warmup_start_lr: 1e-6
|
||||
warmup_start_lr: 2e-6
|
||||
|
||||
|
||||
# data loader for train and eval
|
||||
|
|
|
@ -98,8 +98,8 @@ class Engine(object):
|
|||
logger.info('train with paddle {} and device {}'.format(
|
||||
paddle.__version__, self.device))
|
||||
|
||||
# AMP training
|
||||
self.amp = True if "AMP" in self.config and self.mode == "train" else False
|
||||
# AMP training and evaluating
|
||||
self.amp = "AMP" in self.config
|
||||
if self.amp and self.config["AMP"] is not None:
|
||||
self.scale_loss = self.config["AMP"].get("scale_loss", 1.0)
|
||||
self.use_dynamic_loss_scaling = self.config["AMP"].get(
|
||||
|
@ -250,12 +250,17 @@ class Engine(object):
|
|||
level=amp_level,
|
||||
save_dtype='float32')
|
||||
|
||||
# for distributed
|
||||
# check the gpu num
|
||||
world_size = dist.get_world_size()
|
||||
self.config["Global"]["distributed"] = world_size != 1
|
||||
if world_size != 4 and self.mode == "train":
|
||||
msg = f"The training strategy in config files provided by PaddleClas is based on 4 gpus. But the number of gpus is {world_size} in current training. Please modify the stategy (learning rate, batch size and so on) if use config files in PaddleClas to train."
|
||||
logger.warning(msg)
|
||||
if self.mode == "train":
|
||||
std_gpu_num = 8 if self.config["Optimizer"][
|
||||
"name"] == "AdamW" else 4
|
||||
if world_size != std_gpu_num:
|
||||
msg = f"The training strategy provided by PaddleClas is based on {std_gpu_num} gpus. But the number of gpu is {world_size} in current training. Please modify the stategy (learning rate, batch size and so on) if use this config to train."
|
||||
logger.warning(msg)
|
||||
|
||||
# for distributed
|
||||
if self.config["Global"]["distributed"]:
|
||||
dist.init_parallel_env()
|
||||
self.model = paddle.DataParallel(self.model)
|
||||
|
|
|
@ -73,68 +73,66 @@ def classification_eval(engine, epoch_id=0):
|
|||
},
|
||||
level=amp_level):
|
||||
out = engine.model(batch[0])
|
||||
# calc loss
|
||||
if engine.eval_loss_func is not None:
|
||||
loss_dict = engine.eval_loss_func(out, batch[1])
|
||||
for key in loss_dict:
|
||||
if key not in output_info:
|
||||
output_info[key] = AverageMeter(key, '7.5f')
|
||||
output_info[key].update(loss_dict[key].numpy()[0],
|
||||
batch_size)
|
||||
else:
|
||||
out = engine.model(batch[0])
|
||||
# calc loss
|
||||
if engine.eval_loss_func is not None:
|
||||
loss_dict = engine.eval_loss_func(out, batch[1])
|
||||
for key in loss_dict:
|
||||
if key not in output_info:
|
||||
output_info[key] = AverageMeter(key, '7.5f')
|
||||
output_info[key].update(loss_dict[key].numpy()[0],
|
||||
batch_size)
|
||||
|
||||
# just for DistributedBatchSampler issue: repeat sampling
|
||||
current_samples = batch_size * paddle.distributed.get_world_size()
|
||||
accum_samples += current_samples
|
||||
|
||||
# calc metric
|
||||
if engine.eval_metric_func is not None:
|
||||
if paddle.distributed.get_world_size() > 1:
|
||||
label_list = []
|
||||
paddle.distributed.all_gather(label_list, batch[1])
|
||||
labels = paddle.concat(label_list, 0)
|
||||
if isinstance(out, dict) and "Student" in out:
|
||||
out = out["Student"]
|
||||
if isinstance(out, dict) and "logits" in out:
|
||||
out = out["logits"]
|
||||
|
||||
if isinstance(out, dict):
|
||||
if "Student" in out:
|
||||
out = out["Student"]
|
||||
if isinstance(out, dict):
|
||||
out = out["logits"]
|
||||
elif "logits" in out:
|
||||
out = out["logits"]
|
||||
else:
|
||||
msg = "Error: Wrong key in out!"
|
||||
raise Exception(msg)
|
||||
if isinstance(out, list):
|
||||
pred = []
|
||||
for x in out:
|
||||
pred_list = []
|
||||
paddle.distributed.all_gather(pred_list, x)
|
||||
pred_x = paddle.concat(pred_list, 0)
|
||||
pred.append(pred_x)
|
||||
else:
|
||||
# gather Tensor when distributed
|
||||
if paddle.distributed.get_world_size() > 1:
|
||||
label_list = []
|
||||
paddle.distributed.all_gather(label_list, batch[1])
|
||||
labels = paddle.concat(label_list, 0)
|
||||
|
||||
if isinstance(out, list):
|
||||
preds = []
|
||||
for x in out:
|
||||
pred_list = []
|
||||
paddle.distributed.all_gather(pred_list, out)
|
||||
pred = paddle.concat(pred_list, 0)
|
||||
|
||||
if accum_samples > total_samples and not engine.use_dali:
|
||||
pred = pred[:total_samples + current_samples -
|
||||
accum_samples]
|
||||
labels = labels[:total_samples + current_samples -
|
||||
accum_samples]
|
||||
current_samples = total_samples + current_samples - accum_samples
|
||||
metric_dict = engine.eval_metric_func(pred, labels)
|
||||
paddle.distributed.all_gather(pred_list, x)
|
||||
pred_x = paddle.concat(pred_list, 0)
|
||||
preds.append(pred_x)
|
||||
else:
|
||||
metric_dict = engine.eval_metric_func(out, batch[1])
|
||||
pred_list = []
|
||||
paddle.distributed.all_gather(pred_list, out)
|
||||
preds = paddle.concat(pred_list, 0)
|
||||
|
||||
if accum_samples > total_samples and not engine.use_dali:
|
||||
preds = preds[:total_samples + current_samples - accum_samples]
|
||||
labels = labels[:total_samples + current_samples -
|
||||
accum_samples]
|
||||
current_samples = total_samples + current_samples - accum_samples
|
||||
else:
|
||||
labels = batch[1]
|
||||
preds = out
|
||||
|
||||
# calc loss
|
||||
if engine.eval_loss_func is not None:
|
||||
if engine.amp and engine.config["AMP"].get("use_fp16_test", False):
|
||||
amp_level = engine.config['AMP'].get("level", "O1").upper()
|
||||
with paddle.amp.auto_cast(
|
||||
custom_black_list={
|
||||
"flatten_contiguous_range", "greater_than"
|
||||
},
|
||||
level=amp_level):
|
||||
loss_dict = engine.eval_loss_func(preds, labels)
|
||||
else:
|
||||
loss_dict = engine.eval_loss_func(preds, labels)
|
||||
|
||||
for key in loss_dict:
|
||||
if key not in output_info:
|
||||
output_info[key] = AverageMeter(key, '7.5f')
|
||||
output_info[key].update(loss_dict[key].numpy()[0],
|
||||
current_samples)
|
||||
# calc metric
|
||||
if engine.eval_metric_func is not None:
|
||||
metric_dict = engine.eval_metric_func(preds, labels)
|
||||
for key in metric_dict:
|
||||
if metric_key is None:
|
||||
metric_key = key
|
||||
|
|
|
@ -259,10 +259,8 @@ def eval_func(distmat, q_pids, g_pids, q_camids, g_camids, max_rank=50):
|
|||
|
||||
|
||||
def cal_feature(engine, name='gallery'):
|
||||
all_feas = None
|
||||
all_image_id = None
|
||||
all_unique_id = None
|
||||
has_unique_id = False
|
||||
all_unique_id = None
|
||||
|
||||
if name == 'gallery':
|
||||
dataloader = engine.gallery_dataloader
|
||||
|
@ -273,6 +271,9 @@ def cal_feature(engine, name='gallery'):
|
|||
else:
|
||||
raise RuntimeError("Only support gallery or query dataset")
|
||||
|
||||
batch_feas_list = []
|
||||
img_id_list = []
|
||||
unique_id_list = []
|
||||
max_iter = len(dataloader) - 1 if platform.system() == "Windows" else len(
|
||||
dataloader)
|
||||
for idx, batch in enumerate(dataloader): # load is very time-consuming
|
||||
|
@ -317,32 +318,39 @@ def cal_feature(engine, name='gallery'):
|
|||
if engine.config["Global"].get("feature_binarize") == "sign":
|
||||
batch_feas = paddle.sign(batch_feas).astype("float32")
|
||||
|
||||
if all_feas is None:
|
||||
all_feas = batch_feas
|
||||
if paddle.distributed.get_world_size() > 1:
|
||||
batch_feas_gather = []
|
||||
img_id_gather = []
|
||||
unique_id_gather = []
|
||||
paddle.distributed.all_gather(batch_feas_gather, batch_feas)
|
||||
paddle.distributed.all_gather(img_id_gather, batch[1])
|
||||
batch_feas_list.append(paddle.concat(batch_feas_gather))
|
||||
img_id_list.append(paddle.concat(img_id_gather))
|
||||
if has_unique_id:
|
||||
all_unique_id = batch[2]
|
||||
all_image_id = batch[1]
|
||||
paddle.distributed.all_gather(unique_id_gather, batch[2])
|
||||
unique_id_list.append(paddle.concat(unique_id_gather))
|
||||
else:
|
||||
all_feas = paddle.concat([all_feas, batch_feas])
|
||||
all_image_id = paddle.concat([all_image_id, batch[1]])
|
||||
batch_feas_list.append(batch_feas)
|
||||
img_id_list.append(batch[1])
|
||||
if has_unique_id:
|
||||
all_unique_id = paddle.concat([all_unique_id, batch[2]])
|
||||
unique_id_list.append(batch[2])
|
||||
|
||||
if engine.use_dali:
|
||||
dataloader.reset()
|
||||
|
||||
if paddle.distributed.get_world_size() > 1:
|
||||
feat_list = []
|
||||
img_id_list = []
|
||||
unique_id_list = []
|
||||
paddle.distributed.all_gather(feat_list, all_feas)
|
||||
paddle.distributed.all_gather(img_id_list, all_image_id)
|
||||
all_feas = paddle.concat(feat_list, axis=0)
|
||||
all_image_id = paddle.concat(img_id_list, axis=0)
|
||||
if has_unique_id:
|
||||
paddle.distributed.all_gather(unique_id_list, all_unique_id)
|
||||
all_unique_id = paddle.concat(unique_id_list, axis=0)
|
||||
all_feas = paddle.concat(batch_feas_list)
|
||||
all_img_id = paddle.concat(img_id_list)
|
||||
if has_unique_id:
|
||||
all_unique_id = paddle.concat(unique_id_list)
|
||||
|
||||
# just for DistributedBatchSampler issue: repeat sampling
|
||||
total_samples = len(
|
||||
dataloader.dataset) if not engine.use_dali else dataloader.size
|
||||
all_feas = all_feas[:total_samples]
|
||||
all_img_id = all_img_id[:total_samples]
|
||||
if has_unique_id:
|
||||
all_unique_id = all_unique_id[:total_samples]
|
||||
|
||||
logger.info("Build {} done, all feat shape: {}, begin to eval..".format(
|
||||
name, all_feas.shape))
|
||||
return all_feas, all_image_id, all_unique_id
|
||||
return all_feas, all_img_id, all_unique_id
|
||||
|
|
|
@ -20,6 +20,7 @@ class DSHSDLoss(nn.Layer):
|
|||
"""
|
||||
# DSHSD(IEEE ACCESS 2019)
|
||||
# paper [Deep Supervised Hashing Based on Stable Distribution](https://ieeexplore.ieee.org/document/8648432/)
|
||||
# code reference: https://github.com/swuxyj/DeepHash-pytorch/blob/master/DSHSD.py
|
||||
"""
|
||||
|
||||
def __init__(self, alpha, multi_label=False):
|
||||
|
@ -62,6 +63,7 @@ class DSHSDLoss(nn.Layer):
|
|||
class LCDSHLoss(nn.Layer):
|
||||
"""
|
||||
# paper [Locality-Constrained Deep Supervised Hashing for Image Retrieval](https://www.ijcai.org/Proceedings/2017/0499.pdf)
|
||||
# code reference: https://github.com/swuxyj/DeepHash-pytorch/blob/master/LCDSH.py
|
||||
"""
|
||||
|
||||
def __init__(self, n_class, _lambda):
|
||||
|
@ -100,6 +102,7 @@ class DCHLoss(paddle.nn.Layer):
|
|||
"""
|
||||
# paper [Deep Cauchy Hashing for Hamming Space Retrieval]
|
||||
URL:(http://ise.thss.tsinghua.edu.cn/~mlong/doc/deep-cauchy-hashing-cvpr18.pdf)
|
||||
# code reference: https://github.com/swuxyj/DeepHash-pytorch/blob/master/DCH.py
|
||||
"""
|
||||
|
||||
def __init__(self, gamma, _lambda, n_class):
|
||||
|
|
|
@ -23,6 +23,11 @@ from .comfunc import rerange_index
|
|||
|
||||
|
||||
class EmlLoss(paddle.nn.Layer):
|
||||
"""Ensemble Metric Learning Loss
|
||||
paper: [Large Scale Strongly Supervised Ensemble Metric Learning, with Applications to Face Verification and Retrieval](https://arxiv.org/pdf/1212.6094.pdf)
|
||||
code reference: https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/metric_learning/losses/emlloss.py
|
||||
"""
|
||||
|
||||
def __init__(self, batch_size=40, samples_each_class=2):
|
||||
super(EmlLoss, self).__init__()
|
||||
assert (batch_size % samples_each_class == 0)
|
||||
|
|
|
@ -18,11 +18,13 @@ import paddle.nn.functional as F
|
|||
class GoogLeNetLoss(nn.Layer):
|
||||
"""
|
||||
Cross entropy loss used after googlenet
|
||||
reference paper: [https://arxiv.org/pdf/1409.4842v1.pdf](Going Deeper with Convolutions)
|
||||
"""
|
||||
|
||||
def __init__(self, epsilon=None):
|
||||
super().__init__()
|
||||
assert (epsilon is None or epsilon <= 0 or epsilon >= 1), "googlenet is not support label_smooth"
|
||||
|
||||
assert (epsilon is None or epsilon <= 0 or
|
||||
epsilon >= 1), "googlenet is not support label_smooth"
|
||||
|
||||
def forward(self, inputs, label):
|
||||
input0, input1, input2 = inputs
|
||||
|
|
|
@ -21,10 +21,12 @@ from .comfunc import rerange_index
|
|||
|
||||
class MSMLoss(paddle.nn.Layer):
|
||||
"""
|
||||
MSMLoss Loss, based on triplet loss. USE P * K samples.
|
||||
paper : [Margin Sample Mining Loss: A Deep Learning Based Method for Person Re-identification](https://arxiv.org/pdf/1710.00478.pdf)
|
||||
code reference: https://github.com/michuanhaohao/keras_reid/blob/master/reid_tripletcls.py
|
||||
Margin Sample Mining Loss, based on triplet loss. USE P * K samples.
|
||||
the batch size is fixed. Batch_size = P * K; but the K may vary between batches.
|
||||
same label gather together
|
||||
|
||||
|
||||
supported_metrics = [
|
||||
'euclidean',
|
||||
'sqeuclidean',
|
||||
|
@ -41,7 +43,7 @@ class MSMLoss(paddle.nn.Layer):
|
|||
self.rerange_index = rerange_index(batch_size, samples_each_class)
|
||||
|
||||
def forward(self, input, target=None):
|
||||
#normalization
|
||||
#normalization
|
||||
features = input["features"]
|
||||
features = self._nomalize(features)
|
||||
samples_each_class = self.samples_each_class
|
||||
|
@ -53,7 +55,7 @@ class MSMLoss(paddle.nn.Layer):
|
|||
features, axis=0)
|
||||
similary_matrix = paddle.sum(paddle.square(diffs), axis=-1)
|
||||
|
||||
#rerange
|
||||
#rerange
|
||||
tmp = paddle.reshape(similary_matrix, shape=[-1, 1])
|
||||
tmp = paddle.gather(tmp, index=rerange_index)
|
||||
similary_matrix = paddle.reshape(tmp, shape=[-1, self.batch_size])
|
||||
|
|
|
@ -5,6 +5,11 @@ import paddle
|
|||
|
||||
|
||||
class NpairsLoss(paddle.nn.Layer):
|
||||
"""Npair_loss_
|
||||
paper [Improved deep metric learning with multi-class N-pair loss objective](https://dl.acm.org/doi/10.5555/3157096.3157304)
|
||||
code reference: https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/losses/metric_learning/npairs_loss
|
||||
"""
|
||||
|
||||
def __init__(self, reg_lambda=0.01):
|
||||
super(NpairsLoss, self).__init__()
|
||||
self.reg_lambda = reg_lambda
|
||||
|
|
|
@ -23,6 +23,11 @@ import paddle.nn.functional as F
|
|||
|
||||
|
||||
class PairwiseCosface(nn.Layer):
|
||||
"""
|
||||
paper: Circle Loss: A Unified Perspective of Pair Similarity Optimization
|
||||
code reference: https://github.com/leoluopy/circle-loss-demonstration/blob/main/circle_loss.py
|
||||
"""
|
||||
|
||||
def __init__(self, margin, gamma):
|
||||
super(PairwiseCosface, self).__init__()
|
||||
self.margin = margin
|
||||
|
@ -36,8 +41,10 @@ class PairwiseCosface(nn.Layer):
|
|||
dist_mat = paddle.matmul(embedding, embedding, transpose_y=True)
|
||||
|
||||
N = dist_mat.shape[0]
|
||||
is_pos = targets.reshape([N,1]).expand([N,N]).equal(paddle.t(targets.reshape([N,1]).expand([N,N]))).astype('float')
|
||||
is_neg = targets.reshape([N,1]).expand([N,N]).not_equal(paddle.t(targets.reshape([N,1]).expand([N,N]))).astype('float')
|
||||
is_pos = targets.reshape([N, 1]).expand([N, N]).equal(
|
||||
paddle.t(targets.reshape([N, 1]).expand([N, N]))).astype('float')
|
||||
is_neg = targets.reshape([N, 1]).expand([N, N]).not_equal(
|
||||
paddle.t(targets.reshape([N, 1]).expand([N, N]))).astype('float')
|
||||
|
||||
# Mask scores related to itself
|
||||
is_pos = is_pos - paddle.eye(N, N)
|
||||
|
@ -46,10 +53,12 @@ class PairwiseCosface(nn.Layer):
|
|||
s_n = dist_mat * is_neg
|
||||
|
||||
logit_p = -self.gamma * s_p + (-99999999.) * (1 - is_pos)
|
||||
logit_n = self.gamma * (s_n + self.margin) + (-99999999.) * (1 - is_neg)
|
||||
logit_n = self.gamma * (s_n + self.margin) + (-99999999.) * (1 - is_neg
|
||||
)
|
||||
|
||||
loss = F.softplus(
|
||||
paddle.logsumexp(
|
||||
logit_p, axis=1) + paddle.logsumexp(
|
||||
logit_n, axis=1)).mean()
|
||||
|
||||
loss = F.softplus(paddle.logsumexp(logit_p, axis=1) + paddle.logsumexp(logit_n, axis=1)).mean()
|
||||
|
||||
return {"PairwiseCosface": loss}
|
||||
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ def pdist(e, squared=False, eps=1e-12):
|
|||
|
||||
|
||||
class RKdAngle(nn.Layer):
|
||||
# paper : [Relational Knowledge Distillation](https://arxiv.org/abs/1904.05068?context=cs.LG)
|
||||
# reference: https://github.com/lenscloth/RKD/blob/master/metric/loss.py
|
||||
def __init__(self, target_size=None):
|
||||
super().__init__()
|
||||
|
@ -64,6 +65,7 @@ class RKdAngle(nn.Layer):
|
|||
|
||||
|
||||
class RkdDistance(nn.Layer):
|
||||
# paper : [Relational Knowledge Distillation](https://arxiv.org/abs/1904.05068?context=cs.LG)
|
||||
# reference: https://github.com/lenscloth/RKD/blob/master/metric/loss.py
|
||||
def __init__(self, eps=1e-12, target_size=1):
|
||||
super().__init__()
|
||||
|
|
|
@ -4,6 +4,7 @@ from paddle import nn
|
|||
|
||||
class SupConLoss(nn.Layer):
|
||||
"""Supervised Contrastive Learning: https://arxiv.org/pdf/2004.11362.pdf.
|
||||
code reference: https://github.com/HobbitLong/SupContrast/blob/master/losses.py
|
||||
It also supports the unsupervised contrastive loss in SimCLR"""
|
||||
|
||||
def __init__(self,
|
||||
|
|
|
@ -22,10 +22,12 @@ from .comfunc import rerange_index
|
|||
|
||||
class TriHardLoss(paddle.nn.Layer):
|
||||
"""
|
||||
paper: In Defense of the Triplet Loss for Person Re-Identification
|
||||
code reference: https://github.com/VisualComputingInstitute/triplet-reid/blob/master/loss.py
|
||||
TriHard Loss, based on triplet loss. USE P * K samples.
|
||||
the batch size is fixed. Batch_size = P * K; but the K may vary between batches.
|
||||
same label gather together
|
||||
|
||||
|
||||
supported_metrics = [
|
||||
'euclidean',
|
||||
'sqeuclidean',
|
||||
|
@ -45,7 +47,7 @@ class TriHardLoss(paddle.nn.Layer):
|
|||
features = input["features"]
|
||||
assert (self.batch_size == features.shape[0])
|
||||
|
||||
#normalization
|
||||
#normalization
|
||||
features = self._nomalize(features)
|
||||
samples_each_class = self.samples_each_class
|
||||
rerange_index = paddle.to_tensor(self.rerange_index)
|
||||
|
@ -56,7 +58,7 @@ class TriHardLoss(paddle.nn.Layer):
|
|||
features, axis=0)
|
||||
similary_matrix = paddle.sum(paddle.square(diffs), axis=-1)
|
||||
|
||||
#rerange
|
||||
#rerange
|
||||
tmp = paddle.reshape(similary_matrix, shape=[-1, 1])
|
||||
tmp = paddle.gather(tmp, index=rerange_index)
|
||||
similary_matrix = paddle.reshape(tmp, shape=[-1, self.batch_size])
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve.
|
||||
# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -22,6 +22,8 @@ import paddle.nn as nn
|
|||
|
||||
class TripletLossV2(nn.Layer):
|
||||
"""Triplet loss with hard positive/negative mining.
|
||||
paper : [Facenet: A unified embedding for face recognition and clustering](https://arxiv.org/pdf/1503.03832.pdf)
|
||||
code reference: https://github.com/okzhili/Cartoon-face-recognition/blob/master/loss/triplet_loss.py
|
||||
Args:
|
||||
margin (float): margin for triplet.
|
||||
"""
|
||||
|
|
|
@ -120,8 +120,6 @@ def build_optimizer(config, epochs, step_each_epoch, model_list=None):
|
|||
elif hasattr(model_list[i], optim_scope):
|
||||
optim_model.append(getattr(model_list[i], optim_scope))
|
||||
|
||||
assert len(optim_model) == 1, \
|
||||
"Invalid optim model for optim scope({}), number of optim_model={}".format(optim_scope, len(optim_model))
|
||||
optim = getattr(optimizer, optim_name)(
|
||||
learning_rate=lr, grad_clip=grad_clip,
|
||||
**optim_cfg)(model_list=optim_model)
|
||||
|
|
|
@ -13,14 +13,14 @@ train_infer_img_dir:./dataset/ILSVRC2012/val
|
|||
null:null
|
||||
##
|
||||
trainer:norm_train
|
||||
norm_train:tools/train.py -c ppcls/configs/ImageNet/CSWinTransformer/CSWinTransformer_tiny_224.yaml -o Global.seed=1234 -o DataLoader.Train.sampler.shuffle=False -o DataLoader.Train.loader.num_workers=0 -o DataLoader.Train.loader.use_shared_memory=False
|
||||
norm_train:tools/train.py -c ppcls/configs/ImageNet/CSWinTransformer/CSWinTransformer_tiny_224.yaml -o Global.seed=1234 -o DataLoader.Train.sampler.shuffle=False -o DataLoader.Train.loader.num_workers=0 -o DataLoader.Train.loader.use_shared_memory=False -o Global.print_batch_step=1
|
||||
pact_train:null
|
||||
fpgm_train:null
|
||||
distill_train:null
|
||||
null:null
|
||||
null:null
|
||||
##
|
||||
===========================eval_params===========================
|
||||
===========================eval_params===========================
|
||||
eval:tools/eval.py -c ppcls/configs/ImageNet/CSWinTransformer/CSWinTransformer_tiny_224.yaml
|
||||
null:null
|
||||
##
|
||||
|
|
|
@ -13,14 +13,14 @@ train_infer_img_dir:./dataset/ILSVRC2012/val
|
|||
null:null
|
||||
##
|
||||
trainer:norm_train
|
||||
norm_train:tools/train.py -c ppcls/configs/ImageNet/MobileViT/MobileViT_S.yaml -o Global.seed=1234 -o DataLoader.Train.sampler.shuffle=False -o DataLoader.Train.loader.num_workers=0 -o DataLoader.Train.loader.use_shared_memory=False
|
||||
norm_train:tools/train.py -c ppcls/configs/ImageNet/MobileViT/MobileViT_S.yaml -o Global.seed=1234 -o DataLoader.Train.sampler.shuffle=False -o DataLoader.Train.loader.num_workers=0 -o DataLoader.Train.loader.use_shared_memory=False -o Global.print_batch_step=1
|
||||
pact_train:null
|
||||
fpgm_train:null
|
||||
distill_train:null
|
||||
null:null
|
||||
null:null
|
||||
##
|
||||
===========================eval_params===========================
|
||||
===========================eval_params===========================
|
||||
eval:tools/eval.py -c ppcls/configs/ImageNet/MobileViT/MobileViT_S.yaml
|
||||
null:null
|
||||
##
|
||||
|
|
|
@ -13,7 +13,7 @@ train_infer_img_dir:./dataset/ILSVRC2012/val
|
|||
null:null
|
||||
##
|
||||
trainer:norm_train
|
||||
norm_train:tools/train.py -c ppcls/configs/ImageNet/PVTV2/PVT_V2_B2_Linear.yaml -o Global.seed=1234 -o DataLoader.Train.sampler.shuffle=False -o DataLoader.Train.loader.num_workers=0 -o DataLoader.Train.loader.use_shared_memory=False
|
||||
norm_train:tools/train.py -c ppcls/configs/ImageNet/PVTV2/PVT_V2_B2_Linear.yaml -o Global.seed=1234 -o DataLoader.Train.sampler.shuffle=False -o DataLoader.Train.loader.num_workers=0 -o DataLoader.Train.loader.use_shared_memory=False -o Global.print_batch_step=1
|
||||
pact_train:null
|
||||
fpgm_train:null
|
||||
distill_train:null
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/bash
|
||||
FILENAME=$1
|
||||
|
||||
# MODE be one of ['lite_train_lite_infer' 'lite_train_whole_infer' 'whole_train_whole_infer',
|
||||
# MODE be one of ['lite_train_lite_infer' 'lite_train_whole_infer' 'whole_train_whole_infer',
|
||||
# 'whole_infer', 'klquant_whole_infer',
|
||||
# 'cpp_infer', 'serving_infer', 'lite_infer']
|
||||
|
||||
|
@ -67,9 +67,9 @@ if [ ${MODE} = "cpp_infer" ];then
|
|||
model_dir=${tar_name%.*}
|
||||
eval "tar xf ${tar_name}"
|
||||
eval "mv ${model_dir} ${cls_inference_model_dir}"
|
||||
|
||||
|
||||
eval "wget -nc $det_inference_url"
|
||||
tar_name=$(func_get_url_file_name "$det_inference_url")
|
||||
tar_name=$(func_get_url_file_name "$det_inference_url")
|
||||
model_dir=${tar_name%.*}
|
||||
eval "tar xf ${tar_name}"
|
||||
eval "mv ${model_dir} ${det_inference_model_dir}"
|
||||
|
@ -120,7 +120,7 @@ if [ ${MODE} = "lite_train_lite_infer" ] || [ ${MODE} = "lite_train_whole_infer"
|
|||
wget -nc https://paddle-imagenet-models-name.bj.bcebos.com/data/whole_chain/whole_chain_little_train.tar
|
||||
tar xf whole_chain_little_train.tar
|
||||
ln -s whole_chain_little_train ILSVRC2012
|
||||
cd ILSVRC2012
|
||||
cd ILSVRC2012
|
||||
mv train.txt train_list.txt
|
||||
mv val.txt val_list.txt
|
||||
cp -r train/* val/
|
||||
|
@ -132,7 +132,7 @@ elif [ ${MODE} = "whole_infer" ] || [ ${MODE} = "klquant_whole_infer" ];then
|
|||
wget -nc https://paddle-imagenet-models-name.bj.bcebos.com/data/whole_chain/whole_chain_infer.tar
|
||||
tar xf whole_chain_infer.tar
|
||||
ln -s whole_chain_infer ILSVRC2012
|
||||
cd ILSVRC2012
|
||||
cd ILSVRC2012
|
||||
mv val.txt val_list.txt
|
||||
ln -s val_list.txt train_list.txt
|
||||
cd ../../
|
||||
|
@ -153,7 +153,7 @@ elif [ ${MODE} = "whole_train_whole_infer" ];then
|
|||
wget -nc https://paddle-imagenet-models-name.bj.bcebos.com/data/whole_chain/whole_chain_CIFAR100.tar
|
||||
tar xf whole_chain_CIFAR100.tar
|
||||
ln -s whole_chain_CIFAR100 ILSVRC2012
|
||||
cd ILSVRC2012
|
||||
cd ILSVRC2012
|
||||
mv train.txt train_list.txt
|
||||
mv test.txt val_list.txt
|
||||
cd ../../
|
||||
|
|
Loading…
Reference in New Issue