From e55303b553aaf1e2a0699a891176b02e7993bdf5 Mon Sep 17 00:00:00 2001 From: daidaiershidi <1154864382@qq.com> Date: Mon, 17 Jan 2022 09:17:19 +0000 Subject: [PATCH] add bcn model --- .pre-commit-config.yaml | 5 +- .../bcn/bgm/50salads/full/split1.yaml | 75 +++ .../bcn/bgm/50salads/full/split2.yaml | 75 +++ .../bcn/bgm/50salads/full/split3.yaml | 75 +++ .../bcn/bgm/50salads/full/split4.yaml | 75 +++ .../bcn/bgm/50salads/full/split5.yaml | 75 +++ .../bcn/bgm/50salads/resized/split1.yaml | 78 +++ .../bcn/bgm/50salads/resized/split2.yaml | 78 +++ .../bcn/bgm/50salads/resized/split3.yaml | 78 +++ .../bcn/bgm/50salads/resized/split4.yaml | 78 +++ .../bcn/bgm/50salads/resized/split5.yaml | 78 +++ .../bcn/bgm/breakfast/full/split1.yaml | 75 +++ .../bcn/bgm/breakfast/full/split2.yaml | 75 +++ .../bcn/bgm/breakfast/full/split3.yaml | 75 +++ .../bcn/bgm/breakfast/full/split4.yaml | 75 +++ .../bcn/bgm/breakfast/resized/split1.yaml | 78 +++ .../bcn/bgm/breakfast/resized/split2.yaml | 78 +++ .../bcn/bgm/breakfast/resized/split3.yaml | 78 +++ .../bcn/bgm/breakfast/resized/split4.yaml | 78 +++ configs/segmentation/bcn/bgm/example.yaml | 79 +++ .../bcn/bgm/gtea/full/split1.yaml | 76 +++ .../bcn/bgm/gtea/full/split2.yaml | 75 +++ .../bcn/bgm/gtea/full/split3.yaml | 75 +++ .../bcn/bgm/gtea/full/split4.yaml | 75 +++ .../bcn/bgm/gtea/resized/split1.yaml | 78 +++ .../bcn/bgm/gtea/resized/split2.yaml | 78 +++ .../bcn/bgm/gtea/resized/split3.yaml | 78 +++ .../bcn/bgm/gtea/resized/split4.yaml | 78 +++ .../bcn/model/50salads/split1.yaml | 78 +++ .../bcn/model/50salads/split2.yaml | 78 +++ .../bcn/model/50salads/split3.yaml | 78 +++ .../bcn/model/50salads/split4.yaml | 78 +++ .../bcn/model/50salads/split5.yaml | 78 +++ .../bcn/model/breakfast/split1.yaml | 79 +++ .../bcn/model/breakfast/split2.yaml | 79 +++ .../bcn/model/breakfast/split3.yaml | 79 +++ .../bcn/model/breakfast/split4.yaml | 79 +++ configs/segmentation/bcn/model/example.yaml | 79 +++ .../segmentation/bcn/model/gtea/split1.yaml | 82 +++ .../segmentation/bcn/model/gtea/split2.yaml | 79 +++ .../segmentation/bcn/model/gtea/split3.yaml | 79 +++ .../segmentation/bcn/model/gtea/split4.yaml | 86 +++ docs/en/dataset/SegmentationDataset.md | 35 ++ .../Temporal_action_segmentation.md | 19 + docs/en/model_zoo/segmentation/bcn.md | 160 ++++++ docs/images/bcn.png | Bin 0 -> 228533 bytes docs/images/bcn_error.png | Bin 0 -> 327932 bytes docs/zh-CN/dataset/SegmentationDataset.md | 35 ++ .../Temporal_action_segmentation.md | 19 + docs/zh-CN/model_zoo/segmentation/bcn.md | 158 ++++++ paddlevideo/loader/dataset/__init__.py | 3 +- paddlevideo/loader/dataset/bcn_dataset.py | 360 ++++++++++++ paddlevideo/loader/pipelines/__init__.py | 4 +- paddlevideo/loader/pipelines/bcn_pipeline.py | 135 +++++ paddlevideo/metrics/__init__.py | 3 +- paddlevideo/metrics/bcn_metric.py | 386 +++++++++++++ paddlevideo/modeling/backbones/__init__.py | 4 +- paddlevideo/modeling/backbones/bcn.py | 527 ++++++++++++++++++ paddlevideo/modeling/builder.py | 10 +- paddlevideo/modeling/framework/__init__.py | 3 +- .../modeling/framework/segmenters/__init__.py | 16 + .../modeling/framework/segmenters/base.py | 97 ++++ .../modeling/framework/segmenters/bcn.py | 290 ++++++++++ paddlevideo/modeling/heads/__init__.py | 4 +- paddlevideo/modeling/heads/bcn_head.py | 109 ++++ paddlevideo/modeling/losses/__init__.py | 3 +- paddlevideo/modeling/losses/bcn_loss.py | 131 +++++ paddlevideo/modeling/registry.py | 1 + paddlevideo/solver/custom_lr.py | 30 +- paddlevideo/tasks/train.py | 91 ++- tools/export_model.py | 6 + tools/summary.py | 4 +- tools/utils.py | 224 ++++++++ 73 files changed, 6017 insertions(+), 35 deletions(-) create mode 100644 configs/segmentation/bcn/bgm/50salads/full/split1.yaml create mode 100644 configs/segmentation/bcn/bgm/50salads/full/split2.yaml create mode 100644 configs/segmentation/bcn/bgm/50salads/full/split3.yaml create mode 100644 configs/segmentation/bcn/bgm/50salads/full/split4.yaml create mode 100644 configs/segmentation/bcn/bgm/50salads/full/split5.yaml create mode 100644 configs/segmentation/bcn/bgm/50salads/resized/split1.yaml create mode 100644 configs/segmentation/bcn/bgm/50salads/resized/split2.yaml create mode 100644 configs/segmentation/bcn/bgm/50salads/resized/split3.yaml create mode 100644 configs/segmentation/bcn/bgm/50salads/resized/split4.yaml create mode 100644 configs/segmentation/bcn/bgm/50salads/resized/split5.yaml create mode 100644 configs/segmentation/bcn/bgm/breakfast/full/split1.yaml create mode 100644 configs/segmentation/bcn/bgm/breakfast/full/split2.yaml create mode 100644 configs/segmentation/bcn/bgm/breakfast/full/split3.yaml create mode 100644 configs/segmentation/bcn/bgm/breakfast/full/split4.yaml create mode 100644 configs/segmentation/bcn/bgm/breakfast/resized/split1.yaml create mode 100644 configs/segmentation/bcn/bgm/breakfast/resized/split2.yaml create mode 100644 configs/segmentation/bcn/bgm/breakfast/resized/split3.yaml create mode 100644 configs/segmentation/bcn/bgm/breakfast/resized/split4.yaml create mode 100644 configs/segmentation/bcn/bgm/example.yaml create mode 100644 configs/segmentation/bcn/bgm/gtea/full/split1.yaml create mode 100644 configs/segmentation/bcn/bgm/gtea/full/split2.yaml create mode 100644 configs/segmentation/bcn/bgm/gtea/full/split3.yaml create mode 100644 configs/segmentation/bcn/bgm/gtea/full/split4.yaml create mode 100644 configs/segmentation/bcn/bgm/gtea/resized/split1.yaml create mode 100644 configs/segmentation/bcn/bgm/gtea/resized/split2.yaml create mode 100644 configs/segmentation/bcn/bgm/gtea/resized/split3.yaml create mode 100644 configs/segmentation/bcn/bgm/gtea/resized/split4.yaml create mode 100644 configs/segmentation/bcn/model/50salads/split1.yaml create mode 100644 configs/segmentation/bcn/model/50salads/split2.yaml create mode 100644 configs/segmentation/bcn/model/50salads/split3.yaml create mode 100644 configs/segmentation/bcn/model/50salads/split4.yaml create mode 100644 configs/segmentation/bcn/model/50salads/split5.yaml create mode 100644 configs/segmentation/bcn/model/breakfast/split1.yaml create mode 100644 configs/segmentation/bcn/model/breakfast/split2.yaml create mode 100644 configs/segmentation/bcn/model/breakfast/split3.yaml create mode 100644 configs/segmentation/bcn/model/breakfast/split4.yaml create mode 100644 configs/segmentation/bcn/model/example.yaml create mode 100644 configs/segmentation/bcn/model/gtea/split1.yaml create mode 100644 configs/segmentation/bcn/model/gtea/split2.yaml create mode 100644 configs/segmentation/bcn/model/gtea/split3.yaml create mode 100644 configs/segmentation/bcn/model/gtea/split4.yaml create mode 100644 docs/en/dataset/SegmentationDataset.md create mode 100644 docs/en/model_zoo/segmentation/Temporal_action_segmentation.md create mode 100644 docs/en/model_zoo/segmentation/bcn.md create mode 100644 docs/images/bcn.png create mode 100644 docs/images/bcn_error.png create mode 100644 docs/zh-CN/dataset/SegmentationDataset.md create mode 100644 docs/zh-CN/model_zoo/segmentation/Temporal_action_segmentation.md create mode 100644 docs/zh-CN/model_zoo/segmentation/bcn.md create mode 100644 paddlevideo/loader/dataset/bcn_dataset.py create mode 100644 paddlevideo/loader/pipelines/bcn_pipeline.py create mode 100644 paddlevideo/metrics/bcn_metric.py create mode 100644 paddlevideo/modeling/backbones/bcn.py create mode 100644 paddlevideo/modeling/framework/segmenters/__init__.py create mode 100644 paddlevideo/modeling/framework/segmenters/base.py create mode 100644 paddlevideo/modeling/framework/segmenters/bcn.py create mode 100644 paddlevideo/modeling/heads/bcn_head.py create mode 100644 paddlevideo/modeling/losses/bcn_loss.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a8e5812e8..779867bde 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,14 +1,15 @@ +repos: - repo: local hooks: - id: yapf name: yapf - entry: yapf + entry: bash -c 'yapf "$@"; git add -u' -- language: system args: [-i, --style .style.yapf] files: \.py$ - repo: https://github.com/pre-commit/pre-commit-hooks - sha: a11d9314b22d8f8c7556443875b731ef05965464 + rev: a11d9314b22d8f8c7556443875b731ef05965464 hooks: - id: check-merge-conflict - id: check-symlinks diff --git a/configs/segmentation/bcn/bgm/50salads/full/split1.yaml b/configs/segmentation/bcn/bgm/50salads/full/split1.yaml new file mode 100644 index 000000000..2fdd7160b --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/full/split1.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: True + test_mode: "more" + results_path: "./output/BCN/50salads/split1/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split1.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split1.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split1.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + +output_dir: "./output/BCN/50salads/split1/BcnBgmFull/" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 +model_name: "BcnBgmFull" diff --git a/configs/segmentation/bcn/bgm/50salads/full/split2.yaml b/configs/segmentation/bcn/bgm/50salads/full/split2.yaml new file mode 100644 index 000000000..414603150 --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/full/split2.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: True + test_mode: "more" + results_path: "./output/BCN/50salads/split2/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split2.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split2.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split2.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + +output_dir: "./output/BCN/50salads/split2/BcnBgmFull/" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 +model_name: "BcnBgmFull" diff --git a/configs/segmentation/bcn/bgm/50salads/full/split3.yaml b/configs/segmentation/bcn/bgm/50salads/full/split3.yaml new file mode 100644 index 000000000..d436ff5c2 --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/full/split3.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: True + test_mode: "more" + results_path: "./output/BCN/50salads/split3/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split3.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split3.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split3.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + +output_dir: "./output/BCN/50salads/split3/BcnBgmFull/" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 +model_name: "BcnBgmFull" diff --git a/configs/segmentation/bcn/bgm/50salads/full/split4.yaml b/configs/segmentation/bcn/bgm/50salads/full/split4.yaml new file mode 100644 index 000000000..937788a00 --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/full/split4.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: True + test_mode: "more" + results_path: "./output/BCN/50salads/split4/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split4.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split4.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split4.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + +output_dir: "./output/BCN/50salads/split4/BcnBgmFull/" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 +model_name: "BcnBgmFull" diff --git a/configs/segmentation/bcn/bgm/50salads/full/split5.yaml b/configs/segmentation/bcn/bgm/50salads/full/split5.yaml new file mode 100644 index 000000000..75366068c --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/full/split5.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: True + test_mode: "more" + results_path: "./output/BCN/50salads/split5/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split5.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split5.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split5.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + +output_dir: "./output/BCN/50salads/split5/BcnBgmFull/" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 +model_name: "BcnBgmFull" diff --git a/configs/segmentation/bcn/bgm/50salads/resized/split1.yaml b/configs/segmentation/bcn/bgm/50salads/resized/split1.yaml new file mode 100644 index 000000000..23d79c7a4 --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/resized/split1.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: False + test_mode: "more" + results_path: "./output/BCN/50salads/split1/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split1.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split1.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split1.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + mode: 'more' + temporal_dim: 400 + dataset: '50salads' + +output_dir: "./output/BCN/50salads/split1/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/50salads/resized/split2.yaml b/configs/segmentation/bcn/bgm/50salads/resized/split2.yaml new file mode 100644 index 000000000..5e799fec3 --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/resized/split2.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: False + test_mode: "more" + results_path: "./output/BCN/50salads/split2/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split2.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split2.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split2.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + mode: 'more' + temporal_dim: 400 + dataset: '50salads' + +output_dir: "./output/BCN/50salads/split2/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/50salads/resized/split3.yaml b/configs/segmentation/bcn/bgm/50salads/resized/split3.yaml new file mode 100644 index 000000000..b7353f6ec --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/resized/split3.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: False + test_mode: "more" + results_path: "./output/BCN/50salads/split3/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split3.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split3.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split3.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + mode: 'more' + temporal_dim: 400 + dataset: '50salads' + +output_dir: "./output/BCN/50salads/split3/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/50salads/resized/split4.yaml b/configs/segmentation/bcn/bgm/50salads/resized/split4.yaml new file mode 100644 index 000000000..00cf83a65 --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/resized/split4.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: False + test_mode: "more" + results_path: "./output/BCN/50salads/split4/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split4.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split4.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split4.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + mode: 'more' + temporal_dim: 400 + dataset: '50salads' + +output_dir: "./output/BCN/50salads/split4/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/50salads/resized/split5.yaml b/configs/segmentation/bcn/bgm/50salads/resized/split5.yaml new file mode 100644 index 000000000..c7ce9dd8b --- /dev/null +++ b/configs/segmentation/bcn/bgm/50salads/resized/split5.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "50salads" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "50salads" + use_full: False + test_mode: "more" + results_path: "./output/BCN/50salads/split5/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/train.split5.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split5.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/50salads/splits/test.split5.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [100, 200] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 2 + result_path: './inference/' + mode: 'more' + temporal_dim: 400 + dataset: '50salads' + +output_dir: "./output/BCN/50salads/split5/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 300 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/breakfast/full/split1.yaml b/configs/segmentation/bcn/bgm/breakfast/full/split1.yaml new file mode 100644 index 000000000..b2c34251a --- /dev/null +++ b/configs/segmentation/bcn/bgm/breakfast/full/split1.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "breakfast" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "breakfast" + use_full: True + test_mode: "more" + results_path: "./output/BCN/breakfast/split1/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/train.split1.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split1.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split1.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + +output_dir: "./output/BCN/breakfast/split1/BcnBgmFull/" +model_name: "BcnBgmFull" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/breakfast/full/split2.yaml b/configs/segmentation/bcn/bgm/breakfast/full/split2.yaml new file mode 100644 index 000000000..cfb1b39bb --- /dev/null +++ b/configs/segmentation/bcn/bgm/breakfast/full/split2.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "breakfast" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "breakfast" + use_full: True + test_mode: "more" + results_path: "./output/BCN/breakfast/split2/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/train.split2.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split2.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split2.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + +output_dir: "./output/BCN/breakfast/split2/BcnBgmFull/" +model_name: "BcnBgmFull" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/breakfast/full/split3.yaml b/configs/segmentation/bcn/bgm/breakfast/full/split3.yaml new file mode 100644 index 000000000..67a23c4e4 --- /dev/null +++ b/configs/segmentation/bcn/bgm/breakfast/full/split3.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "breakfast" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "breakfast" + use_full: True + test_mode: "more" + results_path: "./output/BCN/breakfast/split3/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/train.split3.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split3.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split3.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + +output_dir: "./output/BCN/breakfast/split3/BcnBgmFull/" +model_name: "BcnBgmFull" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/breakfast/full/split4.yaml b/configs/segmentation/bcn/bgm/breakfast/full/split4.yaml new file mode 100644 index 000000000..9a6574fac --- /dev/null +++ b/configs/segmentation/bcn/bgm/breakfast/full/split4.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "breakfast" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "breakfast" + use_full: True + test_mode: "more" + results_path: "./output/BCN/breakfast/split4/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/train.split4.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split4.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split4.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + +output_dir: "./output/BCN/breakfast/split4/BcnBgmFull/" +model_name: "BcnBgmFull" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/breakfast/resized/split1.yaml b/configs/segmentation/bcn/bgm/breakfast/resized/split1.yaml new file mode 100644 index 000000000..ac030d7f7 --- /dev/null +++ b/configs/segmentation/bcn/bgm/breakfast/resized/split1.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "breakfast" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "breakfast" + use_full: False + test_mode: "more" + results_path: "./output/BCN/breakfast/split1/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/train.split1.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split1.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split1.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + mode: 'more' + temporal_dim: 300 + dataset: 'breakfast' + +output_dir: "./output/BCN/breakfast/split1/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/breakfast/resized/split2.yaml b/configs/segmentation/bcn/bgm/breakfast/resized/split2.yaml new file mode 100644 index 000000000..01e03d16e --- /dev/null +++ b/configs/segmentation/bcn/bgm/breakfast/resized/split2.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "breakfast" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "breakfast" + use_full: False + test_mode: "more" + results_path: "./output/BCN/breakfast/split2/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/train.split2.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split2.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split2.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + mode: 'more' + temporal_dim: 300 + dataset: 'breakfast' + +output_dir: "./output/BCN/breakfast/split2/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/breakfast/resized/split3.yaml b/configs/segmentation/bcn/bgm/breakfast/resized/split3.yaml new file mode 100644 index 000000000..8a10f571e --- /dev/null +++ b/configs/segmentation/bcn/bgm/breakfast/resized/split3.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "breakfast" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "breakfast" + use_full: False + test_mode: "more" + results_path: "./output/BCN/breakfast/split3/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/train.split3.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split3.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split3.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + mode: 'more' + temporal_dim: 300 + dataset: 'breakfast' + +output_dir: "./output/BCN/breakfast/split3/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/breakfast/resized/split4.yaml b/configs/segmentation/bcn/bgm/breakfast/resized/split4.yaml new file mode 100644 index 000000000..45392c364 --- /dev/null +++ b/configs/segmentation/bcn/bgm/breakfast/resized/split4.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "breakfast" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "breakfast" + use_full: False + test_mode: "more" + results_path: "./output/BCN/breakfast/split4/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/train.split4.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split4.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/breakfast/splits/test.split4.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + mode: 'more' + temporal_dim: 300 + dataset: 'breakfast' + +output_dir: "./output/BCN/breakfast/split4/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/example.yaml b/configs/segmentation/bcn/bgm/example.yaml new file mode 100644 index 000000000..c245517f7 --- /dev/null +++ b/configs/segmentation/bcn/bgm/example.yaml @@ -0,0 +1,79 @@ +# BCN-bgm parameter +MODEL: #MODEL field + framework: "BcnBgm" #Mandatory, indicate the type of network, associate to the 'paddlevideo/modeling/framework/'. + backbone: + name: "BcnBgm" #Mandatory, indicate the type of backbone, associate to the 'paddlevideo/modeling/backbones/'. + dataset: "50salads" #Optional [50salads, gtea, breakfast], indicate the type of dataset, associate to the 'paddlevidel/data'. + use_full: True #Optional [True, False], use the full model or resized model. + loss: + name: "BcnBgmLoss" #Mandatory, indicate the type of loss, associate to the 'paddlevideo/modeling/losses/'. + head: + name: "BcnBgmHead" #Mandatory, indicate the type of loss, associate to the 'paddlevideo/modeling/heads/'. + dataset: "50salads" #Optional [50salads, gtea, breakfast], indicate the type of dataset, associate to the 'paddlevidel/data'. + use_full: True #Mandatory [True, False], use the full model or resized model. + test_mode: "more" #Optional [more, less], how to calculate the results of the test set. + results_path: "./output/BCN/50salads/split1/BcnBgmResized/results" #Optional, the path to save the segmentation result, like "./output/BCN/[gtea, 50salads, breakfast]/[split1, split2...]/[BcnBgmFull, BcnBgmResized]/results". + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Mandatory, valid batch size per gpu. + test_batch_size: 1 #Mandatory, test batch size per gpu. + num_workers: 4 #Optional, the number of subprocess on each GPU. + train: + format: 'BcnBgmDataset' #Mandatory, indicate the type of dataset, associate to the 'paddlevidel/loader/dateset'. + file_path: "./data/50salads/splits/train.split1.bundle" #Optional, choose split + use_full: True #Optional [True, False], use the full model or resized model. + bd_ratio: 0.05 #Mandatory + valid: + format: 'BcnBgmDataset' #Mandatory, indicate the type of dataset, associate to the 'paddlevidel/loader/dateset'. + file_path: "./data/50salads/splits/train.split1.bundle" #Optional, choose split + use_full: True #Optional [True, False], use the full model or resized model. + bd_ratio: 0.05 #Mandatory + test: + format: 'BcnBgmDataset' #Mandatory, indicate the type of dataset, associate to the 'paddlevidel/loader/dateset'. + file_path: "./data/50salads/splits/train.split1.bundle" #Optional, choose split + use_full: True #Optional [True, False], use the full model or resized model. + bd_ratio: 0.05 #Mandatory + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "GetBcnBgmTrainLabel" #Mandatory, processing raw label. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "GetBcnBgmTrainLabel" #Mandatory, processing raw label. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "GetBcnBgmTrainLabel" #Mandatory, processing raw label. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' #Mandatory, the type of optimizer, please to the 'paddlevideo/solver/' + learning_rate: #Optional, the type of learning rate scheduler, please refer to the 'paddlevideo/solver/' + name: 'CustomMultiStepDecay' + learning_rate: 0.001 #Optional, the initial learning rate. + milestones: [100, 200] #Optional, milestones=[int(epochs / 3), int(2 * epochs / 3)] in bcn-bgm model. + gamma: 0.3 #Optional, attenuation coefficient. + weight_decay: #Optional, regularization. + name: 'L2' + value: 0.0001 + +METRIC: + name: 'BcnBgmMetric' #Mandatory, the type of optimizer, please to the 'paddlevideo/metrics' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' #Optional, the type of inference_helper, please to the 'tools/utils.py' + num_channels: 2048 #Mandatory, the number of in channel + sample_rate: 1 #Optional, sample_rate for feature + result_path: './inference/' #Optional, the path to save + mode: 'more' #Optional [more, less], how to calculate the results of the test set, only use in resized + temporal_dim: 300 #Optional, only use in resized + dataset: "50salads" #Optional [50salads, gtea, breakfast], indicate the type of dataset, associate to the 'paddlevidel/data', only use in resized + +output_dir: "./output/BCN/50salads/split1/BcnBgmResized/" #Optional, like "./output/BCN/[gtea, 50salads, breakfast]/[split1, split2...]/[BcnBgmFull, BcnBgmResized]/results". +model_name: "BcnBgmFull" #Optional, model name like [BcnBgmFull, BcnBgmResized]. +log_interval: 2000 #Optional, the interval of logger. +epochs: 300 #Optional, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 #Optional, the interval of save. diff --git a/configs/segmentation/bcn/bgm/gtea/full/split1.yaml b/configs/segmentation/bcn/bgm/gtea/full/split1.yaml new file mode 100644 index 000000000..b630248ea --- /dev/null +++ b/configs/segmentation/bcn/bgm/gtea/full/split1.yaml @@ -0,0 +1,76 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "gtea" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "gtea" + use_full: True + test_mode: "more" + results_path: "./output/BCN/gtea/split1/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/train.split1.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split1.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split1.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0002 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + + +output_dir: "./output/BCN/gtea/split1/BcnBgmFull/" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 +model_name: 'BcnBgmFull' diff --git a/configs/segmentation/bcn/bgm/gtea/full/split2.yaml b/configs/segmentation/bcn/bgm/gtea/full/split2.yaml new file mode 100644 index 000000000..6bd9a8ea6 --- /dev/null +++ b/configs/segmentation/bcn/bgm/gtea/full/split2.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "gtea" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "gtea" + use_full: True + test_mode: "more" + results_path: "./output/BCN/gtea/split2/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/train.split2.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split2.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split2.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0002 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + +output_dir: "./output/BCN/gtea/split2/BcnBgmFull/" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 +model_name: 'BcnBgmFull' diff --git a/configs/segmentation/bcn/bgm/gtea/full/split3.yaml b/configs/segmentation/bcn/bgm/gtea/full/split3.yaml new file mode 100644 index 000000000..e07511887 --- /dev/null +++ b/configs/segmentation/bcn/bgm/gtea/full/split3.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "gtea" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "gtea" + use_full: True + test_mode: "more" + results_path: "./output/BCN/gtea/split3/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/train.split3.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split3.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split3.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0002 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + +output_dir: "./output/BCN/gtea/split3/BcnBgmFull/" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 +model_name: 'BcnBgmFull' diff --git a/configs/segmentation/bcn/bgm/gtea/full/split4.yaml b/configs/segmentation/bcn/bgm/gtea/full/split4.yaml new file mode 100644 index 000000000..6883dd558 --- /dev/null +++ b/configs/segmentation/bcn/bgm/gtea/full/split4.yaml @@ -0,0 +1,75 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "gtea" + use_full: True + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "gtea" + use_full: True + test_mode: "more" + results_path: "./output/BCN/gtea/split4/BcnBgmFull/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/train.split4.bundle" + use_full: True + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split4.bundle" + use_full: True + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split4.bundle" + use_full: True + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0002 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmFull_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + +output_dir: "./output/BCN/gtea/split4/BcnBgmFull/" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 +model_name: 'BcnBgmFull' diff --git a/configs/segmentation/bcn/bgm/gtea/resized/split1.yaml b/configs/segmentation/bcn/bgm/gtea/resized/split1.yaml new file mode 100644 index 000000000..e56b7d28e --- /dev/null +++ b/configs/segmentation/bcn/bgm/gtea/resized/split1.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "gtea" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "gtea" + use_full: False + test_mode: "more" + results_path: "./output/BCN/gtea/split1/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/train.split1.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split1.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split1.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0002 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + mode: 'more' + temporal_dim: 300 + dataset: 'gtea' + +output_dir: "./output/BCN/gtea/split1/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/gtea/resized/split2.yaml b/configs/segmentation/bcn/bgm/gtea/resized/split2.yaml new file mode 100644 index 000000000..b6cbaf1fa --- /dev/null +++ b/configs/segmentation/bcn/bgm/gtea/resized/split2.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "gtea" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "gtea" + use_full: False + test_mode: "more" + results_path: "./output/BCN/gtea/split2/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/train.split2.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split2.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split2.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0002 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + mode: 'more' + temporal_dim: 300 + dataset: 'gtea' + +output_dir: "./output/BCN/gtea/split2/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/gtea/resized/split3.yaml b/configs/segmentation/bcn/bgm/gtea/resized/split3.yaml new file mode 100644 index 000000000..404806b1d --- /dev/null +++ b/configs/segmentation/bcn/bgm/gtea/resized/split3.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "gtea" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "gtea" + use_full: False + test_mode: "more" + results_path: "./output/BCN/gtea/split3/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/train.split3.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split3.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split3.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0002 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + mode: 'more' + temporal_dim: 300 + dataset: 'gtea' + +output_dir: "./output/BCN/gtea/split3/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/bgm/gtea/resized/split4.yaml b/configs/segmentation/bcn/bgm/gtea/resized/split4.yaml new file mode 100644 index 000000000..40d5fd8b6 --- /dev/null +++ b/configs/segmentation/bcn/bgm/gtea/resized/split4.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnBgm" + backbone: + name: "BcnBgm" + dataset: "gtea" + use_full: False + loss: + name: "BcnBgmLoss" + head: + name: "BcnBgmHead" + dataset: "gtea" + use_full: False + test_mode: "more" + results_path: "./output/BCN/gtea/split4/BcnBgmResized/results" + +DATASET: #DATASET field + batch_size: 1 + valid_batch_size: 1 + test_batch_size: 1 + num_workers: 4 + train: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/train.split4.bundle" + use_full: False + bd_ratio: 0.05 + valid: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split4.bundle" + use_full: False + bd_ratio: 0.05 + test: + format: 'BcnBgmDataset' + file_path: "./data/gtea/splits/test.split4.bundle" + use_full: False + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: + decode: + name: "GetBcnBgmTrainLabel" + + valid: + decode: + name: "GetBcnBgmTrainLabel" + + test: + decode: + name: "GetBcnBgmTrainLabel" + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + name: 'CustomMultiStepDecay' + learning_rate: 0.0002 + milestones: [32, 65] + gamma: 0.3 + weight_decay: + name: 'L2' + value: 0.0001 + +METRIC: #METRIC field + name: 'BcnBgmMetric' + +INFERENCE: + name: 'BcnBgmResized_Inference_helper' + num_channels: 2048 + sample_rate: 1 + result_path: './inference/' + mode: 'more' + temporal_dim: 300 + dataset: 'gtea' + +output_dir: "./output/BCN/gtea/split4/BcnBgmResized/" +model_name: "BcnBgmResized" +log_interval: 2000 +epochs: 100 +log_level: "DEBUG" +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/50salads/split1.yaml b/configs/segmentation/bcn/model/50salads/split1.yaml new file mode 100644 index 000000000..0d6d769d8 --- /dev/null +++ b/configs/segmentation/bcn/model/50salads/split1.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/50salads/splits/train.split1.bundle" + bgm_result_path: "./output/BCN/50salads/split1/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/50salads/split1/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True + num_post: 4 + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 + num_layers: 12 + num_f_maps: 256 + dim: 2048 + num_classes: 19 + dataset: "50salads" + use_lbp: True + num_soft_lbp: 1 + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/train.split1.bundle" + bd_ratio: 0.05 + valid: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split1.bundle" + bd_ratio: 0.05 + test: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split1.bundle" + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [30] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [30] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/50salads/mapping.txt" + log_path: "./output/BCN/50salads/split1/BcnModel/metric.csv" + dataset: "50salads" + +output_dir: "./output/BCN/50salads/split1/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 20 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/50salads/split2.yaml b/configs/segmentation/bcn/model/50salads/split2.yaml new file mode 100644 index 000000000..8ec39ce39 --- /dev/null +++ b/configs/segmentation/bcn/model/50salads/split2.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/50salads/splits/train.split2.bundle" + bgm_result_path: "./output/BCN/50salads/split2/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/50salads/split2/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True + num_post: 4 + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 + num_layers: 12 + num_f_maps: 256 + dim: 2048 + num_classes: 19 + dataset: "50salads" + use_lbp: True + num_soft_lbp: 1 + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/train.split2.bundle" + bd_ratio: 0.05 + valid: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split2.bundle" + bd_ratio: 0.05 + test: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split2.bundle" + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [30] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [30] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/50salads/mapping.txt" + log_path: "./output/BCN/50salads/split2/BcnModel/metric.csv" + dataset: "50salads" + +output_dir: "./output/BCN/50salads/split2/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 20 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/50salads/split3.yaml b/configs/segmentation/bcn/model/50salads/split3.yaml new file mode 100644 index 000000000..0964dccca --- /dev/null +++ b/configs/segmentation/bcn/model/50salads/split3.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/50salads/splits/train.split3.bundle" + bgm_result_path: "./output/BCN/50salads/split3/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/50salads/split3/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True + num_post: 4 + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 + num_layers: 12 + num_f_maps: 256 + dim: 2048 + num_classes: 19 + dataset: "50salads" + use_lbp: True + num_soft_lbp: 1 + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/train.split3.bundle" + bd_ratio: 0.05 + valid: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split3.bundle" + bd_ratio: 0.05 + test: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split3.bundle" + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [30] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [30] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/50salads/mapping.txt" + log_path: "./output/BCN/50salads/split3/BcnModel/metric.csv" + dataset: "50salads" + +output_dir: "./output/BCN/50salads/split3/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 20 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/50salads/split4.yaml b/configs/segmentation/bcn/model/50salads/split4.yaml new file mode 100644 index 000000000..424195da5 --- /dev/null +++ b/configs/segmentation/bcn/model/50salads/split4.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/50salads/splits/train.split4.bundle" + bgm_result_path: "./output/BCN/50salads/split4/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/50salads/split4/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True + num_post: 4 + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 + num_layers: 12 + num_f_maps: 256 + dim: 2048 + num_classes: 19 + dataset: "50salads" + use_lbp: True + num_soft_lbp: 1 + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/train.split4.bundle" + bd_ratio: 0.05 + valid: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split4.bundle" + bd_ratio: 0.05 + test: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split4.bundle" + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [30] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [30] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/50salads/mapping.txt" + log_path: "./output/BCN/50salads/split4/BcnModel/metric.csv" + dataset: "50salads" + +output_dir: "./output/BCN/50salads/split4/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 20 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/50salads/split5.yaml b/configs/segmentation/bcn/model/50salads/split5.yaml new file mode 100644 index 000000000..e8fe34d61 --- /dev/null +++ b/configs/segmentation/bcn/model/50salads/split5.yaml @@ -0,0 +1,78 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/50salads/splits/train.split5.bundle" + bgm_result_path: "./output/BCN/50salads/split5/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/50salads/split5/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True + num_post: 4 + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 + num_layers: 12 + num_f_maps: 256 + dim: 2048 + num_classes: 19 + dataset: "50salads" + use_lbp: True + num_soft_lbp: 1 + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/train.split5.bundle" + bd_ratio: 0.05 + valid: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split5.bundle" + bd_ratio: 0.05 + test: + format: 'BcnModelDataset' + file_path: "./data/50salads/splits/test.split5.bundle" + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' + learning_rate: 0.001 + milestones: [30] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' + learning_rate: 0.0001 + milestones: [30] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/50salads/mapping.txt" + log_path: "./output/BCN/50salads/split5/BcnModel/metric.csv" + dataset: "50salads" + +output_dir: "./output/BCN/50salads/split5/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 20 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/breakfast/split1.yaml b/configs/segmentation/bcn/model/breakfast/split1.yaml new file mode 100644 index 000000000..a3f4b523c --- /dev/null +++ b/configs/segmentation/bcn/model/breakfast/split1.yaml @@ -0,0 +1,79 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/breakfast/splits/train.split1.bundle" + bgm_result_path: "./output/BCN/breakfast/split1/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/breakfast/split1/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True + num_post: 4 + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 + num_layers: 12 + num_f_maps: 256 + dim: 2048 + num_classes: 48 + dataset: "breakfast" + use_lbp: True + num_soft_lbp: 1 + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/train.split1.bundle" + bd_ratio: 0.05 + valid: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/test.split1.bundle" + bd_ratio: 0.05 + test: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/test.split1.bundle" + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' + learning_rate: 0.0005 + milestones: [20] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' + learning_rate: 0.00005 + milestones: [20] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/breakfast/mapping.txt" + log_path: "./output/BCN/breakfast/split1/BcnModel/metric.csv" + dataset: "breakfast" + + +output_dir: "./output/BCN/breakfast/split1/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 2000 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/breakfast/split2.yaml b/configs/segmentation/bcn/model/breakfast/split2.yaml new file mode 100644 index 000000000..91da76417 --- /dev/null +++ b/configs/segmentation/bcn/model/breakfast/split2.yaml @@ -0,0 +1,79 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/breakfast/splits/train.split2.bundle" + bgm_result_path: "./output/BCN/breakfast/split2/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/breakfast/split2/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True + num_post: 4 + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 + num_layers: 12 + num_f_maps: 256 + dim: 2048 + num_classes: 48 + dataset: "breakfast" + use_lbp: True + num_soft_lbp: 1 + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/train.split2.bundle" + bd_ratio: 0.05 + valid: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/test.split2.bundle" + bd_ratio: 0.05 + test: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/test.split2.bundle" + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' + learning_rate: 0.0005 + milestones: [20] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' + learning_rate: 0.00005 + milestones: [20] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/breakfast/mapping.txt" + log_path: "./output/BCN/breakfast/split2/BcnModel/metric.csv" + dataset: "breakfast" + + +output_dir: "./output/BCN/breakfast/split2/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 2000 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/breakfast/split3.yaml b/configs/segmentation/bcn/model/breakfast/split3.yaml new file mode 100644 index 000000000..216df06df --- /dev/null +++ b/configs/segmentation/bcn/model/breakfast/split3.yaml @@ -0,0 +1,79 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/breakfast/splits/train.split3.bundle" + bgm_result_path: "./output/BCN/breakfast/split3/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/breakfast/split3/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True + num_post: 4 + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 + num_layers: 12 + num_f_maps: 256 + dim: 2048 + num_classes: 48 + dataset: "breakfast" + use_lbp: True + num_soft_lbp: 1 + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/train.split3.bundle" + bd_ratio: 0.05 + valid: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/test.split3.bundle" + bd_ratio: 0.05 + test: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/test.split3.bundle" + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' + learning_rate: 0.0005 + milestones: [20] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' + learning_rate: 0.00005 + milestones: [20] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/breakfast/mapping.txt" + log_path: "./output/BCN/breakfast/split3/BcnModel/metric.csv" + dataset: "breakfast" + + +output_dir: "./output/BCN/breakfast/split3/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 2000 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/breakfast/split4.yaml b/configs/segmentation/bcn/model/breakfast/split4.yaml new file mode 100644 index 000000000..93b1ade9a --- /dev/null +++ b/configs/segmentation/bcn/model/breakfast/split4.yaml @@ -0,0 +1,79 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/breakfast/splits/train.split4.bundle" + bgm_result_path: "./output/BCN/breakfast/split4/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/breakfast/split4/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True + num_post: 4 + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 + num_layers: 12 + num_f_maps: 256 + dim: 2048 + num_classes: 48 + dataset: "breakfast" + use_lbp: True + num_soft_lbp: 1 + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/train.split4.bundle" + bd_ratio: 0.05 + valid: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/test.split4.bundle" + bd_ratio: 0.05 + test: + format: 'BcnModelDataset' + file_path: "./data/breakfast/splits/test.split4.bundle" + bd_ratio: 0.05 + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' + learning_rate: 0.0005 + milestones: [20] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' + learning_rate: 0.00005 + milestones: [20] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/breakfast/mapping.txt" + log_path: "./output/BCN/breakfast/split4/BcnModel/metric.csv" + dataset: "breakfast" + + +output_dir: "./output/BCN/breakfast/split4/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 2000 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/example.yaml b/configs/segmentation/bcn/model/example.yaml new file mode 100644 index 000000000..919f44593 --- /dev/null +++ b/configs/segmentation/bcn/model/example.yaml @@ -0,0 +1,79 @@ +MODEL: #MODEL field + framework: "BcnModel" #Mandatory, indicate the type of network, associate to the 'paddlevideo/modeling/framework/'. + data_path: "./data/50salads/splits/train.split1.bundle" #Mandatory, the path to [.bundle] file of train data + bgm_result_path: "./output/BCN/50salads/split1/BcnBgmResized/results" #Mandatory, the path to results of resized-resolution bgm + bgm_pdparams: "./output/BCN/50salads/split1/BcnBgmFull/BcnBgmFull_best.pdparams" #Mandatory, the path to full-resolution bgm weight + use_lbp: True #Optional [True, False], use the full model or resized model + num_post: 4 #Optional, the layer number of lbp + backbone: + name: "BcnModel" #Mandatory, indicate the type of backbone, associate to the 'paddlevideo/modeling/backbones/'. + num_stages: 4 #Optional, the stage number of model + num_layers: 12 #Optional, the layer number in each stage + num_f_maps: 256 #Optional, the number of hidden channels in each layer + dim: 2048 #Mandatory, the number of channels for input + num_classes: 19 #Optional, the number of categories + dataset: "50salads" #Optional, dataset + use_lbp: True #Optional [True, False], use the full model or resized model + num_soft_lbp: 1 #Optional, the layer number of soft_lbp + loss: + name: "BcnModelLoss" + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Mandatory, valid batch size per gpu. + test_batch_size: 1 #Mandatory, test batch size per gpu. + num_workers: 2 #Optional, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' #Mandatory, indicate the type of dataset, associate to the 'paddlevidel/loader/dateset'. + file_path: "./data/50salads/splits/train.split1.bundle" #Optional, choose split + bd_ratio: 0.05 # Mandatory + valid: + format: 'BcnModelDataset' #Mandatory, indicate the type of dataset, associate to the 'paddlevidel/loader/dateset'. + file_path: "./data/50salads/splits/test.split1.bundle" #Optional, choose split + bd_ratio: 0.05 #Mandatory + test: + format: 'BcnModelDataset' #Mandatory, indicate the type of dataset, associate to the 'paddlevidel/loader/dateset'. + file_path: "./data/50salads/splits/test.split1.bundle" #Optional, choose split + bd_ratio: 0.05 #Mandatory + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Mandatory + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Mandatory + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Mandatory + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' #Mandatory, the type of optimizer, please to the 'paddlevideo/solver/' + learning_rate: #Mandatory, the type of optimizer, please to the 'paddlevideo/solver/' + - + name: 'CustomMultiStepDecay' #Mandatory, the learning rate scheduler for main model + learning_rate: 0.001 + milestones: [30] + gamma: 0.3 + - + name: 'CustomMultiStepDecay' #Mandatory, the learning rate scheduler for bgm model + learning_rate: 0.0001 + milestones: [30] + gamma: 0.3 + +METRIC: + name: 'BcnModelMetric' #Mandatory, the type of optimizer, please to the 'paddlevideo/metrics' + overlap: [.1, .25, .5] #Optional, the iou threshold value when calculating f-score + actions_map_file_path: "./data/50salads/mapping.txt" # Mandatory, the path to actions_map + log_path: "./output/BCN/50salads/split1/BcnModel/metric.csv" #Optional, the path to save metric results + dataset: "50salads" #Optional, choose dataset + + +output_dir: "./output/BCN/50salads/split1/BcnModel/" #Optional, path to save output +model_name: "BcnModel" #Mandatory, model name. +log_interval: 20 #Optional, the interval of logger. +epochs: 50 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 #Optional, the interval of save. diff --git a/configs/segmentation/bcn/model/gtea/split1.yaml b/configs/segmentation/bcn/model/gtea/split1.yaml new file mode 100644 index 000000000..3367e919c --- /dev/null +++ b/configs/segmentation/bcn/model/gtea/split1.yaml @@ -0,0 +1,82 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/gtea/splits/train.split1.bundle" + bgm_result_path: "./output/BCN/gtea/split1/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/gtea/split1/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True #.. + num_post: 4 #.. + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 #.. + num_layers: 10 #.. + num_f_maps: 256 #.. + dim: 2048 #.. + num_classes: 11 #.. + dataset: "gtea" #.. + use_lbp: True #.. + num_soft_lbp: 1 #.. + loss: + name: "BcnModelLoss" #.. + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/train.split1.bundle" #.. + bd_ratio: 0.05 #.. + valid: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/test.split1.bundle" #.. + bd_ratio: 0.05 #.. + test: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/test.split1.bundle" #.. + bd_ratio: 0.05 #.. + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' #.. + learning_rate: 0.0005 #.. + milestones: [20] #.. + gamma: 0.3 #.. + - + name: 'CustomMultiStepDecay' #.. + learning_rate: 0.00005 #.. + milestones: [20] #.. + gamma: 0.3 #.. + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/gtea/mapping.txt" + log_path: "./output/BCN/gtea/split1/BcnModel/metric.csv" + dataset: "gtea" + +INFERENCE: + name: 'BcnModel_Inference_helper' + num_channels: 2048 + +output_dir: "./output/BCN/gtea/split1/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 2000 #Optional, the interval of logger. +epochs: 60 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/gtea/split2.yaml b/configs/segmentation/bcn/model/gtea/split2.yaml new file mode 100644 index 000000000..72003ff70 --- /dev/null +++ b/configs/segmentation/bcn/model/gtea/split2.yaml @@ -0,0 +1,79 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/gtea/splits/train.split2.bundle" + bgm_result_path: "./output/BCN/gtea/split2/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/gtea/split2/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True #.. + num_post: 4 #.. + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 #.. + num_layers: 10 #.. + num_f_maps: 256 #.. + dim: 2048 #.. + num_classes: 11 #.. + dataset: "gtea" #.. + use_lbp: True #.. + num_soft_lbp: 1 #.. + loss: + name: "BcnModelLoss" #.. + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/train.split2.bundle" #.. + bd_ratio: 0.05 #.. + valid: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/test.split2.bundle" #.. + bd_ratio: 0.05 #.. + test: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/test.split2.bundle" #.. + bd_ratio: 0.05 #.. + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' #.. + learning_rate: 0.0005 #.. + milestones: [20] #.. + gamma: 0.3 #.. + - + name: 'CustomMultiStepDecay' #.. + learning_rate: 0.00005 #.. + milestones: [20] #.. + gamma: 0.3 #.. + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/gtea/mapping.txt" + log_path: "./output/BCN/gtea/split2/BcnModel/metric.csv" + dataset: "gtea" + + +output_dir: "./output/BCN/gtea/split2/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 2000 #Optional, the interval of logger. +epochs: 60 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/gtea/split3.yaml b/configs/segmentation/bcn/model/gtea/split3.yaml new file mode 100644 index 000000000..3165e4274 --- /dev/null +++ b/configs/segmentation/bcn/model/gtea/split3.yaml @@ -0,0 +1,79 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/gtea/splits/train.split3.bundle" + bgm_result_path: "./output/BCN/gtea/split3/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/gtea/split3/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True #.. + num_post: 4 #.. + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 #.. + num_layers: 10 #.. + num_f_maps: 256 #.. + dim: 2048 #.. + num_classes: 11 #.. + dataset: "gtea" #.. + use_lbp: True #.. + num_soft_lbp: 1 #.. + loss: + name: "BcnModelLoss" #.. + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/train.split3.bundle" #.. + bd_ratio: 0.05 #.. + valid: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/test.split3.bundle" #.. + bd_ratio: 0.05 #.. + test: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/test.split3.bundle" #.. + bd_ratio: 0.05 #.. + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' #.. + learning_rate: 0.0005 #.. + milestones: [20] #.. + gamma: 0.3 #.. + - + name: 'CustomMultiStepDecay' #.. + learning_rate: 0.00005 #.. + milestones: [20] #.. + gamma: 0.3 #.. + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/gtea/mapping.txt" + log_path: "./output/BCN/gtea/split3/BcnModel/metric.csv" + dataset: "gtea" + + +output_dir: "./output/BCN/gtea/split3/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 2000 #Optional, the interval of logger. +epochs: 60 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/configs/segmentation/bcn/model/gtea/split4.yaml b/configs/segmentation/bcn/model/gtea/split4.yaml new file mode 100644 index 000000000..9f03b9355 --- /dev/null +++ b/configs/segmentation/bcn/model/gtea/split4.yaml @@ -0,0 +1,86 @@ +MODEL: #MODEL field + framework: "BcnModel" + data_path: "./data/gtea/splits/train.split4.bundle" + bgm_result_path: "./output/BCN/gtea/split4/BcnBgmResized/results" + bgm_pdparams: "./output/BCN/gtea/split4/BcnBgmFull/BcnBgmFull_best.pdparams" + use_lbp: True #.. + num_post: 4 #.. + backbone: + name: "BcnModel" #Optional, model'. + num_stages: 4 #.. + num_layers: 10 #.. + num_f_maps: 256 #.. + dim: 2048 #.. + num_classes: 11 #.. + dataset: "gtea" #.. + use_lbp: True #.. + num_soft_lbp: 1 #.. + loss: + name: "BcnModelLoss" #.. + +DATASET: #DATASET field + batch_size: 1 #Mandatory, batch size per gpu. + valid_batch_size: 1 #Optional, valid batch size per gpu. + test_batch_size: 1 #Optional, test batch size per gpu. + num_workers: 2 #Mandatory, the number of subprocess on each GPU. + train: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/train.split4.bundle" #.. + bd_ratio: 0.05 #.. + valid: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/test.split4.bundle" #.. + bd_ratio: 0.05 #.. + test: + format: 'BcnModelDataset' #.. + file_path: "./data/gtea/splits/test.split4.bundle" #.. + bd_ratio: 0.05 #.. + +PIPELINE: #PIPELINE field + train: #Mandotary, indicate the pipeline to deal with the training data, please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + valid: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + + test: #Mandatory, indicate the pipeline to deal with the validing data. please refer to the 'paddlevideo/loader/pipelines/' + decode: + name: "BcnModelPipeline" #Decoder type. + +OPTIMIZER: #OPTIMIZER field + name: 'Adam' + learning_rate: + - + name: 'CustomMultiStepDecay' #.. + learning_rate: 0.0005 #.. + milestones: [20] #.. + gamma: 0.3 #.. + - + name: 'CustomMultiStepDecay' #.. + learning_rate: 0.00005 #.. + milestones: [20] #.. + gamma: 0.3 #.. + +METRIC: + name: 'BcnModelMetric' + overlap: [.1, .25, .5] + actions_map_file_path: "./data/gtea/mapping.txt" + log_path: "./output/BCN/gtea/split4/BcnModel/metric.csv" + dataset: "gtea" + +INFERENCE: + name: 'BCN_Inference_helper' + num_channels: 2048 + # actions_map_file_path: "./data/gtea/mapping.txt" + # postprocessing_method: "refinement_with_boundary" + # boundary_threshold: 0.5 + # feature_path: "./data/gtea/features" + +output_dir: "./output/BCN/gtea/split4/BcnModel/" +model_name: "BcnModel" #Mandatory, model name. +log_interval: 2000 #Optional, the interval of logger. +epochs: 60 #Mandatory, total epoch +log_level: "DEBUG" #Optional, the logger level. +save_interval: 2000 diff --git a/docs/en/dataset/SegmentationDataset.md b/docs/en/dataset/SegmentationDataset.md new file mode 100644 index 000000000..46295ddb6 --- /dev/null +++ b/docs/en/dataset/SegmentationDataset.md @@ -0,0 +1,35 @@ +English | [简体中文](../../zh-CN/dataset/SegmentationDataset.md) + +# Video Action Segmentation Dataset + +The video motion segmentation model uses breakfast, 50salads and gtea data sets. The use method is to use the features extracted by the pre training model, which can be obtained from the ms-tcn official code base.[feat](https://zenodo.org/record/3625992#.Xiv9jGhKhPY) + +- Dataset tree +```txt +─── GTEA + ├── features + │ ├── S1_Cheese_C1.npy + │ ├── S1_Coffee_C1.npy + │ ├── S1_CofHoney_C1.npy + │ └── ... + ├── groundTruth + │ ├── S1_Cheese_C1.txt + │ ├── S1_Coffee_C1.txt + │ ├── S1_CofHoney_C1.txt + │ └── ... + ├── splits + │ ├── test.split1.bundle + │ ├── test.split2.bundle + │ ├── test.split3.bundle + │ └── ... + └── mapping.txt +``` + +- data tree +```txt +─── data + ├── 50salads + ├── breakfast + ├── gtea + └── ... +``` diff --git a/docs/en/model_zoo/segmentation/Temporal_action_segmentation.md b/docs/en/model_zoo/segmentation/Temporal_action_segmentation.md new file mode 100644 index 000000000..8027de53f --- /dev/null +++ b/docs/en/model_zoo/segmentation/Temporal_action_segmentation.md @@ -0,0 +1,19 @@ +[English](../../../en/model_zoo/segmentation/Trmporal_action_segmentation.md) | 简体中文 + +本仓库提供经典和热门时序动作分割模型的性能和精度对比 + +| Model | Metrics | Value | Flops(M) |Params(M) | test time(ms) bs=1 | test time(ms) bs=2 | inference time(ms) bs=1 | inference time(ms) bs=2 | +| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | +| MS-TCN | F1@0.5 | 38.8% | 791.360 | 0.8 | 170 | - | 10.68 | - | +| ASRF | F1@0.5 | 55.7% | 1,283.328 | 1.3 | 190 | - | 16.34 | - | +| BCN | F1@0.5 | 56.0% | 14,463.616 | 14.0 | 268 | - | - | - | + +* 模型名称:填写模型的具体名字,比如PP-TSM +* Metrics:填写模型测试时所用的指标,使用的数据集为**breakfast** +* Value:填写Metrics指标对应的数值,一般保留小数点后一位 +* Flops:模型一次前向运算所需的浮点运算量,可以调用PaddleVideo/tools/summary.py脚本计算(不同模型可能需要稍作修改),保留小数点后一位,使用数据**输入形状为(1, 2048, 1000)的张量**测得 +* Params(M):模型参数量,和Flops一起会被脚本计算出来,保留小数点后一位 +* test time(ms) bs=1:python脚本开batchsize=1测试时,一个样本所需的耗时,保留小数点后两位。测试使用的数据集为**breakfast**。 +* test time(ms) bs=2:python脚本开batchsize=2测试时,一个样本所需的耗时,保留小数点后两位。时序动作分割模型一般是全卷积网络,所以训练、测试和推理的batch_size都是1。测试使用的数据集为**breakfast**。 +* inference time(ms) bs=1:推理模型用GPU(默认V100)开batchsize=1测试时,一个样本所需的耗时,保留小数点后两位。推理使用的数据集为**breakfast**。 +* inference time(ms) bs=2:推理模型用GPU(默认V100)开batchsize=1测试时,一个样本所需的耗时,保留小数点后两位。时序动作分割模型一般是全卷积网络,所以训练、测试和推理的batch_size都是1。推理使用的数据集为**breakfast**。 diff --git a/docs/en/model_zoo/segmentation/bcn.md b/docs/en/model_zoo/segmentation/bcn.md new file mode 100644 index 000000000..5e0b80d6a --- /dev/null +++ b/docs/en/model_zoo/segmentation/bcn.md @@ -0,0 +1,160 @@ +[简体中文](../../../zh-CN/model_zoo/segmentation/bcn.md) | English + +# BCN Video action segmentation model + +--- +## Contents + +- [Introduction](#Introduction) +- [Data](#Data) +- [Train&Test](#Train&Test) +- [Inference](#Inference) +- [Reference](#Reference) + +## Introduction + +BCN model is an improvement on the video motion segmentation model ms-tcn, which was published on WACV in 2021. We reproduce the officially implemented pytorch code and obtain approximate results in paddlevideo. + + +

