Python val() 通过字符串对应至同名变量

eval()函数可以方便的在python中,通过字符串访问变量名。方便代码中提取特定的一系列变量名相近的变量。

在写Pytorch的一套代码(GPS DlinkNet_fusion),想要提取ResNet中的layer1、layer2、layer3、layer4. 一句一句的写代码太多,又不太雅观。这时候可以用val() 通过字符串对应至同名变量。

简单例子,提取resnet.layer1,resnet.layer2,…

resnet = models.resnet34(pretrained=True)
blocks = []
for i in range(1,5):
    blocks.append(eval('resnet.layer'+str(i)))

包括类变量也可以"self.xxx"这样访问到

eval('self.conv'+str(1))  # self.conv1

VQA MCAN code,看到了一种更优雅的写法。getattr()可以利用字符串获取对应名字属性。下面代码也是resnet的CNN部分,提取image feature

def build_model(args):
    cnn = getattr(torchvision.models, args.model)(pretrained=True)
    layers = [cnn.conv1, 
              cnn.bn1,
              cnn.relu,
              cnn.maxpool]
    for i in range(args.model_stage):
        name = 'layer%d' % (i + 1)
        layers.append(getattr(cnn, name))
    model = torch.nn.Sequential(*layers)
    model.cuda()
    model.eval()
    return model
### 使用YOLOv8进行基于JSON标签文件的训练 为了使用YOLOv8根据JSON标注文件进行模型训练,需完成几个主要步骤:准备环境、转换数据格式以及配置并启动训练过程。 #### 准备工作 加载预训练模型是开始之前的重要一步。这可以通过`ultralytics`库中的`YOLO`类来实现: ```python from ultralytics import YOLO model = YOLO("D:\\MyProject\\yolov8s.pt") # 加载预训练模型[^1] ``` #### 转换JSON至TXT格式 由于YOLOv8期望的数据格式通常是简单的文本文件而不是复杂的JSON结构,因此需要编写脚本来解析原始JSON文件并将边界框坐标和其他必要信息保存为`.txt`文件。对于目标检测任务而言,每行应包含类别索引及其对应的四个角点坐标[x_min, y_min, x_max, y_max],这些值通常被归一化处理以便于不同尺寸图像间的兼容性][^[^24]。 例如,在Python中可以这样操作: ```python import json import os def convert_json_to_txt(json_file_path, output_dir): with open(json_file_path, 'r') as f: data = json.load(f) shapes = data['shapes'] txt_content = [] for shape in shapes: label = shape["label"] points = shape["points"] class_index = labels.index(label) if isinstance(labels, list) and label in labels else -1 bbox = [min([p[0] for p in points]), min([p[1] for p in points]), max([p[0] for p in points]), max([p[1] for p in points])] line = "{} {:.6f} {:.6f} {:.6f} {:.6f}".format(class_index, *bbox) txt_content.append(line) base_name = os.path.splitext(os.path.basename(json_file_path))[0] out_file_path = os.path.join(output_dir, '{}.txt'.format(base_name)) with open(out_file_path, 'w') as file: for item in txt_content: file.write("%s\n" % item) labels = ["蔡徐坤", "篮球"] # 类别列表,可根据实际情况调整 convert_json_to_txt('path/to/json/file.json', './annotations') ``` 这段代码会读取给定路径下的单个JSON文件,并将其内容按照指定格式写入同名但扩展名为`.txt`的新文件中。注意这里假设了一个全局变量`labels`用于映射字符串标签到整数ID;实际应用时可能还需要额外逻辑来动态获取这一映射关系。 #### 配置数据集描述文件(data.yaml) 创建或编辑一个名为`data.yaml`的文件以定义数据集的具体细节,包括但不限于图片存储位置、验证集划分比例等参数。此文件应当放置在项目根目录或其他易于访问的地方[^3]: ```yaml path: ./datasets/my_dataset/ train: images/train/ val: images/valid/ nc: 2 # 类别数量 names: ['蔡徐坤', '篮球'] # 对应上述类别的名称 ``` 以上设置指定了两个分类项:“蔡徐坤”和“篮球”,并且明确了训练集与测试集中图像所在的相对路径。 #### 启动训练流程 最后一步就是调用`model.train()`方法来进行正式训练了。在此之前,请确保已经正确设置了所有必要的超参数,比如迭代次数(`epochs`)、批次大小(batch size)等等。下面是一个完整的命令示例: ```python results = model.train( data="./datasets/my_dataset/data.yaml", epochs=50, imgsz=640 # 图像输入分辨率,默认情况下YOLO系列算法采用正方形裁剪方式 ) ``` 通过这种方式即可利用自定义的JSON标注文件对YOLOv8模型实施有效的监督学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值