YOLOv8 添加 FPS 输出:一步步教你修改代码
在使用 YOLOv8 进行模型训练和验证时,我们经常希望看到 FPS(帧率),以便了解模型的处理速度。然而,YOLOv8 默认只输出每阶段的耗时(如 preprocess、inference 等),并未直接打印 FPS。本文将手把手教你如何在 YOLOv8 中添加 FPS 输出。
📌 为什么要输出 FPS?
FPS(Frames Per Second)是衡量模型实时处理能力的重要指标,特别是在部署到边缘设备或嵌入式系统时。
通过打印 FPS,我们可以直观了解模型在当前硬件上的推理速度,便于优化和调优。
🔍 修改步骤概览
- 找到需要修改的文件
- 定位代码位置
- 添加打印 FPS 的代码
接下来,我们逐步操作。
1️⃣ 找到需要修改的文件
YOLOv8 的核心代码位于 ultralytics
目录下。我们需要修改的是模型验证阶段输出的日志。
操作:
在项目根目录下,全局搜索关键字:
postprocess per image
搜索结果会定位到:
ultralytics/engine/validator.py
大约在 第 206 行附近。
这是 YOLOv8 输出每阶段耗时信息的位置,我们就在这里添加 FPS 输出。
2️⃣ 原始代码片段
找到以下代码:
LOGGER.info(
"Speed: {:.1f}ms preprocess, {:.1f}ms inference, {:.1f}ms loss, {:.1f}ms postprocess per image".format(
*tuple(self.speed.values())
)
)
它负责打印每个阶段的耗时(单位:ms)。
3️⃣ 添加 FPS 输出代码
在上面代码 后面,添加以下代码:
LOGGER.info(f'FPS: {(1000 / sum(self.speed.values())):.2f}')
这里我们通过计算 每张图片总耗时 的倒数,得到每秒可以处理多少帧(FPS)。
4️⃣ 修改后的完整代码
修改后的代码如下:
LOGGER.info(
"Speed: {:.1f}ms preprocess, {:.1f}ms inference, {:.1f}ms loss, {:.1f}ms postprocess per image".format(
*tuple(self.speed.values())
)
)
LOGGER.info(f'FPS: {(1000 / sum(self.speed.values())):.2f}')
继续往下,还可以看到保存 JSON 和绘图的代码段:
if self.args.save_json and self.jdict:
with open(str(self.save_dir / "predictions.json"), "w") as f:
LOGGER.info(f"Saving {f.name}...")
json.dump(self.jdict, f) # flatten and save
stats = self.eval_json(stats) # update stats
if self.args.plots or self.args.save_json:
LOGGER.info(f"Results saved to {colorstr('bold', self.save_dir)}")
return stats
这个部分不用修改,仅供参考。
🚀 最终效果
修改后,在训练或验证结束时,终端会输出类似以下信息:
Speed: 1.2ms preprocess, 8.3ms inference, 0.5ms loss, 1.0ms postprocess per image
FPS: 96.15
其中:
- Speed 表示各阶段耗时
- FPS 表示每秒可处理的图片数
✅ 小结
通过简单修改 validator.py
文件,我们让 YOLOv8 在验证阶段直接输出了 FPS。这个修改适用于训练、验证等阶段,非常适合需要关注实时性能的开发者。