+
+BCN Overview +

+ +## Data + +BCN can choose 50salads, breakfast, GTEA as trianing set. Please refer to Video Action Segmentation dataset download and preparation doc [Video Action Segmentation dataset](../../dataset/SegmentationDataset.md) + +## Train&Test + +BCN is a two-stage model that requires the barrier Generation Module (BGM) to be trained first, and then the BGM and the main model to be trained together. + +All the following **DS** is **breakfast, 50salads or gtea**, and **SP** is the split number **1-5** for 50salads and **1-4** for the other two datasets. +e.g. +```bash +python main.py --validate -c configs/segmentation/bcn/bgm/[DS]/full/split[SP].yaml +``` +Can be replaced with: +```bash +python main.py --validate -c configs/segmentation/bcn/bgm/gtea/full/split1.yaml +``` + +### 1. Train and test the full-resolution barrier generation module + +```bash +export CUDA_VISIBLE_DEVICES=3 +python main.py --validate -c configs/segmentation/bcn/bgm/[DS]/full/split[SP].yaml +python main.py --test -c configs/segmentation/bcn/bgm/[DS]/full/split[SP].yaml \ + -w output/BCN/[DS]/split[SP]/BcnBgmFull/BcnBgmFull_epoch_00001.pdparams +``` + +### 2. Train and test the resized-resolution barrier generation module + +```bash +export CUDA_VISIBLE_DEVICES=3 +python main.py --validate -c configs/segmentation/bcn/bgm/[DS]/resized/split[SP].yaml +python main.py --test -c configs/segmentation/bcn/bgm/[DS]/resized/split[SP].yaml \ + -w output/BCN/[DS]/split[SP]/BcnBgmResized/BcnBgmResized_epoch_00001.pdparams +``` + +### 3. Train and test the BCN + +```bash +export CUDA_VISIBLE_DEVICES=3 +python3.7 main.py --validate -c configs/segmentation/bcn/model/[DS]/split[SP].yaml +python3.7 main.py --test -c configs/segmentation/bcn/model/[DS]/split[SP].yaml \ + -w output/BCN/[DS]/split[SP]/BcnModel/BcnModel_epoch_00001.pdparams +``` + +The results of the measurement are saved in: +``` +output/BCN/[DS]/split[SP]/BcnModel/metric.csv +``` + +### Results in paddle + +- Start the training by using the above command line or script program. There is no need to use the pre training model. The video action segmentation model is usually a full convolution network. Due to the different lengths of videos, the `DATASET.batch_size` of the video action segmentation model is usually set to `1`, that is, batch training is not required. At present, only **single sample** training is supported. + +- The reproduction of pytorch comes from the official [code base](https://github.com/MCG-NJU/BCN) + +Metrics on Breakfast dataset: + +| Model | Acc | Edit | F1@0.1 | F1@0.25 | F1@0.5 | +| :---: | :---: | :---: | :---: | :---: | :---: | +| paper | 70.4% | 66.2% | 68.7% | 65.5% | 55.0% | +| pytorch | 70.9% | 66.7% | 68.5% | 65.9% | 55.8% | +| paddle | 70.8% | 66.4% | 68.9% | 65.9% | 56.0% | + +Metrics on 50salads dataset: + +| Model | Acc | Edit | F1@0.1 | F1@0.25 | F1@0.5 | +| :---: | :---: | :---: | :---: | :---: | :---: | +| paper | 84.4% | 74.3% | 82.1% | 81.3% | 74.0% | +| pytorch | 84.5% | 76.8% | 83.3% | 81.3% | 73.5% | +| paddle | 85.0% | 75.4% | 83.0% | 81.5% | 73.8% | + +Metrics on gtea dataset: + +| Model | Acc | Edit | F1@0.1 | F1@0.25 | F1@0.5 | +| :---: | :---: | :---: | :---: | :---: | :---: | +| paper | 79.8% | 84.4% | 88.5% | 87.1% | 77.3% | +| pytorch | 78.8% | 82.8% | 87.3% | 85.0% | 75.1% | +| paddle | 78.9% | 82.6% | 88.9% | 86.4% | 73.8% | + + +## Inference + +### 1. Export inference full-resolution barrier generation module + +```bash +python3.7 tools/export_model.py \ + -c configs/segmentation/bcn/bgm/[DS]/full/split[SP].yaml \ + --p output/BCN/[DS]/split[SP]/BcnBgmFull/BcnBgmFull_best.pdparams \ + -o ./inference +``` + +### 2. Infer, taking gtea/ Features/s1_cheese_C1.npy as an example + +```bash +python3.7 tools/predict.py --input_file data/gtea/features/S1_Cheese_C1.npy + --config configs/segmentation/bcn/bgm/gtea/full/split1.yaml + --model_file inference/BcnBgmFull.pdmodel + --params_file inference/BcnBgmFull.pdiparams --use_gpu=True + --use_tensorrt=False +``` + +### 3. Export inference resized-resolution barrier generation module + +```bash +python3.7 tools/export_model.py \ + -c configs/segmentation/bcn/bgm/[DS]/resized/split[SP].yaml \ + --p output/BCN/[DS]/split[SP]/BcnBgmResized/BcnBgmResized_best.pdparams \ + -o ./inference +``` + +### 4. Infer, taking gtea/ Features/s1_cheese_C1.npy as an example + +```bash +python3.7 tools/predict.py --input_file data/gtea/features/S1_Cheese_C1.npy + --config configs/segmentation/bcn/bgm/gtea/resized/split1.yaml + --model_file inference/BcnBgmResized.pdmodel + --params_file inference/BcnBgmResized.pdiparams --use_gpu=True + --use_tensorrt=False +``` + +### 5. Export inference bcn model + +None + +Since BCN uses the Unfold function, when generating the static model, the input will contain the variable dimension -1. Unfold is temporarily unable to process the input that contains -1 from Shape. + +

