深度学习项目配置参数(一) argparse.ArgumentParser的使用教程

引 言 训练模型的配置参数在每次实验中都存在部分参数值需要略微调整的情况,如果只在运行主程序文件内调整参数值增加了实验的繁琐程度,严重降低用户体验。良好的配置系统应该具备以下特点:

  • 方便修改实验所需的超参数
  • 用户可以快捷管理项目和复现实验结果
  • 项目结构清晰

实际项目中常见的配置系统:1) argparse.ArgumentParser 2) 使用yaml文件配置参数 3)使用yacs库结合yaml文件配置系统。argparse库提供了用户友好的命令行接口可以不用打开文件直接从命令行传递需要修改的配置参数,完美地解决了模型运行环境参数配置的难题。在本文中,主要介绍argparse模块实际使用场景中涉及的一些操作。若想全面了解该库可查阅argparse官方文档


一、创建ArgumentParser对象

语法:

import argparse	#导入模块

parser = argparse.ArgumentParser(description='what the program does')	#创建对象

参数description描述本程序用途以及怎么使用。

parser = argparse.ArgumentParser(description='what the program does')
parser.print_help()	#打印帮助信息

在命令行输入执行命令后,发现描述信息出现在界面中。

python ssss.py	#主程序执行命令

在这里插入图片描述

二、add_argument()定义参数及parse_args()解析参数

创建对象后,调用add_argument()函数定义模型需要使用的单个参数名称以及如何解析。

2.1 定义位置参数或者可选参数

  • 定义位置参数语法
    parser.add_argument(‘name’),直接输入参数名称name ,位置参数在参数解析过程中必须赋值否则会报错。
parser.add_argument('batch_size')
  • 定义可选参数语法
    parser.add_argument(‘-flag’,‘–flag’)
    可以在参数名flag前添加前缀---,表示同一个可选参数的两种形式。例如示例中的-m--model
parser.add_argument('-m','--model')
parser.add_argument('--lr')

2.2 parse_args()参数解析

2.2.1 parse_args()参数赋值及解析的常用方法

定义的参数在命令行传递相应数值后,需调用parse_args()函数解析参数并返回一个Namespace对象,参数变成对象的属性。参数值匹配优先按照-匹配(可选参数),剩余参数值依次赋给定义的位置参数。

parser = argparse.ArgumentParser(description='what the program does')
parser.add_argument('batch_size')
parser.add_argument('-m','--model')
parser.add_argument('--lr')

