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+,训练使用normalize,但是预测和推理为什么都不用normalize #7220

Open xdg2016 opened 1 year ago

xdg2016 commented 1 year ago

问题确认 Search before asking

请提出你的问题 Please ask your question

请问,ppyoloe+的升级其中一点,说是为了加快推理速度,去掉了normalize的操作 image 为什么训练过程要normalize,但推理和预测的过程不用,加上反而结果是错的呢? 我这边是训练了小目标检测中的configs\smalldet\ppyoloe_crn_s_300e_sliced_visdrone_640_025_text_ico.yml, image 其中数据读取模块,使用的ppyoloe_reader image 而ppyoloe_reader中的训练验证和测试,都是有normalize这一步的: image 但是后面仔细看,在ppyoloe_crn_s_300e_sliced_visdrone_640_025_text_ico.yml中的TestReader中多了一个fuse_normalize的参数,经过调试,发现这个参数就是在测试过程中不使用normalize,刚开始没看到,加上了normalize,结果一片空白,什么都没检测出来,去掉后就正常了。 所以我有点疑惑,为什么训练时候加了,测试的时候加上反而结果错误,去掉反而结果正常了?不应该训练和测试时的预处理要保持一致吗?

nemonameless commented 1 year ago

注意区分ppyoloe_plus_reader 和 ppyoloe_reader。 NormalizeImage的定义代码建议先看下 https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/ppdet/data/transform/operators.py#L361 不同mean std是根据预训练模型来设置的,预训练模型训的时候是怎么设置的,检测使用它时就得跟着设置。一般除以255是基本必做的操作。

训练和测试的预处理的确是保持一致的,按我们给的默认配置跑就行。改了导致结果不正常那就是因为预处理没一致。TestReader中多了一个fuse_normalize,是专门预测的时候把norm操作放在网络中进行避免数据处理耗时太多。建议全局搜下fuse_normalize相关代码查看它是什么时候用的怎么用的。

xdg2016 commented 1 year ago

谢谢,预测时候把norm操作放在网络中,是不是导出模型为静态图时,设置fuse_normalize=True,转好的静态图中第一个卷积前的两个操作(红框中的)就是normalize: image 如果不设置fuse_normalize=True,导出的静态图中的第一个卷积前就不会有这两个操作了。 image

lyuwenyu commented 1 year ago

是这样的 ppyoloe有normlize导出时候会fuse到网络, ppyoloe+直接去掉了

xdg2016 commented 1 year ago

是的,我后面又调试了一下,发现确实是这样,ppyoloe+只做了除以255,谢谢解答