前言
深度学习:模型的推理时间与FPS计算的介绍,并且有详细的YOLO系列与MMdetection系列的FPS计算实现方法
提示:以下是本篇文章正文内容,下面案例可供参考
一、模型推理时间
推理时间:是指模型在处理单个样本所需的时间。这个时间取决于模型的复杂性和所使用的硬件设施。对于神经网络模型,推理时间通常在毫秒到秒之间。
为了精确地测量推理时间,可以使用Python中的time库。下面是一个例子:
import time
model.eval() # 设定模型为评估模式
input_data = ... # 输入数据
start_time = time.time() # 获取开始时间
output = model(input_data) # 模型推理
end_time = time.time() # 获取结束时间
inference_time = end_time - start_time # 计算推理时间
二、FPS(每秒帧数)计算
1、FPS基础
FPS:表示每秒处理的帧数,通常用于衡量模型的性能。对于深度学习模型,通常需要在大量数据上进行训练,因此高FPS是非常重要的。其计算公式为:
,其中 ProcessingTimePerFrame 代表 每帧处理时间。
也可以使用Python中的time库来计算FPS,下面是一个例子:
其中运用公式 ,其中n表述处理的总帧数
import time
model.eval() # 设定模型为评估模式
input_data = ... # 输入数据
start_time = time.time() # 获取开始时间
for i in range(n): # n为处理的总帧数
output = model(input_data) # 模型推理
end_time = time.time() # 获取结束时间
fps = n / (end_time - start_time) # 计算FPS
2、YOLO系列的FPS
在YOLO中这个值通常是由test.py来得到。将test.py的权重文件换为训练生成的best.pt,如下图所示:
运行过后能够得到spped三个值
这里只需用到total,FPS就是1000ms(=1s)/4.8ms=208.3
当然,使用detect.py也能够得到我们的FPS,运行detect.py后的结果如下:
- pre-process:图像预处理时间,包括图像保持长宽比缩放和padding填充,通道变换(HWC->CHW)和升维处理等。
- ms inference:推理速度,指预处理之后的图像输入模型到模型输出结果的时间。
- NMS :可以理解为后处理时间,对模型输出结果经行转换等。
至于计算FPS,是1s也就是1000ms除以这三个时间相加。
3、MMdetection的FPS
3.1、测试模型
python tools/analysis_tools/benchmark.py \
configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py \
--checkpoint checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth --fuse-conv-bn \
--fuse-conv-bn
3.2、遇到的问题
1.空类'NoneType'调用错误
AttributeError: 'NoneType' object has no attribute 'Process'
解决方法:
安装psutil模块 pip install psutil
2、FPS结果过大的问题
计算出的FPS为300多帧,明显不正常
Overall fps: 326.7 batch/s, times per batch: 3.1 ms/batch, batch size: 1, num_workers: 2
解决方法
benchmark.py默认参数错误
将 default='dataloader ',中 dataloader 改成 inference
改变后才会调用定义的模型,执行对应的推理程序计算真实帧率
结果
接近真实值