+
+BCN Error +

+ +- Args usage please refer to [Model Inference](https://github.com/PaddlePaddle/PaddleVideo/blob/release/2.0/docs/zh-CN/start.md#2-%E6%A8%A1%E5%9E%8B%E6%8E%A8%E7%90%86). + +## Reference + +- [Boundary-Aware Cascade Networks for Temporal Action Segmentation](https://github.com/MCG-NJU/BCN/blob/master/demo/ECCV20-BCN.pdf), Zhenzhi Wang, Ziteng Gao, Limin Wang, Zhifeng Li, Gangshan Wu diff --git a/docs/images/bcn.png b/docs/images/bcn.png new file mode 100644 index 0000000000000000000000000000000000000000..ec93b369897e5e439f105cb33fee5bcbe2d47f55 GIT binary patch literal 228533 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

pdh7~ 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

#An>_G+%to)e1tn`yv$}zR`cN~#{@K>0Mc?K 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%0AJetnVrYtum$)Zc;93o-j%} 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%0DAsqvCG5r-e8#vu@0&GhP(` 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�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%0A!9uIH>%IbWdz5 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 b+1dSkdCQ;fu)Ogu_@| +
+BCN Overview +

+ +## 数据准备 + +BCN的训练数据可以选择50salads、breakfast、GTEA三个数据集,数据下载及准备请参考[视频动作分割数据集](../../dataset/SegmentationDataset.md) + +## 模型训练和测试 + +BCN是两阶段模型,需要先训练barrier generation module(bgm),然后将bgm与主模型共同训练。 +以下所有**DS**应替换为**breakfast/50salads/gtea**, **SP**在50salads为**1-5**,在其他两个数据集中为**1-4**。 +例如, +```bash +python main.py --validate -c configs/segmentation/bcn/bgm/[DS]/full/split[SP].yaml +``` +可以替换为: +```bash +python main.py --validate -c configs/segmentation/bcn/bgm/gtea/full/split1.yaml +``` + +### 1. 训练full-resolution barrier generation module,并测试 + +```bash +export CUDA_VISIBLE_DEVICES=3 +python main.py --validate -c configs/segmentation/bcn/bgm/[DS]/full/split[SP].yaml +python main.py --test -c configs/segmentation/bcn/bgm/[DS]/full/split[SP].yaml \ + -w output/BCN/[DS]/split[SP]/BcnBgmFull/BcnBgmFull_epoch_00001.pdparams +``` + +### 2. 训练resized-resolution barrier generation module,并测试 + +```bash +export CUDA_VISIBLE_DEVICES=3 +python main.py --validate -c configs/segmentation/bcn/bgm/[DS]/resized/split[SP].yaml +python main.py --test -c configs/segmentation/bcn/bgm/[DS]/resized/split[SP].yaml \ + -w output/BCN/[DS]/split[SP]/BcnBgmResized/BcnBgmResized_epoch_00001.pdparams +``` + +### 3. 训练BCN,并测试 + +```bash +export CUDA_VISIBLE_DEVICES=3 +python3.7 main.py --validate -c configs/segmentation/bcn/model/[DS]/split[SP].yaml +python3.7 main.py --test -c configs/segmentation/bcn/model/[DS]/split[SP].yaml \ + -w output/BCN/[DS]/split[SP]/BcnModel/BcnModel_epoch_00001.pdparams +``` + +metric保存在: +``` +output/BCN/[DS]/split[SP]/BcnModel/metric.csv +``` + +### 复现结果 + +- 从头开始训练,使用上述启动命令行或者脚本程序即可启动训练,不需要用到预训练模型,视频动作分割模型通常为全卷积网络,由于视频的长度不一,故视频动作分割模型的scr字段通常设为1,即不需要批量训练,目前也仅支持**单样本**训练 + +- pytorch的复现来源于官方提供的[代码库](https://github.com/MCG-NJU/BCN) + +在Breakfast数据集下评估精度如下: + +| Model | Acc | Edit | F1@0.1 | F1@0.25 | F1@0.5 | +| :---: | :---: | :---: | :---: | :---: | :---: | +| paper | 70.4% | 66.2% | 68.7% | 65.5% | 55.0% | +| pytorch | 70.9% | 66.7% | 68.5% | 65.9% | 55.8% | +| paddle | 70.8% | 66.4% | 68.9% | 65.9% | 56.0% | + +在50salads数据集下评估精度如下: + +| Model | Acc | Edit | F1@0.1 | F1@0.25 | F1@0.5 | +| :---: | :---: | :---: | :---: | :---: | :---: | +| paper | 84.4% | 74.3% | 82.1% | 81.3% | 74.0% | +| pytorch | 84.5% | 76.8% | 83.3% | 81.3% | 73.5% | +| paddle | 85.0% | 75.4% | 83.0% | 81.5% | 73.8% | + +在GTEA数据集下评估精度如下: + +| Model | Acc | Edit | F1@0.1 | F1@0.25 | F1@0.5 | +| :---: | :---: | :---: | :---: | :---: | :---: | +| paper | 79.8% | 84.4% | 88.5% | 87.1% | 77.3% | +| pytorch | 78.8% | 82.8% | 87.3% | 85.0% | 75.1% | +| paddle | 78.9% | 82.6% | 88.9% | 86.4% | 73.8% | + + +## 模型推理 + +### 1. 导出动态full-resolution barrier generation module + +```bash +python3.7 tools/export_model.py \ + -c configs/segmentation/bcn/bgm/[DS]/full/split[SP].yaml \ + --p output/BCN/[DS]/split[SP]/BcnBgmFull/BcnBgmFull_best.pdparams \ + -o ./inference +``` + +### 2. 使用预测引擎推理full-resolution barrier generation module, 以gtea/features/S1_Cheese_C1.npy为例 + +```bash +python3.7 tools/predict.py --input_file data/gtea/features/S1_Cheese_C1.npy + --config configs/segmentation/bcn/bgm/gtea/full/split1.yaml + --model_file inference/BcnBgmFull.pdmodel + --params_file inference/BcnBgmFull.pdiparams --use_gpu=True + --use_tensorrt=False +``` + +### 3. 导出动态resized-resolution barrier generation module + +```bash +python3.7 tools/export_model.py \ + -c configs/segmentation/bcn/bgm/[DS]/resized/split[SP].yaml \ + --p output/BCN/[DS]/split[SP]/BcnBgmResized/BcnBgmResized_best.pdparams \ + -o ./inference +``` + +### 4. 使用预测引擎推理resized-resolution barrier generation module, 以gtea/features/S1_Cheese_C1.npy为例 + +```bash +python3.7 tools/predict.py --input_file data/gtea/features/S1_Cheese_C1.npy + --config configs/segmentation/bcn/bgm/gtea/resized/split1.yaml + --model_file inference/BcnBgmResized.pdmodel + --params_file inference/BcnBgmResized.pdiparams --use_gpu=True + --use_tensorrt=False +``` + +### 5. 导出动态bcn + +暂无 + +由于BCN使用了unfold函数,在生成静态模型时,输入会包含可变维度-1,unfold暂时无法处理shape包含-1的输入。 + +

+
+BCN Error +

+ +- 各参数含义可参考[模型推理方法](https://github.com/PaddlePaddle/PaddleVideo/blob/release/2.0/docs/zh-CN/start.md#2-%E6%A8%A1%E5%9E%8B%E6%8E%A8%E7%90%86) + +## 参考论文 + +- [Boundary-Aware Cascade Networks for Temporal Action Segmentation](https://github.com/MCG-NJU/BCN/blob/master/demo/ECCV20-BCN.pdf), Zhenzhi Wang, Ziteng Gao, Limin Wang, Zhifeng Li, Gangshan Wu diff --git a/paddlevideo/loader/dataset/__init__.py b/paddlevideo/loader/dataset/__init__.py index e3cfdb14f..ec878d6c8 100644 --- a/paddlevideo/loader/dataset/__init__.py +++ b/paddlevideo/loader/dataset/__init__.py @@ -22,9 +22,10 @@ from .skeleton import SkeletonDataset from .slowfast_video import SFVideoDataset from .video import VideoDataset +from .bcn_dataset import BcnBgmDataset, BcnModelDataset __all__ = [ 'VideoDataset', 'FrameDataset', 'SFVideoDataset', 'BMNDataset', 'FeatureDataset', 'SkeletonDataset', 'AVADataset', 'MonoDataset', - 'MSRVTTDataset', 'ActBertDataset' + 'MSRVTTDataset', 'ActBertDataset', 'BcnBgmDataset', 'BcnModelDataset' ] diff --git a/paddlevideo/loader/dataset/bcn_dataset.py b/paddlevideo/loader/dataset/bcn_dataset.py new file mode 100644 index 000000000..d45488367 --- /dev/null +++ b/paddlevideo/loader/dataset/bcn_dataset.py @@ -0,0 +1,360 @@ +# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +# 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import json +import paddle +import paddle.nn.functional as F +import numpy as np + +from ..registry import DATASETS +from .base import BaseDataset +from ...utils import get_logger + +logger = get_logger("paddlevideo") + + +@DATASETS.register() +class BcnBgmDataset(BaseDataset): + """Video dataset for BCN bgm model. + """ + + def __init__( + self, + file_path, + pipeline, + # mode, + use_full, + bd_ratio=0.05, + **kwargs, + ): + super().__init__(file_path, pipeline, **kwargs) + + # assert parameter + # assert mode in ['train', 'test'], "mode parameter must be 'train' or 'test'" + assert use_full in [True, + False], "use_full parameter must be True or False" + assert '//' not in file_path, "don't use '//' in file_path, please use '/'" + + # set parameter + self.boundary_ratio = bd_ratio + # self.mode = mode + self.use_full = use_full + + # get other parameter from file_path + file_path_list = file_path.split('/') + root = '/'.join(file_path_list[:-2]) + '/' + + self.dataset = file_path_list[-3] + self.gt_path = root + 'groundTruth/' + self.features_path = root + 'features/' + mapping_file = root + 'mapping.txt' + file_ptr = open(mapping_file, 'r') + actions = file_ptr.read().split('\n')[:-1] + file_ptr.close() + self.actions_dict = dict() + for a in actions: + self.actions_dict[a.split()[1]] = int(a.split()[0]) + # self.num_classes = len(actions_dict) + + # see mapping.txt for details + if self.dataset == '50salads': + self.bg_class = [17, 18] # background + self.resized_temporal_scale = 400 + self.sample_rate = 2 + elif self.dataset == 'gtea': + self.boundary_ratio = 0.1 + self.bg_class = [10] + self.resized_temporal_scale = 300 # 100 in bcn-torch + self.sample_rate = 1 + elif self.dataset == 'breakfast': + self.bg_class = [0] + self.resized_temporal_scale = 300 + self.sample_rate = 1 + + # get all data_path + self.file_path = file_path + file_ptr = open(file_path, 'r') + self.list_of_examples = file_ptr.read().split('\n')[:-1] + file_ptr.close() + + def load_file(self): + """Load index file to get video information.""" + file_ptr = open(self.file_path, 'r') + self.list_of_examples = file_ptr.read().split('\n')[:-1] + file_ptr.close() + return self.list_of_examples + + def prepare_train(self, idx): + """TRAIN & VALID: Prepare data for training/valid given the index.""" + feature_tensor, target_tensor, anchor_xmin, anchor_xmax = self._get_base_data( + idx) + result = dict() + result['feature_tensor'] = feature_tensor + result['target_tensor'] = target_tensor + result['anchor_xmin'] = anchor_xmin + result['anchor_xmax'] = anchor_xmax + result['idx'] = idx + result['pipeline_parameter'] = { + 'use_full': self.use_full, + 'resized_temporal_scale': self.resized_temporal_scale, + 'bg_class': self.bg_class, + 'boundary_ratio': self.boundary_ratio + } + result['video_name'] = self.list_of_examples[idx] + return self.pipeline(result) + + def prepare_test(self, idx): + """TEST: Prepare the data for test given the index.""" + + return self.prepare_train(idx) + + def _get_base_data(self, index): + """Get base data for dataset.""" + features = np.load(self.features_path + + self.list_of_examples[index].split('.')[0] + '.npy') + features = copy.deepcopy(features) + file_ptr = open(self.gt_path + self.list_of_examples[index], 'r') + content = file_ptr.read().split('\n')[:-1] # read ground truth + content = copy.deepcopy(content) + + # initialize and produce gt vector + classes = np.zeros(min(np.shape(features)[1], len(content))) + for i in range(len(classes)): + classes[i] = self.actions_dict[content[i]] + + # sample information by skipping each sample_rate frames + features = features[:, ::self.sample_rate] + feature_tensor = paddle.to_tensor(features, dtype='float32') + temporal_scale = feature_tensor.shape[1] + temporal_gap = 1.0 / temporal_scale + if self.use_full == False: + num_frames = np.shape(features)[1] + feature_tensor = feature_tensor.unsqueeze(0) + if self.dataset == 'breakfast': # for breakfast dataset, there are extremely short videos + factor = 1 + while factor * num_frames < self.resized_temporal_scale: + factor = factor + 1 + feature_tensor = F.interpolate(feature_tensor, + scale_factor=(factor), + mode='linear', + align_corners=False, + data_format='NCW') + feature_tensor = F.interpolate(feature_tensor.unsqueeze(3), + size=(self.resized_temporal_scale, + 1), + mode='nearest').squeeze(3) + feature_tensor = feature_tensor.squeeze(0) + temporal_scale = self.resized_temporal_scale + temporal_gap = 1.0 / temporal_scale + target = classes[::self.sample_rate] + target_tensor = paddle.to_tensor(target, dtype='int64') + anchor_xmin = [temporal_gap * i for i in range(temporal_scale)] + anchor_xmax = [temporal_gap * i for i in range(1, temporal_scale + 1)] + + return feature_tensor, target_tensor, anchor_xmin, anchor_xmax + + def __len__(self): + return len(self.list_of_examples) + + +@DATASETS.register() +class BcnModelDataset(BaseDataset): + """Video dataset for BCN main model. + """ + + def __init__( + self, + file_path, + pipeline, + # mode, + bd_ratio=0.05, + **kwargs, + ): + super().__init__(file_path, pipeline, **kwargs) + + # assert parameter + assert '//' not in file_path, "don't use '//' in file_path, please use '/'" + + # set parameter + self.boundary_ratio = bd_ratio + + # get other parameter from file_path + file_path_list = file_path.split('/') + root = '/'.join(file_path_list[:-2]) + '/' + + self.dataset = file_path_list[-3] + self.gt_path = root + 'groundTruth/' + self.features_path = root + 'features/' + mapping_file = root + 'mapping.txt' + file_ptr = open(mapping_file, 'r') + actions = file_ptr.read().split('\n')[:-1] + file_ptr.close() + self.actions_dict = dict() + for a in actions: + self.actions_dict[a.split()[1]] = int(a.split()[0]) + self.num_classes = len(self.actions_dict) + + # see mapping.txt for details + if self.dataset == '50salads': + self.bg_class = [17, 18] + self.sample_rate = 2 + elif self.dataset == 'gtea': + self.boundary_ratio = 0.1 + self.bg_class = [10] + self.sample_rate = 1 + elif self.dataset == 'breakfast': + self.bg_class = [0] + self.sample_rate = 1 + + # get all data_path + self.index = 0 + self.file_path = file_path + file_ptr = open(file_path, 'r') + self.list_of_examples = file_ptr.read().split('\n')[:-1] + file_ptr.close() + + def load_file(self): + """Load index file to get video information.""" + file_ptr = open(self.file_path, 'r') + self.list_of_examples = file_ptr.read().split('\n')[:-1] + file_ptr.close() + return self.list_of_examples + + def prepare_train(self, idx): + """TRAIN & VALID: Prepare data for training/valid given the index.""" + feature_tensor, target_tensor, mask, anchor_xmin, anchor_xmax = self._get_base_data( + idx) + match_score_start, match_score_end = self._get_train_label( + idx, target_tensor, anchor_xmin, anchor_xmax) + match_score = paddle.concat( + (match_score_start.unsqueeze(0), match_score_end.unsqueeze(0)), 0) + match_score = paddle.max(match_score, 0) #.values() + result = dict() + result['feature_tensor'] = feature_tensor + result['target_tensor'] = target_tensor + result['mask'] = mask + result['match_score'] = match_score + result['video_name'] = self.list_of_examples[idx] + return result + + def prepare_test(self, idx): + """TEST: Prepare the data for test given the index.""" + + return self.prepare_train(idx) + + def __len__(self): + return len(self.list_of_examples) + + def _get_base_data(self, index): + """Get base data for dataset.""" + features = np.load(self.features_path + + self.list_of_examples[index].split('.')[0] + '.npy') + file_ptr = open(self.gt_path + self.list_of_examples[index], 'r') + content = file_ptr.read().split('\n')[:-1] # read ground truth + # initialize and produce gt vector + classes = np.zeros(min(np.shape(features)[1], len(content))) + for i in range(len(classes)): + classes[i] = self.actions_dict[content[i]] + + # sample information by skipping each sample_rate frames + features = features[:, ::self.sample_rate] + target = classes[::self.sample_rate] + + # create pytorch tensor + feature_tensor = paddle.to_tensor(features) + feature_tensor = paddle.cast(feature_tensor, 'float32') + target_tensor = paddle.to_tensor(target) + target_tensor = paddle.cast(target_tensor, 'int64') + mask = paddle.ones([self.num_classes, np.shape(target)[0]]) + mask = paddle.cast(mask, 'float32') + + total_frame = target_tensor.shape[0] + temporal_scale = total_frame + temporal_gap = 1.0 / temporal_scale + anchor_xmin = [temporal_gap * i for i in range(temporal_scale)] + anchor_xmax = [temporal_gap * i for i in range(1, temporal_scale + 1)] + return feature_tensor, target_tensor, mask, anchor_xmin, anchor_xmax + + def _get_train_label(self, index, target_tensor, anchor_xmin, anchor_xmax): + """Process base data to get train label.""" + total_frame = target_tensor.shape[0] + temporal_scale = total_frame + temporal_gap = 1.0 / temporal_scale + gt_label, gt_starts, gt_ends = self._get_labels_start_end_time( + target_tensor, self.bg_class) # original length + gt_label, gt_starts, gt_ends = np.array(gt_label), np.array( + gt_starts), np.array(gt_ends) + gt_starts, gt_ends = gt_starts.astype(np.float64), gt_ends.astype( + np.float64) + gt_starts, gt_ends = gt_starts / total_frame, gt_ends / total_frame # length to 0~1 + + gt_lens = gt_ends - gt_starts + gt_len_small = np.maximum(temporal_gap, self.boundary_ratio * gt_lens) + gt_start_bboxs = np.stack( + (gt_starts - gt_len_small / 2, gt_starts + gt_len_small / 2), + axis=1) + gt_end_bboxs = np.stack( + (gt_ends - gt_len_small / 2, gt_ends + gt_len_small / 2), axis=1) + + match_score_start = [] + for jdx in range(len(anchor_xmin)): + match_score_start.append( + np.max( + self._ioa_with_anchors(anchor_xmin[jdx], anchor_xmax[jdx], + gt_start_bboxs[:, 0], + gt_start_bboxs[:, 1]))) + match_score_end = [] + for jdx in range(len(anchor_xmin)): + match_score_end.append( + np.max( + self._ioa_with_anchors(anchor_xmin[jdx], anchor_xmax[jdx], + gt_end_bboxs[:, 0], + gt_end_bboxs[:, 1]))) + match_score_start = paddle.to_tensor(match_score_start) + match_score_end = paddle.to_tensor(match_score_end) + return match_score_start, match_score_end + + def _ioa_with_anchors(self, anchors_min, anchors_max, box_min, box_max): + """Calculate score""" + len_anchors = anchors_max - anchors_min + int_xmin = np.maximum(anchors_min, box_min) + int_xmax = np.minimum(anchors_max, box_max) + inter_len = np.maximum(int_xmax - int_xmin, 0.0) + scores = np.divide(inter_len, len_anchors) + return scores + + def _get_labels_start_end_time(self, target_tensor, bg_class): + """Get labels clip:[label, start time, end time]""" + labels = [] + starts = [] + ends = [] + target = target_tensor.numpy() + last_label = target[0] + if target[0] not in bg_class: + labels.append(target[0]) + starts.append(0) + + for i in range(np.shape(target)[0]): + if target[i] != last_label: + if target[i] not in bg_class: + labels.append(target[i]) + starts.append(i) + if last_label not in bg_class: + ends.append(i) + last_label = target[i] + + if last_label not in bg_class: + ends.append(np.shape(target)[0] - 1) + return labels, starts, ends diff --git a/paddlevideo/loader/pipelines/__init__.py b/paddlevideo/loader/pipelines/__init__.py index eedf92018..603ccb13a 100644 --- a/paddlevideo/loader/pipelines/__init__.py +++ b/paddlevideo/loader/pipelines/__init__.py @@ -27,6 +27,7 @@ from .sample import Sampler from .sample_ava import * from .skeleton_pipeline import AutoPadding, Iden, SkeletonNorm +from .bcn_pipeline import GetBcnBgmTrainLabel __all__ = [ 'ImageDecoder', 'RandomMask', 'UniformCrop', 'SkeletonNorm', 'Tokenize', @@ -35,5 +36,6 @@ 'GroupResize', 'VideoDecoder', 'FrameDecoder', 'PackOutput', 'GetVideoLabel', 'Cutmix', 'CenterCrop', 'RandomCrop', 'LoadFeat', 'RandomCap', 'JitterScale', 'Iden', 'VideoMix', 'ColorJitter', 'RandomFlip', - 'ToArray', 'FeaturePadding', 'GetMatchMap', 'GroupRandomFlip', 'MultiCrop' + 'ToArray', 'FeaturePadding', 'GetMatchMap', 'GroupRandomFlip', 'MultiCrop', + 'GetBcnBgmTrainLabel' ] diff --git a/paddlevideo/loader/pipelines/bcn_pipeline.py b/paddlevideo/loader/pipelines/bcn_pipeline.py new file mode 100644 index 000000000..cc5b920c0 --- /dev/null +++ b/paddlevideo/loader/pipelines/bcn_pipeline.py @@ -0,0 +1,135 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +# 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import numpy as np +import paddle +from ..registry import PIPELINES +"""pipeline ops for BCN Net. +""" + + +@PIPELINES.register() +class GetBcnBgmTrainLabel(object): + """Get train label for bcn_bgm_model.""" + + def __init__(self): + pass + + def __call__(self, result): + new_results = dict() + + # get pipeline parameter + pipeline_parameter = result['pipeline_parameter'] + self.use_full = pipeline_parameter['use_full'] + self.resized_temporal_scale = pipeline_parameter[ + 'resized_temporal_scale'] + self.bg_class = pipeline_parameter['bg_class'] + self.boundary_ratio = pipeline_parameter['boundary_ratio'] + + # get train_label + match_score_start, match_score_end = self._get_train_label(result['target_tensor'], \ + result['anchor_xmin'], result['anchor_xmax']) + match_score = paddle.concat( + (match_score_start.unsqueeze(0), match_score_end.unsqueeze(0)), 0) + match_score = paddle.max(match_score, 0) + + # get new_results + new_results['feature_tensor'] = result['feature_tensor'] + new_results['match_score'] = match_score + new_results['video_name'] = result['video_name'] + + return new_results + + def _get_labels_start_end_time(self, target_tensor, bg_class): + labels = [] + starts = [] + ends = [] + target = target_tensor.numpy() + last_label = target[0] + if target[0] not in bg_class: + labels.append(target[0]) + starts.append(0) + + for i in range(np.shape(target)[0]): + if target[i] != last_label: + if target[i] not in bg_class: + labels.append(target[i]) + starts.append(i) + if last_label not in bg_class: + ends.append(i) + last_label = target[i] + + if last_label not in bg_class: + ends.append(np.shape(target)[0] - 1) + return labels, starts, ends + + def _get_train_label(self, target_tensor, anchor_xmin, anchor_xmax): + total_frame = target_tensor.shape[0] + if self.use_full: + temporal_gap = 1.0 / total_frame + else: + temporal_gap = 1.0 / self.resized_temporal_scale + gt_label, gt_starts, gt_ends = self._get_labels_start_end_time( + target_tensor, self.bg_class) # original length + gt_label, gt_starts, gt_ends = np.array(gt_label), np.array( + gt_starts), np.array(gt_ends) + gt_starts, gt_ends = gt_starts.astype(np.float), gt_ends.astype( + np.float) + gt_starts, gt_ends = gt_starts / total_frame, gt_ends / total_frame # length to 0~1 + + gt_lens = gt_ends - gt_starts + gt_len_small = np.maximum(temporal_gap, self.boundary_ratio * gt_lens) + gt_start_bboxs = np.stack( + (gt_starts - gt_len_small / 2, gt_starts + gt_len_small / 2), + axis=1) + gt_end_bboxs = np.stack( + (gt_ends - gt_len_small / 2, gt_ends + gt_len_small / 2), axis=1) + + match_score_start = [] + for jdx in range(len(anchor_xmin)): + match_score_start.append( + np.max( + self._ioa_with_anchors(anchor_xmin[jdx], anchor_xmax[jdx], + gt_start_bboxs[:, 0], + gt_start_bboxs[:, 1]))) + match_score_end = [] + for jdx in range(len(anchor_xmin)): + match_score_end.append( + np.max( + self._ioa_with_anchors(anchor_xmin[jdx], anchor_xmax[jdx], + gt_end_bboxs[:, 0], + gt_end_bboxs[:, 1]))) + match_score_start = paddle.to_tensor(match_score_start) + match_score_end = paddle.to_tensor(match_score_end) + return match_score_start, match_score_end + + def _ioa_with_anchors(self, anchors_min, anchors_max, box_min, box_max): + len_anchors = anchors_max - anchors_min + int_xmin = np.maximum(anchors_min, box_min) + int_xmax = np.minimum(anchors_max, box_max) + inter_len = np.maximum(int_xmax - int_xmin, 0.0) + scores = np.divide(inter_len, len_anchors) + return scores + + +@PIPELINES.register() +class BcnModelPipeline(object): + """BCN main model do not need pipeline.""" + + def __init__(self): + pass + + def __call__(self, result): + return result diff --git a/paddlevideo/metrics/__init__.py b/paddlevideo/metrics/__init__.py index f1a5616ed..b00e6056b 100644 --- a/paddlevideo/metrics/__init__.py +++ b/paddlevideo/metrics/__init__.py @@ -22,9 +22,10 @@ from .skeleton_metric import SkeletonMetric from .transnetv2_metric import TransNetV2Metric from .youtube8m.eval_util import HitOneMetric +from .bcn_metric import BcnBgmMetric, BcnModelMetric __all__ = [ 'METRIC', 'build_metric', 'MultiCropMetric', 'BMNMetric', 'CenterCropMetric', 'SkeletonMetric', 'HitOneMetric', 'TransNetV2Metric', - 'DepthMetric', 'MSRVTTMetric' + 'DepthMetric', 'MSRVTTMetric', 'BcnBgmMetric', 'BcnModelMetric' ] diff --git a/paddlevideo/metrics/bcn_metric.py b/paddlevideo/metrics/bcn_metric.py new file mode 100644 index 000000000..38aa5262e --- /dev/null +++ b/paddlevideo/metrics/bcn_metric.py @@ -0,0 +1,386 @@ +# Copyright (c) 2020 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +import os +import json +import numpy as np +import pandas as pd +import paddle +import csv + +from .registry import METRIC +from .base import BaseMetric +from paddlevideo.utils import get_logger + +logger = get_logger("paddlevideo") + + +def BGM_cal_P_R(y, BGM_output): + """Calculate precession and recall, only use in BCN_bgm. + """ + precision, recall = cal_P_R(BGM_output, y) + return precision, recall + + +def cal_P_R(anchors, scores, acc_threshold=0.5): + """Calculate precession and recall by anchors and scores. + """ + scores = paddle.reshape(scores, [scores.shape[-1]]) + anchors = paddle.reshape(anchors, [anchors.shape[-1]]) + # output = (anchors > acc_threshold).int().cpu() + output = paddle.cast((anchors > acc_threshold), 'int64').cpu() + # gt=(scores > acc_threshold).int().cpu() + gt = paddle.cast((scores > acc_threshold), 'int64').cpu() + TP = 0.0 + FP = 0.0 + FN = 0.0 + if scores.shape[0] == 0: + return 0.0, 0.0 + for i in range(scores.shape[0]): + if output[i] == 1: + if output[i] == gt[i]: + TP = TP + 1 + else: + FP = FP + 1 + else: + if gt[i] == 1: + FN = FN + 1 + if (TP + FP) == 0: + return 0.0, 0.0 + precision = TP / (TP + FP) + recall = TP / (TP + FN) + return precision, recall + + +@METRIC.register +class BcnBgmMetric(BaseMetric): + """ + Metrics for bgm model of BCN + """ + + def __init__(self, data_size, batch_size, log_interval=1): + """ + Init for BCN metrics. + """ + super().__init__(data_size, batch_size, log_interval) + self.sum_precision = 0. + self.sum_recall = 0. + self.cnt4data = 0 + + def update(self, batch_id, data, outputs): + """update metrics during each iter + """ + batch_precision, batch_recall = BGM_cal_P_R(data['match_score'], + outputs) + self.sum_precision += batch_precision + self.sum_recall += batch_recall + self.cnt4data += 1 + # f1_score = 2 * (batch_precision * batch_recall) / (batch_precision + batch_recall) + # if batch_id % self.log_interval == 0: + # logger.info("Processing................ batch {}, f1 {}".format(batch_id, f1_score)) + + def accumulate(self): + """accumulate metrics when finished all iters. + """ + f1_score = 2 * ((self.sum_precision / self.cnt4data) * (self.sum_recall / self.cnt4data)) / \ + ((self.sum_precision / self.cnt4data) + (self.sum_recall / self.cnt4data)) + logger.info("Processing................ \t acc:{:.4f}\t recall:{:.4f}\t f1:{:.4f}".format(\ + (self.sum_precision / self.cnt4data), (self.sum_recall / self.cnt4data), f1_score)) + # reset + self.sum_precision = 0. + self.sum_recall = 0. + self.cnt4data = 0 + + return f1_score + + +def get_labels_start_end_time(frame_wise_labels, bg_class=["background"]): + """Get each segment of [label, start_time, end_time]. + """ + labels = [] + starts = [] + ends = [] + last_label = frame_wise_labels[0] + if frame_wise_labels[0] not in bg_class: + labels.append(frame_wise_labels[0]) + starts.append(0) + for i in range(len(frame_wise_labels)): + if frame_wise_labels[i] != last_label: + if frame_wise_labels[i] not in bg_class: + labels.append(frame_wise_labels[i]) + starts.append(i) + if last_label not in bg_class: + ends.append(i) + last_label = frame_wise_labels[i] + if last_label not in bg_class: + ends.append(i + 1) + return labels, starts, ends + + +def levenstein(p, y, norm=False): + """Calculate edit score. + """ + m_row = len(p) + n_col = len(y) + D = np.zeros([m_row + 1, n_col + 1], np.float) + for i in range(m_row + 1): + D[i, 0] = i + for i in range(n_col + 1): + D[0, i] = i + + for j in range(1, n_col + 1): + for i in range(1, m_row + 1): + if y[j - 1] == p[i - 1]: + D[i, j] = D[i - 1, j - 1] + else: + D[i, j] = min(D[i - 1, j] + 1, D[i, j - 1] + 1, + D[i - 1, j - 1] + 1) + + if norm: + score = (1 - D[-1, -1] / max(m_row, n_col)) * 100 + else: + score = D[-1, -1] + + return score + + +def edit_score(recognized, ground_truth, norm=True, bg_class=["background"]): + """Get labels and calculate edit score. + """ + P, _, _ = get_labels_start_end_time(recognized, bg_class) + Y, _, _ = get_labels_start_end_time(ground_truth, bg_class) + return levenstein(P, Y, norm) + + +def f_score(recognized, ground_truth, overlap, bg_class=["background"]): + """Calculate f-score. + """ + p_label, p_start, p_end = get_labels_start_end_time(recognized, bg_class) + y_label, y_start, y_end = get_labels_start_end_time(ground_truth, bg_class) + + tp = 0 + fp = 0 + + hits = np.zeros(len(y_label)) + + for j in range(len(p_label)): + intersection = np.minimum(p_end[j], y_end) - np.maximum( + p_start[j], y_start) + union = np.maximum(p_end[j], y_end) - np.minimum(p_start[j], y_start) + IoU = (1.0 * intersection / union) * ( + [p_label[j] == y_label[x] for x in range(len(y_label))]) + # Get the best scoring segment + idx = np.array(IoU).argmax() + + if IoU[idx] >= overlap and not hits[idx]: + tp += 1 + hits[idx] = 1 + else: + fp += 1 + fn = len(y_label) - sum(hits) + return float(tp), float(fp), float(fn) + + +def create_csv(path): + """Create csv file. + """ + dir_path = '/'.join(path.split('/')[:-1]) + if not os.path.exists(dir_path): + os.makedirs(dir_path) + with open(path, "w+", newline='') as file: + csv_file = csv.writer(file) + head = ["Acc", "Edit", "F1@10", "F1@25", "F1@50"] + csv_file.writerow(head) + + +def append_csv(path, metric_list): + """Additional written to csv file. + """ + with open(path, "a+", newline='' + ) as file: # 处理csv读写时不同换行符 linux:\n windows:\r\n mac:\r + csv_file = csv.writer(file) + datas = [metric_list] + csv_file.writerows(datas) + + +@METRIC.register +class BcnModelMetric(BaseMetric): + """ + For Video Segmentation main model. + """ + + def __init__(self, + data_size, + batch_size, + overlap, + actions_map_file_path, + log_path, + dataset, + log_interval=1): + """prepare for metrics + """ + super().__init__(data_size, batch_size, log_interval) + # actions dict generate + file_ptr = open(actions_map_file_path, 'r') + actions = file_ptr.read().split('\n')[:-1] + file_ptr.close() + self.actions_dict = dict() + for a in actions: + self.actions_dict[a.split()[1]] = int(a.split()[0]) + + if os.path.exists(log_path): + os.remove(log_path) + create_csv(log_path) + self.log_path = log_path + + self.overlap = overlap + self.overlap_len = len(overlap) + + bg_class = ["action_start", "action_end"] + if dataset == 'gtea': + bg_class = ['background'] + if dataset == 'breakfast': + bg_class = ['SIL'] + self.bg_class = bg_class + + self.total_tp = np.zeros(self.overlap_len) + self.total_fp = np.zeros(self.overlap_len) + self.total_fn = np.zeros(self.overlap_len) + self.total_correct = 0 + self.total_edit = 0 + self.total_frame = 0 + self.total_video = 0 + + def update(self, batch_id, data, outputs): + """update metrics during each iter + """ + groundTruth = data['target_tensor'] + + outputs_np = outputs.cpu().detach().numpy() + gt_np = groundTruth.cpu().detach().numpy()[0, :] + + recognition = [] + for i in range(outputs_np.shape[0]): + recognition = np.concatenate((recognition, [ + list(self.actions_dict.keys())[list( + self.actions_dict.values()).index(outputs_np[i])] + ])) + recog_content = list(recognition) + + gt_content = [] + for i in range(gt_np.shape[0]): + gt_content = np.concatenate((gt_content, [ + list(self.actions_dict.keys())[list( + self.actions_dict.values()).index(gt_np[i])] + ])) + gt_content = list(gt_content) + + tp, fp, fn = np.zeros(self.overlap_len), np.zeros( + self.overlap_len), np.zeros(self.overlap_len) + + correct = 0 + total = 0 + edit = 0 + + for i in range(len(gt_content)): + total += 1 + #accumulate + self.total_frame += 1 + + if gt_content[i] == recog_content[i]: + correct += 1 + #accumulate + self.total_correct += 1 + + edit_num = edit_score(recog_content, gt_content, bg_class=self.bg_class) + edit += edit_num + self.total_edit += edit_num + + for s in range(self.overlap_len): + tp1, fp1, fn1 = f_score(recog_content, + gt_content, + self.overlap[s], + bg_class=self.bg_class) + tp[s] += tp1 + fp[s] += fp1 + fn[s] += fn1 + + # accumulate + self.total_tp[s] += tp1 + self.total_fp[s] += fp1 + self.total_fn[s] += fn1 + + # accumulate + self.total_video += 1 + + Acc = 100 * float(correct) / total + Edit = (1.0 * edit) / 1.0 + Fscore = dict() + for s in range(self.overlap_len): + precision = tp[s] / float(tp[s] + fp[s]) + recall = tp[s] / float(tp[s] + fn[s]) + + f1 = 2.0 * (precision * recall) / (precision + recall) + + f1 = np.nan_to_num(f1) * 100 + Fscore[self.overlap[s]] = f1 + + # preds ensemble + # if batch_id % self.log_interval == 0: + # logger.info("batch_id:[{:d}] model performence".format(batch_id)) + # logger.info("Acc: {:.4f}".format(Acc)) + # logger.info('Edit: {:.4f}'.format(Edit)) + # for s in range(len(self.overlap)): + # logger.info('F1@{:0.2f}: {:.4f}'.format( + # self.overlap[s], Fscore[self.overlap[s]])) + + def accumulate(self): + """accumulate metrics when finished all iters. + """ + Acc = 100 * float(self.total_correct) / self.total_frame + Edit = (1.0 * self.total_edit) / self.total_video + Fscore = dict() + for s in range(self.overlap_len): + precision = self.total_tp[s] / float(self.total_tp[s] + + self.total_fp[s]) + recall = self.total_tp[s] / float(self.total_tp[s] + + self.total_fn[s]) + + f1 = 2.0 * (precision * recall) / (precision + recall) + + f1 = np.nan_to_num(f1) * 100 + Fscore[self.overlap[s]] = f1 + + # preds ensemble + logger.info("dataset model performence:") + logger.info("Acc: {:.4f}".format(Acc)) + logger.info('Edit: {:.4f}'.format(Edit)) + for s in range(len(self.overlap)): + logger.info('F1@{:0.2f}: {:.4f}'.format(self.overlap[s], + Fscore[self.overlap[s]])) + + # clear for next epoch + self.total_tp = np.zeros(self.overlap_len) + self.total_fp = np.zeros(self.overlap_len) + self.total_fn = np.zeros(self.overlap_len) + self.total_correct = 0 + self.total_edit = 0 + self.total_frame = 0 + self.total_video = 0 + + # log metric + metric_list = [Acc, Edit] + for s in range(self.overlap_len): + metric_list.append(Fscore[self.overlap[s]]) + append_csv(self.log_path, metric_list) + + return [Acc, Edit, Fscore] diff --git a/paddlevideo/modeling/backbones/__init__.py b/paddlevideo/modeling/backbones/__init__.py index cc341f220..716f3d9a3 100644 --- a/paddlevideo/modeling/backbones/__init__.py +++ b/paddlevideo/modeling/backbones/__init__.py @@ -25,9 +25,11 @@ from .transnetv2 import TransNetV2 from .vit import VisionTransformer from .vit_tweaks import VisionTransformer_tweaks +from .bcn import BcnBgm, BcnModel __all__ = [ 'ResNet', 'ResNetTSM', 'ResNetTweaksTSM', 'ResNetSlowFast', 'BMN', 'ResNetTweaksTSN', 'VisionTransformer', 'STGCN', 'AGCN', 'TransNetV2', - 'ADDS_DepthNet', 'VisionTransformer_tweaks', 'BertForMultiModalPreTraining' + 'ADDS_DepthNet', 'VisionTransformer_tweaks', 'BertForMultiModalPreTraining', + 'BcnBgm', 'BcnModel' ] diff --git a/paddlevideo/modeling/backbones/bcn.py b/paddlevideo/modeling/backbones/bcn.py new file mode 100644 index 000000000..bd821428f --- /dev/null +++ b/paddlevideo/modeling/backbones/bcn.py @@ -0,0 +1,527 @@ +# Copyright (c) 2020 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math +import numpy as np +import paddle +import paddle.nn.functional as F +import paddle.nn as nn +import copy +from ..registry import BACKBONES + + +def _calculate_fan_in_and_fan_out(tensor): + dimensions = len(tensor.shape) + if dimensions < 2: + raise ValueError("Fan in and fan out can not be computed \ + for tensor with fewer than 2 dimensions") + + if dimensions == 2: # Linear + fan_in = tensor.shape[1] + fan_out = tensor.shape[0] + else: + num_input_fmaps = tensor.shape[1] + num_output_fmaps = tensor.shape[0] + receptive_field_size = 1 + if tensor.dim() > 2: + receptive_field_size = tensor[0][0].numel() + fan_in = num_input_fmaps * receptive_field_size + fan_out = num_output_fmaps * receptive_field_size + + return fan_in, fan_out + + +def calculate_gain(nonlinearity=None, a=None): + """calculate_gain like torch + """ + if nonlinearity == 'tanh': + return 5.0 / 3 + elif nonlinearity == 'relu': + return math.sqrt(2.0) + elif nonlinearity == 'leaky_relu': + if a is not None: + return math.sqrt(2.0 / (1 + a**2)) + else: + return math.sqrt(2.0 / (1 + 0.01**2)) + elif nonlinearity == 'selu': + return 3.0 / 4 + else: + return 1 + + +def KaimingUniform_like_torch(weight_npy, + mode='fan_in', + nonlinearity='leaky_relu'): + """KaimingUniform_like_torch + """ + fan_in, fan_out = _calculate_fan_in_and_fan_out(weight_npy) + if mode == 'fan_in': + fan_mode = fan_in + else: + fan_mode = fan_out + a = math.sqrt(5.0) + gain = calculate_gain(nonlinearity=nonlinearity, a=a) + std = gain / math.sqrt(fan_mode) + bound = math.sqrt(3.0) * std + return np.random.uniform(-bound, bound, weight_npy.shape) + + +def init_bias(weight_npy, bias_npy): + """init_bias like torhc + """ + fan_in, fan_out = _calculate_fan_in_and_fan_out(weight_npy) + bound = 1.0 / math.sqrt(fan_in) + return np.random.uniform(-bound, bound, bias_npy.shape) + + +class BgmDilatedResidualLayer(nn.Layer): + """mstcn layer + """ + + def __init__(self, dilation, in_channels, out_channels): + super(BgmDilatedResidualLayer, self).__init__() + self.conv_dilated = nn.Conv1D(in_channels, + out_channels, + 3, + padding=dilation, + dilation=dilation) + self.conv_1x1 = nn.Conv1D(out_channels, out_channels, 1) + self.dropout = nn.Dropout() + + def forward(self, x): + """mstcn layer forward + """ + out = F.relu(self.conv_dilated(x)) + out = self.conv_1x1(out) + out = self.dropout(out) + return (x + out) + + +class FullBGM(nn.Layer): + """FullBGM in BCN_bgm + """ + + def __init__(self): + super(FullBGM, self).__init__() + self.feat_dim = 2048 + self.batch_size = 1 + self.c_hidden = 256 + self.bgm_best_loss = 10000000 + self.bgm_best_f1 = -10000000 + self.bgm_best_precision = -10000000 + self.output_dim = 1 + self.num_layers = 3 + self.conv_in = nn.Conv1D(self.feat_dim, self.c_hidden, 1) + self.layers = nn.LayerList( + [copy.deepcopy(BgmDilatedResidualLayer(2 ** (i + 2), self.c_hidden, self.c_hidden)) \ + for i in range(self.num_layers)] + ) + self.conv_out = nn.Conv1D(self.c_hidden, self.output_dim, 1) + + def forward(self, x): + """FullBGM forward + """ + out = self.conv_in(x) + for layer in self.layers: + out = layer(out) + out = self.conv_out(out) + out = F.sigmoid(0.01 * out) + return out + + def init_weights(self): + """init_weights by kaiming uniform + """ + for layer in self.sublayers(): + if isinstance(layer, nn.Conv1D): + layer.weight.set_value( + KaimingUniform_like_torch(layer.weight).astype('float32')) + if layer.bias is not None: + layer.bias.set_value( + init_bias(layer.weight, layer.bias).astype('float32')) + + +class ResizedBGM(nn.Layer): + """ResizedBGM in BCN_bgm + """ + + def __init__(self, dataset): + super(ResizedBGM, self).__init__() + self.feat_dim = 2048 + if dataset == 'breakfast' or dataset == 'gtea': + self.temporal_dim = 300 + elif dataset == '50salads': + self.temporal_dim = 400 + self.batch_size = 40 + self.batch_size_test = 10 + self.c_hidden = 512 + self.bgm_best_loss = 10000000 + self.bgm_best_f1 = -10000000 + self.output_dim = 1 + self.conv1 = nn.Conv1D(in_channels=self.feat_dim, + out_channels=self.c_hidden, + kernel_size=3, + stride=1, + padding=1, + groups=1) + self.conv2 = nn.Conv1D(in_channels=self.c_hidden, + out_channels=self.c_hidden, + kernel_size=3, + stride=1, + padding=1, + groups=1) + self.conv3 = nn.Conv1D(in_channels=self.c_hidden, + out_channels=self.output_dim, + kernel_size=1, + stride=1, + padding=0) + + def forward(self, x): + """ResizedBGM forward + """ + x = F.relu(self.conv1(x)) + x = F.relu(self.conv2(x)) + x = F.sigmoid(self.conv3(x)) + return x + + def init_weights(self): + """init_weights by kaiming uniform + """ + for layer in self.sublayers(): + if isinstance(layer, nn.Conv1D): + layer.weight.set_value( + KaimingUniform_like_torch(layer.weight).astype('float32')) + if layer.bias is not None: + layer.bias.set_value( + init_bias(layer.weight, layer.bias).astype('float32')) + + +@BACKBONES.register() +class BcnBgm(nn.Layer): + """for BCN_bgm + """ + + def __init__(self, dataset, use_full): + super(BcnBgm, self).__init__() + if use_full: + self.bgm = FullBGM() + else: + self.bgm = ResizedBGM(dataset) + + def init_weights(self): + """init_weights by kaiming uniform + """ + for layer in self.sublayers(): + if isinstance(layer, nn.Conv1D): + layer.weight.set_value( + KaimingUniform_like_torch(layer.weight).astype('float32')) + if layer.bias is not None: + layer.bias.set_value( + init_bias(layer.weight, layer.bias).astype('float32')) + + def forward(self, x): + """bgm forward + """ + return self.bgm(x) + + +class SingleStageModel(nn.Layer): + """SingleStageModel in mstcn + """ + + def __init__(self, num_layers, num_f_maps, dim, num_classes): + super(SingleStageModel, self).__init__() + self.conv_1x1 = nn.Conv1D(dim, num_f_maps, 1) + self.layers = nn.LayerList([ + copy.deepcopy(DilatedResidualLayer(2**i, num_f_maps, num_f_maps)) + for i in range(num_layers) + ]) + self.conv_out = nn.Conv1D(num_f_maps, num_classes, 1) + + def forward(self, x, mask): + """forward + """ + feature = self.conv_1x1(x) + for layer in self.layers: + feature = layer(feature, mask) + out = self.conv_out(feature) * mask[:, 0:1, :] + return out, feature * mask[:, 0:1, :] + + +class DilatedResidualLayer(nn.Layer): + """DilatedResidualLayer in mstcn + """ + + def __init__(self, dilation, in_channels, out_channels): + super(DilatedResidualLayer, self).__init__() + self.conv_dilated = nn.Conv1D(in_channels, + out_channels, + 3, + padding=dilation, + dilation=dilation) + self.conv_1x1 = nn.Conv1D(out_channels, out_channels, 1) + self.dropout = nn.Dropout() # default value is 0.5 + self.bn = nn.BatchNorm1D(in_channels, + epsilon=1e-08, + momentum=0.1, + use_global_stats=True) + + def forward(self, x, mask, use_bn=False): + """forward + """ + out = F.relu(self.conv_dilated(x)) + out = self.conv_1x1(out) + if use_bn: + out = self.bn(out) + else: + out = self.dropout(out) + return (x + out) * mask[:, 0:1, :] + + +def MultiplyList(myList): + """multiplyList + """ + result = 1 + for x in myList: + result = result * x + return [result] + + +@BACKBONES.register() +class BcnModel(nn.Layer): + def __init__(self, num_stages, num_layers, num_f_maps, dim, num_classes, dataset, use_lbp, num_soft_lbp, \ + pretrained=None): + super(BcnModel, self).__init__() + self.num_stages = num_stages # number of cascade stages + self.stage1 = SingleStageModel(num_layers, num_f_maps, dim, + num_classes) # cascade stage 1 + stages = [ + copy.deepcopy( + SingleStageModel(num_layers, num_f_maps, + dim + (s + 1) * num_f_maps, num_classes)) + for s in range(num_stages - 1) + ] + self.stages = nn.LayerList(stages) # cascade stage 2,...,n + self.stageF = SingleStageModel(num_layers, 64, num_classes, + num_classes) # fusion stage + self.bgm = FullBGM() + self.lbp_in = LocalBarrierPooling(7, alpha=1) + self.use_lbp = use_lbp + self.num_soft_lbp = num_soft_lbp + self.num_classes = num_classes + if dataset == '50salads': + self.lbp_out = LocalBarrierPooling(99, alpha=0.2) # has lbp_post + if dataset == 'breakfast': + self.lbp_out = LocalBarrierPooling(159, alpha=0.3) # has lbp_post + if dataset == 'gtea': + self.lbp_out = LocalBarrierPooling( + 99, alpha=1 + ) # no lbp_post for gtea (because of bad barrier quality of resized BGM due to small dataset size), so alpha=1 + + def init_weights(self): + """init_weights by kaiming uniform + """ + for layer in self.sublayers(): + if isinstance(layer, nn.Conv1D): + layer.weight.set_value( + KaimingUniform_like_torch(layer.weight).astype('float32')) + if layer.bias is not None: + layer.bias.set_value( + init_bias(layer.weight, layer.bias).astype('float32')) + + def forward(self, x, mask, gt_target=None, soft_threshold=0.8): + """ forward""" + mask.stop_gradient = True + x.stop_gradient = True + adjusted_weight = mask[:, 0:1, :].clone().detach().unsqueeze( + 0) # weights for SC + for i in range(self.num_stages - 1): + adjusted_weight = paddle.concat( + (adjusted_weight, mask[:, + 0:1, :].clone().detach().unsqueeze(0))) + confidence = [] + feature = [] + if gt_target is not None: + gt_target = gt_target.unsqueeze(0) + + # stage 1 + out1, feature1 = self.stage1(x, mask) + outputs = out1.unsqueeze(0) + feature.append(feature1) + confidence.append(F.softmax(out1, axis=1) * mask[:, 0:1, :]) + confidence[0].stop_gradient = True + + if gt_target is None: + max_conf = paddle.max(confidence[0], axis=1) + max_conf = max_conf.unsqueeze(1).clone().detach() + max_conf.stop_gradient = True + decrease_flag = (max_conf > soft_threshold) + decrease_flag = paddle.cast(decrease_flag, 'float32') + increase_flag = mask[:, 0:1, :].clone().detach() - decrease_flag + adjusted_weight[1] = max_conf.neg().exp( + ) * decrease_flag + max_conf.exp() * increase_flag # for stage 2 + else: + one_hot = F.one_hot(gt_target[0], self.num_classes) + gt_conf = ((confidence[0] * + paddle.transpose(one_hot, [0, 2, 1])).sum(1))[0] + gt_conf = paddle.to_tensor(gt_conf).unsqueeze(0).unsqueeze(0) + decrease_flag = (gt_conf > soft_threshold) + decrease_flag = paddle.cast(decrease_flag, 'float32') + increase_flag = mask[:, 0:1, :].clone().detach() - decrease_flag + adjusted_weight[1] = gt_conf.neg().exp( + ) * decrease_flag + gt_conf.exp() * increase_flag + + # stage 2,...,n + curr_stage = 0 + for s in self.stages: + # for s_i in range(self.num_stages - 2): + curr_stage = curr_stage + 1 + temp = feature[0] + for i in range(1, len(feature)): + temp = paddle.concat( + (temp, feature[i]), axis=1) * mask[:, 0:1, :] + temp = paddle.concat((temp, x), axis=1) + curr_out, curr_feature = s(temp, mask) + outputs = paddle.concat((outputs, curr_out.unsqueeze(0)), axis=0) + feature.append(curr_feature) + confidence.append(F.softmax(curr_out, axis=1) * mask[:, 0:1, :]) + confidence[curr_stage].stop_gradient = True + if curr_stage < self.num_stages - 1: # curr_stage starts from 0 + + if gt_target is None: + max_conf = paddle.max(confidence[curr_stage], axis=1) + max_conf = max_conf.unsqueeze(1).clone().detach() + max_conf.stop_gradient = True + decrease_flag = (max_conf > soft_threshold) + decrease_flag = paddle.cast(decrease_flag, 'float32') + increase_flag = mask[:, 0:1, :].clone().detach( + ) - decrease_flag + adjusted_weight[curr_stage + 1] = max_conf.neg().exp( + ) * decrease_flag + max_conf.exp( + ) * increase_flag # output the weight for the next stage + else: + one_hot = F.one_hot(gt_target[0], self.num_classes) + gt_conf = ((confidence[curr_stage] * + paddle.transpose(one_hot, [0, 2, 1])).sum(1))[0] + gt_conf = paddle.to_tensor(gt_conf).unsqueeze(0).unsqueeze( + 0) + decrease_flag = (gt_conf > soft_threshold) + decrease_flag = paddle.cast(decrease_flag, 'float32') + increase_flag = mask[:, 0:1, :].clone().detach( + ) - decrease_flag + adjusted_weight[curr_stage + 1] = gt_conf.neg().exp( + ) * decrease_flag + gt_conf.exp() * increase_flag + + output_weight = adjusted_weight.detach() + output_weight.stop_gradient = True + adjusted_weight = adjusted_weight / paddle.sum( + adjusted_weight, 0) # normalization among stages + temp = F.softmax(out1, axis=1) * adjusted_weight[0] + for i in range(1, self.num_stages): + temp += F.softmax(outputs[i], axis=1) * adjusted_weight[i] + confidenceF = temp * mask[:, 0:1, :] # input of fusion stage + + # Inner LBP for confidenceF + barrier, BGM_output = self.fullBarrier(x) + if self.use_lbp: + confidenceF = self.lbp_in(confidenceF, barrier) + + # fusion stage: for more consistent output because of the combination of cascade stages may have much fluctuations + out, _ = self.stageF(confidenceF, mask) # use mixture of cascade stages + + # Final LBP for output + if self.use_lbp: + for i in range(self.num_soft_lbp): + out = self.lbp_out(out, barrier) + + confidence_last = paddle.clip( + F.softmax(out, axis=1), min=1e-4, max=1 - + 1e-4) * mask[:, 0:1, :] # torch.clamp for training stability + outputs = paddle.concat((outputs, confidence_last.unsqueeze(0)), axis=0) + return outputs, BGM_output, output_weight + + def fullBarrier(self, feature_tensor): + """fullBarrier + """ + BGM_output = self.bgm(feature_tensor) + barrier = BGM_output + return barrier, BGM_output + + +def im2col(input_data, kh, kw, stride=1, pad=0, dilation=1): + """ + calculate im2col + """ + N, C, H, W = input_data.shape + dh, dw = dilation * (kh - 1) + 1, dilation * (kw - 1) + 1 + h_out = (H + 2 * pad - dh) // stride + 1 + w_out = (W + 2 * pad - dw) // stride + 1 + img = F.pad(input_data, [pad, pad, pad, pad], "constant", value=0) + col = paddle.zeros((N, C, dh, dw, h_out, w_out)) + + for y in range(dh): + y_max = y + stride * h_out + for x in range(dw): + x_max = x + stride * w_out + col[:, :, y, x, :, :] += img[:, :, y:y_max:stride, x:x_max:stride] + res = col.reshape([N, C * dh * dw, h_out * w_out]) + return res + + +def unfold_1d(x, kernel_size=7, pad_value=0): + """unfold_1d + """ + B, C, T = x.shape + padding = kernel_size // 2 + x = x.unsqueeze(-1) + x = F.pad(x, (0, 0, padding, padding), value=pad_value) + x = paddle.cast(x, 'float32') + D = F.unfold(x, [kernel_size, 1]) + # D = im2col(x, kernel_size, 1) + return paddle.reshape(D, [B, C, kernel_size, T]) + + +def dual_barrier_weight(b, kernel_size=7, alpha=0.2): + """dual_barrier_weight + """ + K = kernel_size + b = unfold_1d(b, kernel_size=K, pad_value=20) + # b: (B, 1, K, T) + HL = K // 2 + left = paddle.flip( + paddle.cumsum(paddle.flip(b[:, :, :HL + 1, :], [2]), axis=2), + [2])[:, :, :-1, :] + right = paddle.cumsum(b[:, :, -HL - 1:, :], axis=2)[:, :, 1:, :] + middle = paddle.zeros_like(b[:, :, 0:1, :]) + #middle = b[:, :, HL:-HL, :] + weight = alpha * paddle.concat((left, middle, right), axis=2) + return weight.neg().exp() + + +class LocalBarrierPooling(nn.Layer): + """LBP in BCN paper + """ + + def __init__(self, kernel_size=99, alpha=0.2): + super(LocalBarrierPooling, self).__init__() + self.kernel_size = kernel_size + self.alpha = alpha + + def forward(self, x, barrier): + """ + x: (B, C, T) + barrier: (B, 1, T) (>=0) + """ + xs = unfold_1d(x, self.kernel_size) + w = dual_barrier_weight(barrier, self.kernel_size, self.alpha) + return (xs * w).sum(axis=2) / ((w).sum(axis=2) + np.exp(-10)) diff --git a/paddlevideo/modeling/builder.py b/paddlevideo/modeling/builder.py index b026aadbd..84e6f88ed 100644 --- a/paddlevideo/modeling/builder.py +++ b/paddlevideo/modeling/builder.py @@ -15,7 +15,8 @@ from ..utils import build from .registry import (BACKBONES, BBOX_ASSIGNERS, BBOX_CODERS, BBOX_SAMPLERS, DETECTORS, ESTIMATORS, HEADS, LOCALIZERS, LOSSES, - MULTIMODAL, PARTITIONERS, RECOGNIZERS, ROI_EXTRACTORS) + MULTIMODAL, PARTITIONERS, RECOGNIZERS, ROI_EXTRACTORS, + SEGMENTERS) def build_backbone(cfg): @@ -93,6 +94,11 @@ def build_multimodal(cfg): return build(cfg, MULTIMODAL, key='framework') +def build_segmenter(cfg): + """Build segmenter.""" + return build(cfg, SEGMENTERS, key='framework') + + def build_model(cfg): cfg_copy = cfg.copy() framework_type = cfg_copy.get('framework') @@ -108,5 +114,7 @@ def build_model(cfg): return build_estimator(cfg) elif framework_type in MULTIMODAL: return build_multimodal(cfg) + elif framework_type in SEGMENTERS: + return build_segmenter(cfg) else: raise NotImplementedError diff --git a/paddlevideo/modeling/framework/__init__.py b/paddlevideo/modeling/framework/__init__.py index 2670bf268..2092b9b9c 100644 --- a/paddlevideo/modeling/framework/__init__.py +++ b/paddlevideo/modeling/framework/__init__.py @@ -17,9 +17,10 @@ from .partitioners import BasePartitioner, TransNetV2Partitioner from .recognizers import BaseRecognizer, Recognizer2D from .multimodal import ActBert, BaseMultimodal +from .segmenters import BcnBgm, BcnModel __all__ = [ 'BaseRecognizer', 'Recognizer2D', 'BaseLocalizer', 'BMNLocalizer', 'BasePartitioner', 'TransNetV2Partitioner', 'BaseEstimator', - 'DepthEstimator', 'BaseMultimodal', 'ActBert' + 'DepthEstimator', 'BaseMultimodal', 'ActBert', 'BcnBgm', 'BcnModel' ] diff --git a/paddlevideo/modeling/framework/segmenters/__init__.py b/paddlevideo/modeling/framework/segmenters/__init__.py new file mode 100644 index 000000000..19fa726e1 --- /dev/null +++ b/paddlevideo/modeling/framework/segmenters/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) 2020 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +from .base import BaseSegmenter +from .bcn import BcnBgm, BcnModel + +__all__ = ["BaseSegmenter", "BcnBgm", "BcnModel"] diff --git a/paddlevideo/modeling/framework/segmenters/base.py b/paddlevideo/modeling/framework/segmenters/base.py new file mode 100644 index 000000000..f4670a2b1 --- /dev/null +++ b/paddlevideo/modeling/framework/segmenters/base.py @@ -0,0 +1,97 @@ +# Copyright (c) 2020 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +from abc import abstractmethod +from ... import builder +import paddle.nn as nn + + +class BaseSegmenter(nn.Layer): + """Base class for segementers. + + All segementers should subclass it. + All subclass should overwrite: + + - Methods:``train_step``, supporting to forward when training. + - Methods:``valid_step``, supporting to forward when validating. + - Methods:``test_step``, supporting to forward when testing. + + Args: + backbone (dict): Backbone modules to extract feature. + head (dict): Classification head to process feature. + loss(dict): Loss function. + + """ + + def __init__(self, backbone=None, head=None, loss=None): + + super().__init__() + if backbone is not None: + self.backbone = builder.build_backbone(backbone) + if hasattr(self.backbone, 'init_weights'): + self.backbone.init_weights() + else: + self.backbone = None + + if head is not None: + self.head_name = head.name + self.head = builder.build_head(head) + if hasattr(self.head, 'init_weights'): + self.head.init_weights() + else: + self.head = None + + if loss is not None: + self.loss = builder.build_loss(loss) + else: + self.loss = None + + def forward(self, data_batch, mode='infer'): + """ + 1. Define how the model is going to run, from input to output. + 2. Console of train, valid, test or infer step + 3. Set mode='infer' is used for saving inference model, refer to tools/export_model.py + """ + if mode == 'train': + return self.train_step(data_batch) + elif mode == 'valid': + return self.val_step(data_batch) + elif mode == 'test': + return self.test_step(data_batch) + elif mode == 'infer': + return self.infer_step(data_batch) + else: + raise NotImplementedError + + @abstractmethod + def train_step(self, data_batch, **kwargs): + """Training step. + """ + raise NotImplementedError + + @abstractmethod + def val_step(self, data_batch, **kwargs): + """Validating step. + """ + raise NotImplementedError + + @abstractmethod + def test_step(self, data_batch, **kwargs): + """Test step. + """ + raise NotImplementedError + + @abstractmethod + def infer_step(self, data_batch, **kwargs): + """Infer step. + """ + raise NotImplementedError diff --git a/paddlevideo/modeling/framework/segmenters/bcn.py b/paddlevideo/modeling/framework/segmenters/bcn.py new file mode 100644 index 000000000..749aa64d9 --- /dev/null +++ b/paddlevideo/modeling/framework/segmenters/bcn.py @@ -0,0 +1,290 @@ +# Copyright (c) 2020 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +from ...registry import SEGMENTERS +from .base import BaseSegmenter +from paddlevideo.utils import load + +import paddle +import paddle.nn.functional as F +import paddle.nn as nn +import pandas as pd +import numpy as np + + +def unfold_1d(x, kernel_size=7, pad_value=0): + """unfold_1d + """ + B, C, T = x.shape + padding = kernel_size // 2 + x = x.unsqueeze(-1) + x = F.pad(x, (0, 0, padding, padding), value=pad_value) + x = paddle.cast(x, 'float32') + D = F.unfold(x, [kernel_size, 1]) + return paddle.reshape(D, [B, C, kernel_size, T]) + + +def dual_barrier_weight(b, kernel_size=7, alpha=0.2): + """dual_barrier_weight + """ + K = kernel_size + b = unfold_1d(b, kernel_size=K, pad_value=20) + # b: (B, 1, K, T) + HL = K // 2 + left = paddle.flip( + paddle.cumsum(paddle.flip(b[:, :, :HL + 1, :], [2]), axis=2), + [2])[:, :, :-1, :] + right = paddle.cumsum(b[:, :, -HL - 1:, :], axis=2)[:, :, 1:, :] + middle = paddle.zeros_like(b[:, :, 0:1, :]) + #middle = b[:, :, HL:-HL, :] + weight = alpha * paddle.concat((left, middle, right), axis=2) + return weight.neg().exp() + + +class LocalBarrierPooling(nn.Layer): + """LocalBarrierPooling + """ + + def __init__(self, kernel_size=99, alpha=0.2): + super(LocalBarrierPooling, self).__init__() + self.kernel_size = kernel_size + self.alpha = alpha + + def forward(self, x, barrier): + """ + x: (B, C, T) + barrier: (B, 1, T) (>=0) + """ + xs = unfold_1d(x, self.kernel_size) + w = dual_barrier_weight(barrier, self.kernel_size, self.alpha) + return (xs * w).sum(axis=2) / ((w).sum(axis=2) + np.exp(-10)) + + +@SEGMENTERS.register() +class BcnBgm(BaseSegmenter): + """BCN model framework.""" + + def forward_net(self, video_feature): + """Define how the model is going to train, from input to output. + """ + feature = self.backbone(video_feature) + return feature + + def train_step(self, data_batch): + """Training step. + """ + feature, label = data_batch['feature_tensor'], data_batch['match_score'] + self.backbone.train() + outputs = self.forward_net(feature) + train_loss = self.loss(label, outputs) + loss_metrics = {} + loss_metrics['loss'] = train_loss + + return loss_metrics + + def val_step(self, data_batch): + """Validating setp. + """ + if isinstance(data_batch, dict): + feature = data_batch['feature_tensor'] + elif isinstance(data_batch, list): + feature = data_batch[0] + self.backbone.eval() + outputs = self.forward_net(feature) + + return outputs + + def test_step(self, data_batch): + """Testing setp. + """ + outputs = self.val_step(data_batch) + self.head(outputs, data_batch['video_name'][0].split('.')[0]) + + return outputs + + def infer_step(self, data_batch): + """Infering setp. + """ + outputs = self.val_step(data_batch) + + return outputs + + +@SEGMENTERS.register() +class BcnModel(BaseSegmenter): + """BCN model framework. + e.g. + data_path = ./data/50salads/splits/train.split1.bundle + bgm_result_path = ./output/BcnBgmResized/results + """ + + def __init__(self, data_path, bgm_result_path, bgm_pdparams, use_lbp, + num_post, **kwargs): + super(BcnModel, self).__init__(**kwargs) + # assert parameter + assert '//' not in data_path, "don't use '//' in data_path, please use '/'" + self.use_lbp = use_lbp + self.bgm_result_path = bgm_result_path + self.num_post = num_post + + self.iter = 0 + self.epoch = 0 + + file_ptr = open(data_path, 'r') + list_of_examples = file_ptr.read().split('\n')[:-1] + file_ptr.close() + self.epoch_iters = len(list_of_examples) + + dataset = data_path.split('/')[-3] + freeze_epochs = 15 + pooling_length = 99 + if dataset == 'breakfast': + freeze_epochs = 20 + pooling_length = 159 + elif dataset == 'gtea': + freeze_epochs = 18 + self.freeze_epochs = freeze_epochs + self.pooling_length = pooling_length + self.dataset = dataset + self.lbp = LocalBarrierPooling(pooling_length, alpha=2) + self.backbone.bgm.set_state_dict( + self.transformer_param_dict(load(bgm_pdparams))) + + def transformer_param_dict(self, param_dict): + """transformer param_dict for bgm + """ + new_param_dict = dict() + for k in param_dict.keys(): + new_param_dict['.'.join( + k.split('.')[2:])] = param_dict[k].cpu().detach().numpy() + return new_param_dict + + def update_iter(self): + """update_iter only use in train + """ + if (self.epoch == 0) and (self.iter + == 0) and (self.epoch <= self.freeze_epochs): + self.freeze(self.backbone.bgm, True) + + self.iter += 1 + if self.iter >= self.epoch_iters: + self.iter = 0 + self.epoch += 1 + if self.epoch > self.freeze_epochs: + self.freeze(self.backbone.bgm, False) + + def freeze(self, sub_layer, flag): + """freezing layer + """ + for _, param in sub_layer.named_parameters(): + param.stop_gradient = flag + + def forward_net(self, batch_input, mask, gt_target=None): + """Define how the model is going to train, from input to output. + """ + outputs, BGM_output, output_weight = self.backbone(batch_input, mask) + self.update_iter() + return outputs, BGM_output, output_weight + + def train_step(self, data_batch): + """Training step. + """ + if isinstance(data_batch, dict): + input_x, batch_target = data_batch['feature_tensor'], data_batch[ + 'target_tensor'] + mask = data_batch['mask'] + elif isinstance(data_batch, list): + input_x, batch_target = data_batch[0], data_batch[1] + mask = data_batch[2] + + predictions, _, adjust_weight = self.forward_net( + input_x, mask, batch_target) + + train_loss = self.loss(predictions, adjust_weight, batch_target, mask) + loss_metrics = {} + loss_metrics['loss'] = train_loss + + return loss_metrics + + def val_step(self, data_batch): + """Validating setp. + """ + if isinstance(data_batch, dict): + input_x = data_batch['feature_tensor'] + mask = data_batch['mask'] + video_name = data_batch['video_name'] + elif isinstance(data_batch, list): + input_x = data_batch[0] + mask = data_batch[4] + video_name = data_batch[5] + predictions, _, _ = self.forward_net(input_x, mask) + predictions = predictions[-1] + if self.use_lbp and self.dataset != 'gtea': + num_frames = np.shape(input_x)[2] + if self.dataset in ['50salads', 'breakfast']: + video_name = '/' + video_name[0].split('.')[0] + barrier_file = self.bgm_result_path + video_name + ".csv" + barrier = pd.read_csv(barrier_file) + barrier = np.transpose(np.array(barrier)) + temporal_scale = np.shape(barrier)[1] + barrier = paddle.to_tensor(barrier) + + if temporal_scale < num_frames: + interpolation = paddle.round( + paddle.to_tensor([ + float(num_frames) / temporal_scale * (i + 0.5) + for i in range(temporal_scale) + ])) + interpolation = paddle.cast(interpolation, 'int64') + resize_barrier = paddle.to_tensor([0.0] * num_frames) + resize_barrier[interpolation] = barrier[0] + resize_barrier = resize_barrier.unsqueeze(0).unsqueeze(0) + else: + resize_barrier = barrier + resize_barrier = resize_barrier.unsqueeze( + 0) # size=[1,1,num_frames] + if temporal_scale < num_frames: + for i in range(self.num_post): + predictions = self.lbp(predictions, resize_barrier) + else: + predictions = F.interpolate(predictions, size=[temporal_scale], mode='linear', \ + align_corners=False, data_format='NCW') + for i in range(self.num_post): + predictions = self.lbp(predictions, resize_barrier) + predictions = F.interpolate(predictions, size=[num_frames], mode='linear', \ + align_corners=False, data_format='NCW') + + predicted = paddle.argmax(predictions, 1) + predicted = predicted.squeeze() + return predicted + + def test_step(self, data_batch): + """Testing setp. + """ + + return self.val_step(data_batch) + + def infer_step(self, data_batch): + """Infering setp. + """ + # return self.val_step(data_batch) + if isinstance(data_batch, list): + input_x = data_batch[0] + mask = data_batch[1] + else: + input_x = data_batch + mask = paddle.ones([1, 1, input_x.shape[2]]) + + predictions, _, _ = self.forward_net(input_x, mask) + predicted = paddle.argmax(predictions, 1) + predicted = predicted.squeeze() + return predicted diff --git a/paddlevideo/modeling/heads/__init__.py b/paddlevideo/modeling/heads/__init__.py index 6fbcfccaa..5ad0f54ed 100644 --- a/paddlevideo/modeling/heads/__init__.py +++ b/paddlevideo/modeling/heads/__init__.py @@ -26,9 +26,11 @@ from .transnetv2_head import TransNetV2Head from .tsm_head import TSMHead from .tsn_head import TSNHead +from .bcn_head import BcnBgmHead __all__ = [ 'BaseHead', 'TSNHead', 'TSMHead', 'ppTSMHead', 'ppTSNHead', 'SlowFastHead', 'AttentionLstmHead', 'TimeSformerHead', 'STGCNHead', 'TransNetV2Head', - 'SingleRoIExtractor3D', 'AVARoIHead', 'BBoxHeadAVA', 'AddsHead' + 'SingleRoIExtractor3D', 'AVARoIHead', 'BBoxHeadAVA', 'AddsHead', + 'BcnBgmHead' ] diff --git a/paddlevideo/modeling/heads/bcn_head.py b/paddlevideo/modeling/heads/bcn_head.py new file mode 100644 index 000000000..765940b96 --- /dev/null +++ b/paddlevideo/modeling/heads/bcn_head.py @@ -0,0 +1,109 @@ +# Copyright (c) 2021 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle +import paddle.nn as nn +import pandas as pd +from scipy import signal +import os +import copy +import numpy as np + +from .base import BaseHead +from ..registry import HEADS +from ..weight_init import weight_init_ + + +@HEADS.register() +class BcnBgmHead(BaseHead): + """ + Head for Bcn bgm model. + Args: + just for test. + """ + + def __init__(self, + use_full, + test_mode, + results_path, + dataset, + in_channels=-1, + num_classes=-1, + **kwargs): + super().__init__(num_classes, in_channels, **kwargs) + assert test_mode in ['less', 'more'], "test_mode must be less or more" + + self.use_full = use_full + self.test_mode = test_mode + + if not os.path.exists(results_path): + os.makedirs(results_path) + self.results_path = results_path + if dataset == 'breakfast' or dataset == 'gtea': + self.temporal_dim = 300 + elif dataset == '50salads': + self.temporal_dim = 400 + + def forward(self, outputs, video_name): + """don't need any parameter, just process result and save + """ + outputs = copy.deepcopy(outputs) + outputs = outputs.cpu().detach().numpy() + columns = ["barrier"] + if self.use_full: + barrier_threshold = 0.5 + barrier = (outputs > barrier_threshold) * outputs + video_result = barrier[0] + + video_result = video_result.transpose([1, 0]) + video_df = pd.DataFrame(list(video_result), columns=columns) + video_df.to_csv(os.path.join(self.results_path, + video_name + ".csv"), + index=False) + + else: + if self.test_mode == 'less': + barrier_threshold = 0.5 + barrier = (outputs > barrier_threshold) * outputs + video_result = barrier[0] + + maximum = signal.argrelmax(video_result[0]) + flag = np.array([0] * self.temporal_dim) + flag[maximum] = 1 + + video_result = video_result * flag + video_df = pd.DataFrame(list(video_result.transpose([1, 0])), + columns=columns) + video_df.to_csv(os.path.join(self.results_path, + video_name + ".csv"), + index=False) + elif self.test_mode == 'more': + barrier = (outputs > 0.3) * outputs + high_barrier = (outputs > 0.8) + video_result = barrier[0] + maximum1 = signal.argrelmax(video_result[0]) + maximum2 = high_barrier[0] + + flag = np.array([0] * self.temporal_dim) + flag[maximum1] = 1 + flag = np.clip((flag + maximum2), 0, 1) + + video_result = video_result * flag + video_df = pd.DataFrame(list(video_result.transpose([1, 0])), + columns=columns) + video_df.to_csv(os.path.join(self.results_path, + video_name + ".csv"), + index=False) + + return None # just process and save, don't need return diff --git a/paddlevideo/modeling/losses/__init__.py b/paddlevideo/modeling/losses/__init__.py index cbe9c08ec..99b77dc79 100644 --- a/paddlevideo/modeling/losses/__init__.py +++ b/paddlevideo/modeling/losses/__init__.py @@ -18,8 +18,9 @@ from .depth_loss import ADDSLoss from .transnetv2_loss import TransNetV2Loss from .actbert_loss import ActBertLoss +from .bcn_loss import BcnBgmLoss, BcnModelLoss __all__ = [ 'CrossEntropyLoss', 'BMNLoss', 'TransNetV2Loss', 'ActBertLoss', 'ADDSLoss', - 'BaseWeightedLoss' + 'BaseWeightedLoss', 'BcnBgmLoss', 'BcnModelLoss' ] diff --git a/paddlevideo/modeling/losses/bcn_loss.py b/paddlevideo/modeling/losses/bcn_loss.py new file mode 100644 index 000000000..4a00177b5 --- /dev/null +++ b/paddlevideo/modeling/losses/bcn_loss.py @@ -0,0 +1,131 @@ +import paddle +import paddle.nn as nn +import paddle.nn.functional as F + +from ..registry import LOSSES +from .base import BaseWeightedLoss + + +def bi_loss(scores, anchors, bgm_match_threshold=0.5): + """ + cross_entropy loss + :param scores: gt + :param anchors: predict result + :param bgm_match_threshold: threshold for selecting positive samples + :return: + """ + scores = paddle.reshape(scores, [scores.shape[-1]]) + anchors = paddle.reshape(anchors, [anchors.shape[-1]]) + # pmask = (scores> bgm_match_threshold).float() + pmask = paddle.cast((scores > bgm_match_threshold), 'float32') + num_positive = paddle.sum(pmask) + num_entries = len(scores) + ratio = num_entries / num_positive + + coef_0 = 0.5 * (ratio) / (ratio - 1) + coef_1 = coef_0 * (ratio - 1) + loss = coef_1 * pmask * paddle.log(anchors + 0.00001) + \ + coef_0 * (1.0 - pmask) * paddle.log(1.0 - anchors * 0.999999) + loss = -1 * paddle.mean(loss) + num_sample = [paddle.sum(pmask), ratio] + return loss, num_sample + + +def BGM_loss_calc(anchors, match_scores): + """BGM_loss_calc + """ + loss_start_small, num_sample_start_small = bi_loss(match_scores, anchors) + loss_dict = {"loss": loss_start_small, "num_sample": num_sample_start_small} + return loss_dict + + +@LOSSES.register() +class BcnBgmLoss(BaseWeightedLoss): + """BcnBgmLoss""" + + def forward(self, label, outputs): + """Forward function. + """ + loss_dict = BGM_loss_calc(outputs, label) + return loss_dict["loss"] + + +def MultiplyList(myList): + """multiplyList + """ + result = 1 + for x in myList: + result = result * x + return [result] + + +@LOSSES.register() +class BcnModelLoss(BaseWeightedLoss): + """BcnModelLoss""" + + def __init__(self): + super().__init__() + self.maskCE = nn.CrossEntropyLoss( + ignore_index=-100, reduction='none') # for cascade stages + self.mse = nn.MSELoss(reduction='none') + self.nll = nn.NLLLoss(ignore_index=-100, + reduction='none') # for fusion stage + + def forward(self, predictions, adjust_weight, batch_target, mask): + """Forward function. + """ + loss = 0. + num_stages = len(predictions) - 1 + balance_weight = [1.0] * num_stages + batch_target = paddle.reshape(batch_target, + MultiplyList(batch_target.shape)) + + # num_stages is number of cascade stages + for num_stage in range(num_stages): + adjust_weight[num_stage].stop_gradient = True + + # balance_weight = a / b + a = paddle.sum(adjust_weight[0], 2) + a = paddle.reshape(a, MultiplyList(a.shape)) + a = paddle.cast(a, 'float32') + + b = paddle.sum(adjust_weight[num_stage], 2) + b = paddle.reshape(b, MultiplyList(b.shape)) + b = paddle.cast(b, 'float32') + + balance_weight[num_stage] = paddle.mean(a / b) + + # calculate mask ce_loss + p = predictions[num_stage] + ce_p = paddle.transpose(p, [0, 2, 1]) + ce_p = paddle.reshape( + ce_p, [ce_p.shape[0] * ce_p.shape[1], ce_p.shape[2]]) + ce_mask = adjust_weight[num_stage] + ce_mask = paddle.reshape(ce_mask, MultiplyList(ce_mask.shape)) + + ce_loss = 1 * balance_weight[num_stage] * paddle.mean( + self.maskCE(ce_p, batch_target) * ce_mask) + loss += ce_loss + + # calculate tmse + loss += 0.3 * paddle.mean( + paddle.clip(self.mse( + F.log_softmax(p[:, :, 1:], axis=1), + F.log_softmax(p.detach()[:, :, :-1], axis=1)), + min=0, + max=8) * mask[:, :, 1:]) + + # fusion stage + p = predictions[-1] + nll_p = paddle.transpose(p, [0, 2, 1]) + nll_p = paddle.reshape( + nll_p, [nll_p.shape[0] * nll_p.shape[1], nll_p.shape[2]]) + loss += paddle.mean(self.nll(paddle.log(nll_p), batch_target)) + + loss += 0.5 * paddle.mean( + paddle.clip(self.mse(F.log_softmax(p[:, :, 1:], axis=1), + F.log_softmax(p.detach()[:, :, :-1], axis=1)), + min=0, + max=8) * mask[:, :, 1:]) + + return loss diff --git a/paddlevideo/modeling/registry.py b/paddlevideo/modeling/registry.py index 4ed4ef7ed..123dec1ef 100644 --- a/paddlevideo/modeling/registry.py +++ b/paddlevideo/modeling/registry.py @@ -27,3 +27,4 @@ BBOX_CODERS = Registry('bbox_coder') ESTIMATORS = Registry('estimator') MULTIMODAL = Registry('multimodal') +SEGMENTERS = Registry('Segmenters') diff --git a/paddlevideo/solver/custom_lr.py b/paddlevideo/solver/custom_lr.py index 41f2f1eab..1611661a2 100644 --- a/paddlevideo/solver/custom_lr.py +++ b/paddlevideo/solver/custom_lr.py @@ -36,6 +36,7 @@ class CustomWarmupCosineDecay(LRScheduler): Returns: ``CosineAnnealingDecay`` instance to schedule learning rate. """ + def __init__(self, warmup_start_lr, warmup_epochs, @@ -109,6 +110,7 @@ class CustomWarmupPiecewiseDecay(LRScheduler): Returns: ``CustomWarmupPiecewiseDecay`` instance to schedule learning rate. """ + def __init__(self, warmup_start_lr, warmup_epochs, @@ -150,8 +152,10 @@ def step(self, epoch=None, rebuild=False): self.last_lr = self.get_lr() if self.verbose: - print('step Epoch {}: {} set learning rate to {}.self.num_iters={}, 1/self.num_iters={}'.format( - self.last_epoch, self.__class__.__name__, self.last_lr, self.num_iters, 1/self.num_iters)) + print( + 'step Epoch {}: {} set learning rate to {}.self.num_iters={}, 1/self.num_iters={}' + .format(self.last_epoch, self.__class__.__name__, self.last_lr, + self.num_iters, 1 / self.num_iters)) def _lr_func_steps_with_relative_lrs(self, cur_epoch, lrs, base_lr, steps, max_epoch): @@ -161,9 +165,10 @@ def _lr_func_steps_with_relative_lrs(self, cur_epoch, lrs, base_lr, steps, if cur_epoch < step: break if self.verbose: - print('_lr_func_steps_with_relative_lrs, cur_epoch {}: {}, steps {}, ind {}, step{}, max_epoch{}'.format( - cur_epoch, self.__class__.__name__, steps, ind, step, max_epoch )) - + print( + '_lr_func_steps_with_relative_lrs, cur_epoch {}: {}, steps {}, ind {}, step{}, max_epoch{}' + .format(cur_epoch, self.__class__.__name__, steps, ind, step, + max_epoch)) return lrs[ind - 1] * base_lr @@ -190,14 +195,23 @@ def get_lr(self): alpha = (lr_end - lr_start) / self.warmup_epochs lr = self.last_epoch * alpha + lr_start if self.verbose: - print('get_lr, Epoch {}: {}, lr {}, lr_end {}, self.lrs{}, self.step_base_lr{}, self.steps{}, self.max_epoch{}'.format( - self.last_epoch, self.__class__.__name__, lr, lr_end, self.lrs, self.step_base_lr, self.steps, self.max_epoch )) + print( + 'get_lr, Epoch {}: {}, lr {}, lr_end {}, self.lrs{}, self.step_base_lr{}, self.steps{}, self.max_epoch{}' + .format(self.last_epoch, self.__class__.__name__, lr, lr_end, + self.lrs, self.step_base_lr, self.steps, + self.max_epoch)) - return lr class CustomPiecewiseDecay(PiecewiseDecay): + def __init__(self, **kargs): kargs.pop('num_iters') super().__init__(**kargs) + + +class CustomMultiStepDecay(MultiStepDecay): + + def __init__(self, **kargs): + super().__init__(**kargs) diff --git a/paddlevideo/tasks/train.py b/paddlevideo/tasks/train.py index 00f450d16..97b4d3ae2 100644 --- a/paddlevideo/tasks/train.py +++ b/paddlevideo/tasks/train.py @@ -12,10 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. +from ..metrics.ava_utils import collect_results_cpu +import shutil +import pickle +import time +import os import os.path as osp import time - import numpy as np + import paddle import paddle.distributed as dist import paddle.distributed.fleet as fleet @@ -23,13 +28,20 @@ load, log_batch, log_epoch, mkdir, save) from ..loader.builder import build_dataloader, build_dataset -from ..metrics.ava_utils import collect_results_cpu from ..modeling.builder import build_model +from ..metrics import build_metric from ..solver import build_lr, build_optimizer from ..utils import do_preciseBN +from paddlevideo.utils import get_logger +from paddlevideo.utils import (build_record, log_batch, log_epoch, save, load, + mkdir) +import sys +import numpy as np +from pathlib import Path -paddle.framework.seed(1234) -np.random.seed(1234) +paddle.framework.seed(1538574472) +paddle.seed(1538574472) +np.random.seed(1538574472) def train_model(cfg, @@ -87,7 +99,7 @@ def train_model(cfg, places = paddle.set_device('npu') else: places = paddle.set_device('gpu') - + # default num worker: 0, which means no subprocess will be created num_workers = cfg.DATASET.get('num_workers', 0) valid_num_workers = cfg.DATASET.get('valid_num_workers', num_workers) @@ -124,12 +136,46 @@ def train_model(cfg, ) valid_loader = build_dataloader(valid_dataset, **validate_dataloader_setting) + cfg.METRIC.data_size = len(valid_dataset) + cfg.METRIC.batch_size = batch_size + cfg.METRIC.log_interval = cfg.log_interval + # build metric + if cfg.MODEL.framework in ["BcnBgm", "BcnModel"]: + Metric = build_metric(cfg.METRIC) # 3. Construct solver. - lr = build_lr(cfg.OPTIMIZER.learning_rate, len(train_loader)) - optimizer = build_optimizer(cfg.OPTIMIZER, - lr, - parameter_list=model.parameters()) + if cfg.MODEL.framework == "BcnModel": + lr_list = [] + for sub_learning_rate in cfg.OPTIMIZER.get("learning_rate"): + lr = build_lr(sub_learning_rate, len(train_loader)) + lr_list.append(lr) + model.backbone.bgm.weight_attr = paddle.ParamAttr( + learning_rate=lr_list[1]) + model.backbone.bgm.bias_attr = paddle.ParamAttr( + learning_rate=lr_list[1]) + optimizer = build_optimizer(cfg.OPTIMIZER, + lr_list[0], + parameter_list=[{ + 'params': + model.backbone.stage1.parameters() + }, { + 'params': + model.backbone.stages.parameters() + }, { + 'params': + model.backbone.stageF.parameters() + }, { + 'params': + model.backbone.bgm.parameters(), + 'learning_rate': + 1 + }]) + else: + lr = build_lr(cfg.OPTIMIZER.learning_rate, len(train_loader)) + optimizer = build_optimizer(cfg.OPTIMIZER, + lr, + parameter_list=model.parameters()) + if use_fleet: optimizer = fleet.distributed_optimizer(optimizer) # Resume @@ -196,9 +242,9 @@ def train_model(cfg, else: scaled = scaler.scale(avg_loss) scaled.backward() - # keep prior to 2.0 design - scaler.minimize(optimizer, scaled) - optimizer.clear_grad() + # keep prior to 2.0 design + scaler.minimize(optimizer, scaled) + optimizer.clear_grad() else: outputs = model(data, mode='train') @@ -235,11 +281,15 @@ def train_model(cfg, log_batch(record_list, i, epoch + 1, cfg.epochs, "train", ips) # learning rate iter step - if cfg.OPTIMIZER.learning_rate.get("iter_step"): + if (cfg.MODEL.framework != "BcnModel") and ( + cfg.OPTIMIZER.learning_rate.get("iter_step")): lr.step() # learning rate epoch step - if not cfg.OPTIMIZER.learning_rate.get("iter_step"): + if cfg.MODEL.framework == "BcnModel": + for sub_lr in lr_list: + sub_lr.step() + elif not cfg.OPTIMIZER.learning_rate.get("iter_step"): lr.step() ips = "avg_ips: {:.5f} instance/sec.".format( @@ -258,11 +308,17 @@ def evaluate(best): #single_gpu_test and multi_gpu_test for i, data in enumerate(valid_loader): outputs = model(data, mode='valid') + + if cfg.MODEL.framework in ["BcnBgm", "BcnModel"]: + Metric.update(i, data, outputs) + if cfg.MODEL.framework == "FastRCNN": results.extend(outputs) #log_record - if cfg.MODEL.framework != "FastRCNN": + if cfg.MODEL.framework not in [ + "FastRCNN", "BcnBgm", "BcnModel" + ]: for name, value in outputs.items(): if name in record_list: record_list[name].update(value, batch_size) @@ -307,6 +363,11 @@ def evaluate(best): best = record_list[top_flag].avg best_flag = True + if cfg.MODEL.framework in ["BcnBgm", "BcnModel"]: + new_best = Metric.accumulate() + if not isinstance(new_best, list) and new_best > best: + best = new_best + best_flag = True return best, best_flag # use precise bn to improve acc diff --git a/tools/export_model.py b/tools/export_model.py index 42e49c9f1..f8e7507ba 100644 --- a/tools/export_model.py +++ b/tools/export_model.py @@ -128,6 +128,11 @@ def get_input_spec(cfg, model_name): ], dtype='float32'), ]] + elif model_name in ['BcnModel', 'BcnBgmFull', 'BcnBgmResized']: + input_spec = [[ + InputSpec(shape=[1, cfg.num_channels, None], dtype='float32'), + InputSpec(shape=[1, 1, None], dtype='float32', name='mask'), + ]] elif model_name in ['TransNetV2']: input_spec = [[ InputSpec(shape=[ @@ -167,6 +172,7 @@ def main(): input_spec = get_input_spec(cfg.INFERENCE, model_name) model = to_static(model, input_spec=input_spec) + print(model.parameters) paddle.jit.save(model, osp.join(args.output_path, model_name)) print( f"model ({model_name}) has been already saved in ({args.output_path}).") diff --git a/tools/summary.py b/tools/summary.py index f7f98e0f9..dd1f46032 100644 --- a/tools/summary.py +++ b/tools/summary.py @@ -69,11 +69,11 @@ def main(): img_size = args.img_size num_seg = args.num_seg #NOTE: only support tsm now, will refine soon - params_info = paddle.summary(model, (1, 1, num_seg, 3, img_size, img_size)) + params_info = paddle.summary(model, (1, 2048, 1000)) print(params_info) if args.FLOPs: - flops_info = paddleslim.analysis.flops(model, [1, 1, num_seg, 3, img_size, img_size]) + flops_info = paddleslim.analysis.flops(model, [1, 2048, 1000]) print(flops_info) diff --git a/tools/utils.py b/tools/utils.py index 4c2d83ddf..377ff5133 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -24,6 +24,8 @@ import paddle.nn.functional as F import pandas from PIL import Image +from scipy import signal +import pandas as pd __dir__ = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.abspath(os.path.join(__dir__, '../'))) @@ -104,6 +106,7 @@ def build_inference_helper(cfg): class Base_Inference_helper(): + def __init__(self, num_seg=8, seg_len=1, @@ -158,8 +161,221 @@ def postprocess(self, output, print_output=True): print("\ttop-{0} score: {1}".format(j + 1, scores[j])) +@INFERENCE.register() +class BcnBgmFull_Inference_helper(Base_Inference_helper): + + def __init__(self, + num_channels, + sample_rate, + result_path, + mode=None, + temporal_dim=None, + dataset=None): + self.num_channels = num_channels + self.sample_rate = sample_rate + self.result_path = result_path + + def preprocess(self, input_file_txt): + """ + input_file: str, feature file list txt path + return: list + """ + if not isinstance(input_file_txt, list): + self.input_file_txt = [input_file_txt] + features = np.load(input_file_txt) + features = features[:, ::self.sample_rate] + feature_tensor = paddle.to_tensor(features, dtype='float32') + return [feature_tensor.unsqueeze(0)] + else: + self.input_file_txt = input_file_txt + out_list = [] + for input_file in input_file_txt: + features = np.load(input_file_txt) + features = features[:, ::self.sample_rate] + feature_tensor = paddle.to_tensor(features, dtype='float32') + out_list.append(feature_tensor.unsqueeze(0)) + return out_list + + def postprocess(self, outputs_list, print_output=True): + for outputs, input_file in zip(outputs_list, self.input_file_txt): + columns = ["barrier"] + + barrier_threshold = 0.5 + barrier = (outputs > barrier_threshold) * outputs + video_result = barrier[0] + + video_result = video_result.transpose([1, 0]) + video_df = pd.DataFrame(list(video_result), columns=columns) + video_df.to_csv(os.path.join( + self.result_path, + input_file.split('/')[-1].split('.')[0] + ".csv"), + index=False) + + +@INFERENCE.register() +class BcnBgmResized_Inference_helper(Base_Inference_helper): + + def __init__(self, num_channels, sample_rate, result_path, mode, + temporal_dim, dataset): + self.num_channels = num_channels + self.sample_rate = sample_rate + self.result_path = result_path + self.test_mode = mode + self.temporal_dim = temporal_dim + self.dataset = dataset + + def resized_feature(self, feature_tensor): + num_frames = feature_tensor.shape[1] + feature_tensor = feature_tensor.unsqueeze(0) + if self.dataset == 'breakfast': # for breakfast dataset, there are extremely short videos + factor = 1 + while factor * num_frames < self.temporal_dim: + factor = factor + 1 + feature_tensor = F.interpolate(feature_tensor, + scale_factor=(factor), + mode='linear', + align_corners=False, + data_format='NCW') + feature_tensor = F.interpolate(feature_tensor.unsqueeze(3), + size=(self.temporal_dim, 1), + mode='nearest').squeeze(3) + return feature_tensor + + def preprocess(self, input_file_txt): + """ + input_file: str, feature file list txt path + return: list + """ + if not isinstance(input_file_txt, list): + self.input_file_txt = [input_file_txt] + features = np.load(input_file_txt) + features = features[:, ::self.sample_rate] + feature_tensor = paddle.to_tensor(features, dtype='float32') + return [self.resized_feature(feature_tensor)] + else: + self.input_file_txt = input_file_txt + out_list = [] + for input_file in input_file_txt: + features = np.load(input_file_txt) + features = features[:, ::self.sample_rate] + feature_tensor = paddle.to_tensor(features, dtype='float32') + out_list.append(self.resized_feature(feature_tensor)) + return out_list + + def postprocess(self, outputs_list, print_output=True): + for outputs, input_file in zip(outputs_list, self.input_file_txt): + columns = ["barrier"] + if self.test_mode == 'less': + barrier_threshold = 0.5 + barrier = (outputs > barrier_threshold) * outputs + video_result = barrier[0] + + maximum = signal.argrelmax(video_result[0]) + flag = np.array([0] * self.temporal_dim) + flag[maximum] = 1 + + video_result = video_result * flag + video_df = pd.DataFrame(list(video_result.transpose([1, 0])), + columns=columns) + video_df.to_csv(os.path.join( + self.result_path, + input_file.split('/')[-1].split('.')[0] + ".csv"), + index=False) + elif self.test_mode == 'more': + barrier = (outputs > 0.3) * outputs + high_barrier = (outputs > 0.8) + video_result = barrier[0] + maximum1 = signal.argrelmax(video_result[0]) + maximum2 = high_barrier[0] + + flag = np.array([0] * self.temporal_dim) + flag[maximum1] = 1 + flag = np.clip((flag + maximum2), 0, 1) + + video_result = video_result * flag + video_df = pd.DataFrame(list(video_result.transpose([1, 0])), + columns=columns) + video_df.to_csv(os.path.join( + self.result_path, + input_file.split('/')[-1].split('.')[0] + ".csv"), + index=False) + + +@INFERENCE.register() +class BcnModel_Inference_helper(Base_Inference_helper): + + def __init__(self, num_channels, sample_rate, result_path, mode, + temporal_dim, dataset): + self.num_channels = num_channels + self.sample_rate = sample_rate + self.result_path = result_path + self.test_mode = mode + self.temporal_dim = temporal_dim + self.dataset = dataset + + def preprocess(self, input_file_txt): + """ + input_file: str, feature file list txt path + return: list + """ + if not isinstance(input_file_txt, list): + self.input_file_txt = [input_file_txt] + features = np.load(input_file_txt) + features = features[:, ::self.sample_rate] + feature_tensor = paddle.to_tensor(features, dtype='float32') + return [self.resized_feature(feature_tensor)] + else: + self.input_file_txt = input_file_txt + out_list = [] + for input_file in input_file_txt: + features = np.load(input_file_txt) + features = features[:, ::self.sample_rate] + feature_tensor = paddle.to_tensor(features, dtype='float32') + out_list.append(self.resized_feature(feature_tensor)) + return out_list + + def postprocess(self, outputs_list, print_output=True): + for outputs, input_file in zip(outputs_list, self.input_file_txt): + columns = ["barrier"] + if self.test_mode == 'less': + barrier_threshold = 0.5 + barrier = (outputs > barrier_threshold) * outputs + video_result = barrier[0] + + maximum = signal.argrelmax(video_result[0]) + flag = np.array([0] * self.temporal_dim) + flag[maximum] = 1 + + video_result = video_result * flag + video_df = pd.DataFrame(list(video_result.transpose([1, 0])), + columns=columns) + video_df.to_csv(os.path.join( + self.result_path, + input_file.split('/')[-1].split('.')[0] + ".csv"), + index=False) + elif self.test_mode == 'more': + barrier = (outputs > 0.3) * outputs + high_barrier = (outputs > 0.8) + video_result = barrier[0] + maximum1 = signal.argrelmax(video_result[0]) + maximum2 = high_barrier[0] + + flag = np.array([0] * self.temporal_dim) + flag[maximum1] = 1 + flag = np.clip((flag + maximum2), 0, 1) + + video_result = video_result * flag + video_df = pd.DataFrame(list(video_result.transpose([1, 0])), + columns=columns) + video_df.to_csv(os.path.join( + self.result_path, + input_file.split('/')[-1].split('.')[0] + ".csv"), + index=False) + + @INFERENCE.register() class ppTSM_Inference_helper(Base_Inference_helper): + def __init__(self, num_seg=8, seg_len=1, @@ -199,6 +415,7 @@ def preprocess(self, input_file): @INFERENCE.register() class ppTSN_Inference_helper(Base_Inference_helper): + def __init__(self, num_seg=25, seg_len=1, @@ -244,6 +461,7 @@ def preprocess(self, input_file): @INFERENCE.register() class BMN_Inference_helper(Base_Inference_helper): + def __init__(self, feat_dim, dscale, tscale, result_path): self.feat_dim = feat_dim self.dscale = dscale @@ -330,6 +548,7 @@ def _gen_props(self, pred_bm, pred_start, pred_end, print_output): @INFERENCE.register() class TimeSformer_Inference_helper(Base_Inference_helper): + def __init__(self, num_seg=8, seg_len=1, @@ -373,6 +592,7 @@ def preprocess(self, input_file): @INFERENCE.register() class SlowFast_Inference_helper(Base_Inference_helper): + def __init__(self, num_frames=32, sampling_rate=2, @@ -446,6 +666,7 @@ def postprocess(self, output, print_output=True): @INFERENCE.register() class STGCN_Inference_helper(Base_Inference_helper): + def __init__(self, num_channels, window_size, @@ -477,6 +698,7 @@ def preprocess(self, input_file): @INFERENCE.register() class AttentionLSTM_Inference_helper(Base_Inference_helper): + def __init__( self, num_classes, #Optional, the number of classes to be classified. @@ -517,6 +739,7 @@ def preprocess(self, input_file): @INFERENCE.register() class TransNetV2_Inference_helper(): + def __init__(self, num_frames, height, @@ -689,6 +912,7 @@ def postprocess(self, outputs, print_output=True): @INFERENCE.register() class ADDS_Inference_helper(Base_Inference_helper): + def __init__(self, frame_idxs=[0], num_scales=4,