学习李沐香蕉目标检测时疑问
原始数据 → 张量的转换链路(全程可回溯):
1. 图像原始数据的转换链路
硬盘上的.png文件(原始数据) ↓ 由torchvision.io.read_image读取 单个图像张量(uint8,[C,H,W])→ 存入images列表 ↓ 在BananasDataset的__getitem__中 转为float32张量(模型可训练)
张量和原始图片是一一对应的数值映射:
比如原始图片中 (100,200) 像素的 RGB 值是 (255,0,0),张量中img[0,100,200]=255(R 通道)、img[1,100,200]=0(G 通道)、img[2,100,200]=0(B 通道)。
若要还原为 “可视化的原始图片”,只需将张量转格式即可:
# 从images列表中取第一个图像张量(还原原始图片) img_tensor = train_dataset.features[0] # uint8张量,[3,H,W] # 步骤1:转置为[H,W,C](Matplotlib可视化格式) img_np = img_tensor.permute(1,2,0).numpy() # 步骤2:显示原始图片(和硬盘上的.png文件完全一致) d2l.plt.imshow(img_np)
2. 标签原始数据的转换链路
CSV文本文件(原始标注:img_name,label,xmin,ymin,xmax,ymax) ↓ 由pd.read_csv读取为DataFrame(文本→数字) ↓ 转为list(target)([0,100,80,200,180]) ↓ torch.tensor(targets).unsqueeze(1) 标签张量(float32,[N,1,5])
张量中的数值就是 CSV 里的原始数字(只是维度适配),比如张量labels[0] = [[0,100,80,200,180]],对应 CSV 中00001.png的标注:label=0, xmin=100, ymin=80, xmax=200, ymax=180
若要还原为 “原始 CSV 格式”,只需将张量转回 DataFrame:
# 从标签张量还原原始标注 labels_np = train_dataset.labels.squeeze(1).numpy() # [N,5] csv_raw = pd.DataFrame( labels_np, columns=['label','xmin','ymin','xmax','ymax'] ) # 添加img_name列(从CSV中读取的原始图像名) csv_raw['img_name'] = csv_data.index print(csv_raw) # 和原始CSV文件内容完全一致
为什么代码不返回 “原始数据”(文件 / 文本)?
PyTorch 模型训练的核心是数值计算,原始的.png 文件(二进制)、CSV 文本(字符串)无法直接输入模型 —— 必须转为张量(数值矩阵):
- 图像张量:是原始图片像素的数值化表示,可参与梯度计算、卷积等操作;
- 标签张量:是原始标注的数值化表示,可用于计算损失(如边界框回归损失)。