mirror of
https://github.com/alibaba/EasyCV.git
synced 2025-06-03 14:49:00 +08:00
parent
5f75b22438
commit
8fa2f6ea40
134
docs/source/tutorials/nni_hpo_dlc.md
Normal file
134
docs/source/tutorials/nni_hpo_dlc.md
Normal file
@ -0,0 +1,134 @@
|
||||
# NNI HPO dlc tutorial
|
||||
|
||||
Auto hyperparameter optimization (HPO), or auto tuning, is one of the key features of NNI. This tutorial shows an example of EasyCV for dlc using NNI HPO.
|
||||
|
||||
## Create environment
|
||||
|
||||
Create NAS disks, NAS datasets, and DSW/ECS (ps: Note that the three parts are created in the same region).
|
||||
|
||||
Mount NAS disks on DSW/ECS (ps: The address where the NAS is mounted can be the same as the mount path /mnt/data where the NAS data set is created to avoid errors).
|
||||
|
||||
For details about the create environment, see https://yuque.antfin.com/pai-user/manual/rwk4sh.
|
||||
|
||||
## Installation
|
||||
|
||||
```shell
|
||||
hpo_tools:
|
||||
pip install https://automl-nni.oss-cn-beijing.aliyuncs.com/nni/hpo_tools/hpo_tools-0.1.1-py3-none-any.whl
|
||||
|
||||
dlc_tools:
|
||||
wget https://automl-nni.oss-cn-beijing.aliyuncs.com/nni/hpo_tools/scripts/install_dlc.sh
|
||||
source install_dlc.sh /mnt/data https://dlc-tools.oss-cn-zhangjiakou.aliyuncs.com/release/linux/dlc?spm=a2c4g.11186623.0.0.1b9b4a35er7EfB
|
||||
(ps: install_dlc.sh has two inputs. The first input specifies the default path where the dlc tool is installed, and the second input specifies the url link to the dlc tool.
|
||||
/mnt/data is the root directory where the EasyCV code resides.)
|
||||
|
||||
# test
|
||||
cd /mnt/data/software
|
||||
dlc --help
|
||||
```
|
||||
|
||||
## RUN
|
||||
Take easycv/toolkit/hpo/search/det/ as an example
|
||||
|
||||
```shell
|
||||
cd EasyCV/easycv/toolkit/hpo/det/
|
||||
|
||||
nnictl create --config config_dlc.yml --port=8780
|
||||
|
||||
|
||||
## STOP
|
||||
nnictl stop
|
||||
```
|
||||
|
||||
For more nnictl usage, see https://nni.readthedocs.io/en/v2.1/Tutorial/QuickStart.html.
|
||||
|
||||
## config_dlc.yml file parameter meaning
|
||||
```shell
|
||||
experimentWorkingDirectory: ./expdir
|
||||
searchSpaceFile: search_space.json
|
||||
trialCommand: python3 ../common/run.py --config=./config_dlc.ini
|
||||
trialConcurrency: 1
|
||||
maxTrialNumber: 4
|
||||
debug: true
|
||||
logLevel: debug
|
||||
trainingService:
|
||||
platform: local
|
||||
tuner:
|
||||
name: TPE
|
||||
classArgs:
|
||||
optimize_mode: maximize
|
||||
assessor:
|
||||
codeDirectory: hpo_tools的安装根目录/hpo_tools/core/assessor
|
||||
className: dlc_assessor.DLCAssessor
|
||||
classArgs:
|
||||
optimize_mode: maximize
|
||||
start_step: 2
|
||||
```
|
||||
<details>
|
||||
<summary>Arguments</summary>
|
||||
|
||||
- `ExperimentWorkingDirectory`: the save directory
|
||||
- `searchSpaceFile`: the search space
|
||||
- `trialCommand`: startup scripts run.py(--config specified config path)
|
||||
- `trainingService.platform`: the training platform
|
||||
- `tuner`: the tuner algorithm
|
||||
- `assessor`: the assessor algorithm
|
||||
- `classArgs`: the algorithm parameters
|
||||
|
||||
</details>
|
||||
|
||||
The search space can reference: https://nni.readthedocs.io/en/v2.2/Tutorial/SearchSpaceSpec.html.
|
||||
|
||||
## config_dlc.ini file parameter meaning
|
||||
```shell
|
||||
[cmd_config]
|
||||
cmd1="dlc config --access_id xxx --access_key xxx --endpoint 'pai-dlc.cn-shanghai.aliyuncs.com' --region cn-shanghai"
|
||||
cmd2="dlc submit pytorch --name=test_nni_${exp_id}_${trial_id} \
|
||||
--workers=1 \
|
||||
--worker_cpu=12 \
|
||||
--worker_gpu=1 \
|
||||
--worker_memory=10Gi \
|
||||
--worker_spec='ecs.gn6v-c10g1.20xlarge' \
|
||||
--data_sources='d-domlyt834bngpr68iu' \
|
||||
--worker_image=registry-vpc.cn-shanghai.aliyuncs.com/mybigpai/nni:0.0.3 \
|
||||
--command='cd ../../../../../ && pip install mmcv-full && pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \
|
||||
&& CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 --master_port=29400 tools/train.py easycv/toolkit/hpo/search/det/fcos_r50_torch_1x_coco.py --work_dir easycv/toolkit/hpo/search/det/model/model_${exp_id}_${trial_id} --launcher pytorch --seed 42 --deterministic --user_config_params --data_root /root/data/coco/ --data.imgs_per_gpu ${batch_size} --optimizer.lr ${lr} ' \
|
||||
--workspace_id='255705' "
|
||||
|
||||
[metric_config]
|
||||
metric_filepath=easycv/toolkit/hpo/search/det/model/model_${exp_id}_${trial_id}/tf_logs
|
||||
val/DetectionBoxes_Precision/mAP=100
|
||||
```
|
||||
<details>
|
||||
<summary>Arguments</summary>
|
||||
|
||||
cmd1 specifies the area for the dlc, and cmd2 is the dlc startup command.
|
||||
|
||||
[cmd_config]
|
||||
|
||||
It needs to be modified according to the dlc environment(For details about the dlc command parameters, see https://yuque.antfin-inc.com/pai-user/manual/eo7doa.)
|
||||
- `access_id and access_key`: the ak information
|
||||
- `endpoint`: the port
|
||||
- `region`: the region
|
||||
- `name`: the experiment name
|
||||
- `workers`: the number of machines
|
||||
- `worker_cpu`: the number of cpus
|
||||
- `worker_gpu`: the number of gpus
|
||||
- `worker_memory`: the number of memory required
|
||||
- `worker_spec`: the model of the machine
|
||||
- `data_sources`: mapping mounts the nas, and the dlc is started using the data_sources code
|
||||
- `worker_image`: the image to use
|
||||
- `workspace_id`: the workspace
|
||||
|
||||
It does not need to be modified according to the dlc environment
|
||||
- `command`: the command to start the easycv experiment
|
||||
- `user_config_param`: parameter is selected from searchspace.json
|
||||
|
||||
[metric_config]
|
||||
- `metric_filepath`: tf_logs directory saved for the experiment and used to obtain the parameters of the hpo evaluation
|
||||
|
||||
For example, the above example uses the detected map as the evaluation parameter, with a maximum value of 100.
|
||||
|
||||
</details>
|
||||
|
||||
Tuning method can be reference NNI way of use: https://nni.readthedocs.io/en/v2.1/Overview.html.
|
97
docs/source/tutorials/nni_hpo_local.md
Normal file
97
docs/source/tutorials/nni_hpo_local.md
Normal file
@ -0,0 +1,97 @@
|
||||
# NNI HPO local tutorial
|
||||
|
||||
Auto hyperparameter optimization (HPO), or auto tuning, is one of the key features of NNI. This tutorial shows an example of EasyCV for local using NNI HPO.
|
||||
|
||||
## Create environment
|
||||
|
||||
Create DSW/ECS.
|
||||
|
||||
For details about the create environment, see https://yuque.antfin.com/pai-user/manual/rwk4sh.
|
||||
|
||||
## Installation
|
||||
|
||||
```shell
|
||||
hpo_tools:
|
||||
pip install https://automl-nni.oss-cn-beijing.aliyuncs.com/nni/hpo_tools/hpo_tools-0.1.1-py3-none-any.whl
|
||||
|
||||
```
|
||||
|
||||
## RUN
|
||||
Take easycv/toolkit/hpo/search/det/ as an example
|
||||
|
||||
```shell
|
||||
cd EasyCV/easycv/toolkit/hpo/det/
|
||||
|
||||
nnictl create --config config_local.yml --port=8780
|
||||
|
||||
## STOP
|
||||
nnictl stop
|
||||
```
|
||||
|
||||
For more nnictl usage, see https://nni.readthedocs.io/en/v2.1/Tutorial/QuickStart.html.
|
||||
|
||||
## config_local.yml file parameter meaning
|
||||
```shell
|
||||
experimentWorkingDirectory: ./expdir
|
||||
searchSpaceFile: search_space.json
|
||||
trialCommand: python3 ../common/run.py --config=./config_local.ini
|
||||
trialConcurrency: 1
|
||||
maxTrialNumber: 4
|
||||
debug: true
|
||||
logLevel: debug
|
||||
trainingService:
|
||||
platform: local
|
||||
tuner:
|
||||
name: TPE
|
||||
classArgs:
|
||||
optimize_mode: maximize
|
||||
assessor:
|
||||
codeDirectory: /root/anaconda3/lib/python3.9/site-packages/hpo_tools/core/assessor
|
||||
className: dlc_assessor.DLCAssessor
|
||||
classArgs:
|
||||
optimize_mode: maximize
|
||||
start_step: 2
|
||||
moving_avg: true
|
||||
proportion: 0.6
|
||||
patience: 2
|
||||
```
|
||||
<details>
|
||||
<summary>Arguments</summary>
|
||||
|
||||
- `ExperimentWorkingDirectory`: the save directory
|
||||
- `searchSpaceFile`: the search space
|
||||
- `trialCommand`: startup scripts run.py(--config specified config path)
|
||||
- `trainingService.platform`: the training platform
|
||||
- `tuner`: the tuner algorithm
|
||||
- `assessor`: the assessor algorithm
|
||||
- `classArgs`: the algorithm parameters
|
||||
|
||||
</details>
|
||||
|
||||
The search space can reference: https://nni.readthedocs.io/en/v2.2/Tutorial/SearchSpaceSpec.html.
|
||||
|
||||
## config_local.ini file parameter meaning
|
||||
```shell
|
||||
[cmd_config]
|
||||
cmd1='cd /mnt/data/EasyCV && CUDA_VISIBLE_DEVICES=0,1,2,3,4 python -m torch.distributed.launch --nproc_per_node=4 --master_port=29400 tools/train.py easycv/toolkit/hpo/det/fcos_r50_torch_1x_coco.py --work_dir easycv/toolkit/hpo/det/model/model_${exp_id}_${trial_id} --launcher pytorch --seed 42 --deterministic --user_config_params --data_root /mnt/data/coco/ --data.imgs_per_gpu ${batch_size} --optimizer.lr ${lr} '
|
||||
|
||||
[metric_config]
|
||||
metric_filepath=easycv/toolkit/hpo/det/model/model_${exp_id}_${trial_id}/tf_logs
|
||||
val/DetectionBoxes_Precision/mAP=100
|
||||
```
|
||||
<details>
|
||||
<summary>Arguments</summary>
|
||||
|
||||
cmd1 is a local run command.
|
||||
|
||||
[cmd_config]
|
||||
- `user_config_param`: parameter is selected from searchspace.json
|
||||
|
||||
[metric_config]
|
||||
- `metric_filepath`: tf_logs directory saved for the experiment and used to obtain the parameters of the hpo evaluation
|
||||
|
||||
For example, the above example uses the detected map as the evaluation parameter, with a maximum value of 100.
|
||||
|
||||
</details>
|
||||
|
||||
Tuning method can be reference NNI way of use: https://nni.readthedocs.io/en/v2.1/Overview.html.
|
93
easycv/toolkit/hpo/common/run.py
Normal file
93
easycv/toolkit/hpo/common/run.py
Normal file
@ -0,0 +1,93 @@
|
||||
# Copyright (c) Alibaba, Inc. and its affiliates.
|
||||
import argparse
|
||||
import logging
|
||||
import os
|
||||
|
||||
import nni
|
||||
from hpo_tools.core.metric.report_summary_metric import report_result
|
||||
from hpo_tools.core.platform.dlc.dlc_utils import kill_job, run_multi_command
|
||||
from hpo_tools.core.utils.config_utils import parse_ini
|
||||
from hpo_tools.core.utils.json_utils import set_value
|
||||
from hpo_tools.core.utils.path_utils import unique_path
|
||||
|
||||
|
||||
def get_params():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
'--config', type=str, help='config path', default='./config_oss.ini')
|
||||
args, _ = parser.parse_known_args()
|
||||
return args
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
try:
|
||||
args = get_params()
|
||||
logging.info('args: %s', args)
|
||||
|
||||
config = parse_ini(args.config)
|
||||
|
||||
cmd_config = config['cmd_config']
|
||||
logging.info('cmd_config: %s', cmd_config)
|
||||
|
||||
oss_config = config.get('oss_config', None)
|
||||
|
||||
# get parameters form tuner
|
||||
tuner_params = nni.get_next_parameter()
|
||||
trial_id = str(nni.get_trial_id())
|
||||
experment_id = str(nni.get_experiment_id())
|
||||
|
||||
# update parameter
|
||||
for k, cmd in cmd_config.items():
|
||||
cmd = cmd.replace('${exp_id}', experment_id)
|
||||
cmd = cmd.replace('${trial_id}', trial_id)
|
||||
tuner_params_list = ''
|
||||
tuner_params_dict = ''
|
||||
for p, v in tuner_params.items():
|
||||
cmd = cmd.replace(p, str(v))
|
||||
tuner_params_list += p + ' ' + str(v) + ' '
|
||||
tuner_params_dict += p + '=' + str(v) + ' '
|
||||
cmd = cmd.replace('${tuner_params_list}', tuner_params_list)
|
||||
cmd = cmd.replace('${tuner_params_dict}', tuner_params_dict)
|
||||
cmd_config[k] = cmd
|
||||
|
||||
# report metric
|
||||
metric_dict = config['metric_config']
|
||||
logging.info('metric dict: %s', metric_dict)
|
||||
metric_filepath = metric_dict['metric_filepath']
|
||||
metric_filepath = metric_filepath.replace('${exp_id}', experment_id)
|
||||
metric_filepath = metric_filepath.replace('${trial_id}', trial_id)
|
||||
metric_dict.pop('metric_filepath')
|
||||
|
||||
if metric_filepath.startswith('oss'):
|
||||
dst_filepath = unique_path('../exp')
|
||||
set_value(
|
||||
'expdir', os.path.abspath(dst_filepath), trial_id=trial_id)
|
||||
ori_filepath = metric_filepath
|
||||
else:
|
||||
ori_filepath = None
|
||||
dst_filepath = metric_filepath
|
||||
|
||||
report_result(
|
||||
ori_filepath,
|
||||
dst_filepath,
|
||||
metric_dict,
|
||||
trial_id,
|
||||
use_best=True,
|
||||
oss_config=oss_config)
|
||||
|
||||
# for earlystop or user_canceled
|
||||
nni.report_intermediate_result(0)
|
||||
|
||||
# run command
|
||||
run_multi_command(cmd_config, trial_id)
|
||||
|
||||
except Exception:
|
||||
logging.exception('run begin error')
|
||||
exit(1)
|
||||
|
||||
finally:
|
||||
# kill instance
|
||||
kill_job(trial_id=trial_id)
|
||||
# for kill report result
|
||||
set_value(trial_id + '_exit', '1', trial_id=trial_id)
|
17
easycv/toolkit/hpo/det/config_dlc.ini
Normal file
17
easycv/toolkit/hpo/det/config_dlc.ini
Normal file
@ -0,0 +1,17 @@
|
||||
[cmd_config]
|
||||
cmd1="dlc config --access_id xxx --access_key xxx --endpoint 'pai-dlc.cn-shanghai.aliyuncs.com' --region cn-shanghai"
|
||||
cmd2="dlc submit pytorch --name=test_nni_${exp_id}_${trial_id} \
|
||||
--workers=1 \
|
||||
--worker_cpu=12 \
|
||||
--worker_gpu=1 \
|
||||
--worker_memory=10Gi \
|
||||
--worker_spec='ecs.gn6v-c10g1.20xlarge' \
|
||||
--data_sources='d-domlyt834bngpr68iu' \
|
||||
--worker_image=registry-vpc.cn-shanghai.aliyuncs.com/mybigpai/nni:0.0.3 \
|
||||
--command='cd /mnt/data/EasyCV && pip install mmcv-full && pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \
|
||||
&& CUDA_VISIBLE_DEVICES=0,1,2,3,4 python -m torch.distributed.launch --nproc_per_node=4 --master_port=29400 tools/train.py easycv/toolkit/hpo/det/fcos_r50_torch_1x_coco.py --work_dir easycv/toolkit/hpo/det/model/model_${exp_id}_${trial_id} --launcher pytorch --seed 42 --deterministic --user_config_params --data_root /mnt/data/coco/ --data.imgs_per_gpu ${batch_size} --optimizer.lr ${lr} ' \
|
||||
--workspace_id='255705' "
|
||||
|
||||
[metric_config]
|
||||
metric_filepath=easycv/toolkit/hpo/det/model/model_${exp_id}_${trial_id}/tf_logs
|
||||
val/DetectionBoxes_Precision/mAP=100
|
19
easycv/toolkit/hpo/det/config_dlc.yml
Normal file
19
easycv/toolkit/hpo/det/config_dlc.yml
Normal file
@ -0,0 +1,19 @@
|
||||
experimentWorkingDirectory: ./expdir
|
||||
searchSpaceFile: search_space.json
|
||||
trialCommand: python3 ../common/run.py --config=./config_dlc.ini
|
||||
trialConcurrency: 1
|
||||
maxTrialNumber: 4
|
||||
debug: true
|
||||
logLevel: debug
|
||||
trainingService:
|
||||
platform: local
|
||||
tuner:
|
||||
name: TPE
|
||||
classArgs:
|
||||
optimize_mode: maximize
|
||||
assessor:
|
||||
codeDirectory: /root/anaconda3/lib/python3.9/site-packages/hpo_tools/core/assessor
|
||||
className: dlc_assessor.DLCAssessor
|
||||
classArgs:
|
||||
optimize_mode: maximize
|
||||
start_step: 2
|
6
easycv/toolkit/hpo/det/config_local.ini
Normal file
6
easycv/toolkit/hpo/det/config_local.ini
Normal file
@ -0,0 +1,6 @@
|
||||
[cmd_config]
|
||||
cmd1='cd /mnt/data/EasyCV && CUDA_VISIBLE_DEVICES=0,1,2,3,4 python -m torch.distributed.launch --nproc_per_node=4 --master_port=29400 tools/train.py easycv/toolkit/hpo/det/fcos_r50_torch_1x_coco.py --work_dir easycv/toolkit/hpo/det/model/model_${exp_id}_${trial_id} --launcher pytorch --seed 42 --deterministic --user_config_params --data_root /mnt/data/coco/ --data.imgs_per_gpu ${batch_size} --optimizer.lr ${lr} '
|
||||
|
||||
[metric_config]
|
||||
metric_filepath=easycv/toolkit/hpo/det/model/model_${exp_id}_${trial_id}/tf_logs
|
||||
val/DetectionBoxes_Precision/mAP=100
|
24
easycv/toolkit/hpo/det/config_local.yml
Normal file
24
easycv/toolkit/hpo/det/config_local.yml
Normal file
@ -0,0 +1,24 @@
|
||||
experimentWorkingDirectory: ./expdir
|
||||
searchSpaceFile: search_space.json
|
||||
trialCommand: python3 ../common/run.py --config=./config_local.ini
|
||||
# trialGpuNumber: 4
|
||||
trialConcurrency: 1
|
||||
maxTrialNumber: 4
|
||||
debug: true
|
||||
logLevel: debug
|
||||
trainingService:
|
||||
platform: local
|
||||
# useActiveGpu: true
|
||||
tuner:
|
||||
name: TPE
|
||||
classArgs:
|
||||
optimize_mode: maximize
|
||||
assessor:
|
||||
codeDirectory: /root/anaconda3/lib/python3.9/site-packages/hpo_tools/core/assessor
|
||||
className: dlc_assessor.DLCAssessor
|
||||
classArgs:
|
||||
optimize_mode: maximize
|
||||
start_step: 2
|
||||
moving_avg: true
|
||||
proportion: 0.6
|
||||
patience: 2
|
192
easycv/toolkit/hpo/det/fcos_r50_torch_1x_coco.py
Normal file
192
easycv/toolkit/hpo/det/fcos_r50_torch_1x_coco.py
Normal file
@ -0,0 +1,192 @@
|
||||
train_cfg = {}
|
||||
test_cfg = {}
|
||||
optimizer_config = dict() # grad_clip, coalesce, bucket_size_mb
|
||||
# yapf:disable
|
||||
log_config = dict(
|
||||
interval=50,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
# yapf:enable
|
||||
# runtime settings
|
||||
dist_params = dict(backend='nccl')
|
||||
cudnn_benchmark = False
|
||||
log_level = 'INFO'
|
||||
load_from = None
|
||||
resume_from = None
|
||||
workflow = [('train', 1)]
|
||||
|
||||
CLASSES = [
|
||||
'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train',
|
||||
'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign',
|
||||
'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
|
||||
'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag',
|
||||
'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite',
|
||||
'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
|
||||
'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon',
|
||||
'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot',
|
||||
'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant',
|
||||
'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
|
||||
'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink',
|
||||
'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
|
||||
'hair drier', 'toothbrush'
|
||||
]
|
||||
|
||||
# dataset settings
|
||||
data_root = '/mnt/data/coco/'
|
||||
img_norm_cfg = dict(
|
||||
mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='MMResize', img_scale=(1333, 800), keep_ratio=True),
|
||||
dict(type='MMRandomFlip', flip_ratio=0.5),
|
||||
dict(type='MMNormalize', **img_norm_cfg),
|
||||
dict(type='MMPad', size_divisor=32),
|
||||
dict(type='DefaultFormatBundle'),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'gt_bboxes', 'gt_labels'],
|
||||
meta_keys=('filename', 'ori_filename', 'ori_shape', 'ori_img_shape',
|
||||
'img_shape', 'pad_shape', 'scale_factor', 'flip',
|
||||
'flip_direction', 'img_norm_cfg'))
|
||||
]
|
||||
test_pipeline = [
|
||||
dict(
|
||||
type='MMMultiScaleFlipAug',
|
||||
img_scale=(1333, 800),
|
||||
flip=False,
|
||||
transforms=[
|
||||
dict(type='MMResize', keep_ratio=True),
|
||||
dict(type='MMRandomFlip'),
|
||||
dict(type='MMNormalize', **img_norm_cfg),
|
||||
dict(type='MMPad', size_divisor=32),
|
||||
dict(type='ImageToTensor', keys=['img']),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=('filename', 'ori_filename', 'ori_shape',
|
||||
'ori_img_shape', 'img_shape', 'pad_shape',
|
||||
'scale_factor', 'flip', 'flip_direction',
|
||||
'img_norm_cfg'))
|
||||
])
|
||||
]
|
||||
|
||||
train_dataset = dict(
|
||||
type='DetDataset',
|
||||
data_source=dict(
|
||||
type='DetSourceCoco',
|
||||
ann_file='${data_root}' + 'annotations/instances_train2017.json',
|
||||
img_prefix='${data_root}' + 'train2017/',
|
||||
pipeline=[
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='LoadAnnotations', with_bbox=True)
|
||||
],
|
||||
classes=CLASSES,
|
||||
test_mode=False,
|
||||
filter_empty_gt=True,
|
||||
iscrowd=False),
|
||||
pipeline=train_pipeline)
|
||||
|
||||
val_dataset = dict(
|
||||
type='DetDataset',
|
||||
imgs_per_gpu=1,
|
||||
data_source=dict(
|
||||
type='DetSourceCoco',
|
||||
ann_file='${data_root}' + 'annotations/instances_val2017.json',
|
||||
img_prefix='${data_root}' + 'val2017/',
|
||||
pipeline=[
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='LoadAnnotations', with_bbox=True)
|
||||
],
|
||||
classes=CLASSES,
|
||||
test_mode=True,
|
||||
filter_empty_gt=False,
|
||||
iscrowd=True),
|
||||
pipeline=test_pipeline)
|
||||
|
||||
data = dict(
|
||||
imgs_per_gpu=2, workers_per_gpu=2, train=train_dataset, val=val_dataset)
|
||||
|
||||
# evaluation
|
||||
eval_config = dict(interval=1, gpu_collect=False)
|
||||
eval_pipelines = [
|
||||
dict(
|
||||
mode='test',
|
||||
evaluators=[
|
||||
dict(type='CocoDetectionEvaluator', classes=CLASSES),
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='Detection',
|
||||
pretrained=True,
|
||||
backbone=dict(
|
||||
type='ResNet',
|
||||
depth=50,
|
||||
num_stages=4,
|
||||
out_indices=(1, 2, 3, 4),
|
||||
frozen_stages=1,
|
||||
norm_cfg=dict(type='BN', requires_grad=False),
|
||||
norm_eval=True,
|
||||
style='pytorch'),
|
||||
neck=dict(
|
||||
type='FPN',
|
||||
in_channels=[256, 512, 1024, 2048],
|
||||
out_channels=256,
|
||||
start_level=1,
|
||||
add_extra_convs='on_output', # use P5
|
||||
num_outs=5,
|
||||
relu_before_extra_convs=True),
|
||||
head=dict(
|
||||
type='FCOSHead',
|
||||
num_classes=80,
|
||||
in_channels=256,
|
||||
stacked_convs=4,
|
||||
feat_channels=256,
|
||||
strides=[8, 16, 32, 64, 128],
|
||||
center_sampling=True,
|
||||
center_sample_radius=1.5,
|
||||
norm_on_bbox=True,
|
||||
centerness_on_reg=True,
|
||||
conv_cfg=None,
|
||||
loss_cls=dict(
|
||||
type='FocalLoss',
|
||||
use_sigmoid=True,
|
||||
gamma=2.0,
|
||||
alpha=0.25,
|
||||
loss_weight=1.0),
|
||||
loss_bbox=dict(type='GIoULoss', loss_weight=1.0),
|
||||
loss_centerness=dict(
|
||||
type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0),
|
||||
norm_cfg=dict(type='GN', num_groups=32, requires_grad=True),
|
||||
conv_bias=True,
|
||||
test_cfg=dict(
|
||||
nms_pre=1000,
|
||||
min_bbox_size=0,
|
||||
score_thr=0.05,
|
||||
nms=dict(type='nms', iou_threshold=0.6),
|
||||
max_per_img=100)))
|
||||
|
||||
checkpoint_config = dict(interval=10)
|
||||
# optimizer
|
||||
optimizer = dict(
|
||||
type='SGD',
|
||||
lr=0.01,
|
||||
momentum=0.9,
|
||||
weight_decay=0.0001,
|
||||
paramwise_options=dict(bias_lr_mult=2., bias_decay_mult=0.))
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=1.0 / 3,
|
||||
step=[8, 11])
|
||||
|
||||
total_epochs = 12
|
||||
|
||||
find_unused_parameters = False
|
4
easycv/toolkit/hpo/det/search_space.json
Normal file
4
easycv/toolkit/hpo/det/search_space.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"${batch_size}": {"_type":"choice", "_value": [1, 2, 4]},
|
||||
"${lr}":{"_type":"choice","_value":[0.0001, 0.001, 0.01]}
|
||||
}
|
@ -130,7 +130,7 @@ def main():
|
||||
cfg = mmcv_config_fromfile(args.config)
|
||||
|
||||
if args.user_config_params is not None:
|
||||
assert args.model_type is not None, 'model_type must be setted'
|
||||
# assert args.model_type is not None, 'model_type must be setted'
|
||||
# rebuild config by user config params
|
||||
cfg = rebuild_config(cfg, args.user_config_params)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user