PaddlePaddle / PaddleDetection

Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.
Apache License 2.0
12.34k stars 2.84k forks source link

fasterrcnn导出模型时报错RuntimeError: Can't call main_program when full_graph=False. Use paddle.jit.to_static(full_graph=True) instead. #8994

Closed PlayerJian closed 3 weeks ago

PlayerJian commented 1 month ago

问题确认 Search before asking

Bug组件 Bug Component

No response

Bug描述 Describe the Bug

        if prune_input:
            static_model = paddle.jit.to_static(
                self.model, input_spec=input_spec)
            # NOTE: dy2st do not pruned program, but jit.save will prune program
            # input spec, prune input spec here and save with pruned input spec
            a = static_model.forward
            pruned_input_spec = _prune_input_spec(
                input_spec, static_model.forward.main_program,
                static_model.forward.outputs)

static_model.forward.main_program,报错Can't call main_program when full_graph=False. Use paddle.jit.to_static(full_graph=True) instead.

[05/21 09:57:12] ppdet.engine INFO: Export inference config file to ./inference_model\faster_rcnn_r50_fpn_1x_coco\infer_cfg.yml
Traceback (most recent call last):
  File "D:\Program Files\JetBrains\PyCharm 2022.3.2\plugins\python\helpers\pydev\pydevd.py", line 1496, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "D:\Program Files\JetBrains\PyCharm 2022.3.2\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "E:\workspace\project\pro_paddle\PaddleDetection\tools\export_model.py", line 110, in <module>
    main()
  File "E:\workspace\project\pro_paddle\PaddleDetection\tools\export_model.py", line 106, in main
    run(FLAGS, cfg)
  File "E:\workspace\project\pro_paddle\PaddleDetection\tools\export_model.py", line 73, in run
    trainer.export(FLAGS.output_dir)
  File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\engine\trainer.py", line 1170, in export
    static_model, pruned_input_spec = self._get_infer_cfg_and_input_spec(
  File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\engine\trainer.py", line 1130, in _get_infer_cfg_and_input_spec
    input_spec, static_model.forward.main_program,
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\program_translator.py", line 768, in main_program
    raise_error_template("main_program")()
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\program_translator.py", line 704, in _raise_error
    raise RuntimeError(error_template.format(func=func_str))
RuntimeError: Can't call main_program when full_graph=False. Use paddle.jit.to_static(full_graph=True) instead.

设置full_graph=True还有别的错

复现环境 Environment

windows paddle2.6.1 gpu,cuda11.6 paddledection2.6.0 命令

python tools/export_model.py -c
../configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.yml
--output_dir=./inference_model
-o
weights=./output/faster_rcnn_r50_fpn_1x_coco/best_model.pdparams
export_onnx=True

Bug描述确认 Bug description confirmation

是否愿意提交PR? Are you willing to submit a PR?

lyuwenyu commented 1 month ago

参考这个改一下 https://github.com/PaddlePaddle/PaddleDetection/pull/8762

PlayerJian commented 1 month ago

设置full_graph=True之后报这个错,咋回事

Traceback (most recent call last):
  File "E:\workspace\project\pro_paddle\PaddleDetection\tools\export_model.py", line 110, in <module>
    main()
  File "E:\workspace\project\pro_paddle\PaddleDetection\tools\export_model.py", line 106, in main
    run(FLAGS, cfg)
  File "E:\workspace\project\pro_paddle\PaddleDetection\tools\export_model.py", line 73, in run
    trainer.export(FLAGS.output_dir)
  File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\engine\trainer.py", line 1170, in export
    static_model, pruned_input_spec = self._get_infer_cfg_and_input_spec(
  File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\engine\trainer.py", line 1130, in _get_infer_cfg_and_input_spec
    input_spec, static_model.forward.main_program,
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\program_translator.py", line 1062, in main_program
    concrete_program = self.concrete_program
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\program_translator.py", line 941, in concrete_program
    return self.concrete_program_specify_input_spec(input_spec=None)
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\program_translator.py", line 986, in concrete_program_specify_input_spec
    concrete_program, _ = self.get_concrete_program(
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\program_translator.py", line 875, in get_concrete_program
    concrete_program, partial_program_layer = self._program_cache[
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\program_translator.py", line 1648, in __getitem__
    self._caches[item_id] = self._build_once(item)
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\program_translator.py", line 1575, in _build_once
    concrete_program = ConcreteProgram.from_func_spec(
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\decorator.py", line 232, in fun
    return caller(func, *(extras + args), **kw)
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\base\wrapped_decorator.py", line 26, in __impl__
    return wrapped_func(*args, **kwargs)
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\base\dygraph\base.py", line 68, in __impl__
    return func(*args, **kwargs)
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\program_translator.py", line 1346, in from_func_spec
    error_data.raise_new_exception()
  File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\jit\dy2static\error.py", line 452, in raise_new_exception
    raise new_exception from None
IndexError: In transformed code:

    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\architectures\meta_arch.py", line 59, in forward
    if self.training:
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\architectures\meta_arch.py", line 69, in forward
    for inp in inputs_list:
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\architectures\meta_arch.py", line 76, in forward
    outs.append(self.get_pred())
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\architectures\faster_rcnn.py", line 121, in get_pred
    if self.use_extra_data:
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\architectures\faster_rcnn.py", line 125, in get_pred
    bbox_pred, bbox_num = self._forward()
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\architectures\faster_rcnn.py", line 79, in _forward
    if self.training:
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\architectures\faster_rcnn.py", line 89, in _forward
    bbox, bbox_num, nms_keep_idx = self.bbox_post_process(preds, (rois, rois_num),
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\post_process.py", line 68, in __call__
    if self.nms is not None:
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\post_process.py", line 69, in __call__
    bboxes, score = self.decode(head_out, rois, im_shape, scale_factor)
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\layers.py", line 461, in __call__
    if self.export_onnx:
    File "E:\workspace\project\pro_paddle\PaddleDetection\ppdet\modeling\layers.py", line 463, in __call__
        if self.export_onnx:

            onnx_rois_num_per_im = rois_num[0]
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <--- HERE
            origin_shape = paddle.expand(im_shape[0, :],
                                         [onnx_rois_num_per_im, 2])

    File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\base\framework.py", line 2500, in __getitem__
    return _getitem_static(self, item)
    File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\base\variable_index.py", line 800, in _getitem_static
    ) = parse_index(x, indices)
    File "D:\anaconda3\envs\paddle_gpu\lib\site-packages\paddle\base\variable_index.py", line 300, in parse_index
    and x.shape[dim] is not None

    IndexError: tuple index out of range
lyuwenyu commented 1 month ago

你用的那个模型 修改啥了嘛