lyuwenyu / RT-DETR

[CVPR 2024] Official RT-DETR (RTDETR paddle pytorch), Real-Time DEtection TRansformer, DETRs Beat YOLOs on Real-time Object Detection. 🔥 🔥 🔥
Apache License 2.0
2.34k stars 266 forks source link

pytorch版本的flops怎么计算? #169

Open lkxxxxx opened 9 months ago

lkxxxxx commented 9 months ago

请问一下pytorch版本的flops怎么计算?感谢!!

lyuwenyu commented 9 months ago

可以使用 https://pytorch.org/docs/stable/profiler.html 或者其他第三方的库

NeKoooo233 commented 7 months ago

请问一下pytorch版本的flops怎么计算?感谢!!

可以使用 https://pytorch.org/docs/stable/profiler.html 或者其他第三方的库

找到了一个第三方库 @MrYXJ https://github.com/MrYxJ/calculate-flops.pytorch 在det_solver.py里改最后一个val函数,先安装2个库pip install calflops pip install transformers,

from calflops import calculate_flops
    def val(self, ):
        self.eval()

        base_ds = get_coco_api_from_dataset(self.val_dataloader.dataset)

        module = self.ema.module if self.ema else self.model
        test_stats, coco_evaluator = evaluate(module, self.criterion, self.postprocessor,
                self.val_dataloader, base_ds, self.device, self.output_dir)

        batch_size = 1
        input_shape = (batch_size, 3, 640, 640)
        flops, macs, params = calculate_flops(  model=self.model, 
                                                input_shape=input_shape,
                                                output_as_string=True,
                                                output_precision=4)
        print("Model FLOPs:%s   MACs:%s   Params:%s \n" %(flops, macs, params))

        if self.output_dir:
            dist.save_on_master(coco_evaluator.coco_eval["bbox"].eval, self.output_dir / "eval.pth")

        return

之后运行test脚本就可以了,比如 python tools/train.py -c configs/rtdetr/rtdetr_r18vd_6x_coco.yml -r output/rtdetr_r18vd_6x_coco/checkpoint0071.pth --test-only

NeKoooo233 commented 7 months ago

请问一下pytorch版本的flops怎么计算?感谢!!

可以使用 https://pytorch.org/docs/stable/profiler.html 或者其他第三方的库

image 测出来18版本的是20M,61 GFLOPs

NeKoooo233 commented 7 months ago

如果觉得输出过多的话,把输入细节关掉 calculate_flop设置参数print_detailed =False

lkxxxxx commented 7 months ago

@NeKoooo233 太详细了,非常感谢!! 再请问一下您是怎么计算模型的fps,怎么比较公平的和其他模型做对比。 我现在第一个方法是直接在det_engine最后面添加代码。 images = torch.rand(1, 3, 640, 640) images = images.to('cuda:0') import time

初始化变量

total_time = 0
for i in range(1000):
    start = time.time()
    # 执行模型推理
    model(images)
    end = time.time()
    # 计算fps
    fps = 1 / (end - start)
    # 计算总时间
    total_time += end - start
    # 打印时间,使用毫秒
    print(f'消耗{(end - start) * 1000}ms', f'fps:{fps}')
# 计算平均fps
avg_fps = 1 / (total_time / 1000)
print(f'平均fps:{avg_fps}',f'设备:{device}')

第二种是把模型输出成onnx模式,再调用onnx模型进行计算fps。 这两种方法得到的fps差距还是挺大的,所以在对比其他模型fps时怎么做到公平一点?

NeKoooo233 commented 7 months ago

@lkxxxxx 我还没开始测速的工作,到时候准备用作者提供的工具试一试 https://github.com/lyuwenyu/RT-DETR/tree/main/benchmark 我觉得在onnx或者tensorRT上面测比较好,至于公平,那只能把所有需要对比的模型在同一个设备上测试了, 毕竟作者用的T4,我也没有😭 或许可以去autoDL上面租T4

lkxxxxx commented 7 months ago

@NeKoooo233 好的,了解了,非常感谢

71tongwei commented 4 months ago

@NeKoooo233 太详细了,非常感谢!! 再请问一下您是怎么计算模型的fps,怎么比较公平的和其他模型做对比。 我现在第一个方法是直接在det_engine最后面添加代码。 images = torch.rand(1, 3, 640, 640) images = images.to('cuda:0') import time # 初始化变量 total_time = 0 for i in range(1000): start = time.time() # 执行模型推理 model(images) end = time.time() # 计算fps fps = 1 / (end - start) # 计算总时间 total_time += end - start # 打印时间,使用毫秒 print(f'消耗{(end - start) * 1000}ms', f'fps:{fps}') # 计算平均fps avg_fps = 1 / (total_time / 1000) print(f'平均fps:{avg_fps}',f'设备:{device}') 第二种是把模型输出成onnx模式,再调用onnx模型进行计算fps。 这两种方法得到的fps差距还是挺大的,所以在对比其他模型fps时怎么做到公平一点?

第一种测出来的速度还不如yolov8呢,怎么回事啊?

lkxxxxx commented 4 months ago

@71tongwei 你对比的是yolov8的哪个版本,yolov8模型本身预测速度还是很快的,但是我转换成onnx后,同时加上后处理操作,yolov8的速度就不如rt-detr了