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

这篇具有很好参考价值的文章主要介绍了yolov5-计算fps(新加入: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级时间)

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


1. 自己的

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

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

实现步骤:

  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 = True

    model.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_start

    speed_time = elapsed_time / iteration * 1000
    fps = iteration / elapsed_time

    print('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 = True

    model.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_start

    speed_time = elapsed_time / iteration * 1000
    fps = iteration / elapsed_time

    print('Elapsed Time: [%.2f s / %d iter]' % (elapsed_time, iteration))
    print('Speed Time: %.2f ms / iter   FPS: %.2f' % (speed_time, fps))
    return speed_time, fps


if __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 YoloBody


def compute_speed(model, input_size, device, iteration=1000):   # 这个iteration的作用是预热cpu
    torch.cuda.set_device(device)
    cudnn.benchmark = True

    model.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_start

    speed_time = elapsed_time / iteration * 1000
    fps = iteration / elapsed_time

    print('Elapsed Time: [%.2f s / %d iter]' % (elapsed_time, iteration))
    print('Speed Time: %.2f ms / iter   FPS: %.2f' % (speed_time, fps))
    return speed_time, fps


if __name__ == "__main__":
    input_shape = [640, 640]
    anchors_mask = [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
    num_classes = 4

    device = 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 * 2
    flops, 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'

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

  1. 针对2.报的错,清风大佬让我试试【把LeaKy这个激活函数去了】。于是我的操作就是:在nets\backbone.py文件中的15行加入一句代码act = False。如下图:
yolov5-计算fps(新加入:4. 记录运行B导yolov7-tiny后计算fps的方法)
  1. 有个疑问,compute_speed函数中的iteration是什么作用,为什么默认为100?

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

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

下图对比了我训练完之后,用iteration=100iteration=1000的fps结果:文章来源地址https://www.toymoban.com/news/detail-507077.html

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

到了这里,关于yolov5-计算fps(新加入:4. 记录运行B导yolov7-tiny后计算fps的方法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于Yolov7-tiny模型瘦身(param、FLOPs)碎碎念

    优于模型落地需要,yolov7-tiny版本的参数量(Param)为6.2M,FLOPs在输入为320*320下为3.46G,想着还能不能再进行减少这两者或其中之一(精度方面还未做效果验证)。 于是翻遍了github,没有关于v7的剪枝方法,替换backbone也大部分是基于yolov5s的,眼花缭乱中看到yolov7的github官方作者的

    2024年02月05日
    浏览(44)
  • YOLOv7-tiny网络结构图及yaml文件 详细备注

    池化层,默认表示两倍下采样, 就是表示Conv+BN+LeakyReLU [-1, 1, Conv, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]] 结构图 yaml yaml文件中如下表示,直接看最后一层输出通道数,尺寸不会变化,SP模块默认设置卷积Pading为卷积核的一半大小 构建代码 yaml文件中的SP表示如下 结构图 yaml文件表示

    2024年02月03日
    浏览(54)
  • 基于yolov7的FPS游戏(csgo,cf,cfhd)自瞄开发

    1.训练yolo识别人物导出pt文件 链接: yolov7训练自己的数据集-gpu版 2.使用win32进行屏幕截图和鼠标移动 3.使用导出的pt文件进行推理(pt文件将在完善后发出) 屏幕截图获取屏幕-检测目标的坐标-取中心点-计算距离获取最近的敌人坐标-移动鼠标到中心点 数据集整理后上传 鼠标移动

    2024年02月12日
    浏览(54)
  • 基于YOLOV7的openpose人体姿态检测识别,FPS可以达到“较高”的效果

    前不久yolov7(原yolov4团队)在yolov6(美团)开源不到两周的时间也更新了, 如下图所示,yolov7效果比前面的版本确实牛逼,在精度相同的情况下,速度上面提升了一大截,但是这是在比较好的设备上面; YOLOv7 的发展方向与当前主流的实时目标检测器不同,研究团队希望它能

    2024年02月05日
    浏览(41)
  • Ai实现FPS游戏自动瞄准 yolov5fps自瞄

    大家好 我是 毕加锁 (锁!) 今天来分享一个Yolov5 FPS跟枪的源码解析和原理讲解。代码比较粗糙 各位有什么优化的方式可以留言指出,可以一起交流学习。  需要了解的东西和可能会遇到的问题 1.xy坐标点与当前鼠标的xy坐标点距离计算 2.获取窗口句柄,本文使用的是根据窗口名

    2024年02月02日
    浏览(36)
  • Yolov5使用Ai实现FPS游戏自动瞄准

    自动瞄准技术已经成为了许多FPS游戏玩家们追求的终极目标之一。近年来,随着深度学习技术的发展,越来越多的自动瞄准工具开始出现,其中最为流行且表现出色的莫过于 Yolo 系列目标检测算法,特别是 Yolov5。本文将介绍如何使用 Yolov5 算法实现 FPS 游戏自动瞄准。 xy坐标

    2024年02月09日
    浏览(56)
  • Jetson Nano配置YOLOv5并实现FPS=25

    JetPack 4.6——2021.8 yolov5-v6.0版本 使用的为yolov5的yolov5n.pt,并利用tensorrtx进行加速推理,在调用摄像头实时检测可以达到FPS=25。 在打开的文档的末尾添加如下: 保持并退出,终端执行 1.打开终端输入: 2.修改nvzramconfig.sh文件 3.重启Jetson Nano 4.终端中输入: 可查看到swap已经变为

    2024年02月13日
    浏览(27)
  • yolov5 加入可形变卷积

    更新,之前的deformconv2d没加调制参数,应该是dcnv1 现在的才是dcnv2 修改common.py 文件 修改yolo.p文件 找到parse_model函数,把DCNConv加入进去 修改yolov5s.yaml文件 运行下面命令查看网络结构 在自己的数据集上,map50提升了5%

    2024年02月13日
    浏览(25)
  • yolov5识别cf火线敌人(FPS类的AI瞄准)详细教程二

    以下代码只可用于私服,不可商用,代码完全开源,主要用于学习, 上篇文章已经写了yolov5的基础用法,这篇文章主要是将我对yolov5模型的修改,用于实现对屏幕进行实时监测识别并将鼠标移动到人体指定位置的功能,改动的代码不是很多,我尽量说的详细一些供大家学习。

    2024年02月09日
    浏览(35)
  • yolov5识别cf火线敌人(FPS类的AI瞄准)详细教程一

    以下代码只可用于私服,不可商用,代码完全开源, 因为自己的研究方向也是深度学习方向,而且平时闲的时候还喜欢玩会cf火线等枪战,就想着找一个大模型做一个对游戏敌人的识别的功能,一切实现之后就想把自己的心得写出来,我打算分俩个教程分别细述整个学习以及

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包