VDIGPKU / DynamicDet

[CVPR 2023] DynamicDet: A Unified Dynamic Architecture for Object Detection

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

请问一下作者,您训练一个epoch要多久,我四张A6000在coco一轮要一天!!!!

1324039468 opened this issue · comments

我们在8 * 3090的机器上用COCO数据集训练cfg/dy-yolov7-step1.yaml,单epoch预计15分钟左右。

您可以检查一下以下几点

  1. 数据量是否远超COCO数据集(COCO为100k级别)
  2. 是否机器在并行执行多个程序
  3. 是否是数据集读取过慢

好的 已解决 不过在step2 为什么第二个epoch 到 Epoch gpu_mem diff score.0 score.1 total labels img_size
0/1 14.3G-0.0003649 0.5656 0.4344 0.1478 16 640: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6467/6467 [25:07<00:00, 4.29it/s]
Class Images Labels P R mAP@.5 mAP@.5:.95: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████| 548/548 [00:39<00:00, 13.98it/s]
all 548 38759 2e-05 0.00112 5.04e-06 2.9e-06

 Epoch   gpu_mem      diff   score.0   score.1     total    labels  img_size
   1/1     6.64G-0.0003061    0.5992    0.4008    0.1545        22       640:  27%|██████████████████████████████▏                                                                                   | 1716/6467 [07:33<12:37,  6.27it/s]   就不动了  尝试了两次都是这样

1/1 6.64G-0.0003061 0.5992 0.4008 0.1545 22 640: 27%|██████████████████████████████▏ | 1716/6467 [07:33<12:37, 6.27it/s] 到这个时候就卡住不动了

我们在使用时未遇到过类似的问题,建议您可以尝试使用COCO数据集训练以验证是否是数据的问题,或再仔细看一下dataset, dataloader以及机器是否有其他问题。

image
好的 谢谢您 本地跑可以 服务器有点问题 请问为什么step2的epoch设为2 或者说 step2也需要设置300epoch吗? 非常感谢您的回复 十分感谢

step2只训练router,其参数量非常少,故无需很多的训练

好的 非常感谢您 那最终用于验证测试的weight 是用的哪个结果?

我这边训练得到的step2的map0.5 要比step1的map0.5低很多

image
du对比
image

step2训练完后,使用step2得到的模型统计获得动态阈值,https://github.com/VDIGPKU/DynamicDet#getting-the-dynamic-thresholds-for-variable-speed-inference

之后利用所需阈值测试step2得到的模型,https://github.com/VDIGPKU/DynamicDet#testing

image
du对比
image

可以查看一下step2的时候是否freeze掉detector了

DynamicDet/train_step2.py

Lines 112 to 116 in 4dbb9b2

# freeze the parameters of the cascaded detector
for k, v in model.named_parameters():
if 'router' not in k:
print('freezing %s' % k)
v.requires_grad = False

好的 非常感谢您的耐心回复 谢谢!

step2训练完后,使用step2得到的模型统计获得动态阈值,https://github.com/VDIGPKU/DynamicDet#getting-the-dynamic-thresholds-for-variable-speed-inference

之后利用所需阈值测试step2得到的模型,https://github.com/VDIGPKU/DynamicDet#testing

请问使用step2得到的模型统计获得动态阈值其中的weight 参数是step2后的pt文件还是step1的?

step2训练完后,使用step2得到的模型统计获得动态阈值,https://github.com/VDIGPKU/DynamicDet#getting-the-dynamic-thresholds-for-variable-speed-inference
之后利用所需阈值测试step2得到的模型,https://github.com/VDIGPKU/DynamicDet#testing

请问使用step2得到的模型统计获得动态阈值其中的weight 参数是step2后的pt文件还是step1的?

step2的

不好意思,还是得叨扰您,我看了好几遍原文,还是没能理解 这个dy阈值是什么意思,得到这些该怎么选取,
image

是随机从这么多输出阈值里选择一个 传入test里面吗?

旨在实现动态推理,在测试的时候通过划定不同的难易比例,获取不同的速度与精度的trade-offs

旨在实现动态推理,在测试的时候通过划定不同的难易比例,获取不同的速度与精度的trade-offs

好的,非常感谢您的回复,我可以理解成只是提供一个阈值参考,然后通过实验看哪一个阈值对应的速度和精度比较好吗?

旨在实现动态推理,在测试的时候通过划定不同的难易比例,获取不同的速度与精度的trade-offs

好的,非常感谢您的回复,我可以理解成只是提供一个阈值参考,然后通过实验看哪一个阈值对应的速度和精度比较好吗?

可以的,阈值越高,hard样本划分的比例越多,整体精度会更高,但速度更慢

非常感谢您的工作,我已经在我的数据集上完成了训练,我想只用step1做训练 直接舍弃step2 之训练step1 然后用step1的结果做验证测试 那么在test的时候 dy阈值参数 还有意义吗?

那没有意义,您可以直接使用step1出的权重进行测试,并将下列代码

DynamicDet/models/yolo.py

Lines 244 to 245 in 4dbb9b2

need_second = self.training or (not self.dynamic) or score[:, 0] < self.dy_thres
need_first_head = self.training or (self.dynamic and score[:, 0] >= self.dy_thres)

改成need_second = True; need_first_head = False

好的 非常感谢您的指导 祝您一些顺利!

这样的话 还是正常对step1训练就行了 step2 以及Getting the dynamic thresholds for variable-speed inference 都不需要了吧?

是的

那没有意义,您可以直接使用step1出的权重进行测试,并将下列代码

DynamicDet/models/yolo.py

Lines 244 to 245 in 4dbb9b2

need_second = self.training or (not self.dynamic) or score[:, 0] < self.dy_thres
need_first_head = self.training or (self.dynamic and score[:, 0] >= self.dy_thres)

改成need_second = True; need_first_head = False

直接使用step1的权重的话,这段代码是只有在测试的时候改,训练的时候不用改吗?我在训练的时候改了这段就报错了:
image

还有关于上面这段:

旨在实现动态推理,在测试的时候通过划定不同的难易比例,获取不同的速度与精度的trade-offs

好的,非常感谢您的回复,我可以理解成只是提供一个阈值参考,然后通过实验看哪一个阈值对应的速度和精度比较好吗?

可以的,阈值越高,hard样本划分的比例越多,整体精度会更高,但速度更慢

为什么我训练出来的结果阈值设为0的时候的精度反而比为1的时候更高(MAP分别为0.571和0.374)?我用的是DOTA卫星数据集里的一部分数据,训练集有500张1024*1024的图片,val有100张图片,有可能是数据集太小的问题吗?
image
image