From 4e361b185674772f9a457dab2f72e96908b4df7f Mon Sep 17 00:00:00 2001 From: LutaoChu <30695251+LutaoChu@users.noreply.github.com> Date: Thu, 9 Apr 2020 16:20:04 +0800 Subject: [PATCH] Upgrade API to PaddlePaddle 1.7 version (#214) * release change log * update readme * update readme * upload fast-scnn image * update readme * update readme * replace fluid.layers.data * update api fluid.data and fluid.io.DataLoader Co-authored-by: LielinJiang Co-authored-by: LielinJiang <50691816+LielinJiang@users.noreply.github.com> --- README.md | 12 +++- contrib/LaneNet/README.md | 2 +- contrib/LaneNet/eval.py | 16 +++-- contrib/LaneNet/models/model_builder.py | 75 ++++++++++++++---------- contrib/LaneNet/train.py | 32 +++++----- docs/imgs/fast-scnn.png | Bin 0 -> 120433 bytes docs/models.md | 12 ++++ pdseg/eval.py | 6 +- pdseg/models/backbone/mobilenet_v2.py | 4 +- pdseg/models/backbone/xception.py | 4 +- pdseg/models/model_builder.py | 28 ++++----- pdseg/models/modeling/hrnet.py | 4 +- pdseg/models/modeling/icnet.py | 4 +- pdseg/models/modeling/unet.py | 4 +- pdseg/train.py | 16 ++--- slim/distillation/README.md | 1 - slim/distillation/model_builder.py | 60 ++++++++----------- slim/distillation/train_distill.py | 41 ++++++++----- slim/nas/README.md | 2 +- slim/nas/eval_nas.py | 7 ++- slim/nas/model_builder.py | 32 +++++----- slim/nas/train_nas.py | 53 ++++++++++------- slim/prune/README.md | 2 +- slim/prune/eval_prune.py | 7 ++- slim/prune/train_prune.py | 27 +++++---- slim/quantization/eval_quant.py | 6 +- slim/quantization/train_quant.py | 8 +-- turtorial/finetune_fast_scnn.md | 2 +- 28 files changed, 259 insertions(+), 208 deletions(-) create mode 100644 docs/imgs/fast-scnn.png diff --git a/README.md b/README.md index 0fefe77b..23558c5a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## 简介 -PaddleSeg是基于[PaddlePaddle](https://www.paddlepaddle.org.cn)开发的语义分割库,覆盖了DeepLabv3+, U-Net, ICNet, PSPNet, HRNet等主流分割模型。通过统一的配置,帮助用户更便捷地完成从训练到部署的全流程图像分割应用。 +PaddleSeg是基于[PaddlePaddle](https://www.paddlepaddle.org.cn)开发的语义分割库,覆盖了DeepLabv3+, U-Net, ICNet, PSPNet, HRNet, Fast-SCNN等主流分割模型。通过统一的配置,帮助用户更便捷地完成从训练到部署的全流程图像分割应用。
@@ -33,7 +33,7 @@ PaddleSeg是基于[PaddlePaddle](https://www.paddlepaddle.org.cn)开发的语义 - **模块化设计** -支持U-Net, DeepLabv3+, ICNet, PSPNet, HRNet五种主流分割网络,结合预训练模型和可调节的骨干网络,满足不同性能和精度的要求;选择不同的损失函数如Dice Loss, BCE Loss等方式可以强化小目标和不均衡样本场景下的分割精度。 +支持U-Net, DeepLabv3+, ICNet, PSPNet, HRNet, Fast-SCNN六种主流分割网络,结合预训练模型和可调节的骨干网络,满足不同性能和精度的要求;选择不同的损失函数如Dice Loss, BCE Loss等方式可以强化小目标和不均衡样本场景下的分割精度。 - **高性能** @@ -163,6 +163,14 @@ A: 请将PaddlePaddle升级至1.5.2版本或以上。

   微信公众号                官方技术交流QQ群

## 更新日志 +* 2020.02.25 + + **`v0.4.0`** + * 新增适用于实时场景且不需要预训练模型的分割网络Fast-SCNN,提供基于Cityscapes的[预训练模型](./docs/model_zoo.md)1个。 + * 新增LaneNet车道线检测网络,提供[预训练模型](https://github.com/PaddlePaddle/PaddleSeg/tree/release/v0.4.0/contrib/LaneNet#%E4%B8%83-%E5%8F%AF%E8%A7%86%E5%8C%96)一个。 + * 新增基于PaddleSlim的分割库压缩策略([量化](./slim/quantization/README.md), [蒸馏](./slim/distillation/README.md), [剪枝](./slim/prune/README.md), [搜索](./slim/nas/README.md)) + + * 2019.12.15 **`v0.3.0`** diff --git a/contrib/LaneNet/README.md b/contrib/LaneNet/README.md index b8677730..1448951e 100644 --- a/contrib/LaneNet/README.md +++ b/contrib/LaneNet/README.md @@ -108,7 +108,7 @@ SOLVER: 使用下述命令启动训练 ```shell -CUDA_VISIBLE_DEVICES=0 python -u train.py --cfg configs/lanenet.yaml --use_gpu --use_mpio --do_eval +CUDA_VISIBLE_DEVICES=0 python -u train.py --cfg configs/lanenet.yaml --use_gpu --do_eval ``` ## 六. 进行评估 diff --git a/contrib/LaneNet/eval.py b/contrib/LaneNet/eval.py index 9256c4f0..025fb4e7 100644 --- a/contrib/LaneNet/eval.py +++ b/contrib/LaneNet/eval.py @@ -101,10 +101,10 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): for b in data_gen: yield b - py_reader, pred, grts, masks, accuracy, fp, fn = build_model( + data_loader, pred, grts, masks, accuracy, fp, fn = build_model( test_prog, startup_prog, phase=ModelPhase.EVAL) - py_reader.decorate_sample_generator( + data_loader.set_sample_generator( data_generator, drop_last=False, batch_size=cfg.BATCH_SIZE) # Get device environment @@ -127,7 +127,9 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): # Use streaming confusion matrix to calculate mean_iou np.set_printoptions( precision=4, suppress=True, linewidth=160, floatmode="fixed") - fetch_list = [pred.name, grts.name, masks.name, accuracy.name, fp.name, fn.name] + fetch_list = [ + pred.name, grts.name, masks.name, accuracy.name, fp.name, fn.name + ] num_images = 0 step = 0 avg_acc = 0.0 @@ -137,7 +139,7 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): all_step = cfg.DATASET.TEST_TOTAL_IMAGES // cfg.BATCH_SIZE + 1 timer = Timer() timer.start() - py_reader.start() + data_loader.start() while True: try: step += 1 @@ -153,7 +155,8 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): print( "[EVAL]step={} accuracy={:.4f} fp={:.4f} fn={:.4f} step/sec={:.2f} | ETA {}" - .format(step, avg_acc / num_images, avg_fp / num_images, avg_fn / num_images, speed, + .format(step, avg_acc / num_images, avg_fp / num_images, + avg_fn / num_images, speed, calculate_eta(all_step - step, speed))) timer.restart() @@ -162,7 +165,8 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): break print("[EVAL]#image={} accuracy={:.4f} fp={:.4f} fn={:.4f}".format( - num_images, avg_acc / num_images, avg_fp / num_images, avg_fn / num_images)) + num_images, avg_acc / num_images, avg_fp / num_images, + avg_fn / num_images)) return avg_acc / num_images, avg_fp / num_images, avg_fn / num_images diff --git a/contrib/LaneNet/models/model_builder.py b/contrib/LaneNet/models/model_builder.py index ed6c275e..b274e95a 100644 --- a/contrib/LaneNet/models/model_builder.py +++ b/contrib/LaneNet/models/model_builder.py @@ -25,6 +25,7 @@ from pdseg.loss import multi_softmax_with_loss from loss import discriminative_loss from models.modeling import lanenet + class ModelPhase(object): """ Standard name for model phase in PaddleSeg @@ -107,35 +108,31 @@ def build_model(main_prog, start_prog, phase=ModelPhase.TRAIN): width = cfg.EVAL_CROP_SIZE[0] height = cfg.EVAL_CROP_SIZE[1] - image_shape = [cfg.DATASET.DATA_DIM, height, width] - grt_shape = [1, height, width] + image_shape = [-1, cfg.DATASET.DATA_DIM, height, width] + grt_shape = [-1, 1, height, width] class_num = cfg.DATASET.NUM_CLASSES with fluid.program_guard(main_prog, start_prog): with fluid.unique_name.guard(): - image = fluid.layers.data( - name='image', shape=image_shape, dtype='float32') - label = fluid.layers.data( - name='label', shape=grt_shape, dtype='int32') + image = fluid.data(name='image', shape=image_shape, dtype='float32') + label = fluid.data(name='label', shape=grt_shape, dtype='int32') if cfg.MODEL.MODEL_NAME == 'lanenet': - label_instance = fluid.layers.data( + label_instance = fluid.data( name='label_instance', shape=grt_shape, dtype='int32') - mask = fluid.layers.data( - name='mask', shape=grt_shape, dtype='int32') + mask = fluid.data(name='mask', shape=grt_shape, dtype='int32') - # use PyReader when doing traning and evaluation + # use DataLoader.from_generator when doing traning and evaluation if ModelPhase.is_train(phase) or ModelPhase.is_eval(phase): - py_reader = fluid.io.PyReader( + data_loader = fluid.io.DataLoader.from_generator( feed_list=[image, label, label_instance, mask], capacity=cfg.DATALOADER.BUF_SIZE, iterable=False, use_double_buffer=True) - loss_type = cfg.SOLVER.LOSS if not isinstance(loss_type, list): loss_type = list(loss_type) - + logits = seg_model(image, class_num) if ModelPhase.is_train(phase): @@ -144,25 +141,30 @@ def build_model(main_prog, start_prog, phase=ModelPhase.TRAIN): if cfg.MODEL.MODEL_NAME == 'lanenet': embeding_logit = logits[1] logits = logits[0] - disc_loss, _, _, l_reg = discriminative_loss(embeding_logit, label_instance, 4, - image_shape[1:], 0.5, 3.0, 1.0, 1.0, 0.001) + disc_loss, _, _, l_reg = discriminative_loss( + embeding_logit, label_instance, 4, image_shape[2:], 0.5, + 3.0, 1.0, 1.0, 0.001) if "softmax_loss" in loss_type: weight = None if cfg.MODEL.MODEL_NAME == 'lanenet': weight = get_dynamic_weight(label) - seg_loss = multi_softmax_with_loss(logits, label, mask, class_num, weight) + seg_loss = multi_softmax_with_loss(logits, label, mask, + class_num, weight) loss_valid = True valid_loss.append("softmax_loss") if not loss_valid: - raise Exception("SOLVER.LOSS: {} is set wrong. it should " - "include one of (softmax_loss, bce_loss, dice_loss) at least" - " example: ['softmax_loss']".format(cfg.SOLVER.LOSS)) + raise Exception( + "SOLVER.LOSS: {} is set wrong. it should " + "include one of (softmax_loss, bce_loss, dice_loss) at least" + " example: ['softmax_loss']".format(cfg.SOLVER.LOSS)) invalid_loss = [x for x in loss_type if x not in valid_loss] if len(invalid_loss) > 0: - print("Warning: the loss {} you set is invalid. it will not be included in loss computed.".format(invalid_loss)) + print( + "Warning: the loss {} you set is invalid. it will not be included in loss computed." + .format(invalid_loss)) avg_loss = disc_loss + 0.00001 * l_reg + seg_loss @@ -202,12 +204,12 @@ def build_model(main_prog, start_prog, phase=ModelPhase.TRAIN): accuracy, fp, fn = compute_metric(pred, label) if ModelPhase.is_eval(phase): - return py_reader, pred, label, mask, accuracy, fp, fn + return data_loader, pred, label, mask, accuracy, fp, fn if ModelPhase.is_train(phase): optimizer = solver.Solver(main_prog, start_prog) decayed_lr = optimizer.optimise(avg_loss) - return py_reader, avg_loss, decayed_lr, pred, label, mask, disc_loss, seg_loss, accuracy, fp, fn + return data_loader, avg_loss, decayed_lr, pred, label, mask, disc_loss, seg_loss, accuracy, fp, fn def compute_metric(pred, label): @@ -216,19 +218,27 @@ def compute_metric(pred, label): idx = fluid.layers.where(pred == 1) pix_cls_ret = fluid.layers.gather_nd(label, idx) - correct_num = fluid.layers.reduce_sum(fluid.layers.cast(pix_cls_ret, 'float32')) + correct_num = fluid.layers.reduce_sum( + fluid.layers.cast(pix_cls_ret, 'float32')) - gt_num = fluid.layers.cast(fluid.layers.shape(fluid.layers.gather_nd(label, - fluid.layers.where(label == 1)))[0], 'int64') - pred_num = fluid.layers.cast(fluid.layers.shape(fluid.layers.gather_nd(pred, idx))[0], 'int64') + gt_num = fluid.layers.cast( + fluid.layers.shape( + fluid.layers.gather_nd(label, fluid.layers.where(label == 1)))[0], + 'int64') + pred_num = fluid.layers.cast( + fluid.layers.shape(fluid.layers.gather_nd(pred, idx))[0], 'int64') accuracy = correct_num / gt_num false_pred = pred_num - correct_num - fp = fluid.layers.cast(false_pred, 'float32') / fluid.layers.cast(fluid.layers.shape(pix_cls_ret)[0], 'int64') - - label_cls_ret = fluid.layers.gather_nd(label, fluid.layers.where(label == 1)) - mis_pred = fluid.layers.cast(fluid.layers.shape(label_cls_ret)[0], 'int64') - correct_num - fn = fluid.layers.cast(mis_pred, 'float32') / fluid.layers.cast(fluid.layers.shape(label_cls_ret)[0], 'int64') + fp = fluid.layers.cast(false_pred, 'float32') / fluid.layers.cast( + fluid.layers.shape(pix_cls_ret)[0], 'int64') + + label_cls_ret = fluid.layers.gather_nd(label, + fluid.layers.where(label == 1)) + mis_pred = fluid.layers.cast(fluid.layers.shape(label_cls_ret)[0], + 'int64') - correct_num + fn = fluid.layers.cast(mis_pred, 'float32') / fluid.layers.cast( + fluid.layers.shape(label_cls_ret)[0], 'int64') accuracy.stop_gradient = True fp.stop_gradient = True fn.stop_gradient = True @@ -239,7 +249,8 @@ def get_dynamic_weight(label): label = fluid.layers.reshape(label, [-1]) unique_labels, unique_id, counts = fluid.layers.unique_with_counts(label) counts = fluid.layers.cast(counts, 'float32') - weight = 1.0 / fluid.layers.log((counts / fluid.layers.reduce_sum(counts) + 1.02)) + weight = 1.0 / fluid.layers.log( + (counts / fluid.layers.reduce_sum(counts) + 1.02)) return weight diff --git a/contrib/LaneNet/train.py b/contrib/LaneNet/train.py index 3ee9489c..c2f5bee7 100644 --- a/contrib/LaneNet/train.py +++ b/contrib/LaneNet/train.py @@ -232,9 +232,9 @@ def train(cfg): cfg.BATCH_SIZE_PER_DEV = batch_size_per_dev print_info("batch_size_per_dev: {}".format(batch_size_per_dev)) - py_reader, avg_loss, lr, pred, grts, masks, emb_loss, seg_loss, accuracy, fp, fn = build_model( + data_loader, avg_loss, lr, pred, grts, masks, emb_loss, seg_loss, accuracy, fp, fn = build_model( train_prog, startup_prog, phase=ModelPhase.TRAIN) - py_reader.decorate_sample_generator( + data_loader.set_sample_generator( data_generator, batch_size=batch_size_per_dev, drop_last=drop_last) exe = fluid.Executor(place) @@ -315,7 +315,10 @@ def train(cfg): format(cfg.TRAIN.PRETRAINED_MODEL_DIR)) # fetch_list = [avg_loss.name, lr.name, accuracy.name, precision.name, recall.name] - fetch_list = [avg_loss.name, lr.name, seg_loss.name, emb_loss.name, accuracy.name, fp.name, fn.name] + fetch_list = [ + avg_loss.name, lr.name, seg_loss.name, emb_loss.name, accuracy.name, + fp.name, fn.name + ] if args.debug: # Fetch more variable info and use streaming confusion matrix to # calculate IoU results if in debug mode @@ -359,7 +362,7 @@ def train(cfg): print_info("Use multi-thread reader") for epoch in range(begin_epoch, cfg.SOLVER.NUM_EPOCHS + 1): - py_reader.start() + data_loader.start() while True: try: # If not in debug mode, avoid unnessary log and calculate @@ -385,16 +388,15 @@ def train(cfg): avg_fn /= args.log_steps speed = args.log_steps / timer.elapsed_time() print(( - "epoch={} step={} lr={:.5f} loss={:.4f} seg_loss={:.4f} emb_loss={:.4f} accuracy={:.4} fp={:.4} fn={:.4} step/sec={:.3f} | ETA {}" - ).format(epoch, global_step, lr[0], avg_loss, avg_seg_loss, avg_emb_loss, avg_acc, avg_fp, avg_fn, speed, - calculate_eta(all_step - global_step, speed))) + "epoch={} step={} lr={:.5f} loss={:.4f} seg_loss={:.4f} emb_loss={:.4f} accuracy={:.4} fp={:.4} fn={:.4} step/sec={:.3f} | ETA {}" + ).format(epoch, global_step, lr[0], avg_loss, avg_seg_loss, + avg_emb_loss, avg_acc, avg_fp, avg_fn, speed, + calculate_eta(all_step - global_step, speed))) if args.use_tb: log_writer.add_scalar('Train/loss', avg_loss, global_step) - log_writer.add_scalar('Train/lr', lr[0], - global_step) - log_writer.add_scalar('Train/speed', speed, - global_step) + log_writer.add_scalar('Train/lr', lr[0], global_step) + log_writer.add_scalar('Train/speed', speed, global_step) sys.stdout.flush() avg_loss = 0.0 avg_seg_loss = 0.0 @@ -405,7 +407,7 @@ def train(cfg): timer.restart() except fluid.core.EOFException: - py_reader.reset() + data_loader.reset() break except Exception as e: print(e) @@ -423,10 +425,8 @@ def train(cfg): if args.use_tb: log_writer.add_scalar('Evaluate/accuracy', accuracy, global_step) - log_writer.add_scalar('Evaluate/fp', fp, - global_step) - log_writer.add_scalar('Evaluate/fn', fn, - global_step) + log_writer.add_scalar('Evaluate/fp', fp, global_step) + log_writer.add_scalar('Evaluate/fn', fn, global_step) # Use Tensorboard to visualize results if args.use_tb and cfg.DATASET.VIS_FILE_LIST is not None: diff --git a/docs/imgs/fast-scnn.png b/docs/imgs/fast-scnn.png new file mode 100644 index 0000000000000000000000000000000000000000..2b00eb88401b9981a6d59595bbdf4e1f692db934 GIT binary patch literal 120433 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

NMDKSO!-P>5%0ToX$<}5h_q%tR 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 2 and (("dice_loss" in loss_type) or ("bce_loss" in loss_type)): raise Exception( - "dice loss and bce loss is only applicable to binary classfication" - ) + "dice loss and bce loss is only applicable to binary classfication") # 在两类分割情况下,当loss函数选择dice_loss或bce_loss的时候,最后logit输出通道数设置为1 if ("dice_loss" in loss_type) or ("bce_loss" in loss_type): class_num = 1 if "softmax_loss" in loss_type: raise Exception( - "softmax loss can not combine with dice loss or bce loss" - ) + "softmax loss can not combine with dice loss or bce loss") logits = seg_model(image, class_num) # 根据选择的loss函数计算相应的损失函数 @@ -289,10 +284,7 @@ def build_model(main_prog=None, start_prog=None, phase=ModelPhase.TRAIN, **kwarg logit, axes=[2, 3], starts=[0, 0], ends=valid_shape) logit = fluid.layers.resize_bilinear( - logit, - out_shape=origin_shape, - align_corners=False, - align_mode=0) + logit, out_shape=origin_shape, align_corners=False, align_mode=0) logit = fluid.layers.argmax(logit, axis=1) return origin_image, logit @@ -312,7 +304,7 @@ def build_model(main_prog=None, start_prog=None, phase=ModelPhase.TRAIN, **kwarg return pred, logit if ModelPhase.is_eval(phase): - return py_reader, avg_loss, pred, label, mask + return data_loader, avg_loss, pred, label, mask if ModelPhase.is_train(phase): decayed_lr = None @@ -321,7 +313,7 @@ def build_model(main_prog=None, start_prog=None, phase=ModelPhase.TRAIN, **kwarg decayed_lr = optimizer.optimise(avg_loss) # optimizer = solver.Solver(main_prog, start_prog) # decayed_lr = optimizer.optimise(avg_loss) - return py_reader, avg_loss, decayed_lr, pred, label, mask, image + return data_loader, avg_loss, decayed_lr, pred, label, mask, image def to_int(string, dest="I"): diff --git a/slim/distillation/train_distill.py b/slim/distillation/train_distill.py index c1e23253..e354107f 100644 --- a/slim/distillation/train_distill.py +++ b/slim/distillation/train_distill.py @@ -48,6 +48,7 @@ from utils import dist_utils import solver from paddleslim.dist.single_distiller import merge, l2_loss + def parse_args(): parser = argparse.ArgumentParser(description='PaddleSeg training') parser.add_argument( @@ -260,8 +261,9 @@ def train(cfg): batch_size_per_dev = cfg.BATCH_SIZE // dev_count print_info("batch_size_per_dev: {}".format(batch_size_per_dev)) - py_reader, loss, lr, pred, grts, masks, image = build_model(phase=ModelPhase.TRAIN) - py_reader.decorate_sample_generator( + data_loader, loss, lr, pred, grts, masks, image = build_model( + phase=ModelPhase.TRAIN) + data_loader.set_sample_generator( data_generator, batch_size=batch_size_per_dev, drop_last=drop_last) exe = fluid.Executor(place) @@ -274,8 +276,12 @@ def train(cfg): with fluid.program_guard(teacher_program, teacher_startup_program): with fluid.unique_name.guard(): _, teacher_loss, _, _, _, _, _ = build_model( - teacher_program, teacher_startup_program, phase=ModelPhase.TRAIN, image=image, - label=grts, mask=masks) + teacher_program, + teacher_startup_program, + phase=ModelPhase.TRAIN, + image=image, + label=grts, + mask=masks) exe.run(teacher_startup_program) @@ -293,7 +299,9 @@ def train(cfg): 'mask': 'mask', } merge(teacher_program, fluid.default_main_program(), data_name_map, place) - distill_pairs = [['teacher_bilinear_interp_2.tmp_0', 'bilinear_interp_0.tmp_0']] + distill_pairs = [[ + 'teacher_bilinear_interp_2.tmp_0', 'bilinear_interp_0.tmp_0' + ]] def distill(pairs, weight): """ @@ -322,7 +330,8 @@ def train(cfg): build_strategy.fuse_all_optimizer_ops = False build_strategy.fuse_elewise_add_act_ops = True if cfg.NUM_TRAINERS > 1 and args.use_gpu: - dist_utils.prepare_for_multi_process(exe, build_strategy, fluid.default_main_program()) + dist_utils.prepare_for_multi_process(exe, build_strategy, + fluid.default_main_program()) exec_strategy.num_threads = 1 if cfg.TRAIN.SYNC_BATCH_NORM and args.use_gpu: @@ -334,10 +343,11 @@ def train(cfg): print_info( "Sync BatchNorm strategy will not be effective if GPU device" " count <= 1") - compiled_train_prog = fluid.CompiledProgram(fluid.default_main_program()).with_data_parallel( - loss_name=all_loss.name, - exec_strategy=exec_strategy, - build_strategy=build_strategy) + compiled_train_prog = fluid.CompiledProgram( + fluid.default_main_program()).with_data_parallel( + loss_name=all_loss.name, + exec_strategy=exec_strategy, + build_strategy=build_strategy) # Resume training begin_epoch = cfg.SOLVER.BEGIN_EPOCH @@ -387,7 +397,9 @@ def train(cfg): format(cfg.TRAIN.PRETRAINED_MODEL_DIR)) #fetch_list = [avg_loss.name, lr.name] - fetch_list = [loss.name, 'teacher_' + teacher_loss.name, distill_loss.name, lr.name] + fetch_list = [ + loss.name, 'teacher_' + teacher_loss.name, distill_loss.name, lr.name + ] if args.debug: # Fetch more variable info and use streaming confusion matrix to @@ -431,7 +443,7 @@ def train(cfg): print_info("Use multi-thread reader") for epoch in range(begin_epoch, cfg.SOLVER.NUM_EPOCHS + 1): - py_reader.start() + data_loader.start() while True: try: if args.debug: @@ -491,7 +503,8 @@ def train(cfg): speed = args.log_steps / timer.elapsed_time() print(( "epoch={} step={} lr={:.5f} loss={:.4f} teacher loss={:.4f} distill loss={:.4f} step/sec={:.3f} | ETA {}" - ).format(epoch, global_step, lr[0], avg_loss, avg_t_loss, avg_d_loss, speed, + ).format(epoch, global_step, lr[0], avg_loss, + avg_t_loss, avg_d_loss, speed, calculate_eta(all_step - global_step, speed))) if args.use_tb: log_writer.add_scalar('Train/loss', avg_loss, @@ -507,7 +520,7 @@ def train(cfg): timer.restart() except fluid.core.EOFException: - py_reader.reset() + data_loader.reset() break except Exception as e: print(e) diff --git a/slim/nas/README.md b/slim/nas/README.md index cddfc5a8..31e8f93f 100644 --- a/slim/nas/README.md +++ b/slim/nas/README.md @@ -46,7 +46,7 @@ SLIM: ## 训练与评估 执行以下命令,边训练边评估 ```shell -CUDA_VISIBLE_DEVICES=0 python -u ./slim/nas/train_nas.py --log_steps 10 --cfg configs/deeplabv3p_mobilenetv2_cityscapes.yaml --use_gpu --use_mpio \ +CUDA_VISIBLE_DEVICES=0 python -u ./slim/nas/train_nas.py --log_steps 10 --cfg configs/deeplabv3p_mobilenetv2_cityscapes.yaml --use_gpu \ SLIM.NAS_PORT 23333 \ SLIM.NAS_ADDRESS "" \ SLIM.NAS_SEARCH_STEPS 2 \ diff --git a/slim/nas/eval_nas.py b/slim/nas/eval_nas.py index 08f75f5d..7f8663df 100644 --- a/slim/nas/eval_nas.py +++ b/slim/nas/eval_nas.py @@ -45,6 +45,7 @@ from metrics import ConfusionMatrix from mobilenetv2_search_space import MobileNetV2SpaceSeg + def parse_args(): parser = argparse.ArgumentParser(description='PaddleSeg model evalution') parser.add_argument( @@ -98,10 +99,10 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): for b in data_gen: yield b[0], b[1], b[2] - py_reader, avg_loss, pred, grts, masks = build_model( + data_loader, avg_loss, pred, grts, masks = build_model( test_prog, startup_prog, phase=ModelPhase.EVAL, arch=kwargs['arch']) - py_reader.decorate_sample_generator( + data_loader.set_sample_generator( data_generator, drop_last=False, batch_size=cfg.BATCH_SIZE) # Get device environment @@ -134,7 +135,7 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): all_step = cfg.DATASET.TEST_TOTAL_IMAGES // cfg.BATCH_SIZE + 1 timer = Timer() timer.start() - py_reader.start() + data_loader.start() while True: try: step += 1 diff --git a/slim/nas/model_builder.py b/slim/nas/model_builder.py index 3dfbacb0..27a14fa7 100644 --- a/slim/nas/model_builder.py +++ b/slim/nas/model_builder.py @@ -74,9 +74,7 @@ def seg_model(image, class_num, arch): if model_name == 'deeplabv3p': logits = deeplab.deeplabv3p_nas(image, class_num, arch) else: - raise Exception( - "unknow model name, only support deeplabv3p" - ) + raise Exception("unknow model name, only support deeplabv3p") return logits @@ -156,8 +154,8 @@ def build_model(main_prog, start_prog, phase=ModelPhase.TRAIN, arch=None): width = cfg.EVAL_CROP_SIZE[0] height = cfg.EVAL_CROP_SIZE[1] - image_shape = [cfg.DATASET.DATA_DIM, height, width] - grt_shape = [1, height, width] + image_shape = [-1, cfg.DATASET.DATA_DIM, height, width] + grt_shape = [-1, 1, height, width] class_num = cfg.DATASET.NUM_CLASSES with fluid.program_guard(main_prog, start_prog): @@ -165,25 +163,22 @@ def build_model(main_prog, start_prog, phase=ModelPhase.TRAIN, arch=None): # 在导出模型的时候,增加图像标准化预处理,减小预测部署时图像的处理流程 # 预测部署时只须对输入图像增加batch_size维度即可 if ModelPhase.is_predict(phase): - origin_image = fluid.layers.data( + origin_image = fluid.data( name='image', shape=[-1, -1, -1, cfg.DATASET.DATA_DIM], - dtype='float32', - append_batch_size=False) + dtype='float32') image, valid_shape, origin_shape = export_preprocess( origin_image) else: - image = fluid.layers.data( + image = fluid.data( name='image', shape=image_shape, dtype='float32') - label = fluid.layers.data( - name='label', shape=grt_shape, dtype='int32') - mask = fluid.layers.data( - name='mask', shape=grt_shape, dtype='int32') + label = fluid.data(name='label', shape=grt_shape, dtype='int32') + mask = fluid.data(name='mask', shape=grt_shape, dtype='int32') - # use PyReader when doing traning and evaluation + # use DataLoader.from_generator when doing traning and evaluation if ModelPhase.is_train(phase) or ModelPhase.is_eval(phase): - py_reader = fluid.io.PyReader( + data_loader = fluid.io.DataLoader.from_generator( feed_list=[image, label, mask], capacity=cfg.DATALOADER.BUF_SIZE, iterable=False, @@ -217,7 +212,8 @@ def build_model(main_prog, start_prog, phase=ModelPhase.TRAIN, arch=None): if "softmax_loss" in loss_type: weight = cfg.SOLVER.CROSS_ENTROPY_WEIGHT avg_loss_list.append( - multi_softmax_with_loss(logits, label, mask, class_num, weight)) + multi_softmax_with_loss(logits, label, mask, class_num, + weight)) loss_valid = True valid_loss.append("softmax_loss") if "dice_loss" in loss_type: @@ -290,12 +286,12 @@ def build_model(main_prog, start_prog, phase=ModelPhase.TRAIN, arch=None): return pred, logit if ModelPhase.is_eval(phase): - return py_reader, avg_loss, pred, label, mask + return data_loader, avg_loss, pred, label, mask if ModelPhase.is_train(phase): optimizer = solver.Solver(main_prog, start_prog) decayed_lr = optimizer.optimise(avg_loss) - return py_reader, avg_loss, decayed_lr, pred, label, mask + return data_loader, avg_loss, decayed_lr, pred, label, mask def to_int(string, dest="I"): diff --git a/slim/nas/train_nas.py b/slim/nas/train_nas.py index 7822657f..6ab4d899 100644 --- a/slim/nas/train_nas.py +++ b/slim/nas/train_nas.py @@ -54,6 +54,7 @@ from paddleslim.analysis import flops from paddleslim.nas.sa_nas import SANAS from paddleslim.nas import search_space + def parse_args(): parser = argparse.ArgumentParser(description='PaddleSeg training') parser.add_argument( @@ -269,21 +270,24 @@ def train(cfg): port = cfg.SLIM.NAS_PORT server_address = (cfg.SLIM.NAS_ADDRESS, port) - sa_nas = SANAS(config, server_addr=server_address, search_steps=cfg.SLIM.NAS_SEARCH_STEPS, - is_server=cfg.SLIM.NAS_IS_SERVER) + sa_nas = SANAS( + config, + server_addr=server_address, + search_steps=cfg.SLIM.NAS_SEARCH_STEPS, + is_server=cfg.SLIM.NAS_IS_SERVER) for step in range(cfg.SLIM.NAS_SEARCH_STEPS): arch = sa_nas.next_archs()[0] start_prog = fluid.Program() train_prog = fluid.Program() - py_reader, avg_loss, lr, pred, grts, masks = build_model( + data_loader, avg_loss, lr, pred, grts, masks = build_model( train_prog, start_prog, arch=arch, phase=ModelPhase.TRAIN) cur_flops = flops(train_prog) print('current step:', step, 'flops:', cur_flops) - py_reader.decorate_sample_generator( + data_loader.set_sample_generator( data_generator, batch_size=batch_size_per_dev, drop_last=drop_last) exe = fluid.Executor(place) @@ -297,7 +301,8 @@ def train(cfg): build_strategy = fluid.BuildStrategy() if cfg.NUM_TRAINERS > 1 and args.use_gpu: - dist_utils.prepare_for_multi_process(exe, build_strategy, train_prog) + dist_utils.prepare_for_multi_process(exe, build_strategy, + train_prog) exec_strategy.num_threads = 1 if cfg.TRAIN.SYNC_BATCH_NORM and args.use_gpu: @@ -309,10 +314,11 @@ def train(cfg): print_info( "Sync BatchNorm strategy will not be effective if GPU device" " count <= 1") - compiled_train_prog = fluid.CompiledProgram(train_prog).with_data_parallel( - loss_name=avg_loss.name, - exec_strategy=exec_strategy, - build_strategy=build_strategy) + compiled_train_prog = fluid.CompiledProgram( + train_prog).with_data_parallel( + loss_name=avg_loss.name, + exec_strategy=exec_strategy, + build_strategy=build_strategy) # Resume training begin_epoch = cfg.SOLVER.BEGIN_EPOCH @@ -353,13 +359,14 @@ def train(cfg): print_info( "Parameter[{}] don't exist or shape does not match current network, skip" " to load it.".format(var.name)) - print_info("{}/{} pretrained parameters loaded successfully!".format( - len(load_vars), - len(load_vars) + len(load_fail_vars))) + print_info( + "{}/{} pretrained parameters loaded successfully!".format( + len(load_vars), + len(load_vars) + len(load_fail_vars))) else: print_info( 'Pretrained model dir {} not exists, training from scratch...'. - format(cfg.TRAIN.PRETRAINED_MODEL_DIR)) + format(cfg.TRAIN.PRETRAINED_MODEL_DIR)) fetch_list = [avg_loss.name, lr.name] @@ -374,8 +381,8 @@ def train(cfg): timer.start() if begin_epoch > cfg.SOLVER.NUM_EPOCHS: raise ValueError( - ("begin epoch[{}] is larger than cfg.SOLVER.NUM_EPOCHS[{}]").format( - begin_epoch, cfg.SOLVER.NUM_EPOCHS)) + ("begin epoch[{}] is larger than cfg.SOLVER.NUM_EPOCHS[{}]" + ).format(begin_epoch, cfg.SOLVER.NUM_EPOCHS)) if args.use_mpio: print_info("Use multiprocess reader") @@ -384,7 +391,7 @@ def train(cfg): best_miou = 0.0 for epoch in range(begin_epoch, cfg.SOLVER.NUM_EPOCHS + 1): - py_reader.start() + data_loader.start() while True: try: loss, lr = exe.run( @@ -398,21 +405,22 @@ def train(cfg): avg_loss /= args.log_steps speed = args.log_steps / timer.elapsed_time() print(( - "epoch={} step={} lr={:.5f} loss={:.4f} step/sec={:.3f} | ETA {}" - ).format(epoch, global_step, lr[0], avg_loss, speed, - calculate_eta(all_step - global_step, speed))) + "epoch={} step={} lr={:.5f} loss={:.4f} step/sec={:.3f} | ETA {}" + ).format(epoch, global_step, lr[0], avg_loss, speed, + calculate_eta(all_step - global_step, speed))) sys.stdout.flush() avg_loss = 0.0 timer.restart() except fluid.core.EOFException: - py_reader.reset() + data_loader.reset() break except Exception as e: print(e) if epoch > cfg.SLIM.NAS_START_EVAL_EPOCH: - ckpt_dir = save_checkpoint(exe, train_prog, '{}_tmp'.format(port)) + ckpt_dir = save_checkpoint(exe, train_prog, + '{}_tmp'.format(port)) _, mean_iou, _, mean_acc = evaluate( cfg=cfg, arch=arch, @@ -420,7 +428,8 @@ def train(cfg): use_gpu=args.use_gpu, use_mpio=args.use_mpio) if best_miou < mean_iou: - print('search step {}, epoch {} best iou {}'.format(step, epoch, mean_iou)) + print('search step {}, epoch {} best iou {}'.format( + step, epoch, mean_iou)) best_miou = mean_iou sa_nas.reward(float(best_miou)) diff --git a/slim/prune/README.md b/slim/prune/README.md index b6a45238..25505606 100644 --- a/slim/prune/README.md +++ b/slim/prune/README.md @@ -46,7 +46,7 @@ SLIM.PRUNE_RATIOS '[0.1,0.1,0.1]' ```shell CUDA_VISIBLE_DEVICES=0 -python -u ./slim/prune/eval_prune.py --cfg configs/cityscape_fast_scnn.yaml --use_gpu --use_mpio \ +python -u ./slim/prune/eval_prune.py --cfg configs/cityscape_fast_scnn.yaml --use_gpu \ TEST.TEST_MODEL your_trained_model \ ``` diff --git a/slim/prune/eval_prune.py b/slim/prune/eval_prune.py index b8275d03..3bfb4f4c 100644 --- a/slim/prune/eval_prune.py +++ b/slim/prune/eval_prune.py @@ -45,6 +45,7 @@ from metrics import ConfusionMatrix from paddleslim.prune import load_model + def parse_args(): parser = argparse.ArgumentParser(description='PaddleSeg model evalution') parser.add_argument( @@ -98,10 +99,10 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): for b in data_gen: yield b[0], b[1], b[2] - py_reader, avg_loss, pred, grts, masks = build_model( + data_loader, avg_loss, pred, grts, masks = build_model( test_prog, startup_prog, phase=ModelPhase.EVAL) - py_reader.decorate_sample_generator( + data_loader.set_sample_generator( data_generator, drop_last=False, batch_size=cfg.BATCH_SIZE) # Get device environment @@ -134,7 +135,7 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): all_step = cfg.DATASET.TEST_TOTAL_IMAGES // cfg.BATCH_SIZE + 1 timer = Timer() timer.start() - py_reader.start() + data_loader.start() while True: try: step += 1 diff --git a/slim/prune/train_prune.py b/slim/prune/train_prune.py index 06e1658f..05c599e3 100644 --- a/slim/prune/train_prune.py +++ b/slim/prune/train_prune.py @@ -50,6 +50,7 @@ from utils import dist_utils from paddleslim.prune import Pruner, save_model from paddleslim.analysis import flops + def parse_args(): parser = argparse.ArgumentParser(description='PaddleSeg training') parser.add_argument( @@ -181,10 +182,12 @@ def load_checkpoint(exe, program): return begin_epoch + def print_info(*msg): if cfg.TRAINER_ID == 0: print(*msg) + def train(cfg): startup_prog = fluid.Program() train_prog = fluid.Program() @@ -236,9 +239,9 @@ def train(cfg): batch_size_per_dev = cfg.BATCH_SIZE // dev_count print_info("batch_size_per_dev: {}".format(batch_size_per_dev)) - py_reader, avg_loss, lr, pred, grts, masks = build_model( + data_loader, avg_loss, lr, pred, grts, masks = build_model( train_prog, startup_prog, phase=ModelPhase.TRAIN) - py_reader.decorate_sample_generator( + data_loader.set_sample_generator( data_generator, batch_size=batch_size_per_dev, drop_last=drop_last) exe = fluid.Executor(place) @@ -261,8 +264,9 @@ def train(cfg): print_info("Sync BatchNorm strategy is effective.") build_strategy.sync_batch_norm = True else: - print_info("Sync BatchNorm strategy will not be effective if GPU device" - " count <= 1") + print_info( + "Sync BatchNorm strategy will not be effective if GPU device" + " count <= 1") pruned_params = cfg.SLIM.PRUNE_PARAMS.strip().split(',') pruned_ratios = cfg.SLIM.PRUNE_RATIOS @@ -311,14 +315,16 @@ def train(cfg): for var in load_vars: print_info("Parameter[{}] loaded sucessfully!".format(var.name)) for var in load_fail_vars: - print_info("Parameter[{}] don't exist or shape does not match current network, skip" - " to load it.".format(var.name)) + print_info( + "Parameter[{}] don't exist or shape does not match current network, skip" + " to load it.".format(var.name)) print_info("{}/{} pretrained parameters loaded successfully!".format( len(load_vars), len(load_vars) + len(load_fail_vars))) else: - print_info('Pretrained model dir {} not exists, training from scratch...'. - format(cfg.TRAIN.PRETRAINED_MODEL_DIR)) + print_info( + 'Pretrained model dir {} not exists, training from scratch...'. + format(cfg.TRAIN.PRETRAINED_MODEL_DIR)) fetch_list = [avg_loss.name, lr.name] if args.debug: @@ -371,7 +377,7 @@ def train(cfg): print_info("Use multi-thread reader") for epoch in range(begin_epoch, cfg.SOLVER.NUM_EPOCHS + 1): - py_reader.start() + data_loader.start() while True: try: if args.debug: @@ -441,7 +447,7 @@ def train(cfg): timer.restart() except fluid.core.EOFException: - py_reader.reset() + data_loader.reset() break except Exception as e: print(e) @@ -477,6 +483,7 @@ def train(cfg): if cfg.TRAINER_ID == 0: save_prune_checkpoint(exe, train_prog, 'final') + def main(args): if args.cfg_file is not None: cfg.update_from_file(args.cfg_file) diff --git a/slim/quantization/eval_quant.py b/slim/quantization/eval_quant.py index f40021df..fdf6f3ce 100644 --- a/slim/quantization/eval_quant.py +++ b/slim/quantization/eval_quant.py @@ -105,10 +105,10 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): for b in data_gen: yield b[0], b[1], b[2] - py_reader, avg_loss, pred, grts, masks = build_model( + data_loader, avg_loss, pred, grts, masks = build_model( test_prog, startup_prog, phase=ModelPhase.EVAL) - py_reader.decorate_sample_generator( + data_loader.set_sample_generator( data_generator, drop_last=False, batch_size=cfg.BATCH_SIZE) # Get device environment @@ -152,7 +152,7 @@ def evaluate(cfg, ckpt_dir=None, use_gpu=False, use_mpio=False, **kwargs): all_step = cfg.DATASET.TEST_TOTAL_IMAGES // cfg.BATCH_SIZE + 1 timer = Timer() timer.start() - py_reader.start() + data_loader.start() while True: try: step += 1 diff --git a/slim/quantization/train_quant.py b/slim/quantization/train_quant.py index 6a29dccd..1034b723 100644 --- a/slim/quantization/train_quant.py +++ b/slim/quantization/train_quant.py @@ -157,9 +157,9 @@ def train_quant(cfg): batch_size_per_dev = cfg.BATCH_SIZE // dev_count print_info("batch_size_per_dev: {}".format(batch_size_per_dev)) - py_reader, avg_loss, lr, pred, grts, masks = build_model( + data_loader, avg_loss, lr, pred, grts, masks = build_model( train_prog, startup_prog, phase=ModelPhase.TRAIN) - py_reader.decorate_sample_generator( + data_loader.set_sample_generator( data_generator, batch_size=batch_size_per_dev, drop_last=drop_last) exe = fluid.Executor(place) @@ -274,7 +274,7 @@ def train_quant(cfg): print_info("Use multi-thread reader") for epoch in range(begin_epoch, cfg.SOLVER.NUM_EPOCHS + 1): - py_reader.start() + data_loader.start() while True: try: if args.debug: @@ -326,7 +326,7 @@ def train_quant(cfg): timer.restart() except fluid.core.EOFException: - py_reader.reset() + data_loader.reset() break except Exception as e: print(e) diff --git a/turtorial/finetune_fast_scnn.md b/turtorial/finetune_fast_scnn.md index 188a51ed..31541b79 100644 --- a/turtorial/finetune_fast_scnn.md +++ b/turtorial/finetune_fast_scnn.md @@ -114,6 +114,6 @@ python pdseg/eval.py --use_gpu --cfg ./configs/fast_scnn_pet.yaml | ICNet/bn |(1024, 2048) |8.76ms| 0.6831 | | Fast-SCNN/bn | (1024, 2048) |6.28ms| 0.6964 | -上述测试环境为v100. 测试使用paddle的推理接口[zero_copy](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_usage/deploy/inference/python_infer_cn.html#id8)的方式,模型输出是类别,即argmax后的值。 +上述测试环境为v100. 测试使用paddle的推理接口[zero_copy](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/python_infer_cn.html#id8)的方式,模型输出是类别,即argmax后的值。 -- GitLab