YOLOv5 推理脚本 参数解析和 预测时间计算
1. 推理脚本参数解析
脚本位置:https://github.com/ultralytics/yolov5/blob/master/detect.py
本文目的:通过学习该脚本,让我们可以自己编写别的项目的推理脚本。
主函数:
if __name__ == "__main__": # 定义一个命令行参数的函数 opt = parse_opt() main(opt) import argparse def parse_opt(): parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path or triton URL') ... opt = parser.parse_args() opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1 # expand print_args(vars(opt)) return opt
argparse
模块是 Python 标准库中推荐的命令行解析
模块。
啥叫命令行解析?意思就是你在 命令行(如 windows 中的 cmd,ubuntu 中的 终端等) 中运行一个程序,可以传一些参数过来,该模块就是来解析这些参数的。比如,命令 ls -l
,-l
就是命令行参数,改变 ls 的行为
一般, argparse 的使用为下面四个步骤:
# 导入该模块 import argparse # 创建一个解析对象 parser = argparse.ArgumentParser() # add_argument() 方法用于指定程序能够接受哪些命令行选项 parser.add_argument() # 调用parse_args()方法进行解析 parser.parse_args()
参数说明:
位置参数
parser.add_argument("echo", help="echo the string you use here")
echo
是一个位置参数, 该参数在运行时候必须提供,否则报错。
可选参数
parser.add_argument("--verbosity", help="increase output verbosity")
--verbosity
是 可选参数,运行程序可以不提供。注意,如果一个可选参数没有在命令行中被使用时,相关变量被赋值为 None
。
parser.add_argument('--view-img', action='store_true', help='show results')
action
是一个标志,而非需要接受一个值。当这一选项存在时,为 args.view-img 赋值为 True。没有指定时则隐含地赋值为 False
parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true")
-v
是 --verbose
的短版本,也就是 二者一样。
我们再看几个参数。
nargs
: 表示设置参数个数
- nargs='*': 表示参数可设置零个或多个
- nargs='+':表示参数可设置一个或多个
- nargs='?': 表示参数可设置零个或一个
type
: 表示该参数的类型,比如 str、int、float
等。
default
: 表示该参数的默认值。我经常会在调试代码中给定我想要的值,然后直接点调试按钮
help
: 该参数的帮助说明,用来说明该参数的用途,方便人来看它的意思。
detect.py 脚本中权重文件使用的是这个参数:nargs='+'。这是用于模型集成时候的,也就是可以传递多个权重。
parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path or triton URL')
比如:
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images
参考:https://github.com/ultralytics/yolov5/issues/318
parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
显然上面的 '--imgsz', '--img', '--img-size'
是一些简写,都是等价的。 而使用 nargs='+'
目的是可以传递一个 list。
参考:https://zhuanlan.zhihu.com/p/258446208
parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3')
YOLOv5 还可以过滤一些类别。
*args, **kwargs, **vars(args) 区别参考:
https://blog.csdn.net/weixin_46841421/article/details/110871251
vars() 函数 是内置函数:https://www.runoob.com/python/python-func-vars.html
2. 预测推理时间计算
resnet18 为例:
cpu:
python classify/predict.py --weights resnet18.pt --imgsz 64 --nosave --source xx.mp4 --device=cpu
gpu:
python classify/predict.py --weights resnet18.pt --imgsz 64 --nosave --source xx.mp4
resnet18 速度统计:
输入大小 | cpu(ms) | v100(ms) |
---|---|---|
64 | 4.5 | 3.4 |
128 | 8.1 | 3.5 |
224 | 17 | 3.5 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现