line.strip() #去除txt文件中每一行首尾的空格和换行符
处理多张图片,最关键的是.stack()函数。
images = []
labels = []
for img_path, class_name in label_info:
# read img
img = Image.open(img_path).convert("RGB")
label_index = int(class_indices[class_name])
# preprocessing
img = transform(img)
images.append(img)
labels.append(label_index)
# batching images
images = torch.stack(images, dim=0).to(device)
# inference
with torch.no_grad():
output = net(images)
probs, preds = torch.max(torch.softmax(output, dim=1), dim=1)
probs = probs.cpu().numpy()
preds = preds.cpu().numpy()
tensor图片的数据格式为CHW,正常图片格式为HWC,使用.transpose接口调换CHW顺序
npimg = images[i].cpu().numpy().transpose(1, 2, 0)
cv2.imshow函数输入参数需要转换为主机内存中numpy()格式
image.cpu().numpy()
2-文件路径
深度学习中,文件路径至关重要,绝对路径方法简单,不容易出错,但是可移植性差,此次记录一下相对路径的常用API。
2.1 os.path.join是一个文件路径拼接函数,导入os模块,
import os
path1 = "D:\path"
path2 = "pythondata\dataset\data.txt"
path = os.path.join(path1, path2)
print(path)
输出为:
D:\path\pythondata\dataset\data.txt
如果不显示地添加斜杠‘/’,那么程序会自动添加反斜杠‘\’
print(os.path.join('dataset', 'images','val.txt'))
输出:dataset\images\val.txt
2.2 获取当前脚本的绝对路径
两种方式,一是import os,二是from pathlib import Path,推荐法二
法1:filepath = os.path.abspath(__file__)
法2:filepath = Path(__file__).resolve()
2.3 获取上级目录
法1:os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
法2: Path(__file__).resolve().parents[0]
2.4 获取当前文件对于基准路径的相对路径 os.path.relpath(file_path,base_path)
Path(os.path.relpath(ROOT, Path.cwd())) # relative,将绝对路径转换成相对路径
3-数据加载
若文件结构是这样的:train文件夹和val文件夹并列,他们下面都有cat和dog文件夹,但是没有真实类别标签文件,ImageFolder
数据集类会自动根据文件夹的名称为每个图像分配一个类别标签。在上述目录结构中,'cat' 文件夹的图像将被分配为类别 0,'dog' 文件夹的图像将被分配为类别 1。
4-迭代器返回的值
train_dataset = ImageFolder(ROOT_TRAIN, transform=train_transform)
该函数返回的数据集train_dataset是一个元组(x,y),其中x是图像数据,y是标签。
train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True)
该迭代器train_dataloader从数据集 train_dataset取得的数据也是一个元组(x,y),其中x是图像数据,y是标签。
有一个2*2的tensor张量pred,
# 创建一个示例张量
pred = torch.tensor([[0.1, 0.5, 0.9], [0.2, 0.6, 1.0]])
# 访问第一个元素(i=0)
element_0 = pred[0]
# 访问第二个元素(i=1)
element_1 = pred[1]
输出:element_0:[0.1, 0.5, 0.9]
element_1:[0.2, 0.6, 1.0]
pred[0]指的是去掉最外面维度后的第一个元素。这里有两个很关键的API:
torch.max()
函数被用于找到张量 tensor
中的最大值及其索引
torch.argmax仅返回最大值的索引。