refine code and yaml
parent
661a1909e8
commit
97e8abc3db
|
@ -17,22 +17,32 @@ from __future__ import absolute_import, division, print_function
|
||||||
import paddle
|
import paddle
|
||||||
import paddle.nn as nn
|
import paddle.nn as nn
|
||||||
|
|
||||||
|
from ppcls.arch.utils import get_param_attr_dict
|
||||||
|
|
||||||
|
|
||||||
class BNNeck(nn.Layer):
|
class BNNeck(nn.Layer):
|
||||||
def __init__(self, num_features):
|
def __init__(self, num_features, **kwargs):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
weight_attr = paddle.ParamAttr(
|
weight_attr = paddle.ParamAttr(
|
||||||
initializer=paddle.nn.initializer.Constant(value=1.0))
|
initializer=paddle.nn.initializer.Constant(value=1.0))
|
||||||
bias_attr = paddle.ParamAttr(
|
bias_attr = paddle.ParamAttr(
|
||||||
initializer=paddle.nn.initializer.Constant(value=0.0),
|
initializer=paddle.nn.initializer.Constant(value=0.0),
|
||||||
trainable=False)
|
trainable=False)
|
||||||
|
|
||||||
|
if 'weight_attr' in kwargs:
|
||||||
|
weight_attr = get_param_attr_dict(kwargs['weight_attr'])
|
||||||
|
|
||||||
|
bias_attr = None
|
||||||
|
if 'bias_attr' in kwargs:
|
||||||
|
bias_attr = get_param_attr_dict(kwargs['bias_attr'])
|
||||||
|
|
||||||
self.feat_bn = nn.BatchNorm1D(
|
self.feat_bn = nn.BatchNorm1D(
|
||||||
num_features,
|
num_features,
|
||||||
momentum=0.9,
|
momentum=0.9,
|
||||||
epsilon=1e-05,
|
epsilon=1e-05,
|
||||||
weight_attr=weight_attr,
|
weight_attr=weight_attr,
|
||||||
bias_attr=bias_attr)
|
bias_attr=bias_attr)
|
||||||
# TODO: set bnneck.bias learnable=False
|
|
||||||
self.flatten = nn.Flatten()
|
self.flatten = nn.Flatten()
|
||||||
|
|
||||||
def forward(self, x):
|
def forward(self, x):
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
Global:
|
Global:
|
||||||
checkpoints: null
|
checkpoints: null
|
||||||
pretrained_model: null
|
pretrained_model: null
|
||||||
# pretrained_model: "./pd_model_trace/ISE/ISE_M_model" # pretrained ISE model for Market1501
|
|
||||||
# pretrained_model: "./pd_model_trace/ISE/ISE_MS_model" # pretrained ISE model for MSMT17
|
|
||||||
output_dir: "./output/"
|
output_dir: "./output/"
|
||||||
device: "gpu"
|
device: "gpu"
|
||||||
save_interval: 40
|
save_interval: 40
|
||||||
|
@ -12,10 +10,12 @@ Global:
|
||||||
epochs: 120
|
epochs: 120
|
||||||
print_batch_step: 20
|
print_batch_step: 20
|
||||||
use_visualdl: False
|
use_visualdl: False
|
||||||
|
eval_mode: "retrieval"
|
||||||
|
re_ranking: False
|
||||||
|
feat_from: "backbone" # 'backbone' or 'neck'
|
||||||
# used for static mode and model export
|
# used for static mode and model export
|
||||||
image_shape: [3, 256, 128]
|
image_shape: [3, 256, 128]
|
||||||
save_inference_dir: "./inference"
|
save_inference_dir: "./inference"
|
||||||
eval_mode: "retrieval"
|
|
||||||
|
|
||||||
# model architecture
|
# model architecture
|
||||||
Arch:
|
Arch:
|
||||||
|
@ -32,6 +32,12 @@ Arch:
|
||||||
name: "FC"
|
name: "FC"
|
||||||
embedding_size: 2048
|
embedding_size: 2048
|
||||||
class_num: 751
|
class_num: 751
|
||||||
|
weight_attr:
|
||||||
|
initializer:
|
||||||
|
name: Normal
|
||||||
|
std: 0.001
|
||||||
|
bias_attr: False
|
||||||
|
|
||||||
# loss function config for traing/eval process
|
# loss function config for traing/eval process
|
||||||
Loss:
|
Loss:
|
||||||
Train:
|
Train:
|
||||||
|
@ -63,9 +69,9 @@ Optimizer:
|
||||||
DataLoader:
|
DataLoader:
|
||||||
Train:
|
Train:
|
||||||
dataset:
|
dataset:
|
||||||
name: "VeriWild"
|
name: "Market1501"
|
||||||
image_root: "./dataset/market1501"
|
image_root: "./dataset/"
|
||||||
cls_label_path: "./dataset/market1501/bounding_box_train.txt"
|
cls_label_path: "bounding_box_train"
|
||||||
transform_ops:
|
transform_ops:
|
||||||
- ResizeImage:
|
- ResizeImage:
|
||||||
size: [128, 256]
|
size: [128, 256]
|
||||||
|
@ -88,14 +94,14 @@ DataLoader:
|
||||||
drop_last: True
|
drop_last: True
|
||||||
shuffle: True
|
shuffle: True
|
||||||
loader:
|
loader:
|
||||||
num_workers: 6
|
num_workers: 4
|
||||||
use_shared_memory: True
|
use_shared_memory: True
|
||||||
Eval:
|
Eval:
|
||||||
Query:
|
Query:
|
||||||
dataset:
|
dataset:
|
||||||
name: "VeriWild"
|
name: "Market1501"
|
||||||
image_root: "./dataset/market1501"
|
image_root: "./dataset/"
|
||||||
cls_label_path: "./dataset/market1501/query.txt"
|
cls_label_path: "query"
|
||||||
transform_ops:
|
transform_ops:
|
||||||
- ResizeImage:
|
- ResizeImage:
|
||||||
size: [128, 256]
|
size: [128, 256]
|
||||||
|
@ -109,14 +115,14 @@ DataLoader:
|
||||||
drop_last: False
|
drop_last: False
|
||||||
shuffle: False
|
shuffle: False
|
||||||
loader:
|
loader:
|
||||||
num_workers: 6
|
num_workers: 4
|
||||||
use_shared_memory: True
|
use_shared_memory: True
|
||||||
|
|
||||||
Gallery:
|
Gallery:
|
||||||
dataset:
|
dataset:
|
||||||
name: "VeriWild"
|
name: "Market1501"
|
||||||
image_root: "./dataset/market1501"
|
image_root: "./dataset/"
|
||||||
cls_label_path: "./dataset/market1501/bounding_box_test.txt"
|
cls_label_path: "bounding_box_test"
|
||||||
transform_ops:
|
transform_ops:
|
||||||
- ResizeImage:
|
- ResizeImage:
|
||||||
size: [128, 256]
|
size: [128, 256]
|
||||||
|
@ -130,7 +136,7 @@ DataLoader:
|
||||||
drop_last: False
|
drop_last: False
|
||||||
shuffle: False
|
shuffle: False
|
||||||
loader:
|
loader:
|
||||||
num_workers: 6
|
num_workers: 4
|
||||||
use_shared_memory: True
|
use_shared_memory: True
|
||||||
|
|
||||||
Metric:
|
Metric:
|
||||||
|
|
|
@ -32,11 +32,19 @@ Arch:
|
||||||
Neck:
|
Neck:
|
||||||
name: BNNeck
|
name: BNNeck
|
||||||
num_features: &feat_dim 2048
|
num_features: &feat_dim 2048
|
||||||
# trainable: False # TODO: freeze bn.bias
|
weight_attr:
|
||||||
|
initializer:
|
||||||
|
name: Constant
|
||||||
|
value: 1.0
|
||||||
|
bias_attr:
|
||||||
|
initializer:
|
||||||
|
name: Constant
|
||||||
|
value: 0.0
|
||||||
|
learning_rate: 1.0e-20 # NOTE: Temporarily set lr small enough to freeze the bias
|
||||||
Head:
|
Head:
|
||||||
name: "FC"
|
name: "FC"
|
||||||
embedding_size: *feat_dim
|
embedding_size: *feat_dim
|
||||||
class_num: &class_num 751
|
class_num: 751
|
||||||
weight_attr:
|
weight_attr:
|
||||||
initializer:
|
initializer:
|
||||||
name: Normal
|
name: Normal
|
||||||
|
@ -73,9 +81,9 @@ Optimizer:
|
||||||
DataLoader:
|
DataLoader:
|
||||||
Train:
|
Train:
|
||||||
dataset:
|
dataset:
|
||||||
name: "VeriWild"
|
name: "Market1501"
|
||||||
image_root: "./dataset/market1501"
|
image_root: "./dataset/"
|
||||||
cls_label_path: "./dataset/market1501/bounding_box_train.txt"
|
cls_label_path: "bounding_box_train"
|
||||||
transform_ops:
|
transform_ops:
|
||||||
- DecodeImage:
|
- DecodeImage:
|
||||||
to_rgb: True
|
to_rgb: True
|
||||||
|
@ -108,14 +116,14 @@ DataLoader:
|
||||||
drop_last: True
|
drop_last: True
|
||||||
shuffle: True
|
shuffle: True
|
||||||
loader:
|
loader:
|
||||||
num_workers: 6
|
num_workers: 4
|
||||||
use_shared_memory: True
|
use_shared_memory: True
|
||||||
Eval:
|
Eval:
|
||||||
Query:
|
Query:
|
||||||
dataset:
|
dataset:
|
||||||
name: "VeriWild"
|
name: "Market1501"
|
||||||
image_root: "./dataset/market1501"
|
image_root: "./dataset/"
|
||||||
cls_label_path: "./dataset/market1501/query.txt"
|
cls_label_path: "query"
|
||||||
transform_ops:
|
transform_ops:
|
||||||
- DecodeImage:
|
- DecodeImage:
|
||||||
to_rgb: True
|
to_rgb: True
|
||||||
|
@ -133,14 +141,14 @@ DataLoader:
|
||||||
drop_last: False
|
drop_last: False
|
||||||
shuffle: False
|
shuffle: False
|
||||||
loader:
|
loader:
|
||||||
num_workers: 6
|
num_workers: 4
|
||||||
use_shared_memory: True
|
use_shared_memory: True
|
||||||
|
|
||||||
Gallery:
|
Gallery:
|
||||||
dataset:
|
dataset:
|
||||||
name: "VeriWild"
|
name: "Market1501"
|
||||||
image_root: "./dataset/market1501"
|
image_root: "./dataset/"
|
||||||
cls_label_path: "./dataset/market1501/bounding_box_test.txt"
|
cls_label_path: "bounding_box_test"
|
||||||
transform_ops:
|
transform_ops:
|
||||||
- DecodeImage:
|
- DecodeImage:
|
||||||
to_rgb: True
|
to_rgb: True
|
||||||
|
@ -158,7 +166,7 @@ DataLoader:
|
||||||
drop_last: False
|
drop_last: False
|
||||||
shuffle: False
|
shuffle: False
|
||||||
loader:
|
loader:
|
||||||
num_workers: 6
|
num_workers: 4
|
||||||
use_shared_memory: True
|
use_shared_memory: True
|
||||||
|
|
||||||
Metric:
|
Metric:
|
||||||
|
|
|
@ -25,14 +25,22 @@ Arch:
|
||||||
infer_add_softmax: False
|
infer_add_softmax: False
|
||||||
Backbone:
|
Backbone:
|
||||||
name: "ResNet50_last_stage_stride1"
|
name: "ResNet50_last_stage_stride1"
|
||||||
pretrained: True
|
pretrained: "./dataset/resnet50-19c8e357_for_strong_baseline"
|
||||||
stem_act: null
|
stem_act: null
|
||||||
BackboneStopLayer:
|
BackboneStopLayer:
|
||||||
name: "flatten"
|
name: "flatten"
|
||||||
Neck:
|
Neck:
|
||||||
name: BNNeck
|
name: BNNeck
|
||||||
num_features: &feat_dim 2048
|
num_features: &feat_dim 2048
|
||||||
# trainable: False # TODO: freeze bn.bias
|
weight_attr:
|
||||||
|
initializer:
|
||||||
|
name: Constant
|
||||||
|
value: 1.0
|
||||||
|
bias_attr:
|
||||||
|
initializer:
|
||||||
|
name: Constant
|
||||||
|
value: 0.0
|
||||||
|
learning_rate: 1.0e-20 # TODO: Temporarily set lr small enough to freeze the bias
|
||||||
Head:
|
Head:
|
||||||
name: "FC"
|
name: "FC"
|
||||||
embedding_size: *feat_dim
|
embedding_size: *feat_dim
|
||||||
|
@ -78,7 +86,7 @@ Optimizer:
|
||||||
scope: CenterLoss
|
scope: CenterLoss
|
||||||
lr:
|
lr:
|
||||||
name: Constant
|
name: Constant
|
||||||
learning_rate: 1000.0 # set to ori_lr*(1/centerloss_weight) to void manually scaling centers' gradidents.
|
learning_rate: 1000.0 # NOTE: set to ori_lr*(1/centerloss_weight) to avoid manually scaling centers' gradidents.
|
||||||
|
|
||||||
# data loader for train and eval
|
# data loader for train and eval
|
||||||
DataLoader:
|
DataLoader:
|
||||||
|
|
|
@ -6,9 +6,9 @@ Global:
|
||||||
# pretrained_model: "./pd_model_trace/ISE/ISE_MS_model" # pretrained ISE model for MSMT17
|
# pretrained_model: "./pd_model_trace/ISE/ISE_MS_model" # pretrained ISE model for MSMT17
|
||||||
output_dir: "./output/"
|
output_dir: "./output/"
|
||||||
device: "gpu"
|
device: "gpu"
|
||||||
save_interval: 10
|
save_interval: 1
|
||||||
eval_during_train: True
|
eval_during_train: True
|
||||||
eval_interval: 10
|
eval_interval: 1
|
||||||
epochs: 120
|
epochs: 120
|
||||||
print_batch_step: 10
|
print_batch_step: 10
|
||||||
use_visualdl: False
|
use_visualdl: False
|
||||||
|
@ -25,7 +25,6 @@ Arch:
|
||||||
Backbone:
|
Backbone:
|
||||||
name: "ResNet50_last_stage_stride1"
|
name: "ResNet50_last_stage_stride1"
|
||||||
pretrained: True
|
pretrained: True
|
||||||
stem_act: null
|
|
||||||
BackboneStopLayer:
|
BackboneStopLayer:
|
||||||
name: "avg_pool"
|
name: "avg_pool"
|
||||||
Neck:
|
Neck:
|
||||||
|
@ -115,7 +114,7 @@ DataLoader:
|
||||||
order: ''
|
order: ''
|
||||||
sampler:
|
sampler:
|
||||||
name: DistributedBatchSampler
|
name: DistributedBatchSampler
|
||||||
batch_size: 128
|
batch_size: 64
|
||||||
drop_last: False
|
drop_last: False
|
||||||
shuffle: False
|
shuffle: False
|
||||||
loader:
|
loader:
|
||||||
|
@ -138,7 +137,7 @@ DataLoader:
|
||||||
order: ''
|
order: ''
|
||||||
sampler:
|
sampler:
|
||||||
name: DistributedBatchSampler
|
name: DistributedBatchSampler
|
||||||
batch_size: 128
|
batch_size: 64
|
||||||
drop_last: False
|
drop_last: False
|
||||||
shuffle: False
|
shuffle: False
|
||||||
loader:
|
loader:
|
||||||
|
|
|
@ -299,11 +299,12 @@ class Engine(object):
|
||||||
self.max_iter = len(self.train_dataloader) - 1 if platform.system(
|
self.max_iter = len(self.train_dataloader) - 1 if platform.system(
|
||||||
) == "Windows" else len(self.train_dataloader)
|
) == "Windows" else len(self.train_dataloader)
|
||||||
|
|
||||||
|
# step lr once before first epoch when when Global.warmup_by_epoch=True
|
||||||
if self.config["Global"].get("warmup_by_epoch", False):
|
if self.config["Global"].get("warmup_by_epoch", False):
|
||||||
for i in range(len(self.lr_sch)):
|
for i in range(len(self.lr_sch)):
|
||||||
self.lr_sch[i].step()
|
self.lr_sch[i].step()
|
||||||
logger.info(
|
logger.info(
|
||||||
"lr_sch step once before first epoch, when Global.warmup_by_epoch=True"
|
"lr_sch step once before the first epoch, when Global.warmup_by_epoch=True"
|
||||||
)
|
)
|
||||||
|
|
||||||
for epoch_id in range(best_metric["epoch"] + 1,
|
for epoch_id in range(best_metric["epoch"] + 1,
|
||||||
|
@ -312,6 +313,7 @@ class Engine(object):
|
||||||
# for one epoch train
|
# for one epoch train
|
||||||
self.train_epoch_func(self, epoch_id, print_batch_step)
|
self.train_epoch_func(self, epoch_id, print_batch_step)
|
||||||
|
|
||||||
|
# lr step when Global.warmup_by_epoch=True
|
||||||
if self.config["Global"].get("warmup_by_epoch", False):
|
if self.config["Global"].get("warmup_by_epoch", False):
|
||||||
for i in range(len(self.lr_sch)):
|
for i in range(len(self.lr_sch)):
|
||||||
self.lr_sch[i].step()
|
self.lr_sch[i].step()
|
||||||
|
|
|
@ -53,20 +53,14 @@ def train_epoch(engine, epoch_id, print_batch_step):
|
||||||
out = forward(engine, batch)
|
out = forward(engine, batch)
|
||||||
loss_dict = engine.train_loss_func(out, batch[1])
|
loss_dict = engine.train_loss_func(out, batch[1])
|
||||||
|
|
||||||
# step opt
|
# backward & step opt
|
||||||
if engine.amp:
|
if engine.amp:
|
||||||
scaled = engine.scaler.scale(loss_dict["loss"])
|
scaled = engine.scaler.scale(loss_dict["loss"])
|
||||||
scaled.backward()
|
scaled.backward()
|
||||||
# set BNneck.bias grad to zero
|
|
||||||
engine.model.neck.feat_bn.bias.grad.set_value(
|
|
||||||
paddle.zeros_like(engine.model.neck.feat_bn.bias.grad))
|
|
||||||
for i in range(len(engine.optimizer)):
|
for i in range(len(engine.optimizer)):
|
||||||
engine.scaler.minimize(engine.optimizer[i], scaled)
|
engine.scaler.minimize(engine.optimizer[i], scaled)
|
||||||
else:
|
else:
|
||||||
loss_dict["loss"].backward()
|
loss_dict["loss"].backward()
|
||||||
# set BNneck.bias grad to zero
|
|
||||||
engine.model.neck.feat_bn.bias.grad.set_value(
|
|
||||||
paddle.zeros_like(engine.model.neck.feat_bn.bias.grad))
|
|
||||||
for i in range(len(engine.optimizer)):
|
for i in range(len(engine.optimizer)):
|
||||||
engine.optimizer[i].step()
|
engine.optimizer[i].step()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue