open-mmlab / mmrotate

OpenMMLab Rotated Object Detection Toolbox and Benchmark
https://mmrotate.readthedocs.io/en/latest/
Apache License 2.0
1.84k stars 540 forks source link

[Bug] The reproduced mAP is much less than the official result(RTMDet, O-RCNN, RetinaNet)/复现mAP离官方宣称结果差别较大 #1036

Open Terry-Zheng opened 3 months ago

Terry-Zheng commented 3 months ago

Prerequisite

Task

I'm using the official example scripts/configs for the officially supported tasks/models/datasets.

Branch

dev-1.x branch https://github.com/open-mmlab/mmrotate/tree/dev-1.x

Environment

这是相应的训练时的日志(仅保留训练epoch开始前的部分) orcnn_20240314_083322.log rtmdet-r-m_20240416_115227.log rotated-retinanet-rbox-le90_r50_fpn_1x_dota_20240523_100514.log

Reproduces the problem - code sample

None

Reproduces the problem - command or script

Reproduces the problem - error message

Additional information

CrazyBrick commented 3 months ago

同蹲一个答案,好像之前看有几篇也是自己的repo给的会比mmrotate复现的高

WenLinLliu commented 3 months ago

我跑官方的config也打不到宣称的进度。请问你用dota数据集是如何切图处理的?

Terry-Zheng commented 3 months ago

我跑官方的config也打不到宣称的进度。请问你用dota数据集是如何切图处理的?

@WenLinLliu 我是直接用mmrotate自带的工具分割的,tools/data/dota/README.md这里有说明

WenLinLliu commented 3 months ago

感谢回答,再问一下,val验证集只做验证吗,需不需要把验证集拿去训练

tianbo321 commented 2 months ago

按照论文中的分割方式处理DOTA数据集,val验证集只做验证,使用8块A100训练300epoch,提交官方服务器mAP: 0.5102483053329094。

Latitude9527 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

tianbo321 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

我使用官方的权重进行测试,map值也达不到官方的效果

tianbo321 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

我使用官方的权重进行测试,map值也达不到官方的效果

dotav1.0的test集

Latitude9527 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

我使用官方的权重进行测试,map值也达不到官方的效果

dotav1.0的test集

老哥有没有跑过paper链接里的源码,原文的代码跑起来能不能达到paper性能

tianbo321 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

我使用官方的权重进行测试,map值也达不到官方的效果

dotav1.0的test集

老哥有没有跑过paper链接里的源码,原文的代码跑起来能不能达到paper性能

这个项目里面有更详细的指标,不需要看paper的

Latitude9527 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

我使用官方的权重进行测试,map值也达不到官方的效果

dotav1.0的test集

老哥有没有跑过paper链接里的源码,原文的代码跑起来能不能达到paper性能

这个项目里面有更详细的指标,不需要看paper的

问题是目前复现不出来这个指标,我准备多跑几次看看

tianbo321 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

我使用官方的权重进行测试,map值也达不到官方的效果

dotav1.0的test集

老哥有没有跑过paper链接里的源码,原文的代码跑起来能不能达到paper性能

这个项目里面有更详细的指标,不需要看paper的

问题是目前复现不出来这个指标,我准备多跑几次看看

你可以看看这个官方文档 https://mmrotate.readthedocs.io/zh-cn/v0.3.4/model_zoo.html image

tianbo321 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

我使用官方的权重进行测试,map值也达不到官方的效果

dotav1.0的test集

老哥有没有跑过paper链接里的源码,原文的代码跑起来能不能达到paper性能

这个项目里面有更详细的指标,不需要看paper的

问题是目前复现不出来这个指标,我准备多跑几次看看

你可以看看这个官方文档 https://mmrotate.readthedocs.io/zh-cn/v0.3.4/model_zoo.html image

我也试了好多方法,复现不出人家的指标,感觉唯一的区别就是硬件不一样

Latitude9527 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

我使用官方的权重进行测试,map值也达不到官方的效果

dotav1.0的test集

老哥有没有跑过paper链接里的源码,原文的代码跑起来能不能达到paper性能

这个项目里面有更详细的指标,不需要看paper的

问题是目前复现不出来这个指标,我准备多跑几次看看

你可以看看这个官方文档 https://mmrotate.readthedocs.io/zh-cn/v0.3.4/model_zoo.html image

我也试了好多方法,复现不出人家的指标,感觉唯一的区别就是硬件不一样

好嘞,感谢老哥,这里面map数据应该是test数据集的性能,我还没把测试test数据集结果传到服务器评估,目前只是根据mmrotate的训练日志里的数据对比着看的

tianbo321 commented 1 month ago

我用官方的config跑的验证结果差了四个点,官方log最后验证是map0.89001,我的log验证是0.85056,数据集方面,官方config貌似把验证和训练数据都放在同一个trainval文件夹里,难道不应该分开么 image

我使用官方的权重进行测试,map值也达不到官方的效果

dotav1.0的test集

老哥有没有跑过paper链接里的源码,原文的代码跑起来能不能达到paper性能

这个项目里面有更详细的指标,不需要看paper的

问题是目前复现不出来这个指标,我准备多跑几次看看

你可以看看这个官方文档 https://mmrotate.readthedocs.io/zh-cn/v0.3.4/model_zoo.html image

我也试了好多方法,复现不出人家的指标,感觉唯一的区别就是硬件不一样

好嘞,感谢老哥,这里面map数据应该是test数据集的性能,我还没把测试test数据集结果传到服务器评估,目前只是根据mmrotate的训练日志里的数据对比着看的

要提交到官方服务器去测,项目里面有大佬提供的权重文件,你可以用来测试,提交到服务器,看看能不能达到项目所述指标。

ZhenboZhao77 commented 1 month ago

我有一个建议:官方给的mpa可能是在多尺度分割图片的情况下得到的结果。而在单一尺度下达不到这种精度很正常

Latitude9527 commented 1 month ago

这是我训练的权重在dota评估服务器评估的的结果,应该算是复现成功了吧。预训练文件用的官方在imagenet训练的resnet50,数据集用的ss_trainval.json分割的,完全照搬mmrotate设置。但是训练日志里最后验证指标还是0.85跟官方训练日志的0.89还是差了一些 image

ZhenboZhao77 commented 1 month ago

ss 是原生尺寸,而ms是多尺度训练。我不是很清楚你知道复现是哪一个模型,我建议你可以排查一下原文是否使用了多尺度训练

---- 回复的原邮件 ---- | 发件人 | @.> | | 发送日期 | 2024年7月25日 16:24 | | 收件人 | @.> | | 抄送人 | @.>, @.> | | 主题 | Re: [open-mmlab/mmrotate] [Bug] The reproduced mAP is much less than the official result(RTMDet, O-RCNN, RetinaNet)/复现mAP离官方宣称结果差别较大 (Issue #1036) |

这是我训练的权重在dota评估服务器评估的的结果,应该算是复现成功了吧。预训练文件用的官方在imagenet训练的resnet50,数据集用的ss_trainval.json分割的,完全照搬mmrotate设置。但是训练日志里最后验证指标还是0.85跟官方训练日志的0.89还是差了一些 image.png (view on web)

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

yangxue0827 commented 1 month ago

这是我训练的权重在dota评估服务器评估的的结果,应该算是复现成功了吧。预训练文件用的官方在imagenet训练的resnet50,数据集用的ss_trainval.json分割的,完全照搬mmrotate设置。但是训练日志里最后验证指标还是0.85跟官方训练日志的0.89还是差了一些 image

训练日志里的指标应该比较早版本的mmrotate训练的,后来应该对online的评估代码做了调整,整体计算出来的结果可能偏低导致的,以test的结果为准,online eval仅供同版本代码训练进行对比和参考。

yangxue0827 commented 1 month ago

我有一个建议:官方给的mpa可能是在多尺度分割图片的情况下得到的结果。而在单一尺度下达不到这种精度很正常

官方的默认都是单尺度性能,多尺度的话会在配置文件名上加ms标记

Terry-Zheng commented 1 month ago

这是我训练的权重在dota评估服务器评估的的结果,应该算是复现成功了吧。预训练文件用的官方在imagenet训练的resnet50,数据集用的ss_trainval.json分割的,完全照搬mmrotate设置。但是训练日志里最后验证指标还是0.85跟官方训练日志的0.89还是差了一些 image

训练日志里的指标应该比较早版本的mmrotate训练的,后来应该对online的评估代码做了调整,整体计算出来的结果可能偏低导致的,以test的结果为准,online eval仅供同版本代码训练进行对比和参考。

@yangxue0827 作者好,那请问这种版本问题造成的结果偏低大概是什么范围呢?像我在最开头提到过的那些数据算正常吗?

yangxue0827 commented 1 month ago
  1. mmrotate目的是在相同数据处理已经训练策略下公平对比各个方法,并不会按照这些方法原文的setting跑,所以和原文的性能不具备可以性;
  2. dota用的是AP50指标不像coco的AP50:95这么稳定,加上DOTA数据量不大,因此有1%内的波动比较正常;
  3. mmrotate提供的权重可能是老版本训练的,新版本代码只保证能load上并测试,因此可能在最终评估精度上有些差异也正常,建议是自己将需要对比的方法重新在同版本代码下跑一遍。
yangxue0827 commented 1 month ago

这是我训练的权重在dota评估服务器评估的的结果,应该算是复现成功了吧。预训练文件用的官方在imagenet训练的resnet50,数据集用的ss_trainval.json分割的,完全照搬mmrotate设置。但是训练日志里最后验证指标还是0.85跟官方训练日志的0.89还是差了一些 image

训练日志里的指标应该比较早版本的mmrotate训练的,后来应该对online的评估代码做了调整,整体计算出来的结果可能偏低导致的,以test的结果为准,online eval仅供同版本代码训练进行对比和参考。

@yangxue0827 作者好,那请问这种版本问题造成的结果偏低大概是什么范围呢?像我在最开头提到过的那些数据算正常吗?

建议是自己将需要对比的方法重新在同版本代码下跑一遍,mmrotate提供的仅供参考。而且你现在测出来的75.84的test已经比我们报的75.69要高了。

Latitude9527 commented 1 month ago

ss 是原生尺寸,而ms是多尺度训练。我不是很清楚你知道复现是哪一个模型,我建议你可以排查一下原文是否使用了多尺度训练 ---- 回复的原邮件 ---- | 发件人 | @.> | | 发送日期 | 2024年7月25日 16:24 | | 收件人 | @.> | | 抄送人 | @.>, @.> | | 主题 | Re: [open-mmlab/mmrotate] [Bug] The reproduced mAP is much less than the official result(RTMDet, O-RCNN, RetinaNet)/复现mAP离官方宣称结果差别较大 (Issue #1036) | 这是我训练的权重在dota评估服务器评估的的结果,应该算是复现成功了吧。预训练文件用的官方在imagenet训练的resnet50,数据集用的ss_trainval.json分割的,完全照搬mmrotate设置。但是训练日志里最后验证指标还是0.85跟官方训练日志的0.89还是差了一些 image.png (view on web) — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***> 我复现的是oriented_rcnn_r50_fpn_1×_dota_le90这个模型,未使用多尺度,性能数据和原文表格中接近的,下面是原文数据,第三和第四的数据是使用了多尺度 image

Terry-Zheng commented 1 month ago
  1. mmrotate目的是在相同数据处理已经训练策略下公平对比各个方法,并不会按照这些方法原文的setting跑,所以和原文的性能不具备可以性;
  2. dota用的是AP50指标不像coco的AP50:95这么稳定,加上DOTA数据量不大,因此有1%内的波动比较正常;
  3. mmrotate提供的权重可能是老版本训练的,新版本代码只保证能load上并测试,因此可能在最终评估精度上有些差异也正常,建议是自己讲需要对比的方法重新在同版本代码下跑一遍。

@yangxue0827 好的,那请问如果我需要在论文中对比的话,是可以直接用自己重新训练现有方法的结果对比吗?还是说得用现有方法论文提供的官方数据?

Latitude9527 commented 1 month ago

这是我训练的权重在dota评估服务器评估的的结果,应该算是复现成功了吧。预训练文件用的官方在imagenet训练的resnet50,数据集用的ss_trainval.json分割的,完全照搬mmrotate设置。但是训练日志里最后验证指标还是0.85跟官方训练日志的0.89还是差了一些 image

训练日志里的指标应该比较早版本的mmrotate训练的,后来应该对online的评估代码做了调整,整体计算出来的结果可能偏低导致的,以test的结果为准,online eval仅供同版本代码训练进行对比和参考。

@yangxue0827 作者好,那请问这种版本问题造成的结果偏低大概是什么范围呢?像我在最开头提到过的那些数据算正常吗?

建议是自己将需要对比的方法重新在同版本代码下跑一遍,mmrotate提供的仅供参考。而且你现在测出来的75.84的test已经比我们报的75.69要高了。

好的,感谢

yangxue0827 commented 1 month ago
  1. mmrotate目的是在相同数据处理已经训练策略下公平对比各个方法,并不会按照这些方法原文的setting跑,所以和原文的性能不具备可以性;
  2. dota用的是AP50指标不像coco的AP50:95这么稳定,加上DOTA数据量不大,因此有1%内的波动比较正常;
  3. mmrotate提供的权重可能是老版本训练的,新版本代码只保证能load上并测试,因此可能在最终评估精度上有些差异也正常,建议是自己讲需要对比的方法重新在同版本代码下跑一遍。

好的,那请问如果我需要在论文中对比的话,是可以直接用自己重新训练现有方法的结果对比吗?还是说得用现有方法论文提供的官方数据?

如果你是用test对比的话,可以直接采用mmrotate的,因为评测代码都是用官方的,比较公平和可靠。mmrotate的online eval仅供参考,一个原因是他是小图的评测,另一个原因是eval代码经历过修改和官方的也不一定一致。如果需要用验证集调参数(当然这里验证集就不要参加训练了),也建议用官方的评测脚本来评估验证集整图的检测结果。

Latitude9527 commented 1 month ago
  1. mmrotate目的是在相同数据处理已经训练策略下公平对比各个方法,并不会按照这些方法原文的setting跑,所以和原文的性能不具备可以性;
  2. dota用的是AP50指标不像coco的AP50:95这么稳定,加上DOTA数据量不大,因此有1%内的波动比较正常;
  3. mmrotate提供的权重可能是老版本训练的,新版本代码只保证能load上并测试,因此可能在最终评估精度上有些差异也正常,建议是自己讲需要对比的方法重新在同版本代码下跑一遍。

@yangxue0827 好的,那请问如果我需要在论文中对比的话,是可以直接用自己重新训练现有方法的结果对比吗?还是说得用现有方法论文提供的官方数据?

感觉对比的话控制好变量就行,哪个数据有利就用哪个,自己跑的绝对真实,如果自己方法性能好到碾压对比方法的paper数据,感觉就没必要再跑一遍了

yangxue0827 commented 1 month ago
  1. mmrotate目的是在相同数据处理已经训练策略下公平对比各个方法,并不会按照这些方法原文的setting跑,所以和原文的性能不具备可以性;
  2. dota用的是AP50指标不像coco的AP50:95这么稳定,加上DOTA数据量不大,因此有1%内的波动比较正常;
  3. mmrotate提供的权重可能是老版本训练的,新版本代码只保证能load上并测试,因此可能在最终评估精度上有些差异也正常,建议是自己讲需要对比的方法重新在同版本代码下跑一遍。

@yangxue0827 好的,那请问如果我需要在论文中对比的话,是可以直接用自己重新训练现有方法的结果对比吗?还是说得用现有方法论文提供的官方数据?

如果是希望公平对比,就用mmrotate的结果,不要用论文的结果,因为每篇论文setting不一致,不好直接比较的,这个也是做mmrotate的意义。如果你是要刷SOTA,你可以和原论文的比较,毕竟这里也不care用什么手段了。

yangxue0827 commented 1 month ago

mmrotate不是哪篇早期文章的官方代码(当然后面直接用mmrotate开发的不算),mmrotate也没有刻意去完全复现它们(指的是setting和各种稀奇古怪的tricks保持一致),mmrotate的作用是让大家在相同环境和设置下公平比较。如果实在想复现原文的点,还是要用它们开源的代码去跑。

Terry-Zheng commented 1 month ago
  1. mmrotate目的是在相同数据处理已经训练策略下公平对比各个方法,并不会按照这些方法原文的setting跑,所以和原文的性能不具备可以性;
  2. dota用的是AP50指标不像coco的AP50:95这么稳定,加上DOTA数据量不大,因此有1%内的波动比较正常;
  3. mmrotate提供的权重可能是老版本训练的,新版本代码只保证能load上并测试,因此可能在最终评估精度上有些差异也正常,建议是自己讲需要对比的方法重新在同版本代码下跑一遍。

好的,那请问如果我需要在论文中对比的话,是可以直接用自己重新训练现有方法的结果对比吗?还是说得用现有方法论文提供的官方数据?

如果你是用test对比的话,可以直接采用mmrotate的,因为评测代码都是用官方的,比较公平和可靠。mmrotate的online eval仅供参考,一个原因是他是小图的评测,另一个原因是eval代码经历过修改和官方的也不一定一致。如果需要用验证集调参数(当然这里验证集就不要参加训练了),也建议用官方的评测脚本来评估验证集整图的检测结果。

请问你这说的online eval是指哪种,我上面贴的test集结果都是通过修改configs里的dota.py,将下面的那段注释去掉生成zip,交到DOTA官网计算指标的。

https://github.com/open-mmlab/mmrotate/blob/d92844abf9af8fe6c281f3196020003bb20a38b8/configs/_base_/datasets/dota.py#L67-L85

还是说python tools/test.py跑val集,然后在后面加个--eval mAP这种

Terry-Zheng commented 1 month ago
  1. mmrotate目的是在相同数据处理已经训练策略下公平对比各个方法,并不会按照这些方法原文的setting跑,所以和原文的性能不具备可以性;
  2. dota用的是AP50指标不像coco的AP50:95这么稳定,加上DOTA数据量不大,因此有1%内的波动比较正常;
  3. mmrotate提供的权重可能是老版本训练的,新版本代码只保证能load上并测试,因此可能在最终评估精度上有些差异也正常,建议是自己讲需要对比的方法重新在同版本代码下跑一遍。

@yangxue0827 好的,那请问如果我需要在论文中对比的话,是可以直接用自己重新训练现有方法的结果对比吗?还是说得用现有方法论文提供的官方数据?

如果是希望公平对比,就用mmrotate的结果,不要用论文的结果,因为每篇论文setting不一致,不好直接比较的,这个也是做mmrotate的意义。如果你是要刷SOTA,你可以和原论文的比较,毕竟这里也不care用什么手段了。

理解,也就是比方法消融的时候可以用自己训练的,最后贴SOTA结果对比时再用论文官方数据。

yangxue0827 commented 1 month ago
  1. mmrotate目的是在相同数据处理已经训练策略下公平对比各个方法,并不会按照这些方法原文的setting跑,所以和原文的性能不具备可以性;
  2. dota用的是AP50指标不像coco的AP50:95这么稳定,加上DOTA数据量不大,因此有1%内的波动比较正常;
  3. mmrotate提供的权重可能是老版本训练的,新版本代码只保证能load上并测试,因此可能在最终评估精度上有些差异也正常,建议是自己讲需要对比的方法重新在同版本代码下跑一遍。

好的,那请问如果我需要在论文中对比的话,是可以直接用自己重新训练现有方法的结果对比吗?还是说得用现有方法论文提供的官方数据?

如果你是用test对比的话,可以直接采用mmrotate的,因为评测代码都是用官方的,比较公平和可靠。mmrotate的online eval仅供参考,一个原因是他是小图的评测,另一个原因是eval代码经历过修改和官方的也不一定一致。如果需要用验证集调参数(当然这里验证集就不要参加训练了),也建议用官方的评测脚本来评估验证集整图的检测结果。

请问你这说的online eval是指哪种,我上面贴的test集结果都是通过修改configs里的dota.py,将下面的那段注释去掉生成zip,交到DOTA官网计算指标的。

https://github.com/open-mmlab/mmrotate/blob/d92844abf9af8fe6c281f3196020003bb20a38b8/configs/_base_/datasets/dota.py#L67-L85

还是说python tools/test.py跑val集,然后在后面加个--eval mAP这种

训练的时候不是会每训练几个epoch后会做一次eval出map。当然你给的这种也是可以手动测的。