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.65k stars 2.87k forks source link

PPyoloe-R,onnx导出设置不了[1,3,640,640] #7512

Closed sdreamforchen closed 1 month ago

sdreamforchen commented 1 year ago

问题确认 Search before asking

Bug组件 Bug Component

No response

Bug描述 Describe the Bug

python tools/export_model.py -c configs/rotate/ppyoloe_r/ppyoloe_r_crn_s_3x_dota.yml -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_r_crn_s_3x_dota_ms.pdparams TestReader.inputs_def.image_shape=[1,3,640,640] 如此输出模型,+paddle2onnx。 得到的onnx模型,输入image是type: float32[p2o.DynamicDimension.0,3,640,640],下游任务无法识别这个

复现环境 Environment

-linux,detection develop分支,paddle2.4.1-post117

Bug描述确认 Bug description confirmation

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

wangxinxin08 commented 1 year ago
  1. ppyoloe_r不是640的输入,不需要在导出模型时指定输入大小
  2. 参考文档ppyoloe_r文档导出模型并转换成onnx
  3. 参考paddle2onnx文档为onnx模型指定输入大小https://github.com/PaddlePaddle/Paddle2ONNX#%E5%85%B6%E4%BB%96%E4%BC%98%E5%8C%96%E5%B7%A5%E5%85%B7 具体命令为
    python -m paddle2onnx.optimize --input_model model.onnx \
                               --output_model new_model.onnx \
                               --input_shape_dict "{'x':[1,3,1024,1024]}"
sdreamforchen commented 1 year ago
  1. ppyoloe_r不是640的输入,不需要在导出模型时指定输入大小
  2. 参考文档ppyoloe_r文档导出模型并转换成onnx
  3. 参考paddle2onnx文档为onnx模型指定输入大小https://github.com/PaddlePaddle/Paddle2ONNX#%E5%85%B6%E4%BB%96%E4%BC%98%E5%8C%96%E5%B7%A5%E5%85%B7 具体命令为
python -m paddle2onnx.optimize --input_model model.onnx \
                               --output_model new_model.onnx \
                               --input_shape_dict "{'x':[1,3,1024,1024]}"

搞定。--input_shape_dict "{'image':[1,3,1024,1024]}"

sdreamforchen commented 1 year ago

def forward_eval(self, feats): cls_score_list, reg_box_list = [], [] anchorpoints, , _ = self._generate_anchors(feats) for i, (feat, stride) in enumerate(zip(feats, self.fpnstrides)): b, , h, w = paddle.shape(feat) l = h * w

cls

        avg_feat = F.adaptive_avg_pool2d(feat, (1, 1))
        cls_logit = self.pred_cls[i](self.stem_cls[i](feat, avg_feat) +
                                     feat)
        # reg
        reg_dist = self.pred_reg[i](self.stem_reg[i](feat, avg_feat))
        reg_xy, reg_wh = paddle.split(reg_dist, 2, axis=1)
        reg_xy = reg_xy * stride
        reg_wh = (F.elu(reg_wh) + 1.) * stride
        reg_angle = self.pred_angle[i](self.stem_angle[i](feat, avg_feat))
        reg_angle = self.angle_proj_conv(F.softmax(reg_angle, axis=1))
        reg_box = paddle.concat([reg_xy, reg_wh, reg_angle], axis=1)
        # cls and reg
        cls_score = F.sigmoid(cls_logit)
        cls_score_list.append(cls_score.reshape([b, self.num_classes, l]))
        reg_box_list.append(reg_box.reshape([b, 5, l]))

    cls_score_list = paddle.concat(cls_score_list, axis=-1)
    reg_box_list = paddle.concat(reg_box_list, axis=-1).transpose([0, 2, 1])
    reg_xy, reg_wha = paddle.split(reg_box_list, [2, 3], axis=-1)
    reg_xy = reg_xy + anchor_points
    reg_box_list = paddle.concat([reg_xy, reg_wha], axis=-1)
    return cls_score_list, reg_box_list

ppyoloe和ppyoloe-r这部分代码是差不多的,在转成onnx过程中,ppyoloe-r的b,w,h,和l(=w*h)会被转出来(其实输入确定,这个就是constant)。而ppyoloe是不会转出来的。请问这个如何操作可以排除这个问题呢?(已用onnxsim操作过)

wangxinxin08 commented 1 year ago

pp-yoloe-r支持动态输入,所以anchor_generator的过程是展开的,ppyoloe是静态输入,所以anchor_generator可以先计算好,你自己对照着ppyoloe的代码改下吧

sdreamforchen commented 1 year ago

pp-yoloe-r支持动态输入,所以anchor_generator的过程是展开的,ppyoloe是静态输入,所以anchor_generator可以先计算好,你自己对照着ppyoloe的代码改下吧

关注ppyoloe-head里面的evalsize参数,将其对应部分改到ppyoloe-r即可。只有几行代码。感谢王老师。

dxp2020 commented 1 year ago
  1. ppyoloe_r不是640的输入,不需要在导出模型时指定输入大小
  2. 参考文档ppyoloe_r文档导出模型并转换成onnx
  3. 参考paddle2onnx文档为onnx模型指定输入大小https://github.com/PaddlePaddle/Paddle2ONNX#%E5%85%B6%E4%BB%96%E4%BC%98%E5%8C%96%E5%B7%A5%E5%85%B7 具体命令为
python -m paddle2onnx.optimize --input_model model.onnx \
                               --output_model new_model.onnx \
                               --input_shape_dict "{'x':[1,3,1024,1024]}"

搞定。--input_shape_dict "{'image':[1,3,1024,1024]}"

为什么我这边尝试指定大小 却无效呢

paddle-bot[bot] commented 1 month ago

Since this issue has not been updated for more than three months, it will be closed, if it is not solved or there is a follow-up one, please reopen it at any time and we will continue to follow up. It is recommended to pull and try the latest code first. 由于该问题超过三个月未更新,将会被关闭,若问题未解决或有后续问题,请随时重新打开(建议先拉取最新代码进行尝试),我们会继续跟进。