args = parser.parse_args()
print(args) #打印返回的命名空间对象
  • 参数赋值方法一:参数赋值可以在命令行窗口中输入命令:
    python ***.py [参数值列表]
    参数值会自动解析成字符串,若想要参数值为int或者float可以在定义参数时设置关键字type( 在下面小节详解[type属性] #2.3.6 type属性)。
    在这里插入图片描述
  • 参数赋值方法二:直接在主程序内部的parse_args()中添加参数值列表,
    parser.parse_args([参数值列表])
    传递的参数名和参数值必须为字符串,否则程序会报错。
args = parser.parse_args(['5','--model','lenet'])
print(args)

####结果
Namespace(batch_size='5', lr=None, model='lenet')
  • 参数赋值方法三:在命令行输入与方法一相同的命令后,调用parse_args(sys.argv[1:])函数解析参数。
    注:sys.argv列表的第一项是当前文件相对路径【相对于命令行窗口根目录】,从列表第二项开始为命令行传递的参数名和参数值。
import sys
print(sys.argv) 	#在主程序中打印argv列表
args = parser.parse_args(sys.argv[1:])
print(args)

注意
在命令行输入携带参数值的命令后,主程序argv列表显示结果为下面内容。由于参数在主程序中会解析成字符串,如果在命令行传递参数值为字符串,则会在主程序的的argv列表中出现双层包裹的字符串,如红色方框标注的那样。命名空间对象中的属性值也是一个双层包裹的字符串。
在这里插入图片描述

注意:位置参数在命令行接口中必须赋值,不赋值会报错。可选参数若没有配置required=True时可以赋值也可以不赋值。
举例:在命令行中输入语句只给可选参数[model]赋值,位置参数[batcdh_size]没有赋值时程序报错。
在这里插入图片描述

2.2.2 parse_args()和parse_known_args()解析参数的区别

项目主程序脚本除了使用parser.parse_args()函数解析参数值外,也可以调用parser.parse_known_args()解析参数,下面会介绍两种解析方法的区别。

  • parser.parse_args()只解析在parser.add_argument()中定义的参数名。
    在示例代码中,对未定义参数'--blocks'赋值程序报错。
import argparse

parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-m','--model')
parser.add_argument('--lr')

args = parser.parse_args(['--blocks','10'])
usage: ssss.py [-h] [-m MODEL] [--lr LR]
ssss.py: error: unrecognized arguments: --blocks 10
  • parser.parse_known_args()提高未定义参数的容错能力。
    parser.parse_known_args()函数的参数值列表中可以存在未定义的参数名,函数的返回值分为两部分,一个是解析参数的namespace,另一个是未知参数列表。
namespace, unknow_args = parser.parse_known_args([params])

示例代码:

import argparse

parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-m','--model')
parser.add_argument('--lr')

args,unknown_args = parser.parse_known_args(['--blocks','10','--lr','0.01','--model','lenet'])
print('known_args:',args)
print('unknown_args:',unknown_args)

##结果##
known_args: Namespace(lr='0.01', model='lenet')
unknown_args: ['--blocks', '10']

访问解析后的参数值可以直接通过args.参数名方式。

print('model name:', args.model)

###
model name: lenet

2.3 定义参数的属性设置

2.3.1 default属性

在命令行或者parser.parse_args()函数中没有给可选参数赋值时,参数使用默认值。赋值时使用新值。

parser.add_argument('batch_size',default=32)
parser.add_argument('-m','--model',default='Resnet')
parser.add_argument('--lr')
args = parser.parse_args(['8'])
print(args)

###
Namespace(batch_size='8', lr=None, model='Resnet')
2.3.2 action属性
  • action=‘store_true’或’store_false’,在命令行或者parser.parse_args()函数中没有出现参数名,参数使用默认bool值,出现参数名称时,动作为’store_true’时,参数bool值为True,动作为’store_false’参数时,bool值为False。
# 1.解析参数列表中出现参数名,use_gpu为True
parser.add_argument('--use_gpu',action='store_true',default=False)
args = parser.parse_args(['6'
def setOPT(): # 文件配置 # ******************************************************* parser = argparse.ArgumentParser() parser.add_argument('--weights', type=str, default='D:/py/FaceRecognition/weights/last.pt', help='model.pt path') parser.add_argument('--source', type=str, default='C:/Users/lieweiai/Desktop/video/26321934-1-192.mp4', help='source') # file/folder, 0 for webcam parser.add_argument('--output', type=str, default='../inference/output', help='output folder') # output folder parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)') parser.add_argument('--conf-thres', type=float, default=0.3, help='object confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.5, help='IOU threshold for NMS') parser.add_argument('--fourcc', type=str, default='mp4v', help='output video codec (verify ffmpeg support)') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='display results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--classes', nargs='+', type=int, help='filter by class') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--facenet-model-path',type=str,default='D:/code_data/facenet/20180402-114759',help='miss facenet-model') parser.add_argument('--svc-path', type=str, default='D:/code_data/face_recognition/pkl/SVCmodel.pkl', help='miss svc') parser.add_argument('--database-path', type=str, default='D:/code_data/face_recognition/npz/Database.npz', help='miss database') opt = parser.parse_args() opt.img_size = check_img_size(opt.img_size) print(opt) return opt 这段代码什么意思
最新发布
03-21
<think>好的,我现在需要帮助用户理解他们提供的Python代码段。首先,用户给了个函数`def setOPT():`,里面主要使用了`argparse`模块来配置命令行参数。我需要逐步分析这段代码的功能和结构,然后以清晰的中文解释给用户。 首先,我需要确定代码的结构。函数`setOPT()`内部创建了个`argparse.ArgumentParser()`对象,然后添加了系列的命令行参数。这些参数包括模型权重路径、输入源、输出目录、图像尺寸、置信度阈值等等。最后解析这些参数,进行些处理(比如`check_img_size`),然后返回配置对象`opt`。 接下来,我要考虑用户可能的背景。用户可能对Python的命令行参数解析不太熟悉,或者对这段代码在具体项目中的应用场景不清楚。他们可能想知道每个参数的作用,以及这段代码在整体项目中的用途,比如用于人脸识别或其他计算机视觉任务。 我需要分步骤解释这段代码。首先,介绍`argparse`模块的作用,用来解析命令行参数。然后,逐个解释添加的参数,比如`--weights`是指模型权重文件的路径,`--source`是输入源,可能是视频文件或摄像头输入。解释每个参数的类型、默认值以及帮助信息。然后说明`parser.parse_args()`的作用是将命令行输入的参数解析成对象`opt`,并进行后续处理,比如检查图像尺寸是否符合要求,最后打印和返回配置对象。 此外,需要指出这段代码的典型应用场景,比如用于目标检测或人脸识别项目配置模型推理时的各种参数。可能还需要提到参数的具体用途,例如`--conf-thres`是对象检测的置信度阈值,`--iou-thres`是NMS的IOU阈值,以及`--facenet-model-path`和`--svc-path`可能与人脸识别模型相关。 同时,要注意用户可能不熟悉某些术语,比如NMS(非极大值抑制)、`fourcc`视频编解码器,或者`action='store_true'`的含义,需要适当解释,但保持简洁,避免过于深入技术细节。 最后,总结这段代码的功能,即集中管理项目中的各种配置参数,便于从命令行灵活调整,适用于需要多次实验或不同环境部署的场景。确保解释清晰、结构合理,帮助用户理解代码的作用和每个参数的意义。</think>以下是对这段代码的逐步解析: #### 1. **功能定位** 这是个**命令行参数配置函数**,用于集中管理深度学习项目(目标检测/人脸识别)的运行时参数。主要基于`argparse`模块实现参数解析。 #### 2. **代码结构拆解** ```python def setOPT(): # 创建参数解析器 parser = argparse.ArgumentParser() # 添加参数组(关键参数详解见下文) parser.add_argument('--weights', ...) # 模型权重路径 parser.add_argument('--source', ...) # 输入源(文件/摄像头) # ... 其他参数省略 ... # 解析参数并进行后处理 opt = parser.parse_args() opt.img_size = check_img_size(opt.img_size) # 校验图像尺寸合法性 print(opt) # 打印参数配置 return opt ``` #### 3. **核心参数详解** | 参数名称 | 作用说明 | 典型值示例 | |---------------------|--------------------------------------------------------------------------|-------------------------------------------| | `--weights` | 预训练模型权重文件路径 | `'weights/last.pt'` | | `--source` | 输入源(视频文件/图片文件夹/摄像头ID) | `'test.mp4'`, `0`(摄像头) | | `--img-size` | 模型推理时输入的图像尺寸(需符合模型要求) | `640`(YOLO常用尺寸) | | `--conf-thres` | 对象检测的置信度阈值(过滤低置信度检测框) | `0.3` | | `--iou-thres` | 非极大值抑制(NMS)的IoU阈值(过滤重叠框) | `0.5` | | `--facenet-model-path` | FaceNet模型路径(人脸特征提取模型) | `'20180402-114759'` | | `--svc-path` | 支持向量机分类器路径(用于人脸识别分类) | `'SVCmodel.pkl'` | | `--database-path` | 人脸特征数据库路径(`.npz`格式存储的人脸特征向量) | `'Database.npz'` | #### 4. **特殊参数解析** - `action='store_true'`:表示当参数存在时设为`True`(如`--view-img`启用实时显示) - `nargs='+'`:允许接收多个值(如`--classes 0 2`表示只检测类别0和2) - `type=float/int/str`:强制参数类型转换 #### 5. **典型应用场景** ```python # 主程序中的调用示例 if __name__ == '__main__': opt = setOPT() # 获取配置参数 # 将opt传递给检测器/识别器 detector = FaceDetector(weights=opt.weights) recognizer = FaceRecognizer( facenet_path=opt.facenet_model_path, svc_path=opt.svc_path, database_path=opt.database_path ) ``` #### 6. **设计优势** - **参数集中管理**:避免硬编码,提升代码可维护性 - **命令行灵活性**:运行时可通过命令行覆盖默认值(如`python main.py --source 0 --view-img`) - **多环境适配**:通过切换参数值快速适应开发/测试/生产环境 #### 7. **扩展建议** - 可添加`config.yaml`配置文件支持,实现更复杂的参数管理 - 对关键路径参数增加自动存在性检查(如`if not os.path.exists(opt.weights):`) - 添加类型校验装饰器确保参数合法性 该代码段常见于基于YOLO/FaceNet的人脸识别系统中,用于统管理模型加载、数据输入、算法参数配置项。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值