目录

  • 0. FPS记录的原理
  • 1. 自己的
  • 2. 其实yolov5有自带的打印这些参数
  • 3. 清风大佬分享的
    • 3.1 单个的计算fps函数
    • 3.2 整体的完整代码
  • 4. 记录运行B导yolov7-tiny后计算fps的方法

0. FPS记录的原理

参考自:睿智的目标检测21——如何调用摄像头进行目标检测

FPS简单来理解就是图像的刷新频率,也就是每秒多少帧

假设目标检测网络处理1帧要0.02s,此时FPS就是50

#---------------------------分割线-------------------------------- #

也就是说在计算FPS的时候,会强调每秒每张。因此,在众多博客中计算FPS时,都会注意以下两点:

  1. 实现要求每张:将batch-size设置为1
  2. 实现要求每秒:用1000去除以3个时间之和1s=1000ms,调用yolov5中的val.py后会计算并打印出pre-process图像预处理inference推理NMS非极大值抑制处理这3个ms级时间)

1. 自己的

在yolov5的val.py文件中添加了如下两行代码,即可实现打印:

实现步骤:

  1. val.py中按住快捷键Ctrl+F搜索Print speeds定位过去
  2. 在上图中的合适位置添加如下代码:
FPS = 1000 / sum(t)
LOGGER.info(f'FPS: {round(FPS, 3)}')
  1. 调整好合适参数,直接运行val.py即可(但是要注意一下,batch-size要设置为1

2. 其实yolov5有自带的打印这些参数

参考链接:查看yolov5/lite各层参数量和各层FLOPs

实现方法:(主要是直接调用的yolov5中已经写好的代码utils/torch_utils.py中的profile等函数)

  1. 在终端运行yolo.py时,带上参数--profile,这样可以打印整体的参数量、浮点数运算等
  2. 在终端运行yolo.py时,带上参数--line-profile,这样可以打印出每层的参数量、浮点数等(这第2种方法,在yolov5-master下载下来的val.py中可实现,如果单独下载的yolov5-v6.1中没有这个--line-profile参数)

3. 清风大佬分享的

3.1 单个的计算fps函数

def compute_speed(model, input_size, device, iteration=100):torch.cuda.set_device(device)cudnn.benchmark = Truemodel.eval()model = model.cuda()input = torch.randn(*input_size, device=device)for _ in range(50):model(input)print('=========Eval Forward Time=========')torch.cuda.synchronize()t_start = time.time()for _ in range(iteration):model(input)torch.cuda.synchronize()elapsed_time = time.time() - t_startspeed_time = elapsed_time / iteration * 1000fps = iteration / elapsed_timeprint('Elapsed Time: [%.2f s / %d iter]' % (elapsed_time, iteration))print('Speed Time: %.2f ms / iter   FPS: %.2f' % (speed_time, fps))return speed_time, fps

3.2 整体的完整代码

def compute_speed(model, input_size, device, iteration=100):torch.cuda.set_device(device)cudnn.benchmark = Truemodel.eval()model = model.cuda()input = torch.randn(*input_size, device=device)for _ in range(50):model(input)print('=========Eval Forward Time=========')torch.cuda.synchronize()t_start = time.time()for _ in range(iteration):model(input)torch.cuda.synchronize()elapsed_time = time.time() - t_startspeed_time = elapsed_time / iteration * 1000fps = iteration / elapsed_timeprint('Elapsed Time: [%.2f s / %d iter]' % (elapsed_time, iteration))print('Speed Time: %.2f ms / iter   FPS: %.2f' % (speed_time, fps))return speed_time, fpsif __name__ == '__main__':parser = ArgumentParser()parser.add_argument("--size", type=str, default="256,256", help="input size of model")parser.add_argument('--num-channels', type=int, default=3)parser.add_argument('--batch-size', type=int, default=8)parser.add_argument('--classes', type=int, default=2)parser.add_argument('--iter', type=int, default=501)parser.add_argument('--model', type=str, default='deeplabv3plus_mobilenet')parser.add_argument("--gpus", type=str, default="0", help="gpu ids (default: 0)")args = parser.parse_args()h, w = map(int, args.size.split(','))model = build_model(args.model, num_classes=args.classes)compute_speed(model, (args.batch_size, args.num_channels, h, w), int(args.gpus), iteration=args.iter)

4. 记录运行B导yolov7-tiny后计算fps的方法

B导的yolov7-tiny代码地址:yolov7-tiny-pytorch

兴许他的yolox的fps也可以这样来计算呢,地址为:yolox-pytorch

顺利跑起来的步骤:

  1. 在根目录下的summary.py中加入上面3.清风大佬分享的代码,整体如下:
# --------------------------------------------#
#   该部分代码用于看网络结构
# --------------------------------------------#
import torch
from thop import clever_format, profile
from torch.backends import cudnn
import time
from nets.yolo import YoloBodydef compute_speed(model, input_size, device, iteration=1000):   # 这个iteration的作用是预热cputorch.cuda.set_device(device)cudnn.benchmark = Truemodel.eval()model = model.cuda()input = torch.randn(*input_size, device=device)for _ in range(50):model(input)print('=========Eval Forward Time=========')torch.cuda.synchronize()t_start = time.time()for _ in range(iteration):model(input)torch.cuda.synchronize()elapsed_time = time.time() - t_startspeed_time = elapsed_time / iteration * 1000fps = iteration / elapsed_timeprint('Elapsed Time: [%.2f s / %d iter]' % (elapsed_time, iteration))print('Speed Time: %.2f ms / iter   FPS: %.2f' % (speed_time, fps))return speed_time, fpsif __name__ == "__main__":input_shape = [640, 640]anchors_mask = [[6, 7, 8], [3, 4, 5], [0, 1, 2]]num_classes = 4device = torch.device("cuda" if torch.cuda.is_available() else "cpu")m = YoloBody(anchors_mask, num_classes, False).to(device)for i in m.children():print(i)print('==============================')dummy_input = torch.randn(1, 3, input_shape[0], input_shape[1]).to(device)flops, params = profile(m.to(device), (dummy_input,), verbose=False)# --------------------------------------------------------##   flops * 2是因为profile没有将卷积作为两个operations#   有些论文将卷积算乘法、加法两个operations。此时乘2#   有些论文只考虑乘法的运算次数,忽略加法。此时不乘2#   本代码选择乘2,参考YOLOX。# --------------------------------------------------------#flops = flops * 2flops, params = clever_format([flops, params], "%.3f")print('Total GFLOPS: %s' % (flops))print('Total params: %s' % (params))# -------------------------计算fps------------------------ #model = YoloBody(anchors_mask, num_classes, False)speed_time, fps = compute_speed(m, (1, 3, 640, 640), device=0)print(speed_time)print(fps)
  1. 然后就报错咯,如下图

问题应该是出在最后那一句报错:AttributeError: 'LeakyReLU' object has no attribute 'total_ ops'

  1. 针对2.报的错,清风大佬让我试试【把LeaKy这个激活函数去了】。于是我的操作就是:在nets\backbone.py文件中的15行加入一句代码act = False。如下图:

  1. 有个疑问,compute_speed函数中的iteration是什么作用,为什么默认为100?

然后清风大佬就给我解释了:

  • iteration是用于预热cpu
  • iteration的值不固定,对结果的影响很小

下图对比了我训练完之后,用iteration=100iteration=1000的fps结果:

lwd

yolov5-计算fps(新加入:4. 记录运行B导yolov7-tiny后计算fps的方法)相关推荐

  1. win10系统新电脑用VMware运行Ubuntu电脑就蓝屏死机

    问题描述 win10系统新电脑用VMware运行Ubuntu电脑就蓝屏死机 解决方法 用电脑管家重新下载VMware安装,然后运行Ubuntu.一切正常

  2. linux中计算高斯的进程,linux下运行高斯比windows的优势

    转引自GaussianFAQ第一章第四节 (1.4) 难道非要用Linux算高斯吗?Windows算高斯的缺陷是什么? 后续问题:听说Linux很难的.我是电脑小白,在Windows上都不太懂,只会最 ...

  3. 行业场景智能应用,解锁边缘计算时代新机遇

    简介:阿里云混合云(Apsara Stack)首个全自研原生混合云,与阿里云公共云同宗同源.经过大规模商用验证.历经多年双11考验,是阿里云建管用一体化的全栈混合云平台,助力企业级客户全栈建云.智能管 ...

  4. 开发者解读:为什么蚂蚁要用融合计算这种新计算模式?

    导读:如今大部分人工智能应用是基于监督学习范式开发的,即模型在线下进行训练,然后部署到服务器上进行线上预测,这样的开发方式在实时响应上存在较大的局限.随着计算和 AI 体系逐步成熟,我们希望机器学习应 ...

  5. docker 厂商 容器_容器化 - 边缘计算的新方向

    随着物联网终端设备数量的快速增加,同时由于网络带宽有限,高昂的传输成本和较高的响应延时等问题,传统的基于云计算模型的集中式数据处理方式已不能有效处理网络边缘设备所产生的海量数据.针对物联网场景中的新挑 ...

  6. Scratch3.0——助力新进程序员理解程序(案例八、等差数列计算1)

    Scratch3.0--助力新进程序员理解程序(案例八.等差数列计算1) 前言 一般来说,针对6-18岁的少年儿童开展的编程教育,现在,最常见的形式是线上和线下模式相结合的课外培训. 这里我用作让大朋 ...

  7. 边缘计算:新瓶装旧酒?

    导读:边缘计算概念刚出来的时候,很多人的第一反应是"这是哪个行业组织或者公司为了拉动市场需求而创造出来的新词汇吧?" 边缘计算究竟是什么?为什么会有边缘计算?它是一个全新的概念吗? ...

  8. python 量子计算包_ProjectQ:解锁Python实现量子计算的新方式!

    原标题:ProjectQ:解锁Python实现量子计算的新方式! [ ] [IT168 资讯]现在已经有很多软件框架可用于访问量子计算机,本文将要提到的ProjectQ就是其中之一.ProjectQ是 ...

  9. Windows系统激活问题:在运行Microsoft Windows 非核心版本的计算机上,运行 slui.exe 0x2a 0x803f7001 以显示错误文本 解决方案

    [问题]在运行Microsoft Windows 非核心版本的计算机上,运行 slui.exe 0x2a 0x803f7001 以显示错误文本 [解决方案] 1.开机按下[Win + R],输入:re ...

最新文章

  1. 在CentOS 7.5上升级SQLite3过程实录
  2. 真没想到,Python还能实现5毛特效
  3. 基础 - 结构体大小计算
  4. jQuery基础部分
  5. hdu 5031 Lines 爆搜
  6. [数据仓库]我理解的数据中台
  7. mysql table key,MySQL中为table添加primary key的两种方法[多图]
  8. 专业wifi测试软件,专业的WiFi检测工具有哪些?
  9. 微信小程序内嵌网页链接
  10. CSP 201809-2 买菜
  11. 计算机数值分析-插值法-差商-04
  12. 实对称矩阵的特征值求法_机械振动理论(3)-解析实模态分析
  13. 剑指offer-字符串总结
  14. 防骗指南-披着交友恋爱的外衣,诱骗受害者赌博转钱
  15. MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测
  16. Mathf.PingPong
  17. 一文了解蛋白功能结构域预测与分析
  18. 在Java中使用临时文件/文件夹
  19. 浅析多卡多链路聚合路由器的关键技术、原理
  20. 关于修改ulimit -SHn 65535

热门文章

  1. python8-罗马数字转换
  2. CSDN下载资源再评论不返积分2017-11-8 11:00
  3. Android 高仿腾讯新闻频道定制页面
  4. Nignx-学习总结
  5. python判断字母大小写_python用函数怎么判断大小写
  6. HTML高德地图标点
  7. Nvidia MX150安装Tensorflow-GPU版,Pycharm使用Keras
  8. 关于微信域名检测拦截避免与方法
  9. 对于spring boot的理解
  10. VFB组件:Miniblink控件(浏览器)