一、项目代码结构展示
本篇及以后的学习笔记主要关注点在读懂代码上,因为笔者本身是对python语法不太熟悉,所以想通过对这个项目的精细学习来提升自己对于语法和项目结构的理解。
1. 整体项目结构
经过上一个笔记中的测试环节,现在的项目结构如下:
2. 下一级目录
二、代码命令行全文注释
从截图中可以看到,WinClip-master/datasets/_init_.py文件是按顺序出现的第一个python文件,所以我们的注释从这个文件开始。
import numpy as np
from torch.utils.data import DataLoader
from loguru import logger
from .dataset import CLIPDataset
from .mvtec import load_mvtec, mvtec_classes
from .visa import load_visa, visa_classes
# 数据归一化的均值和标准差
mean_train = [0.48145466, 0.4578275, 0.40821073]
std_train = [0.26862954, 0.26130258, 0.27577711]
# 将不同数据集的加载函数与其名称关联起来
load_function_dict = {
'mvtec': load_mvtec,
'visa': load_visa,
}
# 将不同数据集类别与其名称关联起来
dataset_classes = {
'mvtec': mvtec_classes,
'visa': visa_classes,
}
# 反归一化图像数据: 它接受一个归一化后的张量作为输入,首先将通道维度移动到最后,然后应用之前定义的均值和标准差进行反归一化,最后将结果转换为uint8类型的像素值
def denormalization(x):
x = (((x.transpose(1, 2, 0) * std_train) + mean_train) * 255.).astype(np.uint8)
return x
# 根据输入参数创建一个数据加载器
def get_dataloader_from_args(phase, **kwargs):
dataset_inst = CLIPDataset(
load_function=load_function_dict[kwargs['dataset']], # 根据输入的数据集名称从load_function_dict中获取相应的加载函数
category=kwargs['class_name'],
phase=phase,
k_shot=kwargs['k_shot'], # 根据输入的类别、阶段(训练或测试)、k_shot值和实验索引创建一个CLIPDataset实例
experiment_indx=kwargs['experiment_indx'] # 根据阶段是训练还是测试,以及指定的批量大小,创建一个DataLoader实例用于迭代数据集
)
if phase == 'train':
data_loader = DataLoader(dataset_inst, batch_size=kwargs['batch_size'], shuffle=True,
num_workers=0)
else:
data_loader = DataLoader(dataset_inst, batch_size=kwargs['batch_size'], shuffle=False,
num_workers=0)
#
debug_str = f"===> datasets: {kwargs['dataset']}, class name/len: {kwargs['class_name']}/{len(dataset_inst)}, batch size: {kwargs['batch_size']}"
logger.info(debug_str)
return data_loader, dataset_inst